나를 기록하다
article thumbnail
반응형

현재 회원가입과 로그인 개발을 완료하였다.

공부했던 내용대로 Model, View, Controller를 구분하여 개발하고 싶었으나, 아직 MVC 패턴이 익숙하지 않아 우선 돌아가는 쓰레기라도 만든다는 생각으로 login.jsp에서 입력받은 값을 loginAction.jsp로 보내서 처리하고 DAO, DTO는 따로 만드는 방식으로 개발하였다.

 

확실히 이렇게 코드를 짜니 MVC 패턴으로 짰을 때보다 당장 구현하는 것은 쉬웠으나, 유지보수 측면에서 어려움이 있었다.

그래서 오늘은 이 프로젝트에 MVC 패턴을 적용시키고 싶어서 MVC 모델에 대해서 추가 공부를 하였다. (인강, 구글링 ..)

 

기업형으로 레이어를 나누는 이유

  • Servlet이라는 단일 구조에서 MVC로 코드를 분리한다.
  • Servlet(Controller 역할): Model(데이터)을 가공해서 View로 전달
  • JSP(View 역할): Controller에게 받은 Model을 화면에 출력해주는 역할

코드의 분리

  • 실제 기업에서는 웹페이지 제작 시 역할을 분담(분업)
    • Controller: Servlet을 만듦(예: 사용자의 요청에 의한 Model을 가공해서 View로 출력)
    • Service: 트랜잭션을 만듦(예: 계좌이체를 처리하는 트랜잭션)
    • DAO: 실제로 데이터를 조작하는 작업

 

Servlet
  • HTML을 자바 코드로 구현하며 문자열 스크림("")을 통해 처리
  • 배포 시 컴파일, 코드 수정시 다시 컴파일 해야함.
JSP
  • 자바코드를 <% %>를 이용해서 태그처럼 사용 가능

→ Servlet을 사용하지 않고 JSP만을 사용해서 동적 웹 서비스를 하는 model 1 탄생

 

Model 1

모델 1을 설명하는 구조

  • 모델 1 구조는 하나의 JSP 페이지에서 모든 작업을 처리하는 구조.
  • 장점: 단순한 구조
  • 단점: 가독성(java + html 섞여있음) / 프론트와 백엔드 분업이 모호 / 유지보수 어려움

 

Model 2

  • 모델 1에 대한 단점을 극복하기 위해 MVC 등장.

모델 2를 설명하는 구조

요청 처리 과정
  1. 서블릿 객체(컨트롤러)가 요청을 받음.
  2. 컨트롤러는 받은 요청에 따라 각 로직을 처리해야 하는 객체(모델)가 별도로 존재
  3. 모델 객체가 로직을 처리하면 나오는 결과값을 DTO 객체 등에 담아 컨트롤러에 반환
  4. 컨트롤러는 이 결과값을 클라이언트에 보여주기 위해 JSP 파일에 포워딩
  5. JSP 파일은 이쁘게 출력 버퍼에 담아 클라이언트에 출력(이쁘게 출력해주는 JSP 파일을 View)

Controller
  • 요청은 무조건 서블릿 객체가 받는다.
  • View로 부터 요청을 전달 받으며, Model로부터 넘어온 데이터를 View 측에 전달
  •  
View
  • 클라이언트의 요청을 받고 응답을 해주며 화면을 구성
 Model
  • DTO(Data Transfer Object): 데이터를 담는 객체를 정의(Bean 또는 VO로 쓰이기도 함)
  • Service: 클라이언트가 요청하는 서비스에 대해 처리(예: 트랜잭션)
  • DAO(Data Access Object): 데이터베이스와 연결되는 곳

예시

  • 태그를 클릭하면 type 파라미터 값에 따라 각각 다른 작업을 처리하는 서블릿 객체(Controller) 생성
<a href="/JSPPrj/practice/simple">simple</a><br>
<a href="/JSPPrj/practice/simple?type=date">simple_date</a><br>
<a href="/JSPPrj/practice/simple?type=greeting">simple_greeting</a><br>
<a href="/JSPPrj/practice/simple?type=admin">simple_admin</a><br>
  • 간단한 Controller를 구현하고 매핑
  • 출력 데이터 resultObject를 request에 저장하고 view 역할을 하는 /practice/simpleView.jsp로 포워딩
/* SimpleController.java */
public class SimpleController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 단계 1: 요청을 받음
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 단계 1: 요청을 받음 (POST 요청도 같은 처리를 수행함)
        processRequest(request, response);
    }

    private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 단계 2: 요청 파악
        String type = request.getParameter("type");

        // 단계 3: 요청에 따른 기능 수행을 위한 변수 초기화
        Object resultObject = null;

        if (type == null || type.equals("greeting")) {
            // 'type' 파라미터가 없거나 "greeting"일 경우, 인사 메시지 생성
            resultObject = "안녕하세요,";
        } else if (type.equals("date")) {
            // 'type' 파라미터가 "date"일 경우, 현재 날짜와 시간 생성
            resultObject = new Date();
        } else {
            // 그 외의 경우, 유효하지 않은 'type'으로 처리
            resultObject = "유효하지 않은 타입";
        }

        // 단계 4: 처리 결과를 요청 속성에 저장
        request.setAttribute("result", resultObject);

        // 단계 5: 결과를 보여줄 뷰로 포워딩
        RequestDispatcher dispatcher = request.getRequestDispatcher("/days10/simpleView.jsp");
        dispatcher.forward(request, response);
    }
}
/* simpleView.jsp */
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<%= request.getParameter("type") %> - ${ result }
</body>
</html>
  • 출력값
결과: 안녕하세요,
date - Mon Sep 18 11:43:24 KST 2023
greeting - 안녕하세요,
admin - Invalid Type

 

MVC 패턴을 공부했다. 기간을 정해둔 프로젝트이기에, 급하게 공부하고 만들고 하는 중이다.

프로젝트를 얼른 마무리하고 MVC 패턴에 대해서 좀 더 깊게 공부해보고 싶다.

공부하고 적용해보면서 조금의 이해는 했지만, 수박 겉핥기 같은 느낌이라 차후 제대로 된 이해를 위한 공부를 할 계획이다.

 

 

 

 

 

 

 


참고자료

https://kouzie.github.io/jsp/JSP-MVC%ED%8C%A8%ED%84%B4/#%EA%B0%84%EB%8B%A8%ED%95%9C-%EB%AA%A8%EB%8D%B8-2%EA%B5%AC%EC%A1%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-%EA%B5%AC%ED%98%84

 

JSP/Servlet - MVC패턴!

모델2 구조의 MVC패턴

kouzie.github.io

https://velog.io/@junhok82/Servlet%EA%B3%BC-JSP%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-MVC-%ED%8C%A8%ED%84%B4

 

Servlet과 JSP로 알아보는 MVC 패턴

MVC 디자인패턴은 장점이 많은 architecture다. 그러나 그만큼 알아야할 내용이 많고 구조또한 복잡해서 차근차근 알아갈 필요가있다. 이번 포스팅을 통해서 mvc 구조의 탄생비화(?)를 포함해 servlet과

velog.io

https://kabsung3.tistory.com/16

 

뉴렉처[Servlet/JSP] 강의 복습 69강~74강

69강 - 코드 분리를 위한 사전 설명 (기업형으로 레이어를 나누는 이유와 설명) Servlet이라는 단일구조에서 ==> MVC코드 분리 Servlet(컨트롤러 역할): Model(데이터)을 가공해서 View로 전달 .jsp(View 역할)

kabsung3.tistory.com

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...