이전 글로 JdbcTemplate 소개를 다루어 보았습니다.
JdbcTemplate와 MyBatis - JdbcTemplate 소개
JdbcTemplate 소개 SQL Mapper 기술인 JdbcTemplate 설정의 편리함 반복 문제 해결 JdbcTemplate만 사용할 시 단점 에 대해 다룹니다. SQL Mapper 기술인 JdbcTemplate SQL Mapper는 ORM 기술과 같이 매우 편리한 Data Access
hhhhicode.tistory.com
이번 글로 JdbcTemplate 적용을 다루어 보겠습니다.
내용이 좀 되므로 데이터 조회, 데이터 변경 순으로 알아보겠습니다.
JdbcTemplate 적용(데이터 조회)
- DataSource 설정
- JdbcTemplate DI 받기
- SQL문
에 대해 다룹니다.
DataSource 설정
JdbcTemplate는
DataSource를 사용해서 Connection을 획득합니다.
DataSource는 각 DB 벤더들의 Connection을 획득하기 위한 방법들을 추상화시킨 Interface입니다.
또한 DataSource 객체를 사용해서 JdbcTemplate 객체를 생성합니다.
스프링에서 자동으로 DataSource를 생성하고 스프링 빈으로 등록해주기 위해
몇 가지 설정해야 할 것들이 있습니다.
다시 한 번 말하지만, Spring Framework는 매우 Configuration 합니다.
Configuration 하다는 게 영어 문법적으로 안 맞는 거 같지만 그려려니 해주세요...ㅠ
데이터베이스 접근 설정
application.properties에서 설정합니다.
spring.datasource.url=jdbc:h2:tcp://localhost/~/MyProject
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=123
이렇게 설정만 하면
스프링 부트가 해당 설정을 사용해서
Connection Pool과 DataSource, TransactionManager를 스프링 빈으로 자동으로 등록해줍니다.
프로젝트마다, 사용하는 데이터베이스마다 해당 설정은 조금 다를 것입니다.
저는 h2 데이터베이스를 사용 중입니다.
JdbcTemplate DI 받기
JdbcTemplate는 DataSource를 DI 받고
해당 DataSource를 사용해서 JdbcTemplate 객체를 생성합니다.
관례상 이 방법을 많이 사용합니다.
이름으로 쿼리 파라미터를 바인딩하는 NamedParameterJdbcTemplate로 JdbcTemplate를 만들어보겠습니다.
@Autowired
public H2MemberRepository(DataSource dataSource) {
this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
SQL문
데이터 조회
참고로 JdbcTemplate이 실행하는 SQL 로그를 확인하고 싶으시면
application.properties에 다음을 추가하면 됩니다.
logging.level.org.springframework.jdbc=debug
findById 예시
public Optional<Member> findById(Long id) {
String sql = "SELECT * FROM members WHERE id = :id";
SqlParameterSource param = new MapSqlParameterSource()
.addValue("id", id);
try {
Member findMember = jdbcTemplate.queryForObject(sql, param, BeanPropertyRowMapper.newInstance(Member.class));
return Optional.of(findMember);
} catch (DataAccessException e) {
return Optional.empty();
}
}
- jdbcTemplate.queryForObject()
- 결과 row가 하나일 때 사용됩니다.
- 결과가 없으면, EmptyResultDataAccessException이 발생합니다.
- 결과가 둘 이상이면, IncorrectResultSizeDataAccessException이 발생합니다.
- sql은 sql문을 작성해줍니다.
- :id는 이름으로 쿼리 파라미터를 바인딩할 때 사용합니다.
- NamedParameterJdbcTemplate 객체로 JdbcTemplate를 만들면 사용할 수 있습니다.
- RowMapper는 데이터베이스의 반환 결과인 ResultSet을 객체로 매핑하는 역할을 합니다.
- RowMapper<Item> itemRowMapper()처럼 만들수도 있고, 객체 맞춤으로 RowMapper를 해주는 BeanPropertyRowMapper를 사용할 수도 있습니다.
RowMapper<Item> itemRowMapper()처럼 직접 만드는 예시도 들겠습니다.
JDBC를 직접 사용할 때 ResultSet을 사용했던 부분을 떠올리시면 됩니다.
차이가 있다면
JdbcTemplate는 다음과 같이 루프를 돌려주고 개발자는 RowMapper를 구현해서
그 내부 코드만 채운다고 이해하시면 됩니다
.
결과가 없을 때 Optional을 반환하도록 합니다.
결과에 문제가 있으면 몇 가지 Exception을 반환합니다.
해당 Exception 들을 잡아서
Optional.empty를 대신 반환해주면 됩니다.
findAll 예시
여러가지 조건으로 조회할때는 jdbcTemplate을 사용하지 맙시다.
일단 저는 사용하지 않으며 사용한 예시도 없네요.
- jdbcTemplate.query()
- 결과 row가 하나 이상일 때 사용됩니다.
- 결과가 없을 때는 빈 Collection이 반환되므로, Optional을 사용할 필요가 없습니다.
동적 쿼리 문제가 있습니다.
예를 들어서 ItemSearchCond라는 검색 조건 객체가 사용된다고 합시다.
사용자의 검색 조건에 매핑되는 객체입니다.
검색 조건 객체에 따라 경우의 수만큼, 그리고 여러 상황을 고려해서
동적 쿼리를 작성해야 합니다.
이 과정은 매우 복잡하고 실수하기 쉬우며 어렵습니다.
이렇게 난감한 동적 쿼리 작성은 MyBatis를 통해서 해결하는 게 좋습니다.
추 후 글에서 MyBatis를 다룹니다.
다음 글로 JdbcTemplate의 INSERT와 UPDATE를 다루어 보겠습니다.
JdbcTemplate와 MyBatis - JdbcTemplate 적용(데이터 변경)
이전 글로 JdbcTemplate의 데이터 조회에 대해 간략히 알아보았습니다. JdbcTemplate와 MyBatis - JdbcTemplate 적용(데이터 조회) 이전 글로 JdbcTemplate 소개를 다루어 보았습니다. JdbcTemplate와 MyBatis - JdbcTemplate
hhhhicode.tistory.com
'Spring Data > JdbcTemplate와 MyBatis' 카테고리의 다른 글
JdbcTemplate와 MyBatis - JdbcTemplate 소개 (0) | 2022.12.08 |
---|
댓글