📕 목차
1. 기존 웹 개발의 문제점
비즈니스 로직과 화면 렌더링 혼합
- 자바 코드로 HTML을 생성하는 방식에서는 비즈니스 로직과 화면 렌더링 코드가 하나의 파일에 섞여 있었다.
- 이로 인해 코드 복잡성이 증가하고, 유지보수가 어려워짐.
문제점
- 화면 구성 변경 시 비즈니스 로직까지 영향을 미침
- 비즈니스 로직 수정 시 화면에 변화가 생김
- 수정 시 모든 부분을 점검해야 함.
2. 템플릿 엔진의 도입
템플릿 엔진
- 정적인 HTML에 동적 데이터를 삽입하여 최종 문서를 생성.
- Server Side Rendering(SSR)에 주로 사용됨.

대표적인 템플릿 엔진
- Thymeleaf: Spring과 통합 잘 됨.
- JSP: 예전에 많이 사용되었으나, 현재는 점차 사용을 자제하는 추세.
- FreeMarker, Velocity, Mustache 등.
템플릿 엔진의 장점
- 비즈니스 로직과 화면 렌더링을 분리할 수 있음.
템플릿 엔진의 한계
- 비즈니스 로직이 여전히 뷰에 존재
- 템플릿 엔진을 사용해도 복잡한 비즈니스 로직은 여전히 뷰(View)에 존재할 수 있다.
- 템플릿 엔진에서 일부 로직을 처리할 수 있지만, 이는 복잡한 처리나 상태 관리가 필요한 경우에는 한계가 있다.
- 제어 흐름의 제한
- 템플릿 엔진은 HTML 문서 내에서 조건문과 반복문 등의 제어 흐름을 사용할 수 있지만, 복잡한 제어 흐름이나 중첩된 조건을 처리하는 데는 적합하지 않다.
- 이러한 복잡한 로직은 Java 코드로 처리하는 것이 더 적합하다.
- 성능 문제
- 템플릿 엔진을 사용하면 서버 측에서 HTML을 동적으로 생성해야 하므로, 페이지 렌더링 성능에 영향을 미칠 수 있다. 특히 데이터가 많거나 복잡한 처리가 필요한 경우, 성능이 저하될 수 있다.
- 디버깅 어려움
- 템플릿 엔진에서 발생하는 오류나 예외는 HTML 코드 안에서 일어나므로, 디버깅이 어려울 수 있다. 템플릿 코드 내에서 발생하는 문제를 추적하는 데 시간이 더 걸릴 수 있다.
3. MVC 패턴의 도입
MVC 패턴
- 비즈니스 로직과 화면 렌더링을 Model, View, Controller로 분리.

