연합 스터디 2주차-영속성 컨텍스트, flush, dirty checking, rollback 전략, 관계 매핑과 트랜잭션 테스트

Goguma·2025년 5월 31일

BE 연합_스터디

목록 보기
2/2

### 학습 목표

JPA의 내부 동작을 원리 수준에서 이해하고, 복잡한 관계 매핑과 트랜잭션을 테스트 코드로 검증한다.

EntityManager와 영속성 컨텍스트의 생명 주기

엔티티 매니저는 엔티티를 관리해 데이터베이스와 애플리케이션 사이에서 객체를 생성, 수정, 삭제하는 등의 역할을 한다.
영속성 컨텍스트는 JPA의 중요한 특징 중 하나로, 엔티티를 관리하는 가상 공간이다.
이것 덕분에 데이터베이스에서 효과적으로 데이터를 가져올 수 있고, 엔티티를 편하게 사용할 수 있다.

생명주기를 관리하는 영속성 컨텍스트에 엔티티 객체를 관리할 수 있는 메서드들을 제공한다.
EntityManager가 제공하는 persist(), remove(), flush(), getReference()같은 메서드를 사용하면 엔티티 객체를 영속성 컨텍스트에 저장•삭제•조회할 수 있다.

이 과정에서 엔티티는 총 4가지 상태를 거친다:

비영속 (Transient): JPA와 전혀 관계없는 상태
영속 (Persistent): 영속성 컨텍스트가 관리 중
준영속 (Detached): 관리가 끊긴 상태
삭제 (Removed): 삭제 예정 상태

dirty checking

영속 상태의 엔티티가 변경되었을 때, JPA가 트랜잭션 커밋 시점에 변경된 필드만 감지해 자동으로 UPDATE 쿼리를 생성하는 기능이다.
dirty checking은 영속 상태의 엔티티에서만 작동한다.
준영속 상태(detached)에서는 값이 바뀌어도 감지되지 않는다.

rollback 전략

롤백(Rollback)은 트랜잭션 처리 중 오류가 발생했을 때, 해당 트랜잭션에서 수행된 모든 작업을 취소하고 이전 상태로 되돌리는 것을 말한다. JPA에서는 @Transactional 어노테이션을 통해 트랜잭션을 선언하고, 예외 발생 시 자동으로 롤백을 수행한다.

Spring의 기본 롤백 전략은 다음과 같다:

RuntimeException 또는 Error가 발생하면 자동으로 롤백된다.

Checked Exception(예: IOException)은 기본적으로 롤백되지 않고 트랜잭션이 커밋된다.

관계 매핑과 트랜잭션 테스트

관계 매핑은 JPA에서 객체 간의 연관관계를 설정하는 것을 말하며, 실제 DB의 외래 키와 연결된다. 대표적으로 @OneToMany, @ManyToOne, @OneToOne, @ManyToMany 어노테이션을 사용한다.

연관관계 주인: 외래 키를 가진 엔티티. 주인만 관계를 변경할 수 있음.

Cascade: 부모 엔티티의 저장/삭제가 자식에게 전파됨 (cascade = ALL 등)

orphanRemoval: 부모와의 관계가 끊긴 자식 엔티티를 자동 삭제

FetchType.LAZY: 연관 엔티티를 실제 사용할 때 로딩 (성능 최적화)

트랜잭션 테스트는 @Transactional 안에서 관계 매핑이 잘 작동하는지 확인하는 과정이다. 저장 시 cascade, 삭제 시 orphanRemoval이 제대로 동작하는지 테스트 코드로 검증한다.

profile
달달고구마

0개의 댓글