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단계 폴로 미션 제출합니다. #592

Merged
merged 6 commits into from
Oct 10, 2023

Conversation

green-kong
Copy link

금방 다시 만나게 됐네요.

step3 에서 step4로 넘어오면서
ConnectionHolder 의 역할을 TransactionSynchro~에게
ConnectionAgent 의 DatasourceUtils 에게 넘겼습니다.

그런데 이렇게 하고보니까. 이 구조에선 이게 트랜잭션인지 아닌지 구분을 어떻게하지… 싶더라구요
그래서 connection을 필드로 갖고있는 ConnectionManager을 만들었습니다.
boolean 하나 두고 트랜잭션인지 아닌지 껐다 키고 하려구요.

isTransaction이 true 인경우는 transaction이 진행중이라 close가 되지 않게 했습니다.
4단계도 잘 부탁드려요 이리내~~~

Copy link

@hectick hectick left a comment

Choose a reason for hiding this comment

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

안녕하세요 폴로!
ConnectionManager를 이용한 부분이 인상 깊었네요! 덕분에 저도 아이디어를 얻은 것 같습니다 ㅎㅎ
코드를 잘 작성해주셔서 리뷰드릴 부분이 별로 없었어요.
적절히 셀렉하여 반영해주시고 pr 한번 더 보내주시면 마지하도록 하겠습니다~

return connection;
public static ConnectionManager getConnection(final DataSource dataSource) throws CannotGetJdbcConnectionException {
final ConnectionManager manager = TransactionSynchronizationManager.getResource(dataSource);
if (!isNull(manager)) {
Copy link

Choose a reason for hiding this comment

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

isNull이란게 Objects 클래스에서 static 메서드로 제공해주는 것이군요!
들어가보니 isNull 바로 아래에 nonNull이란 것이 있던데, !로 한번 부정해주는것보다는 nonNull을 쓰는 것이 어떨까요?

private <R> R execute(final Supplier<R> transactionSupplier) {
final ConnectionManager connectionManager = DataSourceUtils.getConnection(dataSource);
try {
connectionManager.activeTransaction();
Copy link

Choose a reason for hiding this comment

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

메서드 명이 동사로 시작하도록 active, inactive대신 activate, inactivate를 써보는게 어떨까요?

Comment on lines 38 to 44
if (connectionManager.isTransaction()) {
return;
}
final ConnectionManager releasedManager = TransactionSynchronizationManager.unbindResource(dataSource);
if (connectionManager.hasSameConnection(releasedManager)) {
connectionManager.close();
}
Copy link

Choose a reason for hiding this comment

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

hasSameConnection이라는 것을 판단할 필요가 있을까요?
트랜잭션에 있는게 아니라면 바로 close해줘도 괜찮지 않을까요?
TransactionSynchronizationManager의 필드는 다음과 같아서 동일한 데이터소스에 대해 여러개의 커넥션이 존재할 순 없을 것 같다고 생각이 됩니다. HashMap이니까용

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

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

Choose a reason for hiding this comment

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

나도 모르는 새에 커넥션이 안닫히고 누수되는 것을 방지하기 위함이지요

Comment on lines 19 to +28
public void transact(final Runnable runnable) {
Connection connection = null;
try {
connection = connectionAgent.getConnectionAndSave();
connection.setAutoCommit(false);
execute(() -> {
runnable.run();
connection.commit();
return null;
});
}

public <T> T transact(final Supplier<T> supplier) {
return execute(supplier);
}
Copy link

Choose a reason for hiding this comment

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

중복을 잘 제거해주셨네요 굿

}

public static void bindResource(DataSource key, Connection value) {
public static void bindResource(final DataSource key, final ConnectionManager value) {
resources.get().put(key, value);
Copy link

Choose a reason for hiding this comment

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

그리고 여기서 이미 key를 contains하고 있다면 예외를 던져주면 안전할 것 같아요!
동일한 datasource에 대해 굴러온 value가 박힌 value를 없애버리는 상황을 방지하기 위해....

Copy link

@hectick hectick left a comment

Choose a reason for hiding this comment

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

빛의 속도로 피드백 반영을 해주셨군요!! 👍👍👍👍
이번 미션은 여기까지 하도록 하겠습니다 고생하셨어요~!
다음 미션도 화이팅입니당💪💪💪💪💪

@hectick hectick merged commit c19f884 into woowacourse:green-kong 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