MVC 구성 요소
- Model: 데이터와 비즈니스 로직 담당.
- 데이터: 애플리케이션에서 사용하는 데이터와 관련된 모든 작업을 처리한다.
- 비즈니스 로직: 실제 애플리케이션의 기능을 구현하는 코드가 포함된다.
- 독립성: Model은 View나 Controller와 직접적으로 상호작용하지 않으며, 오직 비즈니스 로직과 데이터 처리에만 집중한다. 이로 인해 데이터 처리 및 로직 수정 시 UI와는 독립적으로 작업할 수 있다.
- View: 사용자에게 보여지는 화면 담당.
- UI 구성: View는 화면의 레이아웃, 버튼, 폼, 텍스트 등 사용자 인터페이스(UI) 요소를 포함한다. 즉, 사용자와 상호작용하는 모든 시각적인 요소가 View에 해당한다.
- UI 업데이트: Model에서 데이터가 변경되면, View는 그 데이터를 사용자에게 표시하기 위한 역할을 한다
- 독립성: View는 비즈니스 로직이나 데이터 처리와 관련이 없으며, 단지 사용자에게 데이터를 어떻게 표시할지를 담당한다. 이를 통해 UI의 변경이 비즈니스 로직에 영향을 미치지 않도록 할 수 있다.
- Controller: 사용자의 요청을 처리하고, 적절한 Model과 View를 연결하는 중간 관리자 역할
- 요청 처리: 사용자가 버튼을 클릭하거나 폼을 제출하는 등의 요청을 받으면, Controller가 해당 요청을 처리한다. 이때 Controller는 요청에 맞는 비즈니스 로직을 실행할 모델을 선택하고 호출한다.
- Model과의 상호작용: Controller는 필요한 비즈니스 로직을 Model에 전달하고, 그 결과를 받는다. 그 후, 적절한 데이터를 View에 전달하여 사용자에게 출력할 수 있게 한다.
- 업데이트/전환: Controller는 Model의 상태가 변경되면 이를 View에 반영하도록 지시한다.
- 독립성: Controller는 UI와 데이터를 관리하는 역할을 하며, 두 요소가 서로 독립적으로 작동할 수 있도록 한다. UI의 변경이 Controller나 Model에 영향을 미치지 않도록 하며, 반대로 비즈니스 로직의 수정도 UI에 직접 영향을 주지 않는다.
MVC 패턴의 흐름
- 사용자가 View를 통해 요청을 보낸다 (예: 버튼 클릭).
- Controller가 이 요청을 받아 적절한 Model을 호출하고, 데이터를 처리한다.
- Model에서 처리된 데이터를 Controller가 받는다.
- Controller는 그 데이터를 View에 전달하여 화면을 업데이트한다.
- View는 사용자에게 최종 결과를 보여준다.
MVC 장점
- 독립적인 수정: 비즈니스 로직과 UI를 독립적으로 수정할 수 있다.
- 가독성 향상: 코드의 가독성이 높아져 유지보수가 용이하다.
- 유지보수성 증가: 비즈니스 로직과 UI를 분리하여 수정 범위를 최소화한다.
- 협업과 확장성: 각 부분을 독립적으로 작업할 수 있어 협업에 유리하고, 시스템 확장에 용이하다.
4. [실습]
프로젝트 빌드 하기
> spring-basic-jsp 실습 파일
디렉토리 구성 확인
- src/main/java: Java 소스 파일
- webapp/WEB-INF/views: JSP 파일 위치
main 메서드 위치: main/java/SpringBasicApplication

SpringBasicApplication.java
package com.example.springbasicjsp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class SpringBasicJspApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBasicJspApplication.class, args);
}
}
빌드 (실행)
결과

MVC 패턴 살펴보기
블로그 글 목록 조회시 동작하는 Servlet (MvcPostListServlet.java)
package com.example.springbasicjsp;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet(
name = "mvcPostListServlet",
urlPatterns = "/mvc/posts/list"
)
public class MvcPostListServlet extends HttpServlet {
private PostRepository postRepository = PostRepository.getInstance();
@Override
protected void service(
HttpServletRequest request,
HttpServletResponse response
) throws ServletException, IOException {
// 회원 목록 조회
List<Post> posts = postRepository.findAll();
// request 객체의 임시저장소 Model에 posts를 저장
request.setAttribute("posts", posts);
String path = "/WEB-INF/views/posts.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(path);
dispatcher.forward(request, response);
}
}
블로그 글 목록 조회 JSP (posts.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta charset="UTF-8">
<title>글 목록 조회</title>
</head>
<body>
<table>
<thead>
<th>id</th>
<th>title</th>
<th>content</th>
</thead>
<tbody>
<c:forEach var="post" items="${posts}">
<tr>
<td>${post.id}</td>
<td>${post.title}</td>
<td>${post.content}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
MVC 패턴이 적용되며 Controller와 View가 분리되었다.
화면에 수정이 발생하면 화면(View)만 수정하고 로직에 수정이 발생하면 로직만 수정하면 된다.
'Spring > 강의' 카테고리의 다른 글
| [📕 기초 Spring] 3-3. Spring MVC (0) | 2025.05.03 |
|---|---|
| [📕 기초 Spring] 3-2. MVC 패턴의 발전 (0) | 2025.05.03 |
| [📕 기초 Spring] 2-5. Java 웹 기술의 역사 (0) | 2025.05.03 |
| [📕 기초 Spring] 2-4. 빌드 관리 도구 (0) | 2025.05.03 |
| [📕 기초 Spring] 2-3. Spring Framework와 Spring Boot (0) | 2025.05.03 |