본문 바로가기
Spring

[SPRING]JDBC 템플릿사용 DAO 변경해보기

by jackypark 2022. 11. 8.

JDBC 템플릿 이란?

스프링에서 제공하는 SQL 연산들을 수행할 수 있도록 해주는 jdbc코드용 기본 템플릿이다

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html

 

JdbcTemplate (Spring Framework 5.3.23 API)

Execute a query for a result object, given static SQL. Uses a JDBC Statement, not a PreparedStatement. If you want to execute a static query with a PreparedStatement, use the overloaded JdbcOperations.queryForObject(String, Class, Object...) method with nu

docs.spring.io

 

설정 방법:

pom.xml 에 종속성 추가

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>3.2.18.RELEASE</version>
</dependency>

dispatcher-servlet에 의존성 주입

<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <beans:property name="username" value="scott"/>
    <beans:property name="password" value="tiger"/>
</beans:bean>

 

사용 예시:

다음과 같이 접은 글을  훨씬 더 효율적으로 더 짧게 바꿔서 사용할 수 있다. (거의 100줄 이상 줄음)

더보기
package com.javalec.dao;

import com.javalec.dto.BoardBean;
import org.springframework.stereotype.Service;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@Service
public class BoardDAO {

    PreparedStatement pstmt;
    ResultSet rs;
    Connection conn;

    public BoardDAO(){
        try{
            Context context = new InitialContext();
            DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/Oracle11g");
            conn = ds.getConnection();

        }catch(Exception e){
            e.printStackTrace();
        }
    }


    //게시판 목록 개수 가져오기
    public int getListCount(){
        int x=0;
        try{
            pstmt = conn.prepareStatement("select count(*) from board");
            rs=pstmt.executeQuery();

            if(rs.next()){
                x=rs.getInt(1);
            }

        } catch (Exception e) {

        }finally {
            if(rs!=null) try {rs.close();}catch(SQLException e) {}
            if(pstmt!=null) try {pstmt.close();}catch(SQLException e) {}
        }
        return x;
    }

