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단계] 라온(문채원) 미션 제출합니다. #571

Merged
merged 7 commits into from
Oct 11, 2023

Conversation

mcodnjs
Copy link

@mcodnjs mcodnjs commented Oct 9, 2023

안녕하세요, 오션 🌊🌊!!
드디어 마지막 4단계네요 .. 길고 길었습니다 ㅋㅋ

미션 요구사항 이외에 추가적으로 TransactionCallbackTransactionTemplate 을 통해 트랜잭션 중복 로직을 제거해주었습니다.
어딘가 부족한 부분이 있는거 같지만 .. 시간이 없어서 리뷰 요청 후에 조금 더 고민해보겠습니다 ㅎㅎ
커밋이 많이 없어서 커밋 단위로 보셔도 좋을거 같아요!

마지막 4단계도 잘 부탁드립니다 🙇‍♂️
뮤텍스와 세마포어 잘 먹겠습니다 ^^

@mcodnjs mcodnjs requested a review from donghae-kim October 9, 2023 07:17
@mcodnjs mcodnjs self-assigned this Oct 9, 2023
Copy link
Member

@donghae-kim donghae-kim left a comment

Choose a reason for hiding this comment

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

안녕하세요, 라온 !!
연휴 마지막날까지 4단계 고생하셨습니다 !

Callback과 Template을 이용해서 로직을 제거해주신 부분은 잘하신 것 같아요! 그와 관련된 커멘트 남겼으니 확인해주시면 감사하겠습니다.
테스트를 꼼꼼하게 잘 작성해주신 것 같아요. 저도 라온처럼 테스트 잘 짜봐야겠네요 ..

몇가지 커멘트 남겨놨는데 확인 부탁드립니다.😀


import java.sql.SQLException;

@FunctionalInterface
Copy link
Member

Choose a reason for hiding this comment

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

라온이 1단계에서 함수형 인터페이스와 제네릭이 어렵다 했는데 이젠 정말 잘사용하시네요 👍👍

public void changePassword(final long id, final String newPassword, final String createBy) {
transactionTemplate.execute(() -> {
userService.changePassword(id, newPassword, createBy);
return null;
Copy link
Member

Choose a reason for hiding this comment

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

null을 반환하게 해야할까요 ?

}

@Nullable
public <T> T execute(final TransactionCallback<T> action) {
Copy link
Member

Choose a reason for hiding this comment

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

이 메소드를 사용하는 changePassword같은 경우에는 Callback으로 값을 반환할 필요가 없지 않을까요 ?

이 부분 때문에 괜히 return null을 메소드 내부에서 추가한 것 같아요 !

Copy link
Author

Choose a reason for hiding this comment

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

changePassword()에서는 값 반환이 비즈니스 로직 상 필요없지만, 다른 메서드에서는 값을 반환하는 경우가 무조건적으로 있다 생각해서 다음과 같이 구현하였는데요, 개발자 입장에서 해당 비즈니스 로직에 무의미한 null 반환이 들어가는 것도 좋은 방법이 아니라는 생각이 들었습니다! 스프링 구현방식을 참고해서 executeWithOutResult(Runnable action)라는 메서드를 만들고 내부에서 null 반환을 처리하는 방법으로 해결해보았습니다 ..!

Copy link
Member

Choose a reason for hiding this comment

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

executeWithOutResult(Runnable action) 메소드를 통해서 전과 다르게 null 값이 제거되고 가독성도 좋아진 것 같아요!

if (map.isEmpty()) {
resources.remove();
}
return oldConnection;
Copy link
Member

Choose a reason for hiding this comment

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

라온은 왜 여기서 Connection이 반환 되어야 한다고 생각하나요 ?
반환 값으로 사용하지도 않는데 말이에요! (저도 잘 몰라서 질문합니다)

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
Member

Choose a reason for hiding this comment

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

저도 그런식으로 이해했습니다! 그렇기에 라온은 다른 생각을 가지고 있나 궁금해서 물어봤었어요 ~ 😀

@@ -10,14 +12,39 @@ public abstract class TransactionSynchronizationManager {

private TransactionSynchronizationManager() {}

@Nullable
Copy link
Member

Choose a reason for hiding this comment

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

nullable 할 수 있음을 명시적으로 표시해주었군요 👍
혹시 sonarLint의 힘 ?!

final Connection conn = dataSource.getConnection();
final PreparedStatement pstmt = conn.prepareStatement(sql)
) {
final Connection conn = DataSourceUtils.getConnection(dataSource);
Copy link
Member

Choose a reason for hiding this comment

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

connection 재사용 좋아요 !

verify(mockConnection, times(1)).rollback();
verify(mockConnection, times(1)).close();
}
}
Copy link
Member

Choose a reason for hiding this comment

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

테스트를 진짜 잘 작성해주셨네요 리스펙합니다 !!

Copy link
Author

@mcodnjs mcodnjs left a comment

Choose a reason for hiding this comment

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

안녕하세요, 오션 🌊
무의미한 null 값을 반환하는 부분과 핸들링하는 exception만 조금 수정해봤습니다!
별거 없는데 조금 늦었네요 😅

마지막 리뷰 요청이 될 것 같은데요,
오션과 티키타카 하면서 많이 배웠고 !! 재밌었습니다 ~~
전정준씨랑 얼른 잠실에서 볼 수 있었으면 좋겠네요 ^^
며칠 안남은 테코톡 기대하겠습니다 😊 파이팅하십쇼 !!

마지막까지 잘 부탁드립니다 🙇‍♂️
감사합니다 ~~

if (map.isEmpty()) {
resources.remove();
}
return oldConnection;
Copy link
Author

Choose a reason for hiding this comment

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

흠 저도 고민해보지 않고 주어진 시그니처대로 그냥 작성했던거 같아요 ..!
어떤 커넥션이 해제되었는지 확인하는 용도로 사용하는거 아닐까요 ? 저도 이 이외의 활용은 잘 생각나지 않네요 ..

}

@Nullable
public <T> T execute(final TransactionCallback<T> action) {
Copy link
Author

Choose a reason for hiding this comment

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

changePassword()에서는 값 반환이 비즈니스 로직 상 필요없지만, 다른 메서드에서는 값을 반환하는 경우가 무조건적으로 있다 생각해서 다음과 같이 구현하였는데요, 개발자 입장에서 해당 비즈니스 로직에 무의미한 null 반환이 들어가는 것도 좋은 방법이 아니라는 생각이 들었습니다! 스프링 구현방식을 참고해서 executeWithOutResult(Runnable action)라는 메서드를 만들고 내부에서 null 반환을 처리하는 방법으로 해결해보았습니다 ..!

Copy link
Member

@donghae-kim donghae-kim left a comment

Choose a reason for hiding this comment

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

안녕하세요 라온 !

바쁜일정에도 4단계 반영 정말 잘해주셨던 것 같아요! 코드 요구사항도 완전 충족해주시고 완벽한것 같습니다!

마지막 리뷰 Approve가 되겠네요.
저도 라온이 꼼꼼하게 잘 작성해준 코드로 더 많이 배울 수 있는 기회였습니다!
JDBC 미션 고생하셨습니다!
레벨5 때 잠실에서 볼 수 있으면 좋겠네요 ^^ 근데 전 선릉이 더 가까운데..

고생하셨습니다!😀 남은 레벨4도 화이팅입니다!!

@donghae-kim
Copy link
Member

큰라온

작은라온

@donghae-kim donghae-kim merged commit b423d58 into woowacourse:mcodnjs 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