728x90
사전 지식
JPA 트랜잭션
- JPA(Java Persistence API)트랜잭션은 데이터베이스 작업을 그룹화
- 원자성
- 일관성
- 고립성
- 지속성
특성을 가진 트랜잭션으로 관리하기 위한 개념
하는 일
- 시작
- 커밋
- 롤백
=> 데이터베이스 작업을 안전하게 수행하고 데이터의 무결성을 유자하기 위해 중요함
JPA 트랜잭션의 성질
원자성
트랜잭션은 하나 이상의 데이터베이스 작업을 포함하며 이러한 작업은 모두 성공하거나 실패 해야함
트랜잭션 중 하나의 작업이 실패하면 모든 작업이 롤백되어 데이터베이스를 이전 상태로 되돌림
일관성
트랜잭션이 시작하기 전과 끝난 후에 데이터베이스는 일관된 상태여야함. 트랜잭션 중 데이터베이스가 일시적으로 불일치 상태에 놓이지 않아야함
고립성
여러 트랜잭션이 병행으로 실행될 때, 각 트랜잭션은 다른 트랜잭션의 작업을 볼 수 없어야 함. 트랜잭션은 서로 간섭하지 않고 독립적으로 실행
지속성
트랜잭션이 성공적으로 완료된 후에는 해당 트랜잭션에 의해 변경된 데이터는 영구적으로 저장되어야함. 시스템 장애 또는 전원 손실과 같은 상황에서도 데이터가 손실되지 않아야함
결론
JPA를 사용하면 개발자는 트랜잭션을 명시적으로 시작, 커밋, 롤백할 수 있으며, 이를 통해 데이터베이스 작업을 안전하게 관리할 수 있습니다. 트랜잭션을 사용하면 데이터베이스 작업이 원자적으로 실행되고, 데이터 일관성 및 무결성이 보장됩니다.
영속성 컨텍스트
영속성 컨텍스트란?
JPA에서 사용되는 중요한 개념중 하나로 엔티티 객체를 관리하는 환경임.
영속성 컨텍스트는 엔티티의 생명주기를 추적하고 엔티티와 데이터베이스 간의 상호작용을 관리함
영속성 컨텍스트의 주요 특징과 역할
- 엔티티 관리 : 영속성 컨텍스트는 엔티티 객체를 관리, 추적함. 엔티티를 영속성 컨텍스트에 등록하면 영속 상태가 되며, 영속성 컨텍스트가 해당 엔티티를 관리함
- 엔티티 식별 : 영속성 컨텍스트는 엔티티의 식별을 관리하며 데이터 베이스의 일관성을 유지함
- 엔티티의 상태관리 : 엔티티는 영속성 컨텍스트 내에서 다양한 상태(영속, 준영속, 삭제)를 가질 수 있다. 영속성 컨텍스트는 이러한 상태를 관리하며 엔티티의 상태 전이를 처리함
- 1차 캐시 : 영속성 컨텍스트는 엔티티를 메모리에 보관하면 같은 엔티티를 여러번 조회해도 데이터베이스로의 요청을 줄여 성능을 향상시킵니다
- 트랜잭션 지원 : 영속성 컨텍스트는 트랜잭션과 연관되어 있으며, 트랜잭션 커밋 시 엔티티 변경 내용을 데이터베이스에 저장
- 지연로딩 : 영속성 컨텍스트는 지연로딩을 지원하며, 필요한 시점에 연관된 엔티티로 로드한다
- 동일성 보장 : 영속성 컨텍스트 내에서 동일한 엔티티에 대한 조회는 항상 동일한 엔티티 인스턴스를 반환함결론영속성 컨텍스트는 JPA를 통해 엔티티를 관리하고 데이터베이스와의 상호 작용을 쉽게 처리하기 위한 핵심 기능 중 하나이며, 개발자가 데이터베이스 상호 작용을 추상화하여 효율적으로 관리할 수 있도록 도와줍니다
예시
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaExample {
public static void main(String[] args) {
// EntityManagerFactory 생성
// factory : 데이터베이스의 상호작용을 설정
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("myJpaUnit");
// EntityManager 생성
// manager : 엔티티 관리와 데이터베이스 작업을 수행하는데 사용
EntityManager manager = factory.createEntityManager();
// 트랜잭션 시작
// transaction : JPA 트랜잭션을 시작, 커밋, 롤백하는데 사용
EntityTransaction transaction = manager.getTransaction();
// 트랜잭션 시작
transaction.begin();
try {
// 엔티티 생성 및 저장
Student student = new Student("John", "Doe", 25);
manager.persist(student); // 엔티티를 영속성 컨텍스트에 추가
// 데이터베이스에서 엔티티 조회
Student retrievedStudent = manager.find(Student.class,
student.getId());
System.out.println("Retrieved Student: " +
retrievedStudent.getFirstName() + " " +
retrievedStudent.getLastName());
// 트랜잭션 커밋 : 변경사항 영구 저장
transaction.commit(); // 모든 엔티티 작업을 영구적으로 저장
} catch (Exception e) {
// 트랜잭션 롤백 : 에러시 이전상태 복원
transaction.rollback(); // 에러 발생 시 엔티티 작업을 취소하고 이전 상태로 돌림
e.printStackTrace(); // 에러 메시지 출력
} finally {
// EntityManager 및 EntityManagerFactory 종료
manager.close(); // EntityManager 리소스 해제
factory.close(); // EntityManagerFactory 리소스 해제
}
}
}
반응형
'Spring, Spring boot' 카테고리의 다른 글
JPA를 활용한 기본적인 CRUD 해보기 (0) | 2023.10.26 |
---|---|
트랜잭션 (1) | 2023.10.26 |
토큰 기반 인증 방식과 JWT (0) | 2023.10.19 |
스프링 시큐리티 (0) | 2023.10.18 |
타임리프와 템플릿 엔진 (0) | 2023.10.17 |