-
Notifications
You must be signed in to change notification settings - Fork 300
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[JDBC 라이브러리 구현하기 - 4단계] 콩하나(최한빈) 미션 제출합니다. #560
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 하나콩
굉장히 훌륭하게 구현해주셨네요
현재 file changed에서는 마땅히 달 코멘트가 없었어요
근데 하나 생각해볼만한 지점이 있기는 합니다
TxUserService에서 탬플릿 콜백 패턴을 사용한 부분을 @Transactional
어노테이션이라고 생각해볼게요.
커넥션을 release하는 로직이 해당 패턴에 있어서 @Transactional
을 사용한다면 정상적으로 커넥션을 해제합니다.
하지만 만약 사용자가 @Transactional
을 달지 않고 사용한다면 jdbcTemplate에서 커넥션을 생성하지만 닫거나 제거하는 로직이 없어서 커넥션이 계속 유지될 것 같아요.
해당 질문에 대한 답변만 해결되면 아마 다음이 마지막 리뷰가 될 것 같습니다!
private static final ThreadLocal<Map<DataSource, Connection>> resources; | ||
|
||
static { | ||
resources = new ThreadLocal<>(); | ||
resources.set(new HashMap<>()); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
private static final ThreadLocal<Map<DataSource, Connection>> resources; | |
static { | |
resources = new ThreadLocal<>(); | |
resources.set(new HashMap<>()); | |
} | |
private static final ThreadLocal<Map<DataSource, Connection>> resources = ThreadLocal.withInitial(HashMap::new); | |
이런 메서드가 있더군요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
와... 이거 static으로 초기화하면 ThreadLocal을 제대로 사용하지 못하는 거였더라고요.
이 방법을 사용해야지 제대로 ThreadLocal을 사용하는거네요!
감사합니다 👍
안녕하세요 주드! 콩하나입니다.
감사합니다! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 하나콩
jdbc 라이브러리 미션 수고하셨습니다
auto closeable 멋지네요 배워갑니다
더 리뷰하고 싶은데 레거시도 제가 리뷰해도 될까요?
안녕하세요 주드! 콩하나입니다.
마지막 미션이네용
원래 어제 다 마무리해서 제출까지 하려고 했으나,
어제 갑작스러운 인텔리제이 라이센스 만료 이슈로 인해...
갖가지 방법을 찾아보다가 결국 트라이얼 모드로 30일 무료 이용해서 하고 있네요.
아직 학교 졸업 안했는데 인증이 안된대요.. ㅠㅠ
깃허브로 인증받는 것도 위와 동일한 이슈로 안되고... 이클립스를 하려하니까 생산성도 떨어지고 빌드가 안돼서
돌고 돌아서 인텔리제이네요 ㅋㅋㅋㅋ
아무튼 그래도 오늘 무사히 미션 완료해서 제출합니다.
이번에도 특별히 집중했던 부분을 공유드릴게요.
집중했던 부분
~~
jdbcTemplate
보단 Service의 트랜잭션 추상화~~...를 하려 했으나 어쩔 수 없이 JdbcTemplate의 수정... ㅠㅠ원래는 다음과 같이 생각했었습니다.
하지만 결국 JdbcTemplate에서 connection을 전달받는 기능을 모두 제거했습니다.
DataSourceUtils
라는 헬퍼 클래스가 라이브러리에서 제공해주는 클래스인만큼 JdbcTemplate을 사용하는 방법으로 숙지해두면 괜찮겠다는 생각이 들었어요. 이를 보강하기 위해 스프링에서는 프록시를 만들어서 트랜잭션을 따로 관리해주고 있기도 하니까요.그래도 외부에서 connection을 직접 해제하지 않으면 jdbcTemplate에서는 이를 해제할 수 있는 방법이 없다는게 아쉽네요.
참고하면 좋을 사항
DataSourceUtils.releaseConnection() 메소드 내에 TransactionSynchronizationManager.unbindResource() 추가
예시에서는 둘을 분리해서 사용해주고 있는데,
아무리 생각해도 둘을 하나로 묶어서 이를 사용하는 측에서는
DataSourceUtils만 사용
하도록 좋아보여서 이렇게 구현했습니다.왜 둘을 분리했을까요?
그냥 예시일 뿐인 걸까요?
주드의 생각이 궁금합니다.