[Spring] 쉽게 익히는 JDBC Template 사용법 및 간단 예제
스프링에서 제공해주는 JDBC Template은 순수하게 JDBC Connection을 얻어서 DB API를 사용하는 것 보다 편하고 자주 쓰는 반복코드를 많이 줄일 수 있다.
다만 JPA나 QueryDsl과 다르게 db에 날리는 쿼리들을 직접 작성해야 한다는 단점이 있다.
* 참고
JdbcTemplate을 사용하기 위해서는 먼저 Spring에 DB 연결 세팅을 해야한다.
필자의 경우는 MySQL과 연동하였지만 가볍게 예제프로젝트 용으로 굴릴 예정이신 분이라면 H2를 추천한다.
아직 DB 연동이 안되어 있는 분들은 아래 게시글들을 참고하기를 바란다.
1. 개발용으로 가볍고 편리한 H2 데이터베이스 설치 및 SpringBoot에 연동하기
2. DB구축을 위한 MySQL 및 Workbench 설치&SpringBoot 연동
1. 도메인 객체(UserVO)
이 포스팅에서 다룰 도메인 객체인 UserVO의 정보는 다음과 같다.
@Getter @Setter
public class UserVO {
private Long id;
private String name;
}
2. Repository 의 inteface
그리고 작성하고자 하는 Repository의 interface는 다음과 같다.
public interface UserRepository {
UserVO save(UserVO userVO);
Optional<UserVO> findById(Long id);
Optional<UserVO> findByName(String name);
List<UserVO> findAll();
}
간단하게 데이터를 저장하는 save와 id와 name을 통해 조회하는 기능, 그리고 전체 조회를 만들어 볼 예정이다.
3. Repository 구현체
해당 기능들을 JDBC Template로 구현한 소스 코드는 다음과 같다.
public class JdbcTemplateUserRepository implements UserRepository{
private final JdbcTemplate jdbcTemplate;
@Autowired
public JdbcTemplateUserRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public UserVO save(UserVO userVO) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("user").usingGeneratedKeyColumns("id");
//파라미터 바인딩
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", userVO.getName());
// 실행 & db 에서 생성된 key 받아오기
Number key = jdbcInsert.executeAndReturnKey(new
MapSqlParameterSource(parameters));
userVO.setId(key.longValue());
return userVO;
}
@Override
public Optional<UserVO> findById(Long id) {
List<UserVO> result = jdbcTemplate.query("select * from user where id = ?", userRowMapper(), id);
return result.stream().findAny();
}
@Override
public Optional<UserVO> findByName(String name) {
List<UserVO> result = jdbcTemplate.query("select * from user where id= ?", userRowMapper(),name);
return result.stream().findAny();
}
@Override
public List<UserVO> findAll() {
return jdbcTemplate.query("select * from user", userRowMapper());
}
private RowMapper<UserVO> userRowMapper() {
return (rs, rowNum) -> {
UserVO userVO = new UserVO();
userVO.setId(rs.getLong("id"));
userVO.setName(rs.getString("name"));
return userVO;
};
}
}
먼저 생성자로 DB 커넥션 정보를 가지고 있는 Datasource 를 스프링 컨테이너에게 주입받기 위해 매개변수로 받아온다.
이렇게 주입받은 datasource로 new JdbcTemplate(datasource) 와 같이 사용하여
JdbcTemplate을 생성하면 된다.
기본적인 사용법은 다음과 같다.
jdbcTemplate.query("쿼리문", RowMapper<?>, 바인딩할 파라미터 값)
여기서 RowMapper는 결과값을 매핑하는 용도라고 보면 되고
바인딩할 파라미터는 순서대로 쿼리문의 ? 에 대응되어 값이 들어가게 된다.
Insert의 경우가 약간 특이한데
쿼리문을 따로 생성할 필요는 없고
SimpleJdbcInsert 를 생성하여 파라미터를 바인딩하여 사용하면 된다.
일반적으로는 jdbcTemplate.execute() 를 호출하면 쿼리가 날아가지만
필자의 경우 db에서 ID값이 생성되도록 해 놓았으므로
일단 쿼리를 날리고 생성된 id값을 받아오기 위해 executeAndReturnKey 를 사용하였다.
Reference
이 포스팅은 아래의 강좌를 참고하여 만들어졌습니다.
- 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
'Backend > Spring' 카테고리의 다른 글
[Spring] HTTP Range Requests 를 이용한 비디오 스트리밍 만들기(Video Streaming) (0) | 2021.02.07 |
---|---|
[Thymeleaf]HTML Form 태그로 서버에 Multipart 형식의 데이터 전송하기(+로그인 인증문제 해결) (0) | 2021.02.03 |
[Spring]AOP의 개념 및 적용 예제(공통관심사 처리하기) (1) | 2020.11.23 |
[Spring]Request Scope를 사용해서 깔끔하게 로그남기기 (0) | 2020.11.19 |
[Spring]프로토 타입 빈 사용시 생기는 문제점 해결하기(ObjectProvider와 JSR-330 Provider) (0) | 2020.11.12 |