해결된 질문
작성
·
398
·
수정됨
0
7분 08초 정도에 회원가입 테스트 코드를 실행하는 부분에서요,,!
MemberServiceTest 클래스에 @Transactional을 걸어서
회원가입() 메소드를 하나의 트랜잭션으로 관리하는 것으로 이해했습니다...
memberService.join(member); 으로 persistence context에 member를 영속화 시킨 상태인데,
그 다음 코드인 memberRepository.findOne(savedId);에서, 왜 select 문이 나가는거죠?
하나의 트랜잭션이고, member가 영속 상태라서 1차 캐시에서 관리되면, context에서 가져와야 하는게 아닌가요?...
트랜잭션을 롤백한다는 것의 의미가 DB의 트랜잭션을 롤백한다는 것 뿐만 아닌 영속성 컨텍스트도 롤백하는 것을 의미하나요?..
만약 그렇다면, 저는 @Transactional을 메소드 단위로 걸었는데, 왜 회원가입() 메소드 중간에 롤백이 되는 건가요?..ㅠ
아예 애초부터 스프링에서의 트랜잭션 롤백은 영속성 컨텍스트에 반영조차 하지 않는 거라고 봐야 하나요?..
너무 헷갈립니다 ㅠ.ㅠ
답변 2
1
안녕하세요, 인프런 AI 인턴입니다.
같은 강의에서 비슷한 내용의 질문에 대한 답변이 있어 해당 내용을 참고하시면 도움이 될 것 같습니다. 질문하신 회원가입 테스트 코드와 관련된 부분에서 @Transactional 어노테이션의 역할과 영속성 컨텍스트, 그리고 1차 캐시에 대한 이해를 돕는 내용입니다.
아래 링크에서 강사님의 답변을 확인해보세요.
강사님께서 설명해주신 내용을 요약하자면, @Transactional 어노테이션이 있으면 테스트 실행 전에 트랜잭션이 시작되며, 해당 트랜잭션 내에서 영속성 컨텍스트가 유지되어 1차 캐시에서 객체를 관리합니다. 그러나 @Transactional 어노테이션이 없으면, 각각의 메소드마다 별개의 트랜잭션이 생성되고 종료되어 영속성 컨텍스트가 그때마다 새로 생성되어 버리는 것으로 이해하시면 됩니다.
질문하신 상황에서는 select 문이 나가는 것이 예상치 못한 동작으로 보이므로, 이와 관련하여 실제로 어떤 상황에서 select 문이 실행되는지, 그리고 트랜잭션과 영속성 컨텍스트가 어떻게 관리되는지를 좀 더 자세히 알아보는 것이 좋겠습니다.
강사님의 답변을 통해 궁금증이 해소되기를 바랍니다.
앗.. 그렇군요.. 감사합니다 ㅠㅠ