
SimpleJdbcInsert 를 사용하면, insert 쿼리 실행 로직을 좀 더 간소화할 수 있다.
우선 아래와 같이 SimpleJdbcInsert 를 설정할 수 있다.
public class JdbcTemplateMemberRepositoryV2 implements MemberRepository {
private final NamedParameterJdbcTemplate template;
private final SimpleJdbcInsert jdbcInsert;
public JdbcTemplateMemberRepositoryV2(DataSource dataSource) {
this.template = new NamedParameterJdbcTemplate(dataSource);
this.jdbcInsert = new SimpleJdbcInsert(dataSource)
.withTableName("members")
.usingGeneratedKeyColumns("id");
}
}
특징은 테이블명과 자동생성되는 key 를 명시해준다.
기존 save 메서드에 SimpleJdbcInsert 를 적용하면 아래와 같이 코드가 간결해진다.
@Override
public Member save(Member member) {
SqlParameterSource param = new BeanPropertySqlParameterSourceForEnum(member);
Number key = jdbcInsert.executeAndReturnKey(param);
member.setId(key.longValue());
return member;
}
쿼리도 없어지고 KeyHolder 도 사라졌다.
거의 JPA 와 유사한 수준으로 간단하게 처리할 수 있다.
insert 문은 SimpleJdbcInsert 생성 시 명시한 withTableName, usingGeneratedKeyColumns 를 통해 테이블 정보를 읽어서 만들어 주는 것 같다.
간단히 생각해보면, 테이블명을 알면 테이블 스키마를 알 수 있을테고 자동생성되는 key 를 제외시키면 insert 쿼리를 생성할 수 있다.
테이블에 "test" 컬럼을 하나 추가하면 아래와 같이 쿼리가 만들어지는 것을 확인할 수 있다.

도메인 Entity 에 컬럼을 추가해도 애초에 insert 쿼리는 테이블 기반으로 생성되니, insert 쿼리가 바뀌지는 않는다. 불필요한 필드가 있어도 쿼리 파라미터와 도메인 엔티티 필드 간 매핑은 가능하므로 따로 오류가 나지는 않는 것 같다.