Tech/Spring

JdbcTemplate : 이름 지정 파라미터

봄의 개발자 2023. 12. 5.
728x90
반응형

이름 지정 파라미터

map 처럼 key-value 데이터 구조 만들어서 전달해야 한다.

  • Map
  • SqlParameterSource
    • MapSqlParameterSource
    • BeanPropertySqlParameterSource

1. Map

Map<String, Object> param = Map.of("id", id);
Item item = template.queryForObject(sql, param, itemRowMapper());

 

2. MapSqlParameterSource

  • Map 과 유사한데, SQL 타입을 지정할 수 있는 등 SQL에 좀 더 특화된 기능을 제공
  • SqlParameterSource 인터페이스의 구현체이다.ㄴ
  • MapSqlParameterSource 는 메서드 체인을 통해 편리한 사용법도 제공한다.
SqlParameterSource param = new MapSqlParameterSource()
 .addValue("itemName", updateParam.getItemName())
 .addValue("price", updateParam.getPrice())
 .addValue("quantity", updateParam.getQuantity())
 .addValue("id", itemId); //이 부분이 별도로 필요하다.
template.update(sql, param);

 

3. BeamPropertySqlParameterSource

  • 자바빈 프로퍼티 규약을 통해서 자동으로 파라미터 객체 생성
  • key=itemName, value=상품명 값
  • key=price, value=가격 값
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
KeyHolder keyHolder = new GeneratedKeyHolder();
template.update(sql, param, keyHolder);
  • BeanPropertySqlParameterSource를 항상 사용할 수 있는 건 아니다.
  • 예를 들어서 update() 에서는 SQL에 :id 를 바인딩 해야 하는데, update() 에서 사용하는 ItemUpdateDto 에는 itemId 가 없다. 따라서 BeanPropertySqlParameterSource 를 사용할 수 없고, 대신에 MapSqlParameterSource 를 사용했다.

BeanPropertyRowMapper

  • BeanPropertyRowMapper 는 ResultSet 의 결과를 받아서 자바빈 규약에 맞추어 데이터를 변환한다.
  • 예를 들어서 데이터베이스에서 조회한 결과가 select id, price 라고 하면 다음과 같은 코드를 작성해준다. (실제로는 리플렉션 같은 기능을 사용한다.)
  • Item item = new Item(); item.setId(rs.getLong("id")); item.setPrice(rs.getInt("price"));
  • 데이터베이스에서 조회한 결과 이름을 기반으로 setId() , setPrice() 처럼 자바빈 프로퍼티 규약에 맞춘 메서드를 호출하는 것이다

별칭

  • select item_name 의 경우 setItem_name() 이라는 메서드가 없기 때문에 골치가 아프다. 이런 경우 개발자가 조회 SQL을 다음과 같이 고치면 된다.
  • select item_name as itemName
  • 이렇게 데이터베이스 컬럼 이름과 객체의 이름이 다를 때 별칭( as )을 사용해서 문제를 많이 해결한다.
  • JdbcTemplate 은 물론이고, MyBatis 같은 기술에서도 자주 사용된다.

관례의 불일치

  • 자바 객체는 카멜 표기법 사용
  • 관계형 데이터베이스는 주로 언더스코어를 사용하는 snake_case 표기법을 사용한다.
  • BeanPropertyRowMapper는 언더스코어 표기법을 카멜로 자동으로 변환해준다.
728x90
반응형

댓글