프레임워크/Spring

[Spring] SimpleJdbcInsert란 무엇인가?

멍토 2021. 6. 22.

SimpleJdbcInsert는 간단하게 데이터를 저장하기 위해 만들어진 구현체이다.

기존의 의존성 주입으로 JdbcTemplate을 받는거와는 조금 다르게 설정을 해줘야 하는 부분이 있다.

@Repository
public class SimpleInsertDao {
    private final SimpleJdbcInsert insertActor;

    public SimpleInsertDao(DataSource dataSource) {
        this.insertActor = new SimpleJdbcInsert(dataSource)
                .withTableName("customers");
    }
}

JdbcTemplate을 구성하기 위해 더 작은 단위인 DataSource를 가져와서 주입을 해주며 테이블 명을 설정해준다.

여기서 키를 사용해야 한다면 아래와 같은 내용을 추가하면 된다.

@Repository
public class SimpleInsertDao {
    private final SimpleJdbcInsert insertActor;

    public SimpleInsertDao(DataSource dataSource) {
        this.insertActor = new SimpleJdbcInsert(dataSource)
                .withTableName("customers")
                .usingGeneratedKeyColumns("id");
    }
}

여기서 Map을 이용하여 데이터를 추가 할 수 있다.

public Customer insertWithMap(Customer customer) {
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("first_name", customer.getFirstName());
        parameters.put("last_name", customer.getLastName());
        Number number = insertActor.executeAndReturnKey(parameters);
        return new Customer(number.longValue(), customer.getFirstName(), customer.getLastName());
    }

그렇지만 Map과 같은 방식은 필드가 많아지면 작업할 내용이 많아진다.

그래서 좀 더 편리하게 사용하기 위해 BeanPropertySqlParameterSource를 이용한다.

public Customer insertWithBeanPropertySqlParameterSource(Customer customer) {
    SqlParameterSource parameters = new BeanPropertySqlParameterSource(customer);
    long id = insertActor.executeAndReturnKey(parameters).longValue();
    return new Customer(id, customer.getFirstName(), customer.getLastName());
}

SqlParameterSource를 Map과 비슷하게 사용 할 수도 있다.

SqlParameterSource parameters = new MapSqlParameterSource()
                .addValue("first_name", actor.getFirstName())
                .addValue("last_name", actor.getLastName());

(이 방법은 내가 필요성을 못느껴서 그런지 모르겠지만 굳이 이렇게 써야하나 싶다.)

전체적으로 SimpleJdbcInsert를 사용해보면서 느낀점은 데이터를 넣을때는 쉽지만(sql을 굳이 작성하지 않아도 되며, KeyHold가 필요없음) Dao에서 삽입만 이뤄지는 것이 아니기 때문에 다른걸 쓰는게 좋지않을까? 라고 생각이 들었다. (이걸 쓰면서 어떠한 상황에서 써야할지 감이 오지 않았다.)

혼용해서 쓸 수도 있지만 통일성이 깨져서 오히려 보기 어렵지 않을까? 라는 생각도 해보았다.

(따로 사용하면서 좋은 점이 있다면 알려주세요.)

검프 : batch를 사용할때 편리하다, 장기적으로 볼때는 이것이 유지보수를 하는데 좋을 것 같다.

출처 : https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#jdbc-simple-jdbc

댓글

💲 광고입니다.