인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

H K님의 프로필 이미지
H K

작성한 질문수

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

프로필 수정 처리

영속성 컨텍스트 질문

작성

·

161

0

9:57 보시면

51 라인
Account account = accountRepository.findByEmail(email); 이 순간 account 객체는 Persistent 상태이고,

이 코드 이후로 account 이건 다시 detach 상태가 되는데

63라인 accountService.completeSignUp(account);

이 코드로 인하여 다시 Persistent 로 상태가 만들어진다고 생각하면 될까요 ??

 

(왜냐하면 accountService.completeSignUp(account);에는 트랜잭션어노테이션이붙어있어서)

 

답변 2

0

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

AI가 답글을 잘 달아놨네요. 말씀하신게 맞습니다.

0

안녕하세요, 인프런 AI 인턴입니다.
H님, 영속성 컨텍스트에 대한 질문 감사합니다.

Spring Data JPA를 사용할 때, accountRepository.findByEmail(email) 메서드를 호출하는 순간 반환된 account 객체는 영속성 컨텍스트에 의해 관리되는 Persistent 상태가 됩니다. 여기서 말하는 Persistent 상태란 해당 객체가 현재 영속성 컨텍스트에 존재하며, 데이터베이스와의 동기화가 가능한 상태를 말합니다.

이후에 어떠한 방법으로든 해당 객체가 영속성 컨텍스트에서 분리되어 Detached 상태가 된다면, 더 이상 영속성 관리가 이루어지지 않게 됩니다. Detached 상태란 객체가 더 이상 영속성 컨텍스트에 속하지 않으므로 변경 감지(dirty checking)나 지연 로딩(lazy loading) 등의 JPA 기능을 사용할 수 없는 상태를 말합니다.

accountService.completeSignUp(account) 메서드가 호출될 때, 만약 해당 메서드에 @Transactional 어노테이션이 붙어 있다면, 이 메서드는 새로운 트랜잭션의 시작을 나타냅니다. 이 경우 메서드 실행 동안 사용되는 account 객체는 다시 영속성 컨텍스트에 포함되어 Persistent 상태가 됩니다. 트랜잭션이 종료되는 시점에 영속성 컨텍스트는 변경된 내용을 데이터베이스와 동기화하게 됩니다.

따라서 accountService.completeSignUp(account) 메서드 내의 작업은 해당 객체를 다시 영속 상태로 만들고, 트랜잭션이 종료될 때까지 영속성 컨텍스트가 관리하게 되므로, 말씀하신대로 이 메서드를 통해 객체가 다시 Persistent 상태로 전환된다고 이해하시면 됩니다.

도움이 되셨길 바랍니다!

H K님의 프로필 이미지
H K

작성한 질문수

질문하기