2023-10-19: Jdbc template

대휘·2023년 10월 19일
0

TIL

목록 보기
9/11

이번에 쓰는 TIL부터는 간단한 제목을 달려고 한다. 나중에 다시 읽어보려고 쓰는 글인데 언제 썼는지 찾기가 너무 힘들다..

Database - Driver - DataSource(HikariCP)

  1. 저수준 방식: JDBC Driver에서 제공하는 API를 통해 DB와의 연결을 얻는다.
  2. DataSource를 이용한 방식: JDBC API에 있는 인터페이스인 DataSource의 구현체를 이용해 연결을 관리하는 방법. HikariCP가 대표적인 구현체이며, 연결관리가 훨씬 간편하고 연결 풀(Connection Pool)을 활용하면 성능을 향상시킬 수 있다.
  3. JDBC Template을 이용한 방식: JDBC Template를 사용하여 데이터베이스 관련 코드를 더 간결하게 작성할 수 있다. JDBC template도 DataSource를 사용하여 연결을 관리하므로, Connection Pool 구현체인 HikariCP와 함께 사용할 수 있다.

JDBC Template

DataSource를 이용해서 커넥션을 가져와서 DB에 접근하는 방식은 매번 같은 코드를 중복해서 작성해야한다. JDBC Template은 템플릿 콜백을 통해서 간결한 코드를 작성할 수 있도록 도와준다.

기존 DataSource 코드

public List<Customer> findByName(String name) { 
	List<Customer> customers = new ArrayList<>();  
	try (  
	        final Connection connection = dataSource.getConnection(); // 매번 반복 필요 
	        final PreparedStatement statement = connection.prepareStatement("select * from customers where name like ? ");  
	) {  
	    statement.setString(1, "%" + name + "%");  
	    final ResultSet resultSet = statement.executeQuery();  
	    while (resultSet.next()) {  
	        UUID customerId = toUUID(resultSet.getBytes("id"));  
	String customerName = resultSet.getString("name");  
	final LocalDateTime createdAt = resultSet.getTimestamp("created_at").toLocalDateTime();  
	final boolean isBanned = resultSet.getBoolean("is_banned");  
	customers.add(new Customer(customerId, customerName, createdAt, isBanned)); 
	    }  
	  
	} catch (SQLException e) {  
	    throw new RuntimeException(e);  
	}  
}
  
return customers;

JDBC template을 사용한 코드

public List<Customer> findByName(String name) {  
    return jdbcTemplate.query("select * from customers where name like ? ",  
            (resultSet, i) -> mapToCustomer(resultSet),  
            "%" + name + "%");
}

기존의 코드에서 반복적인 코드를 템플릿 콜백 패턴을 이용해 내부적으로 처리한다.

NamedParameterJdbcTemplate

Jdbc를 사용하면서 쓰게되는 쿼리문의 파라미터들의 이름을 이용해서 값을 바인딩하는 방법이다. 주로 Map을 이용해서 파라미터들의 값을 넘겨준다.

profile
학생

0개의 댓글