    public List getBoardList(int page,int limit){
        String board_list_sql="select * from "+
                "(select rownum rnum,BOARD_NUM,BOARD_NAME,BOARD_SUBJECT,"+
                "BOARD_CONTENT,BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,"+
                "BOARD_RE_SEQ,BOARD_READCOUNT,BOARD_DATE,BOARD_ID,BOARD_PASS from "+
                "(select * from board order by BOARD_RE_REF desc,BOARD_RE_SEQ asc)) "+
                "where rnum>=? and rnum<=?";

        List list = new ArrayList();

        int startrow=(page-1)*10+1; //�б� ������ row ��ȣ.
        int endrow=startrow+limit-1; //���� ������ row ��ȣ.
        try{
            pstmt = conn.prepareStatement(board_list_sql);
            pstmt.setInt(1, startrow);
            pstmt.setInt(2, endrow);
            rs = pstmt.executeQuery();

            while(rs.next()){
                BoardBean board = new BoardBean();
                board.setBOARD_NUM(rs.getInt("BOARD_NUM"));
                board.setBOARD_NAME(rs.getString("BOARD_NAME"));
                board.setBOARD_SUBJECT(rs.getString("BOARD_SUBJECT"));
                board.setBOARD_CONTENT(rs.getString("BOARD_CONTENT"));
                board.setBOARD_FILE(rs.getString("BOARD_FILE"));
                board.setBOARD_RE_REF(rs.getInt("BOARD_RE_REF"));
                board.setBOARD_RE_LEV(rs.getInt("BOARD_RE_LEV"));
                board.setBOARD_RE_SEQ(rs.getInt("BOARD_RE_SEQ"));
                board.setBOARD_READCOUNT(rs.getInt("BOARD_READCOUNT"));
                board.setBOARD_DATE(rs.getDate("BOARD_DATE"));
                board.setBOARD_ID(rs.getString("BOARD_ID"));
                board.setBOARD_PASS(rs.getString("BOARD_PASS"));
                list.add(board);
            }

            return list;
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }
        return null;
    }
    //게시판 등록
    public boolean boardInsert(BoardBean board){
        int num =0;
        String sql="";

        int result=0;

        try{
            pstmt=conn.prepareStatement("select max(board_num) from board");
            rs = pstmt.executeQuery();

            if(rs.next())
                num =rs.getInt(1)+1;
            else
                num=1;

            sql="insert into board (BOARD_NUM,BOARD_NAME,BOARD_PASS,BOARD_SUBJECT,";
            sql+="BOARD_CONTENT, BOARD_FILE, BOARD_RE_REF,"+
                    "BOARD_RE_LEV,BOARD_RE_SEQ,BOARD_READCOUNT,"+
                    "BOARD_DATE,BOARD_ID) values(?,?,?,?,?,?,?,?,?,?,sysdate,?)";

            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, num);
            pstmt.setString(2, board.getBOARD_NAME());
            pstmt.setString(3, board.getBOARD_PASS());
            pstmt.setString(4, board.getBOARD_SUBJECT());
            pstmt.setString(5, board.getBOARD_CONTENT());
            pstmt.setString(6, board.getBOARD_FILE());
            pstmt.setInt(7, num);
            pstmt.setInt(8, 0);
            pstmt.setInt(9, 0);
            pstmt.setInt(10, 0);
            pstmt.setString(11, board.getBOARD_ID());

            result=pstmt.executeUpdate();
            if(result==0)return false;

            return true;
        }catch(Exception ex){
            System.out.println("boardInsert ���� : "+ex);
        }finally{
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }
        return false;
    }

    //글 조회수 올리기
    public void setReadCountUpdate(int num) throws Exception{
        String sql="update board set BOARD_READCOUNT = "+
                "BOARD_READCOUNT+1 where BOARD_NUM = "+num;

        try{
            pstmt=conn.prepareStatement(sql);
            pstmt.executeUpdate();
        }catch(SQLException ex){
            System.out.println("setReadCountUpdate ���� : "+ex);
        }finally {
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }
    }

    //해당 게시글 내용 가져오기
    public BoardBean getDetail(int num) throws Exception{
        BoardBean board = null;
        try{
            pstmt = conn.prepareStatement(
                    "select * from board where BOARD_NUM = ?");
            pstmt.setInt(1, num);

            rs= pstmt.executeQuery();

            if(rs.next()){
                board = new BoardBean();
                board.setBOARD_NUM(rs.getInt("BOARD_NUM"));
                board.setBOARD_NAME(rs.getString("BOARD_NAME"));
                board.setBOARD_SUBJECT(rs.getString("BOARD_SUBJECT"));
                board.setBOARD_CONTENT(rs.getString("BOARD_CONTENT"));
                board.setBOARD_FILE(rs.getString("BOARD_FILE"));
                board.setBOARD_RE_REF(rs.getInt("BOARD_RE_REF"));
                board.setBOARD_RE_LEV(rs.getInt("BOARD_RE_LEV"));
                board.setBOARD_RE_SEQ(rs.getInt("BOARD_RE_SEQ"));
                board.setBOARD_READCOUNT(rs.getInt("BOARD_READCOUNT"));
                board.setBOARD_DATE(rs.getDate("BOARD_DATE"));
                board.setBOARD_ID(rs.getString("BOARD_ID"));
                board.setBOARD_PASS(rs.getString("BOARD_PASS"));
            }
            return board;
        }catch(Exception ex){
            System.out.println("getDetail ���� : " + ex);
        }finally{
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }
        return null;
    }

    //해당 글번호와 입력한 비밀번호가 일치한지 확인
    public boolean isBoardWriter(int num,String pass){
        String board_sql="select * from board where BOARD_NUM=?";

        try{
            pstmt=conn.prepareStatement(board_sql);
            pstmt.setInt(1, num);
            rs=pstmt.executeQuery();
            rs.next();

            if(pass==""||pass==null||pass.equals(rs.getString("BOARD_PASS"))){
                return true;
            }
        }catch(SQLException ex){
            System.out.println("isBoardWriter ���� : "+ex);
        }finally {
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }
        return false;
    }

    //글 내용 수정하기 UPDATE
    public boolean boardModify(BoardBean modifyboard) throws Exception{
        String sql="update board set BOARD_SUBJECT=?,BOARD_CONTENT=? where BOARD_NUM=?";

        try{
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, modifyboard.getBOARD_SUBJECT());
            pstmt.setString(2, modifyboard.getBOARD_CONTENT());
            pstmt.setInt(3, modifyboard.getBOARD_NUM());
            pstmt.executeUpdate();
            return true;
        }catch(Exception ex){
            System.out.println("boardModify ���� : " + ex);
        }finally{
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }
        return false;
    }
    //번호가져와서 게시글삭제
    public boolean boardDelete(int num){
        String board_delete_sql="delete from board where BOARD_num=?";

        int result=0;

        try{
            pstmt=conn.prepareStatement(board_delete_sql);
            pstmt.setInt(1, num);
            result=pstmt.executeUpdate();
            if(result==0)return false;

            return true;
        }catch(Exception ex){
            System.out.println("boardDelete ���� : "+ex);
        }finally{
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }

        return false;
    }

    public int boardReply(BoardBean board){
        String board_max_sql="select max(board_num) from board";
        String sql="";
        int num=0;
        int result=0;

        int re_ref=board.getBOARD_RE_REF();
        int re_lev=board.getBOARD_RE_LEV();
        int re_seq=board.getBOARD_RE_SEQ();

        try{
            pstmt=conn.prepareStatement(board_max_sql);
            rs = pstmt.executeQuery();
            if(rs.next())num =rs.getInt(1)+1;
            else num=1;

            sql="update board set BOARD_RE_SEQ=BOARD_RE_SEQ+1 where BOARD_RE_REF=? ";
            sql+="and BOARD_RE_SEQ>?";

            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,re_ref);
            pstmt.setInt(2,re_seq);
            result=pstmt.executeUpdate();

            re_seq = re_seq + 1;
            re_lev = re_lev+1;

            sql="insert into board (BOARD_NUM,BOARD_NAME,BOARD_PASS,BOARD_SUBJECT,";
            sql+="BOARD_CONTENT, BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,BOARD_RE_SEQ,";
            sql+="BOARD_READCOUNT,BOARD_DATE,BOARD_ID) values(?,?,?,?,?,?,?,?,?,?,sysdate,?)";

            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, num);
            pstmt.setString(2, board.getBOARD_NAME());
            pstmt.setString(3, board.getBOARD_PASS());
            pstmt.setString(4, board.getBOARD_SUBJECT());
            pstmt.setString(5, board.getBOARD_CONTENT());
            pstmt.setString(6, ""); //���忡�� ������ ���ε����� ����.
            pstmt.setInt(7, re_ref);
            pstmt.setInt(8, re_lev);
            pstmt.setInt(9, re_seq);
            pstmt.setInt(10, 0);
            pstmt.setString(11, board.getBOARD_ID());
            pstmt.executeUpdate();
            return num;
        }catch(SQLException ex){
            System.out.println("boardReply ���� : "+ex);
        }finally{
            if(rs!=null) try{rs.close();}catch(SQLException ex){}
            if(pstmt!=null) try{pstmt.close();}catch(SQLException ex){}
        }
        return 0;
    }

}
package com.javalec.dao;

