코딩하는 바나나
[BackEnd] Spring JDBC 본문
https://fine-code.tistory.com/14
[BackEnd] JDBC
DAO DAO는 Data Access Object 즉 데이터에 접근하는 객체이다. 우리는 보통 DAO객체를 구현해서 DB에 접근해서 값을 조회, 수정, 삭제, 삽입 등의 작업을 한다. DAO객체를 따로 서비스 객체와 분리 시켜 DAO
fine-code.tistory.com
Spring JDBC는 앞선 JDBC게시물에서도 보았듯이 JDBC를 그냥 사용하기에는 반복되는 코드가 너무 많아 복잡하다. 이를 해결 해 줄 수 있는 것이 Spring JDBC이다. 우리는 DAO클래스에서 JDBC를 직접 사용하는 것이 아닌 Spring JDBC를 사용 할 것이다. Spring JDBC에서 정의된 클래스, 함수들을 사용하면 된다. 이 클래스, 함수들을 내부적으로 이전 게시물에서 우리가 구현 한 것 처럼 JDBC를 이용해서 내부 구현이 되어있을 것이다. 하지만 우리는 그것을 전혀 몰하도 Spring JDBC를 활용해서 DB와 통신 할 수 있다.
먼저 Spring JDBC를 사용하기 위해서는 Spring JDBC 라이브러리와 dbcp라이브러리가 필요하다. maven이나 gradle을 이용해 추가하면 된다.
그리고 먼저 DataSource를 등록해주어야 한다. 스프링 Bean에 DataSource객체를 등록 해주면된다. 이때 우리가 JDBC에서 드라이버를 등록하고 db에 접근하기위해 db의 url, 사용자 id, 비밀번호를 Connection객체에 등록해준 것 처럼 DataSource에 다음과 같이 정보를 등록해준다.
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
이러면 기본 설정은 끝난 것이다. 이제 DAO객체에서 DataSource를 Bean으로 부터 받아와서 사용하면된다.
보통 JdbcTemplate 클래스를 쿼리를 날리기 위해 사용한다. 그런데 이 객체는 쿼리를 날릴때 내가 파라미터를 동적으로 설정해 줄 수없다. 예를 들어 20살 이하인 회원의 정보를 회원db로 부터 받고 싶으면 SELECT * FROM member WHERE age < 20 sql문을 날리기위해 JdbcTeamplate객체를 사용하면 될 것이다. 하지만 내가 20살 이하인 회원 정보만 받고싶은게 아니라 클라이언트로 부터 값을 입력받은 나이를 기준으로 사용하고싶으면 SELECT * FROM member WHERE age < ? 와 같이 사용하고 ?에 클라이언트로 부터 받은 값을 사용해주면 좋을 것이다. 이것을 가능하게 해주는 것이 바로 NamedParameterJdbcTemplate이다. 두 객체의 사용법은 거의 같지만 NamedParameterJdbc의 경우 파라미터를 등록해주기 위한 과정이 추가된다.
"NamedParameterJdbcTemplate"
생성자
new NamedParameterJdbcTemplate(DataSource dataSource) 와 같이 미리 정의한 dataSource를 생성자에 매개변수로 넣어주면 된다. 보통 자바 빈에 미리 dataSource를 등록해놓고 Dao클래스 안에서 NamedParameterJdbcTemplate객체를 생성 할때 @Autowired로 dataSource를 주입해준다.
메소드
query 메소드
이 메소드는 안에 들어가는 인자에 따라 다양하게 사용이 가능하다.
query(String sql, Map<String,?> paramMap, RowMapper<T> rowMapper)
이 경우 먼저 sql문을 String형으로 넣어준다. 그리고 Map객체는 해당 sql문에 파라미터에 넣을 값들을 매핑해 놓으면 된다. 예를 들어 sql문이 SELECT * FROM member WHERE age < :age (파라미터가 들어가야 할 부분은 Jdbc에서의 ?와 다르게 ':파라미터이름'으로 사용한다) 이면 Map객체에 키는 "age" 밸류는 인티저형 객체로 20을 넣어주면된다. RowMapper는 쿼리의 결과로 받은 db의 row들을 객체로 저장을 해줄 객체이다. db의 값이 name, age, email이 있다면 해당 멤버 변수를 가지는 클래스를 하나 만들어(DTO) RowMapper에 등록 해놓아야 한다. private RowMapper<Guestbook> rowMapper = BeanPropertyRowMapper.newInstance(Guestbook.class); 이렇게 spring에서 rowMapper에 dto객체를 등록해주는 함수를 제공한다. 참고로 DB에서 보통 컬럼명으로 사용하는 _ (예를 들어 user_id)를 rowMapper는 카멜표기법(userId)로 사용하기 때문에 이를 참고해서 dto를 작성해야 할 것이다. 이렇게 sql, pramMap, rowMapper를 등록하면 해당 sql문을 paramMap에 있는 파라미터들을 넣어서 실행시켜 주고 이에 따른 결과를 rowMapper를 이용해서 객체로 받아서 돌려준다. 이 메소드는 RowMapper에 등록된 객체의 리스트를 반환한다.
query(String sql, RowMapper<T> rowMapper)
이 경우에는 paramMap이 빠져있다. 파라미터가 필요없을 경우 이렇게 사용하면 된다.
query(String sql, SqlParameterSource paramSource, RowMapper<T> rowMapper)
이 경우에는 paramMap 대신 SqlParameterSource 객체가 사용되었다. 이 객체는 sql문의 파라미터의 이름과 같은 이름의 변수를 가진 새로운 객체를 파라미터로 매핑해준다.
이 클래스는 parametersource = new MapSqlParameterSourc("name",name) 과 같이 사용해 Map객체를 사용하지 않고 자동으로 생성하게 해서 편리하게 사용 할 수 있다.
또는 parametrsource = new BeanPropertySqlParameterSource(객체이름)를 이용해서 해당 객체를 파라미터로 매핑해준다.
NamedParameterJdbcTemplate의 메소드들은 위와 비슷한 형태로 되어있다. 쿼리의 결과가 int형일 경우
queryForInt, 객체일 경우 queryForObject, ... 이런식으로 사용 할 수 있다. 또한 update쿼리를 보내기 쉽게해주는 update메소드나 다른 여러가지 메소드들이 있다. 메소드들은 공식 문서에서 찾아 볼 수있다.
NamedParameterJdbcTemplate (Spring Framework 5.3.17 API)
Query given SQL to create a prepared statement from SQL and a list of arguments to bind to the query, expecting a result list. The results will be mapped to a List (one entry for each row) of Maps (one entry for each column, using the column name as the ke
docs.spring.io
https://docs.spring.io/spring-framework/docs/2.5.x/reference/jdbc.html
Chapter 11. Data access using JDBC
The JdbcTemplate class is the central class in the JDBC core package. It simplifies the use of JDBC since it handles the creation and release of resources. This helps to avoid common errors such as forgetting to always close the connection. It executes the
docs.spring.io
그리고 NamedParameterJdbcTemplate 외에도 SimpleJdbcTemplate, SimpleJdbcInsert등 여러 클래스들을 지원한다. 상황에 따라 적절한 클래스를 선택하면 될 것 같다.
'Web' 카테고리의 다른 글
| [BackEnd] JWT (0) | 2022.04.13 |
|---|---|
| [BackEnd] Spring MVC (1) | 2022.03.29 |
| [BackEnd] JDBC (0) | 2022.03.27 |
| [BackEnd] DB, DBMS (0) | 2022.03.27 |
| [BackEnd] Scope (0) | 2022.03.09 |