Cohe

6. JSP-JDBC 연동 본문

개발 언어/JSP

6. JSP-JDBC 연동

코헤0121 2024. 4. 11. 18:09
728x90

JDBC

  • 싱글톤 패턴 : 하나의 객체만 생성하여 사용하도록 만드는 패턴-객체를 1개로 제한
  • 여러개의 객체가 생성되게 하면 메모리 과부하가 올 수 있는 경우에 사용

DAO

  • DAO 객체는 DB 연동을 담당하는 클래스로 싱글톤 방식으로 생성
  1. 스스로의 객체를 멤버변수로 선언, 1개로 제한
  2. 외부에서 객체를 생성할 수 없게 생성자에 private 설정
  3. 외부에서 객체를 요구할 때 getter를 써서 반환

    //싱글톤 패턴 : 하나의 객체만 생성하여 사용하도록 만드는 패턴
    private static UserDAO instance  = new UserDAO();
    //Connection 객체를 생성하기 위한 값
    private String url ="jdbc:mysql://localhost:3306/jdbctest";
    private String user = "jdbc";
    private String password = "jdbc";

    //데이터 접속을 위한 객체 데이터베이스 연결 객체(Connection 객체)
    Connection conn = null; //비어있는 객체선언.
    ResultSet rs = null;
    private UserDAO() {
        //생성자가 한 번 동작할 때 드라이버와 연결
         try {
                Class.forName("com.mysql.cj.jdbc.Driver");

                // 2. Connection 객체 생성 - DriverManger.getConnection 이용
                conn = DriverManager.getConnection(url, user, password);
                System.out.println(conn);
                System.out.println("데이터베이스 접속 성공.");



            } catch (ClassNotFoundException e) {
                System.out.println("드라이버 로드 실패");
            }
            catch(SQLException sqle) {
                System.out.println("SQL 연동 오류");
                System.out.println(sqle.getMessage());

            }
    }
    public static UserDAO getInstance() {
        return instance;
    }
    public static void setInstance(UserDAO instance) {
        UserDAO.instance = instance;
    }

VO

  • VO 클래스는 DB컬럼을 자바변수로 동일하게 선언
package com.jdbc.domain;

public class UserVO {
    // vo class DB column을 자바변수로 동일하게 선언, 은닉 선언

    private String id;
    private String pw;
    private String name;
    private String phone1;
    private String phone2;
    private String gender;


    public UserVO() {
        super();
    }
    public UserVO(String id, String pw, String name, String phone1, String phone2, String gender) {
        super();
        this.id = id;
        this.pw = pw;
        this.name = name;
        this.phone1 = phone1;
        this.phone2 = phone2;
        this.gender = gender;
    }
    @Override
    public String toString() {
        return String.format("UserV)[id= %s, pw= %s, name= %s, phone1= %s, phone2= %s, gender= %s]",id,pw, name, phone1, phone2,gender);
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPw() {
        return pw;
    }
    public void setPw(String pw) {
        this.pw = pw;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone1() {
        return phone1;
    }
    public void setPhone1(String phone1) {
        this.phone1 = phone1;
    }
    public String getPhone2() {
        return phone2;
    }
    public void setPhone2(String phone2) {
        this.phone2 = phone2;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }


}

회원 가입 처리

  • 이건 서블릿으로 작성하기로 한다
  1. login.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
    <h2>회원 가입 연습</h2>
    <body>
    <form action="join_ok" method="post">
    ID : <input type="text" name="id"><br> 
    PW : <input type="password" name="pw"><br>
    이름 : <input type="text" name="name"><br>
    <select name="phone1">
        <option>010</option>
        <option>011</option>
        <option>018</option>
    </select>
    -<input type="text" name = phone2><br>

    <input type="radio" name="gender" value="m"/>남자
    <input type="radio" name="gender" value="w"/>여자 <br>

    <input type = "submit" value= "가입">
    </form>

</body>
</html>
  • join_ok 서블릿으로 처리하기 위해 서블릿을 만든다
  1. join_ok.java
  • 회원 가입을 처리한다.
package com.jdbc.ok;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jdbc.domain.UserDAO;
import com.jdbc.domain.UserVO;

/**
 * Servlet implementation class join_ok
 */
@WebServlet("/join_ok")
public class join_ok extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public join_ok() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //form에서 들어오는 값 처리

        request.setCharacterEncoding("utf-8");

        String id = request.getParameter("id");
        String pw = request.getParameter("pw");
        String name = request.getParameter("name");
        String phone1 = request.getParameter("phone1");
        String phone2 = request.getParameter("phone2");
        String gender = request.getParameter("gender");

        //DAO 객체 생성 -> 싱글톤 작업을 할 것임! 딱 하나의 dao 객체를 만듦 -> db와 작업함!

        UserDAO dao = UserDAO.getInstance();

        //VO 객체 생성
        UserVO vo = new UserVO(id, pw, name, phone1, phone2, gender);

        //회원가입 처리
        int result = dao.join(vo);

        if(result ==1) {//성공시 처리
            response.sendRedirect("join_success.jsp");
        }else { //실패 시 처리
            response.sendRedirect("join_fail.jsp");
        }
    }

}
  • 여기서 dao에는 지금은 join 메소드가 없어 직접적으로 만들어줘야 한다
  1. UserDAO에 join 메소드 추가

    //-----------------기능을 메소드로 선언

    //회원 가입
    public int join(UserVO vo) {
        int result = 0;

        String sql = "insert into user values(?,?,?,?,?,?)";

        try {
             Class.forName("com.mysql.cj.jdbc.Driver");
             conn = DriverManager.getConnection(url, user,password);
             System.out.println(conn);
             System.out.println("데이터베이스 접속 성공.");
             pstmt = conn.prepareStatement(sql);

             pstmt.setString(1,vo.getId());
             pstmt.setString(2,vo.getPw());
             pstmt.setString(3,vo.getName());
             pstmt.setString(4,vo.getPhone1());
             pstmt.setString(5,vo.getPhone2());
             pstmt.setString(6,vo.getGender());

             result = pstmt.executeUpdate();

             if(result != 0) {
                 System.out.println("SQL성공");
             }else {
                 System.out.println("SQL실패");
                 }
        }  catch (ClassNotFoundException e) {
             System.out.println("드라이버 로드 실패");
          }catch (SQLException sqle) {
             System.out.println("SQL 연동 오류");
             System.out.println(sqle.getMessage());
          }finally {
             try {

             } catch (Exception e) {
                // TODO: handle exception
             }
          }

        return result;

    }
  1. join_fail.jsp생성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>회원가입을 실패했습니다</h1>
