JSP - #2 MVC Pattern

임다이·2023년 11월 1일
0

Jsp/Servlet

목록 보기
7/10

  • Design Pattern
    소프트웨어 설계에 있어 공통된 문제들에 대한 표준적인 해법과 작명법

MVC(Model View Controller)

시각적으로 보여지는 부분과 데이터를 처리하는 부분을 분리하여 유연한 구조를 설계

  • MVC 구성


    → 세 영역으로 구분하고, 영역간 결합도를 최소화
  • Model

    • 실행에 직접적인 관여 X
    • 데이터를 담거나, 데이터를 보내거나, 수정·삭제하는 객체
  • Controller

    • 어플리케이션의 행위를 정의
    • Logic 결과에 따라 적절한 View를 선택하여 응답
  • View

    • Model 데이터를 기반으로 실제 사용자에게 보여지는 페이지

  • Model1
    • 웹 어플리케이션을 개발할 때 JSP만을 사용 하는 설계방법
    • 클라이언트의 요청 처리, DB 연동, 세션관리, 응답 처리 등과 같은 작업을 JSP만으로 구현하는 방법

      → Model1은 소규모 프로젝트 때 사용한다.
  • Model2
    • Presentation Logic과 Business Login 처리를 명확하게 분리
  • Model1 vs Model2

    → Model1은 잘 사용하지않는다.

  • MVC Pattern

  • Model2

실습(회원가입/로그인)

  • View

  • Main.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
        fieldset {
            display:inline;
    }
    </style>
    </head>
    <body>
    
        <fieldset>
            <legend> Main </legend>
            <a href="./Join.jsp"> <button> 회원가입 </button> </a>
            <a href="./Login.jsp"> <button> 로그인 </button> </a>
        </fieldset>
    
    </body>
    </html>
  • Join.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
        fieldset {
            display:inline;
    }
    </style>
    </head>
    <body>
    
        <fieldset>
            <legend> 회원가입 </legend>
            <!-- action에 적을 때
                 servlet을 요청 : url mapping값(확장자X)
                 jsp로 요청 : 해당 jsp로 가기 위한 상대경로 -->
            <form action="JoinProgram">
            <table>
    
            <tr>
            <td> ID : </td>
            <td> <input type="text" name="id"> </td>
            </tr>
    
            <tr>
            <td> PW : </td>
            <td> <input type="password" name="pw"> </td>
            </tr>
    
            <tr>
            <td> NAME : </td>
            <td> <input type="text" name="name"> </td>
            </tr>
    
            <tr>
            <td><input type="submit" value="회원가입"></td>
            </tr>
    
            </table>
            </form>
        </fieldset>
    
    </body>
    </html>
  • Login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	fieldset {
		display: inline;
}
</style>
</head>
<body>

	<fieldset>
		<legend> 로그인 </legend>
		<form action="LoginProgram" method="post">
		<table>
		
		<tr>
		<td> ID : </td>
		<td> <input type="text" name="id"> </td>
		</tr>
		
		<tr>
		<td> PW : </td>
		<td> <input type="password" name="pw"> </td>
		</tr>
		
		<tr>
		<td><input type="submit" value="로그인"></td>
		</tr>
		
		</table>
		</form>
	</fieldset>

