Skip to content
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단계] 가비 미션 제출합니다. #523

Merged
merged 19 commits into from
Oct 11, 2023

Conversation

iamjooon2
Copy link

@iamjooon2 iamjooon2 commented Oct 8, 2023

안녕하세요 홍고🍊

람다랑 함수형 인터페이스한테 또 혼나고 온 가비입니다

DataSourceUtils를 이용해서 Connection을 관리하도록 했고
TranasactionManager라는 친구를 만들어서, Service에 있던 트랜잭션 관리하는 넘을 안으로 밀어넣어줬습니다

날씨 추워졌는데 감기 조심하세요...!

4단계 미션 제출하신다음 리뷰해주셔도 됩니다...!
기간내 리뷰하신다고 스포당하진 않으셨으면🥲

Copy link

@hgo641 hgo641 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요, 가비!! 😄
이번에도 역시 코드가 깔끔하군요 👍👍
TransactioManager로 트랜잭션을 관리하는 코드가 깔끔하게 분리되었네요! 👍
배우고 갑니다!
코드보면서 궁금한 거 질문으로 남겼습니다!
날씨가 많이 추워졌는데 감기 조심하세요!

Comment on lines 17 to 20
@Override
public User findById(final long id) {
return userService.findById(id);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기는 트랜잭션 처리를 안해주신 이유가 있나요? read-only여서인가요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 단순 조회이기도 하고 반환값이 있는 함수형 인터페이스 새로 만들어줘야해서였는데
생각해보니 자바 기본 함수형 인터페이스가 있었네요🥲


public TxUserService(final UserService userService) {
this.userService = userService;
this.transactionManager = new TransactionManager(DataSourceConfig.getInstance());
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Service에서 DataSource를 주입해주신 이유가 있으신가요?? 궁금합니다!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TransactionManager를 주입받도록 변경했습니다

Comment on lines +27 to 29
private static Map<DataSource, Connection> getResources() {
return resources.get();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resources.get()의 반복 사용이 없어졌네요 👍👍

@@ -31,31 +31,35 @@ void setUp() {
@Test
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기 setUp()에서 사용되는 DatabasePopulatorUtils의 connection은 DataSourceUtils로 connection을 가져오지 않으신 이유가 있나요? DatabasePopulatorUtils가 실행하는 쿼리에는 트랜잭션이 적용되지 않아도 될까요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

꼼꼼하게 봐주셔서 감사합니다! 반영했습니다~!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅎㅎㅎ... 진짜 궁금해서 여쭤본거였는데.... ☺

Copy link
Author

@iamjooon2 iamjooon2 Oct 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 setUp() 메서드에 DatabasePopulatorUtils라는 다른 종류의 클래스를 사용하는걸 미처 보지 못했어요
그리고 자연히 테스트에서도 동일하게 트랜잭션을 적용해야한다고 생각합니다.. 적용하지 않을 이유는 없다고 생각해요

놓친 것이 있다면 알려주심 감사하겠습니다..

Comment on lines 35 to 41
private static void rollBackConnection(final Connection connection) {
try {
connection.rollback();
} catch (final SQLException e) {
throw new DataAccessException(e);
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

덕분에 try depth가 줄어들었군요👍

Comment on lines 19 to 33
public void run(final TransactionExecutor transactionExecutor) {
final Connection connection = DataSourceUtils.getConnection(dataSource);
try {
connection.setAutoCommit(false);

transactionExecutor.action();

connection.commit();
} catch (final SQLException e) {
rollBackConnection(connection);
throw new DataAccessException(e);
} finally {
DataSourceUtils.releaseConnection(connection, dataSource);
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기도 템플릿 콜백패턴을 적용하면 로직이 더 깔끔해질 것 같습니다! 이미 알고 계실 것 같지만 리뷰가 넘 심심한 것 같아 쥐어짜내봅니다 😄 (반영은 안 해주셔도 됩니다!!!)

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금은 TransactionManager가 하나밖에 없지만 Spring을 보면 HibernateTransactionManager같이 TransactionManager가 여러 개 있더군요! 추상화를 위해 rollBack을 메서드로 분리하신 것처럼 commit도 메서드로 분리하셔도 좋을 것 같습니다. 이 부분도 콜백패턴을 적용하면 자연스럽게 반영되겠군여. 쥐어짜낸 리뷰222 (반영안해주셔도 됩니다222)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

소중한 리뷰 감사합니다 😊
첫 리뷰 반영하면서 템플릿 콜백으로 변경했어요...!
connection 부분은 메서드만 분리했습니다..!

Comment on lines +23 to 25
public static void unbindResource(DataSource key) {
getResources().remove(key);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 가비랑 동일하게 코드를 짰었는데 소나가 "ThreadLocal" variables should be cleaned up when no longer used라고 경고를 띄워주더라고요!! Thread Pool을 사용할 경우, 사용한 ThreadLocal을 remove해주지 않으면 예상치못하게 동작할 수도 있다고 해요. (참고한 글)
물론 지금은 Thread Pool을 사용하지 않아 remove를 해주지 않아도 될 것 같지만, ThreadLocal을 사용할 땐 의식적으로 값이 비었을 경우 remove해줘도 괜찮을 것 같다... 는 생각이 들었지만 제 뇌피셜입니다

Copy link

@hgo641 hgo641 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요, 가비!
4단계 고생하셨습니다!!👍
이번에는 질문없고 박수만 짝짝 치고갑니다.
다음 미션도 화이팅입니다 😄😄

Comment on lines +19 to +28
public <T> T runForObject(final TransactionExecutor<T> transactionExecutor) {
return execute(transactionExecutor);
}

public void run(final Runnable runnable) {
execute(() -> {
runnable.run();
return null;
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍👍 짱깔끔해여

@@ -39,8 +44,7 @@ public static void execute(final DataSource dataSource) {
connection.close();
}
} catch (SQLException ignored) {}
DataSourceUtils.releaseConnection(connection, dataSource);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

릴리즈까지 꼼꼼!!! 👍👍

@hgo641 hgo641 merged commit 4897a4f into woowacourse:iamjooon2 Oct 11, 2023
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants