• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

회원가입 테스트 코드 관련해 질문 드립니다..ㅠ

24.01.03 20:24 작성 24.01.03 20:34 수정 조회수 295

0

7분 08초 정도에 회원가입 테스트 코드를 실행하는 부분에서요,,!

 

MemberServiceTest 클래스에 @Transactional을 걸어서

회원가입() 메소드를 하나의 트랜잭션으로 관리하는 것으로 이해했습니다...

 

memberService.join(member); 으로 persistence context에 member를 영속화 시킨 상태인데,

그 다음 코드인 memberRepository.findOne(savedId);에서, 왜 select 문이 나가는거죠?

하나의 트랜잭션이고, member가 영속 상태라서 1차 캐시에서 관리되면, context에서 가져와야 하는게 아닌가요?...

 

트랜잭션을 롤백한다는 것의 의미가 DB의 트랜잭션을 롤백한다는 것 뿐만 아닌 영속성 컨텍스트도 롤백하는 것을 의미하나요?..

 

만약 그렇다면, 저는 @Transactional을 메소드 단위로 걸었는데, 왜 회원가입() 메소드 중간에 롤백이 되는 건가요?..ㅠ

아예 애초부터 스프링에서의 트랜잭션 롤백은 영속성 컨텍스트에 반영조차 하지 않는 거라고 봐야 하나요?..

 

 

 

 

너무 헷갈립니다 ㅠ.ㅠ

 

답변 2

·

답변을 작성해보세요.

1

David님의 프로필

David

2024.01.05

안녕하세요. qpal1zm23님, 공식 서포터즈 David입니다.

가입시 중복회원인지 검증하는 로직이 있습니다.

여기서 발생한 조회 쿼리인걸로 보입니다.

확인 부탁드립니다.🙂

감사합니다.

qpal1zm23님의 프로필

qpal1zm23

질문자

2024.01.07

앗.. 그렇군요.. 감사합니다 ㅠㅠ

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.03

안녕하세요, 인프런 AI 인턴입니다.

같은 강의에서 비슷한 내용의 질문에 대한 답변이 있어 해당 내용을 참고하시면 도움이 될 것 같습니다. 질문하신 회원가입 테스트 코드와 관련된 부분에서 @Transactional 어노테이션의 역할과 영속성 컨텍스트, 그리고 1차 캐시에 대한 이해를 돕는 내용입니다.

아래 링크에서 강사님의 답변을 확인해보세요.

강사님께서 설명해주신 내용을 요약하자면, @Transactional 어노테이션이 있으면 테스트 실행 전에 트랜잭션이 시작되며, 해당 트랜잭션 내에서 영속성 컨텍스트가 유지되어 1차 캐시에서 객체를 관리합니다. 그러나 @Transactional 어노테이션이 없으면, 각각의 메소드마다 별개의 트랜잭션이 생성되고 종료되어 영속성 컨텍스트가 그때마다 새로 생성되어 버리는 것으로 이해하시면 됩니다.

질문하신 상황에서는 select 문이 나가는 것이 예상치 못한 동작으로 보이므로, 이와 관련하여 실제로 어떤 상황에서 select 문이 실행되는지, 그리고 트랜잭션과 영속성 컨텍스트가 어떻게 관리되는지를 좀 더 자세히 알아보는 것이 좋겠습니다.

강사님의 답변을 통해 궁금증이 해소되기를 바랍니다.