[Spring 입문] MVC 패턴 1강

박화랑·2025년 3월 17일

Spring_개념정리

목록 보기
10/17

MVC 패턴 1강

1. Template Engine(템플릿 엔진)

  • 동적인 웹 페이지를 생성하기 위한 도구
  • 정적인 HTML 문서에 동적인 데이터를 결합하여 SSR(Server Side Rendering)을 수행

템플릿 엔진이 나온 이유

  • 자바 코드로 HTML을 생성하는 방식이 아닌, HTML 문서에 필요한 부분만 동적으로 변경하는 것이 더 효율적이기 때문

대표적인 템플릿 엔진

  1. Thymeleaf → Spring과 통합이 잘 되어 있으며, 다양한 기능 제공
  2. JSP(Java Server Pages) → 과거에는 많이 사용했으나 현재는 사용이 줄어드는 추세
  3. FreeMarker
  4. Velocity
  5. Mustache

2. MVC 패턴 개요

  • Servlet이나 JSP만으로 비즈니스 로직과 View Rendering까지 처리하면 코드의 복잡도가 증가하고 유지보수가 어려워짐
  • 이를 해결하기 위해 MVC(Model-View-Controller) 패턴이 등장

Servlet을 활용한 웹 애플리케이션 예시

@WebServlet("/hello-world")
public class HelloWorldServlet extends HttpServlet {
    private UserRepository repository = new UserRepository();

    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 = (userIdParam != null) ? Long.parseLong(userIdParam) : null;
            String userInfo = repository.findById(userId);
            
            // View를 포함한 코드
            out.println("<h1>Hello World!</h1>");
            out.println("<div>조회한 회원의 정보: " + userInfo + "</div>");
        } catch (NumberFormatException e) {
            out.println("<div>Invalid user ID format</div>");
        } finally {
            out.close();
        }
    }
}

Servlet의 문제점

  1. 비즈니스 로직과 View가 하나의 Servlet에 포함 → 유지보수가 어려움
  2. 역할 분리가 부족하여 코드가 복잡해짐

Servlet 동작 순서

  1. 사용자가 브라우저를 통해 HTTP 요청을 전송
  2. Servlet 컨테이너가 HttpServletRequest, HttpServletResponse 객체를 생성
  3. URL과 HTTP Method를 기반으로 요청에 맞는 Servlet을 찾음
  4. Servlet의 service() 메서드가 실행되며, 요청 방식에 따라 doGet() 또는 doPost() 실행
  5. 서버가 HttpServletResponse에 응답을 담아 브라우저로 반환
  6. 응답 완료 후 HttpServletRequest, HttpServletResponse 객체가 소멸

3. JSP를 활용한 웹 애플리케이션 예시

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>게시글 등록</title>
</head>
<body>
    <%
        BoardRepository boardRepository = BoardRepository.getInstance();
        String title = request.getParameter("title");
        String content = request.getParameter("content");
        Board board = new Board(title, content);
        boardRepository.save(board);
    %>
    <div>게시글이 저장되었습니다.</div>
</body>
</html>

JSP의 개선점

  • Servlet에서 HTML을 직접 생성하던 방식을 개선하여 View를 JSP로 분리

Servlet & JSP 방식의 문제점

  1. Servlet만 사용 시 → 비즈니스 로직과 View가 한곳에 있어 유지보수 어려움
  2. JSP를 사용해도 비즈니스 로직이 일부 포함됨 → 완전한 분리 미흡

4. MVC 패턴

  • 하나의 Servlet이나 JSP에서 모든 처리를 수행하는 방식에서 벗어나, Model, View, Controller로 역할을 분리한 패턴

MVC 패턴의 핵심 개념

  1. View와 비즈니스 로직을 분리해야 하는 이유
    • View(화면 구성)는 기획 변경에 따라 수정될 가능성이 높음
    • 비즈니스 로직은 기능 변경 시 수정이 발생
    • 두 가지를 완전히 분리하면 유지보수가 용이해짐

MVC 패턴 구조

구성 요소역할
Controller사용자의 요청을 받아 Model과 View를 연결
Model비즈니스 로직을 처리하고 데이터를 관리
ViewModel 데이터를 기반으로 화면을 렌더링

5. MVC 패턴의 동작 과정

  1. Controller → HTTP 요청을 받아 파라미터 검증 후 비즈니스 로직 호출
  2. Service Layer → 비즈니스 로직을 수행 (Controller에 직접 포함될 수도 있음)
  3. Repository Layer → 데이터베이스와 상호작용
  4. Model → View에 전달할 데이터를 저장
  5. View → Model 데이터를 사용하여 화면을 렌더링

Service Layer와 Repository Layer는 다음 강의에서 다룰 예정


정리

  • Template Engine: HTML 문서 내에서 동적인 데이터를 표현하기 위한 도구
  • Servlet & JSP의 한계: 비즈니스 로직과 View가 섞여 유지보수가 어려움
  • MVC 패턴: Model, View, Controller로 역할을 분리하여 유지보수성을 높이는 설계 방식
  • MVC 패턴 도입 이유: View와 비즈니스 로직을 분리하여 코드 변경을 용이하게 하기 위함
profile
개발자 희망생

1개의 댓글

comment-user-thumbnail
2025년 3월 17일

MVC에 대해 잘 알아갑니다 !!!!

답글 달기