</body>
</html>
  • loginSuccess.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
        fieldset {
            display: inline;
    }
    </style>
    </head>
    <body>
    
        <%
            String name = request.getParameter("name");
            // MemberDTO login_dto = request.getAttribute("name");
            // String name = login_dto.getName();
        %>
    
        <fieldset>
            <h3>로그인 성공!</h3>
            <%= name %>님 환영합니다~!
            <!-- ${login_dto.name}님 환영합니다~! -->
        </fieldset>
    
    </body>
    </html>
  • loginFail.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
        fieldset {
            display: inline;
    }
    </style>
    </head>
    <body>
    
        <fieldset>
            <h3> 로그인 실패 </h3>
            <a href="./Main.jsp"> <button> 메인 </button> </a>
            <a href="./Login.jsp"> <button> 로그인 </button> </a>
        </fieldset>
    
    </body>
    </html>

  • Controller

  • JoinProgram.java

    @WebServlet("/JoinProgram")
    public class JoinProgram extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("[JoinProgram]");
    
            // Join.jsp에서 보낸 id, pw, name 3가지 데이터를
            // 받아와서 console창에 출력
    
            // post방식 디코딩
            response.setContentType("utf-8");
    
            // id, pw, name 데이터 받아오기
            String id = request.getParameter("id");
            String pw = request.getParameter("pw");
            String name = request.getParameter("name");
    
            System.out.println("id : " + id);
            System.out.println("pw : " + pw);
            System.out.println("name : " + name);
    
            // DTO(Data Transfer Object) 묶기
            MemberDTO dto = new MemberDTO(id, pw, name);
    
            // 회원가입 기능이 있는 join메소드 호출
            int row = new MemberDAO().join(dto);
    
            // MemberDAO dao = new MemberDAO();
            // dao. join(dto);
    
            // 성공 실패 여부 확인
            // 성공 -> Login.jsp
            // 실패 -> Main.jsp
            String moveURL;
            if(row > 0) {
                System.out.println("회원가입 성공");
                moveURL = "./Login.jsp";
            }else {
                System.out.println("회원가입 실패");
                moveURL = "./Main.jsp";
            }
    
            response.sendRedirect(moveURL);
    
        }
    
    }
    
  • LoginProgram.java

    @WebServlet("/LoginProgram")
    public class LoginProgram extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            System.out.println("[LoginProgram]");
    
            response.setContentType("utf-8");
    
            String id = request.getParameter("id");
            String pw = request.getParameter("pw");
    
            System.out.println("id : " + id);
            System.out.println("pw : " + pw);
    
            MemberDTO dto = new MemberDTO(id, pw);
    
            String name = new MemberDAO().login(id, pw);
    
            String moveURL;
            if(name != null) {
                // 로그인 성공
                // sendRedirect 페이지 이동 방식
                name = URLEncoder.encode(name, "UTF-8");
                System.out.println("로그인 성공");
                response.sendRedirect("./loginSuccess.jsp?name="+name);
    
                // forwarding 페이지 이동 방식
    //			RequestDispatcher rd = request.getRequestDispatcher("./loginSuccess.jsp");
    //			request.setAttribute("login_dto", login_dto);
    //			rd.forward(request, response);
            }else {
                // 로그인 실패
                System.out.println("로그인 실패");
                response.sendRedirect("./loginFail.jsp");
            }
        }
    
    }
    

  • Model

  • MemberDAO.java

    public class MemberDAO {
    
        // DAO(Data Access Object) : DB에 접근하는 객체
    
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
    
        // DB연결 메소드
        public void db_conn() {
    
            try {
                // 1. ojdbc6.jar 라이브러리 불러오기
                // C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
                // webapp -WEB-INF -lib 폴더에 넣기
    
                // 2. OracleDriver class 불러오기
                // OracleDriver : Java와 DB 사이에 통로를 만들어주는 역할
                Class.forName("oracle.jdbc.driver.OracleDriver");
    
                // 3. DB에 접속하기 위한 카드키 설정(주소, 계정, 비번)
                String url = "jdbc:oracle:thin:@localhost:1521:xe";
                String user = "service";
                String pw = "12345";
    
                // 4. DB에 접속 -> 접속 성공 시 Connection 객체로 반환
                conn = DriverManager.getConnection(url, user, pw);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // DB연결 종료 메소드
        public void db_close() {
    
            try {
                if(psmt != null) psmt.close();
                if(conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 회원가입 메소드
        public int join(MemberDTO dto) {
    
            int row = 0;
    
            try {
                db_conn();
    
                // 5. SQL 쿼리 작성 -> ? : 바인드변수 -> 성능향상을 위해(soft parsing)
                String sql = "insert into Member1 values(?, ?, ?)";
    
                // 6. SQL문장을 DB에 전달 -> 전달 성공 시 PrepareStatement 객체로 반환
                psmt = conn.prepareStatement(sql);
    
                // 7. 바인드변수 값 채우기
                // psmt.set자료형(물음표의 순서, 넣을 값)
                psmt.setString(1, dto.getId());
                psmt.setString(2, dto.getPw());
                psmt.setString(3, dto.getName());
    
                // 8. 실행
                // executeUpdate : DB에 변화가 생겼을 때, select구문을 제외한 모든 구문
                // executeQuery : DB에 질의할 때, select구문
                // int로 return하는 이유 : 몇 개의 행이 변화되었는지 알려주는 것!
                row = psmt.executeUpdate();
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally { // 무조건 (열려있으면 닫으세요)
    
                db_close();
    
            } return row;
        }
    
        // 로그인 메소드
        public String login(String id, String pw) {
    
            // 1. DB연결 메소드 호출
            db_conn();
    
            String name = null;
    
            try {
    
                // 2. 쿼리문 작성
                String sql = "select * from Member1 where id= ? and pw= ?";
    
                // 3. SQL문 DB에 전달 -> PrepareState객체 생성(psmt)
                psmt = conn.prepareStatement(sql);
    
                // 4. 받아온 id와 pw를 SQL문에 셋팅
                psmt.setString(1, id);
                psmt.setString(2, pw);
    
                rs = psmt.executeQuery();
    
                while(rs.next()) {
                    name = rs.getString("name");
                }
    
            } catch (Exception e) {
                e.printStackTrace();
    
            } finally {
    
                // 6. DB연결 종료 메소드 호출
                db_close();
    
            } return name;
        }
    
    }
    
  • MemberDTO.java

    public class MemberDTO {
    
        // DTO(Data Transfer Object) : 데이터 전달 객체
        // 테이블 형태 그대로 생성
    
        // 필드
        private String id;
        private String pw;
        private String name;
    
        // 메소드
        // 생성자 메소드 : 객체를 초기화 하기 위한 메소드
        // MemberDTO dto = new MemberDTO(id, pw, name);
    
        public MemberDTO(String id, String pw, String name) {
            this.id = id;
            this.pw = pw;
            this.name = name;
        }
    
        // 로그인을 위한 생성자 메소드
        public MemberDTO(String id, String pw) {
            this.id = id;
            this.pw = pw;
        }
    
        // Getter (불러오는거기때문에 매개변수 필요없다.)
        public String getId() {
            return id;
        }
        public String getPw() {
            return pw;
        }
        public String getName() {
            return name;
        }
    
    }
    

profile
노는게 제일 좋아~!

0개의 댓글