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단계] 디노(신종화) 미션 제출합니다. #543

Merged
merged 7 commits into from
Oct 10, 2023

Conversation

jjongwa
Copy link
Member

@jjongwa jjongwa commented Oct 8, 2023

안녕하세요 오잉!
가을모기에 물려 정신이 번쩍 뜨인 디노입니다 🦖

이번에도 우선 주어진 요구사항을 만족하는 선에서 구현을 해 보았는데요,
뭔가 더 깔끔하게 다듬을 수 있을 것 같으면서도 애매한 느낌이 드네요..ㅎㅎ
그래서 일단 리뷰 요청 후 오잉과의 의견 교환을 통해 조금 더 리팩터링 해보고 싶어요.!

마지막까지 잘 부탁드립니다아아아아🙇

@jjongwa jjongwa requested a review from hanueleee October 8, 2023 21:27
@jjongwa jjongwa self-assigned this Oct 8, 2023
@@ -0,0 +1,40 @@
package org.springframework.transaction.support;
Copy link
Member Author

Choose a reason for hiding this comment

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

이 친구의 위치에 대해 고민하다 일단 여기 두었는데,
ServeiceExceutor라는 이름이지만 결국 서비스의 transaction 관련 중복 로직을 처리해 주는 친구이기 때문에
transaction/support 위치가 알맞다는 생각이 들었습니다.!
오잉의 생각은 어떤가요?

Choose a reason for hiding this comment

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

저도 해당 클래스는 transaction/support에 위치하는 것이 맞다고 생각합니다!!
아마 ServiceExecutor라는 이름 때문에 좀 고민하시는 것 같은데,
이름을 바꿔보는 건 어떨까요?! (ex. TransactionTemplate)

Comment on lines 35 to 37
final Map<DataSource, Connection> dataSourceConnMap = resources.get();
return dataSourceConnMap.remove(key);
}
Copy link
Member Author

Choose a reason for hiding this comment

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

여기서 애초에 resources.get()을 했을때 null이 나오는 경우도 고려해 주어야 할까요.?

Choose a reason for hiding this comment

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

오오 저도 이부분은 크게 신경 안 썼는데,
이제 보니 고려해야할 것 같아요..!
미리 초기화시켜두지 않는 이상은 항상 null체크를 해주는게 좋을 것 같습니다!

private static final ThreadLocal<Map<DataSource, Connection>> resources = ThreadLocal.withInitial(HashMap::new);

Copy link

@hanueleee hanueleee left a comment

Choose a reason for hiding this comment

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

안녕하세요 다이노🦟🦖 (모기를 쫓는 공룡)
오전 6:32라니..
그 시간까지 안 주무신 건가요, 그 때 일어나신건가요?!
어느 쪽이든 대단합니다..👍

4단계 코드 깔끔하게 짜주셔서 읽기가 너무 편했어요. 감사합니다 ㅎㅎ
남겨주신 코멘트 위주로 제 생각을 적어봤어요!!

connection 관리가 참 어렵네요..
우리 모두 화이팅..

Comment on lines 19 to 22
if (dataSourceConnMap != null) {
return dataSourceConnMap.get(key);
}
return null;

Choose a reason for hiding this comment

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

밑에 bindResource()에서는 ==null로 분기처리를 하고,
여기 getResource()에서는 !=null로 분기한
이유가 궁금합니다 ㅎㅎ

Copy link
Member Author

Choose a reason for hiding this comment

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

아차차
이유따윈 없었습니다 8edf972

Comment on lines 35 to 37
final Map<DataSource, Connection> dataSourceConnMap = resources.get();
return dataSourceConnMap.remove(key);
}

Choose a reason for hiding this comment

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

오오 저도 이부분은 크게 신경 안 썼는데,
이제 보니 고려해야할 것 같아요..!
미리 초기화시켜두지 않는 이상은 항상 null체크를 해주는게 좋을 것 같습니다!

private static final ThreadLocal<Map<DataSource, Connection>> resources = ThreadLocal.withInitial(HashMap::new);

@@ -0,0 +1,40 @@
package org.springframework.transaction.support;

Choose a reason for hiding this comment

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

저도 해당 클래스는 transaction/support에 위치하는 것이 맞다고 생각합니다!!
아마 ServiceExecutor라는 이름 때문에 좀 고민하시는 것 같은데,
이름을 바꿔보는 건 어떨까요?! (ex. TransactionTemplate)

final Connection conn = DataSourceUtils.getConnection(dataSource);
try {
conn.setAutoCommit(false);
final T result = executor.execute();

Choose a reason for hiding this comment

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

템플릿 콜백 패턴 굿👍👍

Copy link
Member Author

Choose a reason for hiding this comment

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

이것이 콜백..

}

public void execute(final Connection conn, final String sql, final Object... objects) {
final Connection conn = DataSourceUtils.getConnection(dataSource);

Choose a reason for hiding this comment

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

execute의 경우는 DataSourceUtils.getConnection(dataSource)로 connection을 가져오고,
queryqueryForObject의 경우에는 dataSource.getConnection()으로 connection을 가져오고 있네요!!

그럼 현재 changePassword로직에서 userDao.findById와 userDao.update는 서로 다른 connection을 사용할 수도 있을 것 같은데,
어떻게 생각하시나용?!

Copy link
Member Author

Choose a reason for hiding this comment

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

그러네요.. update에만 정신이 팔려 있어서 미처 생각을 못했습니다..!
f6b8c25 에. 반영했습니다!

@jjongwa
Copy link
Member Author

jjongwa commented Oct 10, 2023

오잉! 디노입니다~~

일찍 보내려고 했는데 오늘 들려온 소식에 정신을 차리지 못하다가 그만..
(이제 매일 알고리즘을 풀어야만 할 것 같은...)

남겨주신 리뷰에 대한 반영 마쳤습니다!

Copy link

@hanueleee hanueleee left a comment

Choose a reason for hiding this comment

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

안녕하세요 디노!!
리뷰 반영해주신 것 확인했습니다. 감사합니다 ㅎㅎ

저만 그런지 모르겠지만, 이번 미션은 유난히 길었던 것 같아요..
무려 4단계!!를 하나씩 차곡차곡 진행하시느라 수고많으셨어요!!!
이제 정말 마지막 미션만을 앞두고 있네요 ><
우리 모두 마지막까지 화이팅!!!!!!!!!!!!!!!!!!!!!!!!!!!👩‍🎤👨‍🎤🧑‍🎤

p.s. 오늘 들려온 소식이.. 충격적이긴 했죠..ㅋㅋㅋㅋㅋ
디노가 알고리즘을 그렇게 잘한다는 소문이 들려오던데
한 수 배우러 찾아가겠습니다 선생님🏛🦖📚

@hanueleee hanueleee merged commit 1cd5e3a into woowacourse:jjongwa Oct 10, 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