필요한 것들
- DTO 만들기
- 데이터를 주고받을 DTO 만들어야 한다
- RoleDaoSqls 클래스 - 해당 클래스에 select 하는 쿼리 상수 포함
- DAO 만들기
- 어떤 하나의 객체(여기서는 Role 객체)에 대한 데이터를 엑세스 할 수 있는 객체이다. (Data Access Object)
- 스프링 컨테이너가 빈으로 등록해야 하므로, @Repository 어노테이션 붙이기
- 이미 Spring JDBC에서 구현해둔 NamedParameterJdbcTemplate, SimpleJdbcInsert 객체를 사용하여, selelctAll() 메서드를 작성한다.
- ApplicationConfig에 @ComponentScan 붙이기
1. DTO
public class Role {
private int roleId;
private String description;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getRoleId() {
return roleId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
@Override
public String toString() {
return "Role{" +
"roleId=" + roleId +
", description='" + description + '\'' +
'}';
}
}
2. RoleDaoSqls
package org.example.dao;
public class RoleDaoSqls {
public static final String SELECT_ALL = "SELECT role_id, description FROM role ORDER BY role_id";
public static final String UPDATE = "UPDATE role SET description = :description where role_id = :roleId";
}
3. Dao
package org.example.dao;
import org.example.dto.Role;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.util.Collections;
import java.util.List;
import static org.example.dao.RoleDaoSqls.*;
@Repository
public class RoleDao {
// spring jdbc에서 제공하는 객체 2가지
private NamedParameterJdbcTemplate jdbc;
private RowMapper<Role> rowMapper = BeanPropertyRowMapper.newInstance(Role.class);
// spring이 datasource를 자동으로 주입해준다
public RoleDao(DataSource dataSource) {
this.jdbc = new NamedParameterJdbcTemplate(dataSource);
}
public List<Role> selectAll(){
// 2번째 파라미터 : sql문에 바인딩 할 값이 있을 때, 바인딩 할 값을 전달할 목적으로 사용하는 객체
// 3번째 파라미터 : select 한건한건의 결과를 dto에 저장하는 목적으로 사용
return jdbc.query(SELECT_ALL, Collections.emptyMap(), rowMapper);
}
}
NamedParameterJdbcTemplate의 query() 메서드는 결과가 여러 건이였을 때, 내부적으로 반복하면서 DTO를 생성하고, 생성한 DTO를 리스트에 담아서, 해당 리스트를 리턴한다
query() 메서드의 두번째 파라미터
- sql문에 바인딩 할 값이 있을 때, 바인딩 할 값을 전달할 목적으로 사용하는 객체
query() 메서드의 세번째 파라미터
- select 한건 한건의 결과를 dto에 저장하는 목적으로 사용
BeanPropertyRowMapper
- 쿼리 결과를 객체로 변환해준다
- DB의 컬럼명이 snake_case 이여도, 자바 클래스의 필드명 camelCase로 자동 매핑해준다
SELECT_ALL 이라는 상수를 가져다 쓸 때, static import를 활용하면 코드가 훨씬 깔끔해진다
4. ApplicationConfig
@Configuration
@ComponentScan(basePackages = {"org.example.dao"})
@Import({DBConfig.class})
public class ApplicationConfig {
}
ApplicationConfig에 @ComponentScan 붙여야 하는데, 해당 패키지 이하에 대해 컴포넌트스캔을 해야 @Repository로 지정한 Dao가 빈으로 등록되기 때문이다.
5. 실제로 동작하는지, main 함수 돌려보기
public class SelectAllTest {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
RoleDao roleDao = ac.getBean(RoleDao.class);
List<Role> roles = roleDao.selectAll();
for (Role role : roles) {
System.out.println(role);
}
}
}
JDBC 관련 참고 블로그
https://github.com/benelog/spring-jdbc-tips/blob/master/spring-jdbc-core.md
'Spring > Spring JDBC' 카테고리의 다른 글
[Spring] [Spring JDBC] RowMapper와 @NoArgsConstructor, @Setter (0) | 2022.10.06 |
---|---|
[Spring] [Spring JDBC] 5. Spring JDBC 실습 진행 3 - insert(), update() (2) | 2022.09.20 |
[Spring] [Spring JDBC] 3. Spring JDBC 실습 진행 (0) | 2022.09.19 |
[Spring] [Spring JDBC] 2. Spring JDBC 실습 개요 (0) | 2022.09.19 |
[Spring] [Spring JDBC] 1. Spring JDBC 개요 (0) | 2022.09.19 |