<a href="join.jsp">회원가입 페이지로 이동</a>
</body>
</html>
  1. join_success.jsp 생성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

<h1>회원가입을 축하합니다</h1>
<a href="login.jsp">로그인 페이지로 이동</a>
</body>
</html>

login 구현하기

  1. UserDAO객체 생성 => login_ok.java
    package com.jdbc.ok;



import java.io.IOException;  
import javax.servlet.ServletException;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpSession;

import com.jdbc.domain.UserDAO;  
import com.jdbc.domain.UserVO;

@WebServlet("/login\_ok")  
public class login\_ok extends HttpServlet {  
private static final long serialVersionUID = 1L;

public login_ok() {
    super();
    // TODO Auto-generated constructor stub
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //폼데이터 처리
    String id = request.getParameter("id");
    String pw = request.getParameter("pw");

    UserDAO dao = UserDAO.getInstance();

    //dao에 login(id,pw) 메서드를 생성

    //회원가입 처리
    int result = dao.login(id,pw);
    if(result ==1) {//성공시 처리
        HttpSession session = request.getSession();
        session.setAttribute("id", id);
        response.sendRedirect("mypage.jsp");
    }else { //실패 시 처리
        response.sendRedirect("login_fail.jsp");
    }
}


}
  1. DAO에 login(id, pw) 메서드를 생성 : sql = select * from user where id = ? and pw = ?
    public int login(String id, String pw) {
        int result = 0;
         String sql = "select * from user where id=? and pw=?";

            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                 conn = DriverManager.getConnection(url, user, password);
                 System.out.println(conn);
                 System.out.println("데이터베이스 접속 성공.");

                 pstmt = conn.prepareStatement(sql);

                 pstmt.setString(1, id); // id 값이 문자열이므로 setString을 사용하여 데이터 타입을 지정
                 pstmt.setString(2, pw); // pw 값이 문자열이므로 setString을 사용하여 데이터 타입을 지정


                 rs = pstmt.executeQuery(); // 쿼리 실행 결과를 ResultSet에 저장

                 if (rs.next()) {
                     result = 1; // 존재하는 경우 1, 존재하지 않는 경우 0
                 }

                 if(result != 0) {
                     System.out.println("SQL성공");
                 }else {
                     System.out.println("SQL실패");
                     }    

            }
            catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                 try {
                     if(conn!=null) conn.close();
                     if(pstmt!=null) pstmt.close();
                     if(rs!=null) rs.close();

                 } catch (Exception e) {
                    // TODO: handle exception
                 }
            }

        return result;

    }
  1. login 메서드 안에서 executeQuery() 구문으로 실행 : rs.next() 결과가 있으면 1, 없으면 0을 반환
  2. login_ok에서는 세션을 id로 저장하고 화면으로 이동
    1. 결과가 1인 경우, mypage.jsp -> XXX님 환영합니다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    <%
    String id = (String)session.getAttribute("id"); //type casting 필요
    if(id==null){

        response.sendRedirect("login.jsp");
    }
    %>


<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1><%=id %>님 환영합니다.</h1>

<a href="logout.jsp">로그아웃</a><br>
<a href="modify_ok.jsp">정보수정</a><br> 
<!-- DB로 부터 객체 정보를 담아와서 vo에 담아줘야 한다, update.jsp 를 그대로 나온다. 값을 변경해야 한다.
 update_ok로 가야함. 수정이 다되면 my_page로 다시 온다.  -->
<a href="delete_ok.jsp">회원탈퇴</a>
</body>
</html>
  1. 결과가 0인 경우, login_fail.jsp로 이동 -> 로그인 실패했습니다. 로그인페이지로 이동 링크 생성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>

<h1>로그인에 실패했습니다</h1>
<h2>아이디나 패스워드가 틀립니다.</h2>
<a href="login.jsp">로그인 페이지로 이동</a>
</body>
</html>

'개발 언어 > JSP' 카테고리의 다른 글

JSP mini project : mypage 실습  (0) 2024.04.15
6-1 JSP-JDBC 연동2  (0) 2024.04.12
5. javaBean  (0) 2024.04.11
4. application, param, include, forward, action tag, error page  (0) 2024.04.09
3. Cookie, Session  (0) 2024.04.08