템플릿은 jdbcTemplate말고 NamedParameterJdbcTemplate와 SimpleJdbcInsert도 있다.
이것에 대해서 자세히 알아보자.
말 그대로 jdbcTemplate인데, 파라미터에 이름을 붙일 수 있다.
jdbcTemplate와 완전히 동일하지만, 인자를 처리하는 부분에서 차이가 있다.
우선 기존의 JdbcTemplate의 단점부터 알아보자.
기존의 템플릿은 편하긴 하지만, 인자가 많아지면 곤란하다.
다음을 보자.
String name = jdbcTemplate.queryForObject(
"SELECT name FROM USER WHERE firstname=?, lastname=?",
String.class,
"Secu", "Loper");
위처럼 SQL문의 인자가 ?로 모두 동일하다.
때문에, 실수로 둘의 순서를 바꿔 문제없으며, 런타임 시에 에러가 발생하는 불상사가 일어난다.
// 순서가 바뀌었으므로 에러가 뜸!!
String name = jdbcTemplate.queryForObject(
"SELECT name FROM USER WHERE firstname=?, lastname=?",
String.class,
"Loper", "Secu");
런타임 에러가 나면 해당 부분을 찾게될 것이고, 소스코드를 수정하는 등 실수 한번으로 일이 꽤 커진다.
반면 Named 템플릿은 일일히 이름을 지정하므로, 그럴 수가 없다.
// 인자 설정
String firstname = "Secu";
String lastname = "Loper";
// 순서 상관 ㄴㄴ
String name = namedTemplate.queryForObject(
"SELECT name FROM USER WHERE firstname=:firstname, lastname=:lastname",
String.class,
firstname, lastname);
순서가 바뀌어도 상관없다. 변수의 이름을 보고 판단하기 때문이다.
즉, firstname과 lastname 2개만 있으면 된다.
그럼 이제 사용 방법을 알아보자.
기존 템플릿과 완전히 동일하므로, SELECT 예시만을 살펴보기로 한다.
우선 해당 템플릿을 주입해준다.
private NamedParameterJdbcTemplate namedTemplate;
public setNamedTemplate(DataSurce dataSource) {
this.namedTemplate = new NamedParameterJdbcTemplate(dataSource);
}
Named 템플릿에서는 인자를 ?대신 이름을 지정하여 사용한다.
// 인자 설정
String first = "Secu";
String last = "Loper";
// 순서 상관 ㄴㄴ
String name = namedTemplate.queryForObject(
"SELECT name FROM USER WHERE firstname=:first, lastname=:last",
String.class,
first, last);
위처럼 first와 last를 사용하여 인자를 서로 구분하였다.
이제 인자를 잘못 넣는 상황은 없을 것이다.
정말 이름 그대로 INSERT 구문이 간단해지는 템플릿이다.
이건 사용법만 봐도 바로 느낌이 온다. 살펴보자.
마찬가지로 의존성을 주입해준다.
private SimpleJdbcInsert simpleInsert;
public setSimpleInsert(DataSurce dataSource) {
this.simpleInsert = new SimpleJdbcInsert(dataSource)
.withTableName("user").usingGenerateKeyColumns("id");
}
withTableName은 어떤 테이블에 INSERT를 할건지,
usingGenerateKeyColumns은 INSERT 시, 메인키를 자동 생성할 건지를 정하는 구문이다.
따라서 각각 테이블 이름 user와 메인키인 id를 넣어주었다.
이제 끝이다. 메소드만 작성해주면 된다.
public Long insert(User user) {
SqlParameterSource params = new BeanPropertySqlParameterSource(user);
return simpleInsert.executeAndReturnKey(params);
// return simpleInsert.excute(params);
}
쿼리를 날린 땐 2가지가 있는데,
그냥 Insert만 하고 싶다면 excute()를
Insert 후의 결과물도 보고 싶다면 excuteAndReturnKey()를 사용한다.
excuteAndReturnKey()를 하면, Insert한 데이터의 메인키를 반환하게 된다.
이상으로 길고 긴 Spring JDBC에 대해 모두 알아보았다.
이제 이 시리즈의 최종 관문! DAO/DTO에 대해 알아볼 차례이다.
다음 편에서는 우선 DAO/DTO에 대한 개념을 파악해 볼 것이다