ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 25. Model2 방식
    개발자 수업/JSP 2021. 12. 21. 17:08

    1. Web Application Model1
        1) 표준화된 소스 구조
        2) 모델1, 모델2가 있음

    2. 모델1 방식
        1) 모든 클라이언트의 요청과 비즈니스 로직 처리를 JSP가 담당하는 구조
        2) 기능 구현이 쉽고 편리하지만 유지보수가 어려움

    3. 모델2 방식
        1) 각 기능을 분리해서 구현
            - 클라이언트의 요청 처리 및 흐름 제어 담당 (Controller) -> 서블릿
            - 응답 처리 (화면기능) (View) -> JSP
            - 비즈니스 로직 처리 (Model) -> DAO
        2) 각각의 기능을 모듈화해서 개발 -> 재사용 높음
        3) 유지보수가 쉬움
        4) 퍼블리셔와 개발자 작업 분업화
        5) 모델2 방식과 관련된 기능, 개념에 대한 이해가 필요

    4. MVC 디자인 패턴
        1) Model-View-Controller
            - Controller
                - 서블릿이 컨트롤러 역할
                - 클라이언트의 요청을 분석
                - Model에서 처리한 결과를 보여주기 위해 JSP를 선택
            - Model
                - 데이터베이스 연동과 같은 비즈니스 로직을 수행
                - DAO, DTO(VO) 클래스
            - View
                - JSP가 화면 기능을 담당
                - Model에서 처리한 결과를 화면에 표시
        2) 일반 PC 프로그램 개발에 사용되는 패턴을 웹 애플리케이션에 도입

    5. url-pattern
        1) 디렉토리 패턴
            - 디렉토리 형태로 서버의 해당 컴포넌트(서블릿)를 찾아서 실행하는 구조
            - 예) http://localhost/프로젝트명/directory -> 해당 Servlet
        2) 확장자 패턴
            - 확장자 형태로 서버의 해당 컴포넌트(서블릿)를 찾아서 실행하는 구조
            - 예) http://localhost/프로젝트명/list.do
                  http://localhost/프로젝트명/update.do     --> do Servlet
                  http://localhost/프로젝트명/detail.do
            - http://localhost/프로젝트명/*.do 로 끝나는 요청을 동일한 doServlet으로 찾아가게 매핑함

    6. FrontController 패턴
        1) FrontController 패턴 적용 전
            - 클라이언트의 다양한 요청이 개별적인 서블릿에 존재 -> 파일도 많아지고 관리 부담 -> 모든 요청을 처리하는 하나의 서블릿을 만들고, 이에 맞게 분기처리를 함
        2) FrontController 패턴 적용 후
            - 클라이언트의 다양한 요청을 한 곳에 집중시켜 개발 및 유지보수 효율성 증대

    7. Command 패턴
        1) 클라이언트로부터 받은 요청들에 대해서 서블릿이 직접하지 않고 해당 클래스가 처리하도록 함
        2) FrontController 역할을 하는 서블릿이 직접 처리하지 않고 해당 업무 담당 서블릿으로 분산시켜서 처리하도록 함

    -> FrontController 패턴 + Command 패턴


    MemberController.java
    
    package kr.co.ezenac.member;
    
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class MemberController
     */
    @WebServlet("/mem.do")
    public class MemberController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	
    	MemberDAO memberDAO;
    	
    	@Override
    	public void init() throws ServletException {
    		memberDAO = new MemberDAO();
    	}
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandler(request, response);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandler(request, response);
    	}
    
    	private void doHandler(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html; charset=utf-8");
    		List<MemberVO> membersList = memberDAO.listMembers();	//요청에 대한 회원 정보를 조회함
    		request.setAttribute("membersList", membersList); 		//조회한 회원 정보를 request에 바인딩함
    		
    		//컨트롤러에서 해당 결괄르 표시할 JSP로 포워딩함
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/member/listmembers.jsp");
    		dispatcher.forward(request, response);
    	}
    
    }
    MemberDAO.java
    
    package kr.co.ezenac.member;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
    
    public class MemberDAO {
    	private Connection conn;
    	private PreparedStatement pstmt;
    	private DataSource dataFactory;
    	
    	public MemberDAO() {
    		try {
    			Context ctx = new InitialContext();
    			Context envContext = (Context)ctx.lookup("java:/comp/env");		//JNDI에 접근하기 위해 기본경로를 지정
    			//톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴
    			dataFactory = (DataSource)envContext.lookup("jdbc/oracle");		
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public List<MemberVO> listMembers() {
    		List<MemberVO> membersList = new ArrayList<>();
    		
    		try {
    			conn = dataFactory.getConnection();
    			String query = "SELECT * FROM T_MEMBER ORDER BY JOINDATE DESC";
    			System.out.println(query);
    			
    			pstmt = conn.prepareStatement(query);
    			ResultSet rs = pstmt.executeQuery();
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");
    				MemberVO memberVO = new MemberVO(id, pwd, name, email, joinDate);
    				membersList.add(memberVO);
    			}
    			rs.close();
    			pstmt.close();
    			conn.close();
    			
    		} catch(Exception e) {
    			System.out.println("회원 조회 중 오류");
    			e.printStackTrace();
    		}
    		
    		return membersList;
    	}
    }
    MemberVO.java
    
    package kr.co.ezenac.member;
    
    import java.sql.Date;
    
    public class MemberVO {
    	private String id;
    	private String pwd;
    	private String name;
    	private String email;
    	private Date joinDate;
    	
    	public MemberVO() {
    		System.out.println("MemberVO 생성자 호출");
    	}
    
    	public MemberVO(String id, String pwd, String name, String email) {
    		this.id = id;
    		this.pwd = pwd;
    		this.name = name;
    		this.email = email;
    	}
    
    	public MemberVO(String id, String pwd, String name, String email, Date joinDate) {
    		super();
    		this.id = id;
    		this.pwd = pwd;
    		this.name = name;
    		this.email = email;
    		this.joinDate = joinDate;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getPwd() {
    		return pwd;
    	}
    
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    
    	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 getJoinDate() {
    		return joinDate;
    	}
    
    	public void setJoinDate(Date joinDate) {
    		this.joinDate = joinDate;
    	}
    }
    listmembers.jsp
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%
    	request.setCharacterEncoding("utf-8");
    %>
    	
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>Insert title here</title>
    	<style type="text/css">
    		.cls1{
    			font-size: 40px;
    			text-align: center;
    		}
    		
    		.cls2{
    			font-size: 20px;
    			text-align: center;	
    		}
    	</style>
    </head>
    <body>
    	<p class="cls1">회원정보</p>
    	<table align="center" border="1">
    		<tr align="center" bgcolor="lightgreen">
    			<td width="%"><b>아이디</b></td>
    			<td width="%"><b>비밀번호</b></td>
    			<td width="%"><b>이름</b></td>
    			<td width="%"><b>이메일</b></td>
    			<td width="%"><b>가입일</b></td>
    		</tr>
    		<c:choose>
    			<c:when test="${empty membersList }">
    				<td colspan="5" align="center">
    					<b>등록된 회원이 없습니다.</b>
    				</td>
    			</c:when>
    			<c:when test="${!empty membersList }">
    				<c:forEach var="mem" items="${membersList }">
    					<tr align="center">
    						<td>${mem.id }</td>
    						<td>${mem.pwd }</td>
    						<td>${mem.name }</td>
    						<td>${mem.email }</td>
    						<td>${mem.joinDate }</td>
    					</tr>
    				</c:forEach>
    			</c:when>
    		</c:choose>
    	</table>
    	
    	<a href="#"><p class="cls2">회원 가입하기</p></a>
    </body>
    </html>


    FrontController.java
    
    package kr.co.ezenac.front;
    
    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;
    
    /**
     * Servlet implementation class FrontController
     */
    @WebServlet("*.one")
    public class FrontController extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String uri = request.getRequestURI();
    		int lastSlash = uri.lastIndexOf("/");
    		String commandStr = uri.substring(lastSlash);
    		
    		if(commandStr.equals("/register.one")) {
    			registFunc(request);
    		} else if(commandStr.equals("/login.one")) {
    			loginFunc(request);
    		} else if(commandStr.equals("/freeboard.one")) {
    			freeboardFunc(request);
    		}
    		
    		request.setAttribute("uri", uri);
    		request.setAttribute("commandStr", commandStr);
    		request.getRequestDispatcher("/front/frontController.jsp").forward(request, response);
    	}
    
    	private void freeboardFunc(HttpServletRequest request) {
    		request.setAttribute("resultValue", "<h4>자유게시판</h4>");
    		
    	}
    
    	private void loginFunc(HttpServletRequest request) {
    		request.setAttribute("resultValue", "<h4>로그인</h4>");
    		
    	}
    
    	private void registFunc(HttpServletRequest request) {
    		request.setAttribute("resultValue", "<h4>회원가입</h4>");
    		
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		
    	}
    
    }
    frontController.jsp
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>Frontcontroller 테스트</title>
    </head>
    <body>
    	<h3>한 번의 매핑으로 여러가지 요청 처리하기</h3>
    	${resultValue }
    	<ol>
    		<li>URI : ${uri }</li>
    		<li>요청명 : ${commandStr } </li>
    	</ol>
    	<ul>
    		<li><a href="../front/register.one">회원가입</a></li>
    		<li><a href="../front/login.one">로그인</a></li>
    		<li><a href="../front/freeboard.one">자유게시판</a></li>
    	</ul>
    </body>
    </html>

    '개발자 수업 > JSP' 카테고리의 다른 글

    27. Model2 방식 - 게시판  (0) 2021.12.22
    26. Model2 방식 - 회원  (0) 2021.12.22
    24. jQuery Ajax  (0) 2021.12.20
    23. 파일 업로드 다운로드  (0) 2021.12.16
    22. JSTL  (0) 2021.12.15

    댓글