-
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단계] 포이(김보준) 미션 제출합니다. #587
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.
안녕하세요 포이~
3단계 때 구현해주신 부분에서 4단계 로직이 어느 정도 구현되어 있었어서 이번에는 정말로 추가할 리뷰가 없군요 😅 미션에는 없는 내용이기는 하지만, 완전히 로직을 분리하고 싶으시다면 프록시를 사용해보셔도 좋을 것 같습니다!
JDBC 미션도 벌써 끝이고, 올해도 벌써 10월이네요. 남은 우테코 기간도 파이팅입니다!
🔥🔥🔥 미션 수고 많으셨습니다 🔥🔥🔥
jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java
Show resolved
Hide resolved
...src/main/java/org/springframework/transaction/support/TransactionSynchronizationManager.java
Show resolved
Hide resolved
import com.techcourse.domain.User; | ||
import org.springframework.transaction.support.TransactionManager; | ||
|
||
public class TxUserService implements UserService { |
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.
현재 구현으로는 TxUserService 는 로직을 가지고 있을 수 밖에 없겠네요 🤔 UserService 를 구현하기 위해서는 findById, insert, changePassword 메서드가 필요하니까요!
완전한 분리를 위해서는 Proxy 를 사용해서 interface 의 요청을 가로챈 뒤, 트랜잭션 로직을 추가해줄 수도 있을 것 같습니다 😄
물론 미션 내용에서 벗어난 리뷰이기 때문에 포이가 원하신다면 구현하셔도 좋지만 안 하셔도 매우 충분합니다 👍
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.
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.
안녕하세요 포이!
사실 제가 Approve 를 하려고 했었는데, 다시 보니 제가 놓친 부분들이 조금 있더라고요 ㅋㅋㅋㅋ
미리 Approve 죄송합니다 사실은 Request Change 입니다 😂
어떻게 보면 크리티컬할 수도 있는 이슈일 것 같아 커멘트 남겨봤습니다!
시간 되실 때 반영해주세요 :) 마지막 미션 조금만 더 파이팅입니다 🫡
@@ -15,17 +15,15 @@ public TransactionManager(final DataSource dataSource) { | |||
} | |||
|
|||
public void doInTransaction(final Runnable runnable) throws DataAccessException { | |||
final var connection = DataSourceUtils.getConnection(dataSource); | |||
try { | |||
try (final var connection = DataSourceUtils.getConnection(dataSource)) { | |||
TransactionSynchronizationManager.bindResource(dataSource, connection); | |||
connection.setAutoCommit(false); | |||
runnable.run(); | |||
connection.commit(); | |||
} catch (final SQLException e) { |
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.
이 부분에 대해서 리뷰를 놓쳤네요! SQLException 이 발생할 때만 Rollback 이 일어난다면 어떤 일이 발생할까요?
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.
아주 치명적인 버그가 있었네요... 모든 예외에서 롤백을 수행하도록 변경했습니다!
@@ -16,11 +16,11 @@ public static Connection getResource(final DataSource key) { | |||
return getThreadLocalResource().get(key); | |||
} | |||
|
|||
public static void bindResource(final DataSource key, final Connection value) { | |||
static void bindResource(final DataSource key, final Connection value) { | |||
getThreadLocalResource().put(key, value); |
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.
고민해보시면 좋을 것 같아서 코멘트 남깁니다!
ThreadLocal
의 resources 는 왜 Map 으로 구현되어 있을까요? 사실상 Connection
으로만 구현되어 있어도 잘 동작할텐데 말이죠. 포이의 생각을 들어보고 싶네요~
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.
저도 서치하다가 알게 되었는데, ThreadLocal
에는 withInitial
메서드가 있다고 합니다! 해당 메서드를 사용해보시면 좀 더 코드가 깔끔해질 것 같아요!!!! 😄
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.
아주 좋은 기능이네요! 적용하니 코드가 깔끔해졌습니다 👍
@@ -15,17 +15,15 @@ public TransactionManager(final DataSource dataSource) { | |||
} | |||
|
|||
public void doInTransaction(final Runnable runnable) throws DataAccessException { |
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.
만약 Transaction 의 결과값이 존재한다면 어떻게 될까요? 현재 코드에서는 리턴 타입이 void 이기 때문에 결과값이 존재하는 경우에는 문제가 발생할 것 같아요 🤔 포이는 어떻게 생각하시나요?
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 Template 처럼 반환값을 갖는 대신 @Nullable
어노테이션을 사용해 이를 void 메서드에서도 재사용할 수 있도록 수정해보았습니다.
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 미션 너무 수고 많으셨어요 우테코 남은 기간도 파이팅입니다 🔥
베로 안녕하세요.
이번 단계에선 사실 크게 할일이 없었지만, 저 문장을 보고 궁금해서 스프링 공식문서를 찾아보느라 풀리퀘스트가 늦었네요.
EJB, JDNI, JTA 같은 모르는 단어들이 막 나와서 생각보다 더 오래걸렸네요
결론은 여느 스프링 기능처럼 코드 수정을 최소화하고 기존에 사용되던 기술을 쉽게 적용시킬 수 있게 하기 위해 추상화를 적용했다. 가 핵심이었던 것 같아요ㅋㅋㅋ..
이번 단계에 적용할 필요는 없는 것 같아 수정은 따로 안했습니다!
이번 단계도 잘부탁드립니다 ☑️
++ 이걸 찾아보느라 저녁도 안먹었더니 엄청 배고프네요. 저녁은 든든한 걸 먹어야겠어요