NamedParameterJdbcTemplate이란?
JdbcTemplate은 파라미터를 순서대로 바인딩한다.
String sql = "update item set item_name=?, price=?, quantity=? where id=?";
template.update(sql,
itemName,
price,
quantity,
itemId);
예를 들어 위와 같은 코드가 있다면, sql의 ?에 itemName, price, quantity, itemId 파라미터가 순서대로 바인딩된다.
이렇게 순서를 제대로 지킨다면 문제가 없는 코드이다.
하지만 모종의 이유로 위의 SQL 코드를 변경하게 된다고 생각해보자. 실무에서 수십 개의 파라미터를 사용한다고 했을 때 순서에 맞춰 파라미터를 바인딩 하기는 쉽지 않을 것이고, 만약 실수로 파라미터가 잘못 들어가게 되면 버그를 고치기가 매우 어렵다.
NamedParameterJdbcTemplate은 이러한 문제를 해결해준다.
NamedParameterJdbcTemplate는 이름을 지정해서 파라미터를 바인딩할 수 있다.
String sql = "update item set item_name=:itemName, price=:price, quantity=:quantity where id=:itemId";
sql문에 ":파라미터 이름"처럼 입력하면 NamedParameterJdbcTemplate는 파라미터 이름에 해당하는 파라미터를 넣어주게 된다.
이때 파라미터를 전달하려면 Map처럼 (key, value) 데이터 구조를 만들어서 전달해야 한다.
여기서 key는 :파라미터이름 으로 지정한 파라미터의 이름이고, valuesms 해당 파라미터의 값이다.
이때 자주 사용하는 파라미터의 종류는 크게 3가지가 있다.
1. Map
단순히 Map 자료구조를 이용한다.
Map<String, Object> param = Map.of("id", id);
Item item = template.queryForObject(sql, param, itemRowMapper());
2. MapSqlParameterSource
SqlParameterSource 인터페이스의 구현체로 메서드 체인을 통해 편리한 사용이 가능하다.
SqlParameterSource param = new MapSqlParameterSource()
.addValue("itemName", itemName )
.addValue("price", price)
.addValue("quantity", quantity)
.addValue("id", itemId);
template.update(sql, param);
3. BeanPropertySqlParameterSource
자바빈 프로퍼티 규약을 통해 자동으로 파라미터 객체를 생성한다.
예) getXxx() -> xxx, getItemName() -> itemName
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
KeyHolder keyHolder = new GeneratedKeyHolder();
template.update(sql, param, keyHolder);
SimpleJdbcInsert란?
JdbcTemplate은 InsertSQL을 직접 작성하지 않아도 되도록 SimpleJdbcInsert라는 편리한 기능을 제공한다.
private final NamedParameterJdbcTemplate template;
private final SimpleJdbcInsert jdbcInsert;
public JdbcTemplateItemRepositoryV3(DataSource dataSource) {
this.template = new NamedParameterJdbcTemplate(dataSource);
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName("item")
.usingGeneratedKeyColumns("id");
// .usingColumns("item_name", "price", "quantity"); //생략 가능
}
@Override
public Item save(Item item) {
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
Number key = jdbcInsert.executeAndReturnKey(param);
item.setId(key.longValue());
return item;
}
- withTableName : 데이터를 저장할 테이블 명을 지정한다.
- usingGeneratedKeyColumns : key를 생성하는 PK 칼럼 명을 지정한다.
- usingColumns : INSERT SQL에 사용할 칼럼을 지정한다. 특정 값만 저장하고 싶을 때 사용한다. 생략할
수 있다. - SimpleJdbcInsert는 생성 시점에 데이터베이스 테이블의 메타 데이터를 조회한다. 따라서 어떤 칼럼이
있는지 확인할 수 있으므로 usingColumns을 생략할 수 있다. 만약 특정 칼럼만 지정해서 저장하고
싶다면 usingColumns를 사용하면 된다.
SimpleJdbcInsert는 생성된 키 값도 매우 편리하게 조회할 수 있다.
참고
해당 게시글은 인프런 강의(스프링 DB 2편 - 데이터 접근 활용 기술, 김영한)를 듣고 정리한 내용입니다.
1. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
'Back-End > [Spring]' 카테고리의 다른 글
[Spring] 실무에서 활용하는 @PathVariable 사용법, @RequestParam 차이 (0) | 2024.01.23 |
---|---|
[Spring] 실무에서 활용하는 @RequestParam 사용법 (0) | 2023.12.14 |
[Spring] JdbcTemplate이란? JdbcTemplate 사용법, RowMapper란? (0) | 2022.12.13 |
[Spring] 체크 예외(Checked Exception) vs 언체크 예외(Unchecked Exception)/런타임 예외(RuntimeException), 예외전환 (0) | 2022.12.01 |
[Spring] JDBC(Java Database Connectivity)란? JDBC 드라이버란? (0) | 2022.11.10 |