인프런 커뮤니티 질문&답변

Key Handsome님의 프로필 이미지
Key Handsome

작성한 질문수

스프링과 JPA 기반 웹 애플리케이션 개발

프로필 수정 처리

영속 상태에 관해 질문이 있습니다.

작성

·

189

2

저는 엔티티가 detached 되는 시점이 Transaction이 끝나는 시점 (@Transactional 애노테이션이 붙은 메서드의 호출 후)인 줄 알았는데 오늘 수업을 들으니 그게 아닌 것 같아요.

findByEmail로 조회를 하고나면 해당 트랜잭션이 끝나 detached 상태가 되는 줄 알았거든요.

그렇다면 제가 위에 서술한 부분 중 틀린 부분이 있을건데 어느 부분을 잘못 이해하고 있는지 궁금해요 !

답변 2

2

Key Handsome님의 프로필 이미지
Key Handsome
질문자

아.. 트랜잭션이 끝나도 영속성 관리는 유지되는 상태였기 때문이군요. 전 시간에 배운 걸 다시 물어본 셈이 되었네요. 감사합니다 ㅠ

2

백기선님의 프로필 이미지
백기선
지식공유자

"Transaction이 끝나는 시점"이 맞기도 하고 틀리기도 한데 OSIV 필터 때문에 영속성 관리자는 계속 열려 있어서 트랜잭션이 끝났어도 detached가 아니라 persist 상태일 수 있습니다.

OSIV 필터 때문에 영속성 관리자는 요청이 컨트롤러에 들어오기 전부터 만들어져 있고, 컨트롤러 안에서 리파지토리 사용해서 findByEmail로 엔티티를 조회할 때 당연히 리파지토리에 있는 @Transactional이 적용되서 엔티티 가져올 때 해당 엔티티는 persist 상태입니다. 그런데 영송성 관리자가 계속 현재 쓰레드에 열려 있기 때문에 컨트롤러가 @Transactional이 아니어도 해당 엔티티는 계속해서 persist 상태인 겁니다.

OSIV 필터가 없는 상태에서는 트랜잭션이 끝나는 시점이 영속성 관리자도 종료되는 시점이라고 가정하는게 맞긴합니다.

Key Handsome님의 프로필 이미지
Key Handsome

작성한 질문수

질문하기