💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.
스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의
백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의
www.inflearn.com
목차
1. DataSource와 커넥션 풀
2. DriveManager와 DataSource(DriveManagerDataSource)
3. HikariDataSource
4. DataSource 데이터베이스에 적용
5. Connection Pool과 DataSource 간단 정리
1. DataSource와 커넥션 풀
- DriveManager를 사용해서 커넥션을 요청할 경우 매번 새로운 커넥션을 돌려받는다. 이는 Connection 고갈의 문제를 만들 수 있고 또한 TCP/IP에서 커넥션을 연결 요청 작업이 시간이 많이 걸리기 때문에 이를 보완하기 위해서 커넥션 풀이라는 개념을 사용했다.
- DataSource는 커넥션 풀을 지원하는 인터페이스로 미리 커넥션을 만들어 두고 필요할 때 커넥션을 꺼내 쓸 수 있는 개념을 커넥션 풀이라고 한다.
2. DriveManager와 DataSource(DriveManagerDataSource)
DriveManager은 매번 새로운 커넥션을 반환하기 때문에 문제가 생길 수 있다 했다. 이런 문제를 해결하기 위해서는 커넥션 풀을 지원하는 인터페이스인 DataSource를 사용해야 하는데, DriveManager의 경우엔 이를 지원하지 않기에 DriveManagerDataSource를 사용해야 한다.
DriveManagerDataSource의 설정과 사용의 분리
DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
- 설정부로 이 부분을 설정해 준뒤 사용할 땐 설정부가 어떤지 몰라도 사용이 가능하다.
//사용부
useDataSource(dataSource);
- 사용부로 설정이 어떻게 구성되어있는지 몰라도 된다.
커넥션 풀에 있는 커넥션보다 많은 커넥션을 연결한다면?
자동으로 block 처리를 해주고 개발자는 커넥션 풀이 다 찼을 때 얼만큼의 대기 시간을 설정할 것인가가 중요하다.
3. HikariDataSource
- DataSource를 구현한 구현체로 여러 훌륭한 Open Source가 제공되고 있다. HikariDataSource는 그 중 하나이다.
- DataSource를 DI(Dependency Injection) 의존관계 주입 해주어 사용하고 있다면 어떤 DataSource 구현체를 사용하더라도 코드의 변경 없이 구현체 변경이 가능하다.
- 이때, DriveManagerDataSource도 DataSource를 상속하고 있기 때문에 이 역시도 커넥션 풀 구현체를 변경할 때 코드 변경 없이 사용이 가능하다.
4. DataSource 데이터베이스에 적용
- 의존 관계 주입(DataSource)
- DataSource의 생성자 작성
- getConnection을 DataSource껄로 변경
-
private Connection getConnection() throws SQLException { Connection con = dataSource.getConnection(); log.info("get connection = {}, class={}",con, con.getClass()); return con; }
-
- close() 메소드는 직접 만든 DBConnectionUtil이 아닌 JdbcUtil을 사용해 관련 메서드를 사용해 코드를 간결하게 한다.
-
JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(stmt); JdbcUtils.closeConnection(con);
-
5. Connection Pool과 DataSource 간단 정리
- DataSource는 커넥션 풀을 지원하는 인터페이스이다.
- 데이터 소스를 구현한 구현체들은 내가 직접 만들수도 있지만 실제 Open Source로 좋은 것들이 많이 구현되어 있으니 찾아서 쓰는 것이 좋다.
- 커넥션 풀에 있는 커넥션을 다 쓰고 있는 상황에서 close를 해주면 그 시간이 반환되고 다시 반환된 커넥션을 요청에 보내준다.
- 커넥션 풀을 사용한다는 것은 같은 커넥션을 계속 재활용하여 사용할 수 있음을 의미한다.
- 또한 DataSource의 DI로 인해서 구현체가 변경되더라도 그 부분만 변경이 될 뿐 코드의 변경은 없게 된다.
'Back-End > Spring' 카테고리의 다른 글
[Spring DB][자바 예외] - 체크, 언체크 예외의 활용 그리고 예외 포함 스택 트레이스 (0) | 2022.07.20 |
---|---|
[Spring DB][자바 예외] - 자바의 예외 이해 (0) | 2022.07.12 |
[Spring DB][커넥션풀과 데이터소스 이해] - 커넥션풀과 데이터소스란 무엇인가? (0) | 2022.06.22 |
[Spring DB][JDBC 이해] - JDBC 사용 (0) | 2022.06.22 |
[Spring DB][JDBC 이해] - JDBC와 ORM SQL Mapper에 대해서 알아보자. (0) | 2022.06.21 |