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

김우철님의 프로필 이미지

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

@Transactional 관련 커넥션풀 반환 원리 질문드립니다.

작성

·

2.4K

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 아니오

[질문 내용]
안녕하세요. 커넥션풀 반환에 관련되서 질문드리고자 합니다.
서비스단의 메소드에 @Transactional 을 사용해서 생성된 프록시의 마지막에 커넥션을 반환하는것으로 이해해습니다.
@Transactional은 보통 update,insert,delete 쿼리가 존재하는 곳에 붙이는 것으로 알고 있는데요.
 
단순히 조회만하는 메서드에서 @Transactional을 안붙여도 어떻게 커넥션 풀이 반환되는지 궁금합니다.
Service.java 코드에서 가령 10개의 메서드가 있는데 1개만 @Transactional이 붙여도 해당 클래스는 프록시가 생성되어 모든 메서드에 커넥션 풀이 반환되는 부분이 들어가는것으로 이해됩니다.
그렇다면 controller에서 바로 repository 메서드(select, update, insert, delete 등)를 호출해도 커넥션풀이 반환되는걸까요?
반환이된다면 원리가 궁금합니다.
 
※ 추가질문
강의 내용 일부 중 JPA 트랜잭션 코드 예시에서 엔티티매니저 종료 & 엔티티 매니저 팩토리 종료 부분이 있는데 해당 부분이 커넥션 풀을 반환하는 것으로 이해하면 될까요?
 

답변 1

6

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

안녕하세요. 김우철님

다음 순서를 봐주세요^^

트랜잭션을 사용하는 경우

1. 트랜잭션 프록시를 호출한다.

2. 트랜잭션 프록시는 데이터소스를 찾아서 사용한다. 이때 커넥션 풀에서 커넥션을 획득한다.

3. 커넥션을 모두 사용하고 나면 connection.close()를 호출한다. 이때 실제 커넥션이 커넥션 풀로 돌아간다.

 

트랜잭션 없이 바로 사용하는 경우

1. 트랜잭션 없이 리포지토리를 호출한다.

2. 리포지토리 내부에서 데이터소스를 찾아서 사용한다. 이때 커넥션 풀에서 커넥션을 획득한다.

3. 커넥션을 모두 사용하고 나면 connection.close()를 호출한다. 이때 실제 커넥션이 커넥션 풀로 돌아간다.

 

커넥션 풀에 커넥션이 되돌아가는 코드는 바로 connection.close() 입니다. 그런데 connection.close()를 호출하게 되면 커넥션이 종료되어버리겠지요!

그래서 커넥션풀에서 커넥션을 반환할 때 커넥션풀(hikariCP)은 실제 물리 커넥션을 바로 반환하는 것이 아니라 실제 물리커넥션을 내부에 한번 감싼 프록시 커넥션을 반환합니다.

이것이 바로 com.zaxxer.hikari.pool.HikariProxyConnection 이지요.

이 프록시 커넥션에 connection.close()를 호출하게 되면 내부의 물리 커넥션을 풀에 반환하게 됩니다^^

감사합니다.