[Spring boot] 스프링부트 jdbcTemplate 세팅 및 예제

    Spring boot에서 가장 기본적으로 jdbc를 다룰 수 있는 jdbcTemplate에 대한 설정에 대해서 가볍게 설명해보도록 하겠습니다.  포스팅의 내용은 maven을 기준으로 작성하였고, DB는 MySQL 기준인 것을 참고하시면 되겠습니다.

     

    [Spring boot] 스프링부트 jdbcTemplate 세팅 및 예제


    Spring boot 설정

    Pom.xml

    <!-- JDBC -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- MySQL 연결용 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    spring-boot-starter-jdbc는 jdbcTemplate를 위함이며, mysql-connector-java는 mysql를 기반으로 connection을 하기 위함입니다.

     

    application.properties

    ## MySQL
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxxxxx
    spring.datasource.username=xxxx
    spring.datasource.password=xxxx

     

    JdbcTemplate 예제

    Data 구조

    member table

     

    member라는 테이블에는 member_id, email, name, password, reg_dt 컬럼들이 있는 구조입니다.

     

     

    jdbc 클래스 선언

    @Autowired
    private JdbcTemplate jdbcTemplate;

    jdbcTemplate를 사용하기 위해, Autowired로 bean을 선언합니다.

     

    QueryForObject

    public int count() {
        return jdbcTemplate.queryForObject("select count(*) from member", Integer.class);
    }
    
    # 10

    QueryForObject는 단일 건을 가져오기 위함이며, MongoDB 등에서 사용하는 findOne과 유사합니다. queryForObject는 오버로딩(Overloading)으로 구현된 다양한 메소드가 있으며, deprecated(더이상 사용되지 않는) 메소드만 아니면 본인에게 맞는 스타일로 코딩을 하면 됩니다. 

     

    위 예시는 member 테이블의 카운트를 출력하여 Integer로 리턴하는 매우 간단한 예제입니다.

     

    public MemberVO loginChk(Map<String, String> paramMap) {
        try {
            MemberVO member = jdbcTemplate.queryForObject(
                "select member_id, email, name from member where email = ? AND password = ?",
                (resultSet, rowNum) -> {
                    MemberVO newMember = new MemberVO();
                    newMember.setEmail(resultSet.getString("email"));
                    newMember.setMember_id(resultSet.getString("member_id"));
                    newMember.setName(resultSet.getString("name"));
                    return newMember;
                }, paramMap.get("email"), paramMap.get("password"));
            return member;
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    위 예시는 email과 패스워드를 입력 받아 로그인을 구현하는 예시입니다. 다만 queryForObject의 경우, 데이터가 Empty일 경우 에러가 발생할 수 있기에 위와 같이 Try ~ Catch로 처리를 해야 합니다. 위 예시는 Emtpy가 발생할 경우 return null을 하는 구조입니다.

     

    첫번째 예제와 다르게 파라미터가 훨씬 많은데 첫번째는 sql, 두번째는 resultSet을 Entity에 set하며 나머지는 parameter들을 입력하는 모습으로 크게 3개로 구성이 되어 있는 것과 같습니다. 

     

    배열로 받기 원한다면, queryForObject대신 query를 사용하며, return 값만 List형을 추가해주면 됩니다.

     

    update (insert, update, delete)

    public int insertMember(Map<String, String> paramMap) {
        return this.jdbcTemplate.update(
                "insert into member (email, name, password, reg_dt) values (?,?,?,now())",
                paramMap.get("email"), paramMap.get("name"), paramMap.get("password"));
    }

    update 메소드는 insert, update, delete 모두 사용되며, 사용 방법은 동일합니다. 첫번째는 쿼리, 나머지는 파라미터들을 나열하면 되며, return은 처리 카운트로 int 형입니다.

     

    댓글

    Designed by JB FACTORY