import com.javalec.controller.Constant;
import com.javalec.dto.BoardBean;
import org.springframework.jdbc.core.*;
import org.springframework.stereotype.Service;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@Service
public class BoardDAO {


    JdbcTemplate template;

    public BoardDAO(){
        this.template= Constant.template;
    }


    //게시판 목록 개수 가져오기
    public int getListCount(){
        int x= this.template.queryForObject("select count(*) from board", Integer.class);
        return x;
    }

    public List getBoardList(int page,int limit){
        int startrow=(page-1)*10+1; ///�б� ������ row ��ȣ.
        int endrow=startrow+limit-1; //���� ������ row ��ȣ.
        String board_list_sql="select * from "+
                "(select rownum rnum,BOARD_NUM,BOARD_NAME,BOARD_SUBJECT,"+
                "BOARD_CONTENT,BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,"+
                "BOARD_RE_SEQ,BOARD_READCOUNT,BOARD_DATE,BOARD_ID,BOARD_PASS from "+
                "(select * from board order by BOARD_RE_REF desc,BOARD_RE_SEQ asc)) "+
                "where rnum>=? and rnum<=?";

        return (ArrayList<BoardBean>) template.query(board_list_sql,new Object[]{startrow,limit},new BeanPropertyRowMapper<BoardBean>(BoardBean.class));
    }
    //게시판 등록
    public boolean boardInsert(BoardBean board){

        int x=this.template.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                int num= template.queryForObject("select max(board_num) from board", Integer.class);

                if(num==0){
                    num=1;
                }else{
                    num=num+1;
                }
                String sql="insert into board (BOARD_NUM,BOARD_NAME,BOARD_PASS,BOARD_SUBJECT,";
                sql+="BOARD_CONTENT, BOARD_FILE, BOARD_RE_REF,"+
                    "BOARD_RE_LEV,BOARD_RE_SEQ,BOARD_READCOUNT,"+
                    "BOARD_DATE,BOARD_ID) values(?,?,?,?,?,?,?,?,?,?,sysdate,?)";

                PreparedStatement pstmt = connection.prepareStatement(sql);
                pstmt.setInt(1, num);
                pstmt.setString(2, board.getBOARD_NAME());
                pstmt.setString(3, board.getBOARD_PASS());
                pstmt.setString(4, board.getBOARD_SUBJECT());
                pstmt.setString(5, board.getBOARD_CONTENT());
                pstmt.setString(6, board.getBOARD_FILE());
                pstmt.setInt(7, num);
                pstmt.setInt(8, 0);
                pstmt.setInt(9, 0);
                pstmt.setInt(10, 0);
                pstmt.setString(11, board.getBOARD_ID());

                return pstmt;
            }
        });

        if(x!=0){
            return true;
        }else{
            return false;
        }
    }

    //글 조회수 올리기
    public void setReadCountUpdate(int num) throws Exception{

        String sql="update board set BOARD_READCOUNT = "+
                "BOARD_READCOUNT+1 where BOARD_NUM = ?";
        this.template.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setInt(1,num);
            }
        });
    }

    //해당 게시글 내용 가져오기
    public BoardBean getDetail(int num) throws Exception{

            String sql = "select * from board where BOARD_NUM = "+num;

            return template.queryForObject(sql,new BeanPropertyRowMapper<BoardBean>(BoardBean.class));

    }

    //해당 글번호와 입력한 비밀번호가 일치한지 확인
    public boolean isBoardWriter(int num,String pass){

        return this.template.queryForObject("select * from board where BOARD_NUM=?", new Object[]{num}, new RowMapper<Boolean>() {
            @Override
            public Boolean mapRow(ResultSet resultSet, int i) throws SQLException {
                if(pass==""||pass==null||pass.equals(resultSet.getString("BOARD_PASS"))){
                return true;
                }
                return false;
            }
        });
    }

    //글 내용 수정하기 UPDATE
    public boolean boardModify(BoardBean modifyboard) throws Exception{
        String sql="update board set BOARD_SUBJECT=?,BOARD_CONTENT=? where BOARD_NUM=?";

        int result=this.template.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setString(1, modifyboard.getBOARD_SUBJECT());
                preparedStatement.setString(2, modifyboard.getBOARD_CONTENT());
                preparedStatement.setInt(3, modifyboard.getBOARD_NUM());
            }
        });

        if (result!=0){
            return true;
        }else{
            return false;
        }
    }
    //번호가져와서 게시글삭제
    public boolean boardDelete(int num){
        String board_delete_sql="delete from board where BOARD_num=?";
        int result=this.template.update(board_delete_sql, num);
        if (result!=0){
            return true;
        }else{
            return false;
        }
}

    public int boardReply(BoardBean board){

        return this.template.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

                String board_max_sql="select max(board_num) from board";
                String sql="";
                int num=0;
                int result=0;

                int re_ref=board.getBOARD_RE_REF();
                int re_lev=board.getBOARD_RE_LEV();
                int re_seq=board.getBOARD_RE_SEQ();

                num=template.queryForObject(board_max_sql, Integer.class);

                if(num==0){
                    num=1;
                }else{
                    num=num+1;
                }

                sql="update board set BOARD_RE_SEQ=BOARD_RE_SEQ+1 where BOARD_RE_REF=? ";
                sql+="and BOARD_RE_SEQ>?";

                PreparedStatement pstmt=connection.prepareStatement(sql);
                pstmt.setInt(1,re_ref);
                pstmt.setInt(2,re_seq);

                re_seq = re_seq + 1;
                re_lev = re_lev+1;

                sql="insert into board (BOARD_NUM,BOARD_NAME,BOARD_PASS,BOARD_SUBJECT,";
                sql+="BOARD_CONTENT, BOARD_FILE,BOARD_RE_REF,BOARD_RE_LEV,BOARD_RE_SEQ,";
                sql+="BOARD_READCOUNT,BOARD_DATE,BOARD_ID) values(?,?,?,?,?,?,?,?,?,?,sysdate,?)";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, num);
                pstmt.setString(2, board.getBOARD_NAME());
                pstmt.setString(3, board.getBOARD_PASS());
                pstmt.setString(4, board.getBOARD_SUBJECT());
                pstmt.setString(5, board.getBOARD_CONTENT());
                pstmt.setString(6, ""); //���忡�� ������ ���ε����� ����.
                pstmt.setInt(7, re_ref);
                pstmt.setInt(8, re_lev);
                pstmt.setInt(9, re_seq);
                pstmt.setInt(10, 0);
                pstmt.setString(11, board.getBOARD_ID());
                return pstmt;
            }
        });
    }
}

 

 

 

느낀 점: 

비록 예전에 하던 방법이 더 직관 적이어도 jdbc템플릿을 사용하면 훨씬 더 코드가 간결해지고 편안 해진다는 걸 느꼈다. 다음 프로젝트할 때는 jdbc템플릿을 사용해봐야겠다. 물론 mybatis도 연습해서 사용할 것이다.

'Spring' 카테고리의 다른 글

[SpringSecurity] CSRF란?Restapi에서 CSRF 해제 가능?  (0) 2023.09.22
Spring mvc2 패턴  (0) 2022.11.01
[Spring] 스프링 프레임워크 첫걸음~  (1) 2022.10.26

댓글