MemberRepositoryV1, MemberRepositoryV1Test 를 수정해보자.
MemberRepositoryV1
똑같이 복사하여 MemberRepositoryV1을 만들고 DataSource 를 주입받자.
getConnection 메서드를 커넥션 풀에서 가져온 커넥션을 반환하도록 변경
getConnection() 을 커넥션 풀에서 가져오게 수정하자.
dataSource에서 getConnection으로 커넥션을 가져와 사용하자.
close 메서드를 JdbcUtils 를 이용하여 변경
이렇게 바꿔주자! 역순으로 닫아준다.
-> 내부적으로 원래 처럼 try catch 로 짜져 있겠지?
closeResultSet 만 보자면 우리가 구현 한 것과 똑같이 구현되어있다.
MemberRepositoryV1Test - DriverManagerDataSource
DriverManagerDataSource를 사용했기 때문에 매번 새로운 커넥션을 맺는다.
-> 1. Creating new JDBC... 문구
-> 2. con1, con2, con3, con4 ..... 문구
로 확인가능.
DriverManagerDataSource 쓰는 방법 : 속도가 느리다. -> 커넥션 풀을 쓰자.
MemberRepositoryV1Test - DataSource
이렇게 바꿨다. -> new HikariDataSource를 DataSource 인터페이스로 받을 수도 있지만 DataSource인터페이스에는 .setJdbcUrl, .setUsername, .setPassword 메서드가 없으므로 MemberRepositoryV1의 인수로 넣어줄 때 DataSource로 받는다.
히카리 프록시객체가 모두 다른 건 알겠는데 왜 감싸고 있는 Jdbc Connection이 다 conn0 이지????
우리가 지금 save, findById, update 메서드 에서 는 각각 마지막에 finally 구문을 통해 close 해주고 있다.
이때 closeConnection을 할 경우 Connection Pool의 경우 커넥션을 닫는게 아니라 Pool에 반환한다.
-> 실제 커넥션을 wrapping하고 있는 히카리 프록시 객체에 closeConnection 시 실제 커넥션 닫지않고 Pool에 반환하는 로직이 있음.
conn0을 썼다 반환 썼다 반환..... 반복 (히카리 객체의 주소는 다 다르다.)
왜 다르지? -> 매번 커넥션 요청에 반환할 때마다 새로 wrapping해서 반환해줌
최종 결론
DataSource는 "커넥션을 획득하는 방법"을 추상화
# 본 게시글은 인프런 김영한님의 강의를 수강 후 반복학습을 위해 정리한 내용입니다.
꾸준히 다시보자.
1. 221014
2. 221031
'Java, Spring > Spring DB 1' 카테고리의 다른 글
3-3. 트랜잭션 - DB 예제1 - 개념 이해, 3-4. 트랜잭션 - DB 예제2 - 자동 커밋, 수동 커밋 (2) | 2022.09.23 |
---|---|
3-1. 트랜잭션 - 개념 이해, 3-2. 데이터베이스 연결 구조와 DB 세션 (1) | 2022.09.23 |
2-4. DataSource 예제2 - 커넥션 풀 (0) | 2022.09.22 |
2-3. DataSource 예제1 - DriverManager (0) | 2022.09.22 |
2-2. DataSource 이해 (0) | 2022.09.22 |