프레임워크/Spring

[Spring] NamedParameterJdbcTemplate 이란 무엇인가?

멍토 2021. 6. 22. 16:48

기존에 사용하던 JdbcTemplate 같은 경우는 우리가 데이터를 넣을 부분에 ?를 이용하여 처리를 했다.

이러한 방식은 인자 위치에 대한 순서가 강제되는데 이러한 방식은 가독성을 떨어트린다.

그래서 나온것이 NamedParameterJdbcTemplate이다.

NamedParameterJdbcTemplate는 ?대신 :변수명 을 이용하여 처리함으로써 순서에 강제를 받지 않는다.

public int countOfActorsByFirstName(String firstName) {

    String sql = "select count(*) from T_ACTOR where first_name = :first_name";

    SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);

    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}

값은 ParameterSource를 이용하여 입력을 해준다.

아래와 같이 Map으로도 처리가 가능하다.

public int countOfActorsByFirstName(String firstName) {

    String sql = "select count(*) from T_ACTOR where first_name = :first_name";

    Map<String, String> namedParameters = Collections.singletonMap("first_name", firstName);

    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters,  Integer.class);
}

개인적으로 강력하다고 생각되는 기능은 객체와 매핑하는 것이다.

public class Actor {

    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public Long getId() {
        return this.id;
    }
}

Actor의 코드가 위와 같다고 할때 BeanPropertySqlParameterSource를 이용하면 아래와 같이 편하게 처리가 가능하다.

public int countOfActors(Actor exampleActor) {

    String sql = "select count(*) from T_ACTOR where first_name = :firstName and last_name = :lastName";

    SqlParameterSource namedParameters = new BeanPropertySqlParameterSource(exampleActor);

    return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}

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