728x90
JdbcTemplate은 INSERT SQL를 직접 작성하지 않아도 되도록 SimpleJdbcInsert라는 편리한 기능을 제공한다.
JdbcTemplateItemRepositoryV3
/**
* SimpleJdbcInsert
*/
@Slf4j
public class JdbcTemplateItemRepositoryV3 implements ItemRepository {
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;
}
...
}
- JdbcTemplateItemRepositoryV3 은 ItemRepository 인터페이스를 구현했다.
- this.jdbcInsert = new SimpleJdbcInsert(dataSource) : 생성자를 보면 의존관계 주입은 dataSource를 받고 내부에서 SimpleJdbcInsert을 생성해서 가지고 있다. 스프링에서는 JdbcTemplate 관련 기능을 사용할 때 관례상 이 방법을 많이 사용한다.
- 물론 SimpleJdbcInsert 을 스프링 빈으로 직접 등록하고 주입받아도 된다.
SimpleJdbcInsert
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName("item")
.usingGeneratedKeyColumns("id");
//.usingColumns("item_name", "price", "quantity"); //생략가능
- withTableName : 데이터를 저장할 테이블 명을 지정한다.
- usingGeneratedKeyColumns : key를 생성하는 PK 컬럼 명을 지정한다.
- usingColumns : INSERT SQL에 사용할 컬럼을 지정한다.
- 특정 값만 저장하고 싶을 때 사용한다. 생략할 수 있다.
- SimpleJdbcInsert 는 생성 시점에 데이터베이스 테이블의 메타 데이터를 조회한다. 따라서 어떤 컬럼이 있는지 확인할 수 있으므로 usingColumns을 생략할 수 있다.
- 만약 특정 컬럼만 지정해서 저장하고 싶다면 usingColumns를 사용하면 된다.
- 애플리케이션을 실행해보면 SimpleJdbcInsert 이 어떤 INSERT SQL을 만들어서 사용하는지 로그로 확인할 수 있다

Save()
@Override
public Item save(Item item) {
SqlParameterSource param = new BeanPropertySqlParameterSource(item);
Number key = jdbcInsert.executeAndReturnKey(param);
item.setId(key.longValue());
return item;
}
- jdbcInsert.executeAndReturnKey(param) 을 사용해서 INSERT SQL을 실행하고, 생성된 키 값도 매우 편리하게 조회할 수 있다
구현과 실행
JdbcTemplateV3Config
@Configuration
@RequiredArgsConstructor
public class JdbcTemplateV3Config {
private final DataSource dataSource;
@Bean
public ItemService itemService(){
return new ItemServiceV1(itemRepository());
}
@Bean
public ItemRepository itemRepository(){
return new JdbcTemplateItemRepositoryV3(dataSource);
}
}
ItemServiceApplication
//@Import(MemoryConfig.class)
//@Import(JdbcTemplateV1Config.class)
//@Import(JdbcTemplateV2Config.class)
@Import(JdbcTemplateV3Config.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {
...
}728x90
'스프링 DB 2편(데이터 접근 활용 기술)' 카테고리의 다른 글
| Ch03. 테스트 - 데이터베이스 연동, 데이터베이스 분리, 데이터 롤백 (0) | 2022.06.26 |
|---|---|
| Ch02. 스프링 JdbcTemplate - JdbcTemplate 기능 정리 (0) | 2022.06.25 |
| Ch02. 스프링 JdbcTemplate - JdbcTemplate(이름 지정 파라미터) (0) | 2022.06.25 |
| Ch02. 스프링 JdbcTemplate - JdbcTemplate 적용 (0) | 2022.06.25 |
| Ch02. 스프링 JdbcTemplate - JdbcTemplate 소개와 설정 (0) | 2022.06.25 |