[JSP/SERVLET] JSP MVC

Posted by 신희준 on September 25, 2017


2017 - 09 - 25 (월)

  • JDBC/JSP MVC 예제 따라풀기

  • 기본사항 정리


    1 . MVC 예제 따라하기


    ▶ User Class :User 테이블의 정의, 인스턴스 변수들을 DB의 컬럼들과 일치하도록 이름을 유사하게 생성. private로 생성하고 getter/setter 메소드 사용

    class User {
     String user_id;
     String password;
     String name;
     String email;
     java.sql.Date in_date;
     java.sql.Date up_date;
     public User() {}
    
     public User(String user_id, String password, String name, String email) {
      this(user_id, password, name, email
       , new java.sql.Date(new java.util.Date().getTime())
       , new java.sql.Date(new java.util.Date().getTime()));
     }
    public User(String user_id, String password, String name, String email, java.sql.Date in_date, java.sql.Date up_date) {
     super();
     this.user_id = user_id;
     this.password = password;
     this.name = name;
     this.email = email;
     this.in_date = in_date;
     this.up_date = up_date;
    }
    
    @Override
    public String toString() {
     return "User [user_id=" + user_id + ", password=" + password + ", name=" + name + ", email=" + email
       + ", in_date=" + in_date + ", up_date=" + up_date + "]";
    }
    
    public String getUser_id() {
     return user_id;
    }
    public void setUser_id(String user_id) {
     this.user_id = user_id;
    }
    public String getPassword() {
     return password;
    }
    public void setPassword(String password) {
     this.password = password;
    }
    public String getName() {
     return name;
    }
    
    public void setName(String name) {
     this.name = name;
    }
    
    public String getEmail() {
     return email;
    }
    public void setEmail(String email) {
     this.email = email;
    }
    public Date getIn_date() {
     return in_date;
    }
    public void setIn_date(Date in_date) {
     this.in_date = in_date;
    }
    public Date getUp_date() {
     return up_date;
    }
    public void setUp_date(Date up_date) {
     this.up_date = up_date;
    }
    }
    

    ▶ DBUtil이라는 클래스를 하나 생성해준다.

    getConnection() : 공통적으로 쓰이는 DB 경로/ DB 아이디 / DB 비밀번호를 정의해주며 DB에 로딩을 요청한다.

    rollback(Connection conn) : rollback을 공통적으로 정의해준 이유는 예외 상황을 위해서이다. rollback은 이론상 SAVEPOINT로 되돌아간다.
     rollback() 은 예를들어 게시판을 지울 때 필요할 수 있다. 게시글 삭제는 더불어 댓글까지 삭제할 필요가 있는데 이 때 하나는 지워지고 하나는 안지워지는 상황이 나올 수 있다. 이 때 rollback이 필요하다고 한다.
     또한 보통의 단일의 insert, delete, update 등은 AutoCommit(false)를 지정하지만 쿼리문이 두개가 들어갈 수 있다.
      이 경우 AutoCommit(true)를하여 rollback할 수 있어야한다. (트랜잭션 컨트롤 필요)

    close(AutoCloseable... asc) : 각각의 UserDao의 메소드에는 본래 공통적으로 close()할 필요가 있다. 이 메소드를 정의하는 이유는 중복적으로 닫아야되는 코드를 없애기 때문이다.

    class DBUtil {
     public static Connection getConnection() {
      Connection conn = null;
    
      String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";
         String DB_URL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
         String DB_USER = "asdf1234";  // DB의 userid와 pwd를 알맞게 변경
         String DB_PASSWORD = "1234";
      // 드라이버를 로딩한다.
      try {
       Class.forName(DB_DRIVER);
       conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); // 데이터베이스의 연결을 설정한다.
      } catch (Exception e) {
       e.printStackTrace();
      }     
    
      return conn;
     }
    
     static void rollback(Connection conn){
      if(conn!=null) {
       try {
        conn.rollback();
       } catch(SQLException e){
    
       }
      }
     }
    
     static void close(AutoCloseable... acs) {
      try {
       for(AutoCloseable ac : acs) {
        if(ac!=null)
         ac.close();
       }
      } catch(Exception e) {}
     }
    
    }
    

    ▶ Dao(UserDAO, BoardDao, ...Dao 의 조상) : DB에 접근하는 Object들이 공통적으로 상속받을 Data Access Object를 만들어준다. 공통적으로 connection 객체 정의와 tableName을 아래 상속받은 클래스에서 정의해주기 위해 인스턴스 변수를 생성한다. conn 객체가 비어있으면 앞서 정의한 DButil.getConnection(); 메소드를 실행해준다.(DB로딩을 요청 / 공통적으로 쓰이는 Instance 변수들 local DB url과 DB 아이디, 비밀번호를 정의해줌)

    class Dao {
     Connection conn;
     String tableName = "";
    
     Dao() {
      this(null, "");
     }
    
     Dao(String tableName) {
      this(null, tableName );
    }//테이블명을 잡아줌 >>User_info와 연결하는 DAO면 USER_INFO , TABLE_INFO와 연결하는 DAO면 TABLE_INFO
    
     Dao(Connection conn, String tableName) {
      this.tableName = tableName;
      this.conn = conn;
    
      if(conn==null) {
       this.conn = DBUtil.getConnection();
      }
    }//conn 객체가 null값이면
    }
    

    ▶ UserDao(회원가입/로그인/회원정보수정/전체회원조회/회원삭제 기능 정의) >> UserDao 클래스로 묶는다. //예를들어 Board(게시판)에 관여하는 DB연결 메소드는 BoardDAO 클래스를 정의하여 묶는다. (DAO-Data Access Object) Dao 클래스는 DB와 연동하고

    class UserDao extends Dao {
     UserDao() {
      super(null, "user_info");
     }
     //UsedDao() 생성자에는 조상클래스에 table을 지정해줌 ( UserDao 클래스는 조상 Dao 클 )
    
     UserDao(Connection conn) {
      super(conn, "user_info");
     }
    
     List<User> selectAllUsers() {
      List<User> list = new ArrayList<User>();
         String query = "SELECT * FROM " + tableName; // 모든 사용자의 정보를 가져온다.
      ResultSet rs = null;
      Statement stmt = null;
    
            try {
           stmt = conn.createStatement();             // Statement를 가져온다.
           rs = stmt.executeQuery(query); // SQL문을 실행한다.
    
              while (rs.next()) {
               User u = new User();
            u.setUser_id(rs.getString(1));
            u.setName(rs.getString(2));
            u.setPassword(rs.getString(3));
            u.setEmail(rs.getString(4));
            u.setIn_date(rs.getDate(5));
            u.setUp_date(rs.getDate(6));
            list.add(u);
              }
            } catch ( Exception e ) {
                 e.printStackTrace();
            } finally {
             DBUtil.close(stmt, rs);
            }
    
         return list;
     }
    
        User selectUser(User u) {
         String query = "SELECT * FROM "+ tableName
                +" WHERE USER_ID = ?"; // 사용자 정보를 가져온다. ''를 사용하지 않음에 주의
         PreparedStatement ps = null;
      ResultSet rs = null;
    
            try {
                 ps = conn.prepareStatement(query);
           ps.setString(1, u.getUser_id());
           rs = ps.executeQuery(); // rs = ps.executeQuery(query);과 같이 하지 않음에 주의
    
              while (rs.next()) {
            u.setUser_id(rs.getString(1));
            u.setName(rs.getString(2));
            u.setPassword(rs.getString(3));
            u.setEmail(rs.getString(4));
            u.setIn_date(rs.getDate(5));
            u.setUp_date(rs.getDate(6));
              }
            } catch ( Exception e ) {
                 e.printStackTrace();
            } finally {
             DBUtil.close(ps, rs);
            }
    
         return u;
        }
    
        int deleteUser(User u) {
            int result = 0;
         String query = "DELETE FROM " + tableName
               + " WHERE USER_ID = ?"; // 사용자 정보를 가져온다. ''를 사용하지 않음에 주의
            try (PreparedStatement ps = conn.prepareStatement(query);) {
             conn.setAutoCommit(true);
       // 3.2 쿼리 셋팅 & 실행   
       ps.setString(1, u.getUser_id());
       result = ps.executeUpdate(); // ps.executeUpdate(sql);과 같이 하지 않음에 주의
            } catch(SQLException e) {
       e.printStackTrace();
            }
    
            return result;
        }
        int insertUser(User u) {
            int result = 0;
            String sql = "INSERT INTO " + tableName + " VALUES "
               + " (?,?,?,?,?,?)"; // ""안에 ;를 넣지 않아도 된다.
    //  String sql = "insert into USER_INFO values (?,?,?,?, sysdate, sysdate)"; // ""안에 ;를 넣지 않아도 된다.
            try (PreparedStatement ps = conn.prepareStatement(sql);) {
             conn.setAutoCommit(true);
       // 3.2 쿼리 셋팅 & 실행   
       ps.setString(1, u.getUser_id());
       ps.setString(2, u.getName());
       ps.setString(3, u.getPassword());
       ps.setString(4, u.getEmail());
    //   ps.setDate(5, java.sql.Date.valueOf("2013-09-04"));
       ps.setDate(5, u.getIn_date());
       ps.setDate(6, u.getUp_date());
    
       result = ps.executeUpdate(); // ps.executeUpdate(sql);과 같이 하지 않음에 주의
            } catch ( Exception e ) {
             e.printStackTrace();
            }
    
            return result;
        }
    
        int updateUser(User u) {
            int result = 0;
            String sql = "UPDATE "+ tableName
              + " SET name=?, password=?, email=?, in_date=?, up_date=? "
              + " WHERE user_id = ?"; // ""안에 ;를 넣지 않아도 된다.
            try (PreparedStatement ps = conn.prepareStatement(sql);){
             conn.setAutoCommit(true);
       // 3.2 쿼리 셋팅 & 실행   
       ps.setString(1, u.getName());
       ps.setString(2, u.getPassword());
       ps.setString(3, u.getEmail());
    //   ps.setDate(5, java.sql.Date.valueOf("2013-09-04"));
       ps.setDate(4, u.getIn_date());
       ps.setDate(5, u.getUp_date());
       ps.setString(6, u.getUser_id());
    
       result = ps.executeUpdate(); // ps.executeUpdate(sql);과 같이 하지 않음에 주의
            } catch ( Exception e ) {
             // 5. 실패하면, 에러를 보여줘?
             e.printStackTrace();
            }
    
            return result;
        }     
    }