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

kiroro0814님의 프로필 이미지

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

트랜잭션 전파 활용1,2 강의 내용 중 질문

해결된 질문

24.10.19 17:47 작성

·

22

0

강의록에 첨부해주신 그림을 보면 MemberRepository는 con1를 사용하고, LogRepository는 con2를 사용하는데 이게 각각 MemberRepository는 트랜잭션B를 사용하고 LogRepository는 트랜잭션C를 사용한다고 해서 다른 커넥션을 사용하게 되는거죠??
MemberRepository는 con1를 사용하고 커밋하고 난 후에 커넥션 풀에 con1이 반납되고 그 후에 LogRepository가 트랜잭션을 시작하게 되면 con1을 사용하게 되는건 아닌가요?? 이럴때는 서로가 다른 트랜잭션B,C로 구분이 안되어있을때만 이렇게 되는건가요..??

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

2024. 10. 21. 20:39

안녕하세요. kiroro0814님

이번 예시는 트랜잭션이 없는 MemberService가 트랜잭션이 있는 MemberRepository와 트랜잭션이 있는 LogRepository를 호출하는 그림입니다.

스프링에서 @Transactional을 사용하는 경우 기존에 연결된 트랜잭션이 없다면 새로운 커넥션을 받아와서 처리합니다. 따라서 각각 다른 커넥션을 사용하게 됩니다.

예시에 MemberRepository를 시작하는 시점에는 연결된 트랜잭션이 없습니다. 따라서 새로운 커넥션을 통해 트랜잭션을 시작합니다. 이후에 MemberRepository 호출과 트랜잭션도 다 끝나고 난 다음에 LogRepository가 시작됩니다. 이때도 연결된 트랜잭션이 없기 때문에 새로운 커넥션을 받아서 트랜잭션을 시작하게 됩니다.

 

커넥션을 커넥션 풀에 반납하는 경우 해당 커넥션의 트랜잭션이 commit 또는 rollback을 통해 모두 초기화된 다음에 반납됩니다. 따라서 풀에 반납하고 다시 꺼낸 커넥션은 기존 트랜잭션과 무관한 것으로 이해하시면 됩니다.

감사합니다.

kiroro0814님의 프로필 이미지
kiroro0814
질문자

2024. 10. 21. 22:58

친절하게 직접 알려주셔서 감사합니다 ㅠㅠ

그런데 제가 아직 제대로 이해하지 못한것 같아서 다시 한번 여쭤봅니다.. ㅠㅠ
강사님께서 말씀해주신 마지막 문단에 따르면
1. MemberRepository가 트랜잭션을 시작
2. con1을 사용
3. commit 후, con1을 반납, 트랜잭션 종료
4. LogRepository가 트랜잭션을 시작
과 같이 진행이 되는거면 LogRepository도 con1을 사용하게 될 수도 있지만 이 con1은 기존에 MemberRepository가 사용하던 con1과는 무관하다는 말씀이신거죠??
이때 그 히카리 프록시 커넥션 이라는 객체를 생성하기 때문에 그렇게 되는게 맞는걸까요...??

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 19. 17:51

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

질문하신 내용에 대해서 답변드리겠습니다.

스프링의 트랜잭션 전파 속성과 커넥션 풀 작동 방식에 대한 이해가 필요합니다.

  1. 트랜잭션의 분리:

    • MemberRepositoryLogRepository가 각각 별도의 트랜잭션(B, C)을 사용하도록 설정되어 있다면, 이 두 트랜잭션은 서로 다른 커넥션을 사용하게 됩니다. 특히, @Transactional(propagation = Propagation.REQUIRES_NEW)를 사용하면 항상 새로운 트랜잭션을 생성하며, 기존 트랜잭션과 별도의 커넥션을 사용합니다. 이는 새로운 커넥션을 커넥션 풀로부터 가져와서 사용하게 되므로 자연스럽게 con1(기존 커넥션)과는 다른 새 커넥션(con2)이 할당됩니다.
  2. 커넥션 반납 후 재사용:

    • MemberRepository 작업이 완료된 후 con1이 커넥션 풀에 반환됩니다. 다음 작업에서 커넥션 풀에서 새로운 요청이 발생하면 con1이 재사용될 수 있습니다. 그러나 두 트랜잭션이 서로 다른 경우 각각 다른 커넥션을 사용해야 성격상 분리가 됩니다.
    • @Transactional(propagation = Propagation.REQUIRES_NEW)를 통해 새로운 트랜잭션을 열면, 기존 커넥션을 반납하고 새로운 커넥션을 열어 처리하게 되므로, 기존의 커넥션(con1)이 아닌 다른 커넥션(con2)이 사용됩니다.

결론적으로, 트랜잭션 전파와 새 트랜잭션 생성 설정에 따라 각 작업이 다른 커넥션을 사용하게 됩니다. 이는 자연스럽게 트랜잭션의 독립성을 유지하도록 설계된 것입니다.

관련 내용을 좀 더 이해하고 싶으시다면, 다음의 답변들을 참고해 주세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.