-
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 라이브러리 구현하기 - 3단계] 도이(유도영) 미션 제출합니다. #463
Conversation
- JdbcTemplate의 메서드는 외부에서 Connection을 전달받도록 함 - JdbcTemplate 다건, 단건 조회 메서드 통합하면서 단건 조회 검증로직 추가 - Dao의 메서드는 Connection을 전달받을 수도, 받지 않을 수도 있음 - Connection을 전달받으면 이를 통해 JdbcTemplate 메서드 실행 - Connection을 전달받지 않으면 TransactionManager를 통해 독립된 트랜잭션으로 실행
final var... 왜 우리 컨벤션 안지키시죠? |
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.
안녕하세요 도이! 제 미션을 구현해보고 리뷰를 달아야 더 깊게 이해하고 달 수 있을 것 같아 리뷰하는데 시간이 더 걸렸던 것 같습니다 ㅜ 기다려주셔서 감사하고 이번 미션도 커멘트 몇 개 달았습니다만 워낙 깔끔하게 구현도 잘하시고 빠르게 4단계도 하셨으면 하는 마음에 머지하겠습니다! 되신다면 빠르게 4단계 제출해주시면 리뷰할게요!!
@@ -26,7 +32,11 @@ public void insert(final User user) { | |||
public void changePassword(final long id, final String newPassword, final String createBy) { | |||
final var user = findById(id); | |||
user.changePassword(newPassword); | |||
userDao.update(user); | |||
userHistoryDao.log(new UserHistory(user, createBy)); | |||
transactionManager.save( |
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.
트랜젝션 메니저를 통해 Dao 메서드에 트랜젝션을 구현하셨군요! 기존 API에 큰 변경 없이 잘 설계 해주셨네요! 감동입니다 ㅜㅜ 저는 이부분 고민 많이했거든요.. 도이처럼 JDBCTemplate API 명세를 보니 Callback 함수형 인터페이스를 사용해서 저도 적극 활용을 해봤는데 Transaction이 들어가고 특히나 두 메서드를 동시에 트랜젝션 거는 작업이 어려웠던 것 같습니다.. 제 말이 길었네요! 트랜젝션 메서드로 일관되게 트랜젝션 걸어주셔서 잘하신것 같습니다!
public int executeUpdate(final String query, final Object... parameters) { | ||
return execute(query, (connection, preparedStatement) -> preparedStatement.executeUpdate(), parameters); | ||
public int executeUpdate(final Connection connection, final String query, final Object... parameters) { | ||
PreparedStatementCallback<Integer> preparedStatementCallback = PreparedStatement::executeUpdate; |
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.
뭔기 이번 단계에서 final var를 주로 사용하신 것 같은데, 이 부분에서는 일부로 타입을 명시해주신건가요? 왠지 함수형 인터페이스라 잘 읽히지 않을 것 같아서 명시적으로 타입을 적으신거 같아서요!
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.
var를 쓰려고 하면 Cannot infer type: method reference requires an explicit target type
라고 하면서 빨간 줄이 뜨더라고요!
그런데 final은 실수로 빼먹었고 / 위 부분은 애초에 변수로 뺄 필요가 없어 보이기도 하네요 ㅎㅎㅎ
다음 단계에서 같이 수정하겠습니당
import java.sql.SQLException; | ||
|
||
@FunctionalInterface | ||
public interface ConnectionCallback<T> { |
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.
저도 이거 만들었다가 지워야하는데 어떻게 안지우고 할 수 있는 방법을 찾고 있는 중입니다..
요 방법이 어떤 걸 의미하시는지 이해를 못했습니다..!! 혹시 더 설명해주실 수 있을까용
안녕하세요 에코!! 🧑🚀
2단계에서도 좋은 리뷰 주셔서 감사합니다. 질문해주신 코멘트에 답변하면서 제 생각도 정리할 수 있었어요!
제가 이번 주말에 시간을 많이 쓰지 못할 것 같아서, 어제 미리 진행해둔 내용을 기반으로 리뷰 요청드립니다.
아래와 같은 흐름으로 구현을 진행했습니다. 2단계 내용에서 조금 바뀐 부분도 있어서 포함해서 설명드려요!
JdbcTemplate의 다건, 단건 조회 메서드를 통합하면서 단건 조회 검증로직 추가 (중복 코드 줄이기 위함)
JdbcTemplate의 메서드는 외부에서 Connection을 전달받도록 함
Connection에 대한 책임이 사라지면서 기존 ConnectionCollback 인터페이스의 네이밍, 시그니쳐 변경
Dao는 Connection을 매개변수로 받을 수도, 받지 않을 수도 있음
update(Connection connection, User user)
)BiConsumer
) (ex.update(User user)
)Service도 TransactionManager를 통해 원하는 로직을 하나의 트랜잭션으로 묶을 수 있음
Connection을 전달받지 않으면 TransactionManager를 통해 독립된 트랜잭션으로 실행
이번에도 잘 부탁드립니다!!