2015년 7월 30일 목요일

신입SW인력을 위한 실전 자바(Java) 스프링(Spring) 동영상과정 21_JDBC

이 게시물은
http://www.wiz.center/251

해당 링크를 청취하고 작성한 글입니다.

본인 이해도 확인을 위해서 작성한 것이니
스프링에 대해서 알고 있다면 쑥 훝어보고 끝내시고

좀 깊게 알고 싶다면 위의 링크부터 시작해서
총 30개 강의로 이루어진 스프링 과정을 청취하세요

1. JDBC 이용한 반복코드 줄이기
     ps. 이전 게시물 결과물 에서 작업이 진행될 예정임
   JDBC 연결 순서
    (1) JDBC 드라이버 로드
    (물론 Tomcat 에서 설정되어 있지만 객체는 로드 하고 있음)
    ->(2) DB 연결 -> (3) SQL문 실행 -> (4) DB 연결 해제
   이 작업들이 반복적으로 시행되고 있었음

 1) 설명 : Spring 빈 을 이용해서 위 내용을 간소화 시킬 수 있다.
 2) 방법 : Bean 설정에 JdbcTemplate bean 을 등록하고
               Java 에서 사용한다.
              Datasource bean은 JdbcTemplate 에 포함되어 있다.

 3) 작성순서
  (3-1) pom.xml 에 의존성 추가 할때 참고사항
        maven 은 mysql JDBC를 지원하지 않으므로
        mysql 을 보기위해서는 수기로 다운로드 받아야된다고 한다.
http://hellogk.tistory.com/92


 org.springframework
 spring-jdbc
 4.1.4.RELEASE



ps. 기존에 있는 지 확인하고 넣을 것.

  (3-2) Controller 에 JdcbTemplate 를 멤버변수로 추가
            및 set 함수 추가

......
public JdbcTemplate template;
 
 public void setJdbcTemplate(JdbcTemplate template) {
  this.template= template;
 }
......


  (3-3) servlet-context.xml 에 bean 등록
          JdbcTemplate 가 property로  dataSource 를
         가지고 있는 bean을 등록(여기서는 mysql 용)


    
    
    
    

 

 



  (3-4) controller 의 set 함수에 @Autowired 어노테이션 추가
         bean 등록후 아래와 같이 어노테이션을 추가해야
         JdbcTemplate를 사용 가능하다.
        보통 같으면 bean을 컨트롤러에서 구현하여 사용하는데
        JdbcTemplate는 Spring 에서 구현하고 있기 때문에
        콜 하는 xml 부분과 Controller 에서 셋 하는 부분만 명시하고
      DAO 단에서 사용하면 된다.

......
 @Autowired
 public void setJdbcTemplate(JdbcTemplate template) {
  this.template= template;
 }
......


  (3-5) 사용을 쉽게 하기위해서 util 이라는 패키지를 생성 후
         거기에 다음 내용을 작성한다.

package com.javalec.spring_pjt_board.util;

import org.springframework.jdbc.core.JdbcTemplate;

public class Constant {

 public static JdbcTemplate template;
 
}


  (3-6) controller set 함수를 다시 이렇게 수정한다.
         이후 Constant.template 를 통해 set 한 template를
          어디서든 쓸 수 있게끔 설정되었다.

 @Autowired
 public void setJdbcTemplate(JdbcTemplate template) {
    this.template = template;
    Constant.template = this.template;
 }  


여기까지 진행하면 DAO 을 JDBC 적용할 준비가 끝났다고 본다.
 요약하면 pom.xml 등록하고 -> servlet-context.xml에
    bean 등록
   (dataSource 를 멤버변수로 지니는 template bean 빈 등록)
   -> 컨트롤러에 @Autowired 등록 및 util 클래스 등록
   -> set 함수에 util 선언 template 객체를 등록
   -> 이후 DAO에서 util 객체를 사용하도록 설정하면
   -> 사용준비 끝


 4) 이후 DAO 클래스 작성

  (4-1) DAO 에 멤버변수 JdbcTemplate추가

JdbcTemplate template = null;

  (4-2) 생성자 Constante template 할당

public BDao(){
  
// try {
//  Context context = new InitialContext();
//  datasource = (DataSource) context.lookup("java:comp/env/jdbc/mysql");
//  
//  
// } catch (NamingException e) {
//  e.printStackTrace();
// }
     
          template = Constant.template;
}


  (4-3) list 함수 수정

