본문 바로가기

Spring/Spring JDBC

[Spring] [Spring JDBC] 4. Spring JDBC 실습 진행 2 - selectAll()

필요한 것들

  1. DTO 만들기
    • 데이터를 주고받을 DTO 만들어야 한다
  2. RoleDaoSqls 클래스 - 해당 클래스에 select 하는 쿼리 상수 포함
  3. DAO 만들기
    • 어떤 하나의 객체(여기서는 Role 객체)에 대한 데이터를 엑세스 할 수 있는 객체이다. (Data Access Object)
    • 스프링 컨테이너가 빈으로 등록해야 하므로, @Repository 어노테이션 붙이기
    • 이미 Spring JDBC에서 구현해둔 NamedParameterJdbcTemplate, SimpleJdbcInsert 객체를 사용하여, selelctAll() 메서드를 작성한다.
  4. 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

 

GitHub - benelog/spring-jdbc-tips: Spring JDBC 활용팁, SQL 관리 방안 등

Spring JDBC 활용팁, SQL 관리 방안 등. Contribute to benelog/spring-jdbc-tips development by creating an account on GitHub.

github.com