Spring : MVC 패턴

커비·2024년 12월 9일
0

Spring

목록 보기
5/6

Template Engine

동적인 웹 페이지를 생성하기 위해 사용되는 도구이며 템플릿을 기반으로 정적인 부분과 동적인 데이터를 결합하여 HTML, XML 등의 문서를 생성하는 역할을 수행함


(우리가 흔히 말하는 UI를 만들며 SSR에 사용됨)

템플릿 엔진이 나온 이유

  • 자바 코드로 HTML을 만들어내는 것이 아닌 HTML 문서에 동적으로 변경해야하는 부분만 자바 코드를 넣을 수 있다면 더 편리하기 때문

대표적인 템플릿 엔진

  • Thymeleaf : Spring과 통합이 잘되어있고 다양한 기능을 포함하고 있음
  • JSP : 예전에는 많이 사용했으나 현재는 사용하지 않는 추세
  • FreeMarker
  • Velocity
  • Mustache

MVC 패턴

Servlet이나 JSP만으로 비즈니스 로직과 View Redering까지 모두 처리하면 너무 많은 역할을 하게 되고 책임이 너무 많기 때문에 유지보수가 굉장히 어려워져서 고안된 패턴
Web Appliction은 일반적으로 MVC(Model View Controller) 패턴을 사용함


Servlet 예시

@WebServlet("/hello-world")
public class HelloWorldServlet extends HttpServlet {
		
		// User 저장소
    private UserRepository repository = new UserRepository();
    
    public HelloWorldServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        
        try {
            // 비지니스 로직을 처리하는 코드
            // 파라미터 조회 
            String userIdParam = request.getParameter("userId");
            Long userId = null;
            if (userIdParam != null) {
                userId = Long.parseLong(userIdParam);
            }
            
            // 회원 조회 
            String userInfo = repository.findById(userId);
            
            // 화면을 그리는 코드 START
            out.println("<h1>Hello World!</h1>");
            out.println("<div>조회한 회원의 정보: " + userInfo + "</div>");
            // 화면을 그리는 코드 END
            
           
        } catch (NumberFormatException e) {
	        // parsing 에러가 발생한 경우
            out.println("<div>Invalid user ID format</div>");
        } finally {
            out.close();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {        
        doGet(request, response);
    }
}

Servlet 문제점

  • 화면을 그리는 View 영역과 비즈니스 로직이 Servlet 하나에 모두 섞여있음
  • 책임을 너무 많이 가지고 있음

Servlet 동작 순서

  1. 사용자가 Client(브라우저)를 통해 서버에 HTTP Request 즉, API 요청을 한다.
  2. 요청을 받은 Servlet 컨테이너는 HttpServletRequest, HttpServletResponse객체를 생성한다.
  3. 설정된 정보(URL, HTTP Method)를 통해 어떠한 Servlet에 대한 요청인지 찾는다.
  4. 해당 Servlet에서 service 메서드를 호출한 뒤 브라우저의 요청 Method에 따라 doGet() 혹은doPost() 등의 메서드를 호출한다.
  5. 서버에서 응답을 생성한 뒤 HttpServletResponse객체에 응답을 담아 Client(브라우저)에 반환한다.
  6. 응답이 완료되면 생성한 HttpServletRequest, HttpServletResponse객체를 소멸한다.

JSP 예시

Servlet 코드에서 HTML을 만드는 부분인 View가 분리되었음

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
		<!-- HTML 코드... -->
		<!-- <%...%> 영역에는 Java 코드를 사용할 수 있다. -->
    <%
		    // 게시글 저장소 싱글톤으로 인스턴스 생성
		    BoardRepository boardRepository = BoardRepository.getInstance();
		    
		    // 게시글 제목, 내용 
        String title = request.getParameter("title");
        String content = request.getParameter("content");
        
        // 게시글 객체 생성
        Board board = new Baord(title, content);
        
        // 게시글 객체 저장
        repository.save(board);
        
    %>
    <div>
        ID : <input type ="text" name = "id" value="<%=id %>">
    </div>
		<!-- JSP 코드... -->
		<!-- HTML 코드... -->
    <jsp:forward page="<%=url %>" />
</body>
</html>

Servlet, JSP 방식의 문제점

  1. Servlet만을 사용한 경우 View를 위한 코드와 비지니스 로직을 처리하는 코드가 Servlet에 모두 존재하여 유지보수가 어려워진다.
  2. JSP를 사용하여 View를 분리하였지만 비지니스 로직의 일부가 JSP 파일안에 존재한다. 여전히 책임이 많아 유지보수가 어렵다.

MVC 패턴

하나의 Servlet이나 JSP로 처리하던 것들을 Model, View, Controller 영역으로 나눈것

MVC패턴의 핵심

  • View가 분리된 이유의 핵심은 변경이다.
  • 기획이 변하지 않는 이상 비지니스 로직과 View의 수정 원인은 별개로 발생한다.
    • 화면 구성에 수정이 발생하면 View만 변경
    • 요구사항에 수정이 발생하는 경우 비지니스 로직 변경
  • 즉, 서로 연관이 없는 코드끼리 함께 존재할 필요가 없다. 완전히 분리하자

Controller

  1. HTTP Request를 전달받아 파라미터를 검증
  2. 비지니스 로직을 실행
    • 비지니스 로직을 Controller에 포함하게되면 Controller가 너무 많은 역할을 담당하게 되어 일반적으로 Service Layer를 별도로 만들어서 처리
    • Database와 상호작용 하는 Layer를 따로 구분하여 Repository Layer를 추가로 구성함
    • Controller도 비지니스 로직을 포함할 수 있지만 일반적으로 Service Layer를 호출하는 역할을 담당함
  3. View에 전달할 결과를 조회하여 Model 객체에 임시로 저장

Model

  1. View에 출력할 Data를 저장하는 객체
  2. View는 비지니스 로직이나 Data 접근을 몰라도 되고 View Rendering에만 집중(책임 분리)

View

  • 예시 코드에서 JSP에 해당하는 영역
  1. Model 객체에 담겨져 있는 Data를 사용하여 화면을 Rendering함
profile
전공은 컴퓨터공학, 복수전공은 해킹보안학, 직장은 방학(파워 구직중)

0개의 댓글