var connection = DriverManager.getConnection(
"jdbc:mysql://localhost/order_mgmt", // order_mgmt는 데이터베이스
"user",
"password");
var statement = connection.createStatement();
var resultSet = statement.executeQuery("select * from customer");
// resultSet에 쿼리의 결과가 들어감
statement.close();
connection.close();
// 예외처리 없음
try-catch-finally
try 블록에서 예외가 발생하는 경우 코드 실행 중단
catch 에 지정된 예외와 일치하면 catch 블록 실행
finally : 예외 처리의 발생 여부에 관계 없이 무조건 실행
try with resources
try 구문에 리소스를 선언하고 리소스를 사용 후 자동으로 반납해주는 기능
java.lang.AutoCloseable 인터페이스를 구현해야함
해당 구문을 사용하여 connection, statement, resultSet을 명시적으로 close하지 않아도 됨
try(
var connection = DriverManager.getConnection(
"jdbc:mysql://localhost/order_mgmt",
"user",
"password");
var statement = connection.createStatement();
var resultSet = statement.executeQuery("select * from customer");
// 자동으로 close 됨
) {
//.....
}
catch (SQLException throwable) {
logger.error("Got error while closing connection");
}
DBCP
Connection Pool
동시 접속자가 가질 수 있는 connection을 하나로 모아놓고 관리하는 개념
Connection을 미리 만들어 pool속에 저장해 두고 필요할 때 pool에서 사용, 사용후 다시 pool로 반납함
특징
미리 connection이 생성되어 있으므로 Connection을 생성하는 데 드는 연결 시간이 소비되지 않고, 닫는 시간이 소비되지 않음 → 어플리케이션의 속도가 빨라짐
Connection은 계속 재사용 되므로 생성되는 connection의 수가 많지 않음
Connection 풀 내부의 connection의 개수는 한정적이므로 동시 접속자가 많아지면 대기해야함
Connection이 미리 생성되므로 Connection pool의 크기를 크게 설정하면 메모리 소모가 큼
DataSource
java에서 제공하는 Connection pool을 관리하는 목적으로 사용되는 인터페이스
Connection pool의 각각의 객체를 직접적으로 이용하면 체계적으로 관리하기 어렵기 때문에 사용
DB와 관계된 Connection 정보를 담고 있으며, bean으로 등록하여 인자로 넘겨준다.
HikariCP
Spring Boot에서 기본적으로 사용하는 Connection Pool
var dataSource = DataSourceBuilder.create()
.url("jdbc:mysql://localhost/order_mgmt")
.username("root")
.password("password")
.type(HikariDataSource.class)
.build();
// hikariCP를 Connection Pool로 사용도록 dataSource 인스턴스를 가져옴
// dataSource는 인터페이스로 사용되므로 해당 인터페이스의 기능을 사용할 수 있다
// setMaximumPoolSize : 최대 Connection 개수
// setMinimumIdle : 최소 Connection 개수
var connection = dataSource.getConnection();
// hikariCP에서 Connection을 받아오는 코드
디자인 패턴
전략 패턴
클라이언트가 Context에게 문맥에 맞는 Strategy를 주입해주는 것
ex) 인터페이스로 여러 전략을 구현해 놓고, 클라이언트가 context 객체에 전략 주입
템플릿 콜백 패턴
전략 패턴에서 주입되는 전략이 익명 내부 클래스인 패턴으로 람다식이 주입 가능하다.
템플릿 : 정해져 있는 틀, 전략 패턴에서 context를 템플릿이라 한다.
콜백 : 익명 내부 클래스로 만들어지는 오브젝트를 콜백이라고 한다.
JDBC Template에서 사용되는 패턴
JDBC Template
기존의 JDBC API 보다 간결한 사용법을 제공해주고, 반복되는 코드를 줄이기 위해 사용
Connection 객체, PreparedStatement 객체를 생성하고 ResultSet, PreparedStatement, Connection을 close 하는 반복을 줄여줌
생성할 때 DataSource가 필요함
query 메소드
List<T> query(String sql, RowMapper<T> rowMapper)
sql 파라미터로 쿼리문을 전달받고, RowMapper을 이용하여 ResultSet 결과를 반환
RowMapper는 함수형 인터페이스로 람다식으로 전달 가능함
→ RowMapper로 ResultSet 객체를 원하는 객체로 매핑 가능함
queryForObject 메소드
결과를 리스트가 아닌 오브젝트로 받는 메소드
결과가 한 행인 경우에만 사용 가능함 (아닐 경우 예외 발생)
update 메소드
int update(String sql) 또는 int update(String sql, Object … args)