public ArrayList list(){
//  ArrayList dtos = new ArrayList();
//  
//  Connection connection = null;
//  PreparedStatement preparedStatement = null;
//  ResultSet resultSet = null;
//  
//  try{
//   connection = (Connection) datasource.getConnection();
//   String query = "select bId, bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent from mvc_board order by bGroup desc, bStep asc";
//   preparedStatement = (PreparedStatement) connection.prepareStatement(query);
//   resultSet = preparedStatement.executeQuery();
//   
//   while(resultSet.next()){
//    int bId = resultSet.getInt("bId");
//    String bName = resultSet.getString("bName");
//    String bTitle = resultSet.getString("bTitle");
//    String bContent = resultSet.getString("bContent");
//    Timestamp bDate = resultSet.getTimestamp("bDate");
//    int bHit = resultSet.getInt("bHit");
//    int bGroup = resultSet.getInt("bGroup");
//    int bStep = resultSet.getInt("bStep");
//    int bIndent = resultSet.getInt("bIndent");
//    
//    BDto dto = new BDto(bId, bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent);
//    
//    dtos.add(dto);
//   }
//   
//  }catch(Exception e){
//   e.printStackTrace();
//  }finally{
//   
//    try {
//     if(resultSet != null)resultSet.close();
//     if(preparedStatement != null)preparedStatement.close();
//     if(connection != null)connection.close();
//    } catch (SQLException e2) {
//     // TODO Auto-generated catch block
//     e2.printStackTrace();
//    }
//   
//  }
//  
//  return dtos;
  
  String query = "select bId, bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent from mvc_board order by bGroup desc, bStep asc";
  return (ArrayList) template.query(query, new BeanPropertyRowMapper(BDto.class));
 }


  (4-4) write 함수 수정 - 이전 소스 생략
      ps. mysql 에서는 oracle 과는 다르게 update 문의 서브쿼리에
          같은 테이블에서 select 한 결과를 넣지 못하도록 설정되어 있다.
          그래서 from tablename a 정도로 테이블 명을 바꿔주면
          다른 테이블로 인식하게끔 작성해서 진행하는건 가능하다.

public void write(final String bName, final String bTitle, final String bContent){

 template.update(new PreparedStatementCreator() {
   @Override
  public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
   String query2 ="insert into test.mvc_board (bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent) "
     + "        values (?, ?, ?, now(), 0, (select max(bId) as bGroup from mvc_board a), 0, 0)";
   PreparedStatement psmt = con.prepareStatement(query2);
   psmt.setString(1, bName );
   psmt.setString(2, bTitle );
   psmt.setString(3, bContent );
//   String query = "select max(bId) as maxId from mvc_board";
//   JdbcTemplate template = Constant.template;
//   psmt.setInt(4, template.query(query, Integer);
   return psmt;
  }
 });
}


  (4-5) upHit 함수 수정

private void upHit( final String bId) {
  String query = "update test.mvc_board set bHit = bHit + 1 where bId = ?";
  template.update(query, new PreparedStatementSetter() {
   
   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setInt(1, Integer.parseInt(bId));
   }
  });
 }


  (4-6) modify()

 public void modify(final String bId, final String bName, final String bTitle, final String bContent){
  String query = "update mvc_board set bName =?, bTitle=?, bContent=? where bId = "+?;
  template.update(query, new PreparedStatementSetter() {
   
   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setString(1, bId);
    ps.setString(2, bName);
    ps.setString(3, bTitle);
    ps.setInt(4, Integer.parseInt(bContent));
   }
  });
 }


  (4-7) delete()

 public void delete(final String bId) {
  String query = "delete from mvc_board where bId = ?";
  
  template.update(query, new PreparedStatementSetter() {
   
   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setString(1, bId);
   }
  });
 }


  (4-8) reply_view()

public BDto reply_view(String bid) {
  String query = "select * from mvc_board where bId = "+bid;
  return template.queryForObject(query, new BeanPropertyRowMapper(BDto.class));
}


  (4-9) reply()

public void reply(final String bId, final String bName, final String bTitle, final String bContent, final String bGroup, final String bStep, final String bIndent) {
  String query = "insert into test.mvc_board(bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent) values (?,?,?,now(),0,?,?,?)";
  template.update(query, new PreparedStatementSetter() {
   
   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setString(1,bName);
    ps.setString(2,bTitle);
    ps.setString(3,bContent);
    ps.setInt(4,Integer.parseInt(bGroup));
    ps.setInt(5,Integer.parseInt(bStep)+1);
    ps.setInt(6,Integer.parseInt(bIndent)+1);
   }
  });
}


  (4-10) replyShape()

 private void replyShape( final String strGroup, final String strStep) {
  String query = "update mvc_board set bStep = bStep + 1 where bGroup = ? and bStep > ?";
  template.update(query, new PreparedStatementSetter() {
   
   @Override
   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setInt(1, Integer.parseInt(strGroup));
    ps.setInt(2, Integer.parseInt(strStep));
   }
  });
 }


  (4-11) contentView()

 upHit(strid);
 String query = "select bId, bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent from mvc_board where bId="+strid;
 return template.queryForObject(query, new BeanPropertyRowMapper(BDto.class));


댓글 없음:

댓글 쓰기