자바 웹 개발 기초: 서블릿부터 Spring MVC까지 단계별 실습 - 4. MVC패턴

조아·2025년 3월 6일

Spring MVC 패턴 설명

Spring 프레임워크에서 MVC 패턴은 웹 애플리케이션을 구조적으로 설계하는 중요한 디자인 패턴임. 이를 통해 애플리케이션의 유지보수성과 확장성을 높일 수 있음. 아래에서 Spring MVC 패턴의 개념과 동작 방식에 대해 설명함.

1. MVC 패턴이란?

MVC(Model-View-Controller) 패턴은 애플리케이션을 세 개의 주요 구성 요소로 분리하는 설계 패턴임.

  • Model(모델): 비즈니스 로직과 데이터를 처리하는 부분.
  • View(뷰): 사용자에게 데이터를 표시하는 역할.
  • Controller(컨트롤러): 사용자의 요청을 받고 모델과 뷰를 연결하는 역할.

Spring에서는 이 패턴을 기반으로 웹 애플리케이션을 설계함.

1.1 너무 많은 역할 문제

MVC 패턴을 적용하지 않으면 하나의 서블릿이나 JSP에서 비즈니스 로직과 뷰 렌더링을 모두 처리해야 함. 이 경우 유지보수가 어려워지며, 단순한 UI 변경도 수백 줄의 코드와 함께 수정해야 하는 문제가 발생함.

1.2 변경의 라이프 사이클 차이

UI 변경과 비즈니스 로직 변경은 각각의 라이프 사이클이 다름. 이를 하나의 코드에서 관리하면 유지보수성이 떨어짐. MVC 패턴은 이러한 문제를 해결하고 역할을 분리하여 변경이 독립적으로 이루어질 수 있도록 함.

1.3 기능 특화

뷰 템플릿(JSP, Thymeleaf 등)은 화면을 렌더링하는 데 최적화되어 있음. 따라서 이 부분을 뷰(View)에서 담당하고, 컨트롤러와 모델은 본연의 역할을 수행하는 것이 가장 효율적임.

2. Spring MVC 패턴의 주요 구성 요소

Spring MVC 패턴은 여러 구성 요소를 포함하며, 각각의 역할이 명확하게 분리됨.

2.1 DispatcherServlet

  • 클라이언트의 모든 요청을 중앙에서 처리하는 역할을 함.
  • 요청을 적절한 컨트롤러로 전달하고, 응답을 다시 클라이언트에게 반환함.

2.2 Controller

  • 클라이언트의 요청을 처리하는 역할을 함.
  • @Controller 또는 @RestController 어노테이션을 사용하여 정의함.
  • 요청을 받은 후 서비스 계층을 호출하고, 처리된 데이터를 뷰에 전달함.

2.3 Service

  • 비즈니스 로직을 처리하는 계층임.
  • @Service 어노테이션을 사용하여 정의하며, 컨트롤러에서 호출됨.

2.4 Repository

  • 데이터베이스와의 연결을 담당하는 계층임.
  • @Repository 어노테이션을 사용하며, JPA나 MyBatis 등을 통해 DB와 연동됨.

2.5 ViewResolver

  • 컨트롤러에서 반환한 데이터를 적절한 뷰로 변환하는 역할을 함.
  • JSP, Thymeleaf, Mustache 등 다양한 템플릿 엔진과 함께 사용됨.

3. Spring MVC 요청 처리 흐름

Spring MVC에서 클라이언트의 요청이 처리되는 흐름은 다음과 같음.

  1. 클라이언트가 URL을 통해 요청을 보냄.
  2. DispatcherServlet이 요청을 받음.
  3. 요청을 처리할 적절한 컨트롤러를 찾음.
  4. 컨트롤러가 요청을 처리하고, 필요한 경우 서비스 계층을 호출함.
  5. 서비스 계층은 비즈니스 로직을 수행하고, 필요한 데이터를 저장소에서 조회함.
  6. 컨트롤러는 처리된 데이터를 Model에 담아 반환함.
  7. ViewResolver가 데이터를 적절한 뷰로 변환하여 클라이언트에게 응답함.

4. 예제 코드

Spring Boot 환경에서 간단한 컨트롤러를 구현한 예제임.

@RestController
@RequestMapping("/api")
public class ExampleController {
    
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring MVC!";
    }
}
  • /api/hello 요청이 들어오면 "Hello, Spring MVC!" 응답을 반환함.

5. redirect vs forward

  • redirect: 클라이언트(웹 브라우저)가 요청을 받고 응답을 받은 후 새로운 URL로 다시 요청을 보내는 방식. URL이 변경됨.
  • forward: 서버 내부에서 요청을 다른 서블릿이나 JSP로 전달하는 방식. 클라이언트가 이를 인지하지 못하며, URL도 변경되지 않음.
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/result.jsp");
dispatcher.forward(request, response);

6. Spring MVC 적용 예제

서블릿을 컨트롤러로 사용하고, JSP를 뷰로 사용하는 방식으로 MVC 패턴을 구현할 수 있음.

6.1 회원 등록 컨트롤러

@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String viewPath = "/WEB-INF/views/new-form.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }
}
  • dispatcher.forward()를 사용하여 뷰로 이동함.

6.2 회원 목록 조회 컨트롤러

@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
    private MemberRepository memberRepository = MemberRepository.getInstance();
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        List<Member> members = memberRepository.findAll();
        request.setAttribute("members", members);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/members.jsp");
        dispatcher.forward(request, response);
    }
}

6.3 회원 목록 JSP 뷰

<c:forEach var="member" items="${members}">
    <tr>
        <td>${member.id}</td>
        <td>${member.username}</td>
        <td>${member.age}</td>
    </tr>
</c:forEach>

7. 정리

  • Spring MVC는 애플리케이션을 Model, View, Controller로 분리하여 유지보수성과 확장성을 높이는 패턴임.
  • 비즈니스 로직과 UI 변경의 라이프 사이클을 분리하여 유지보수를 쉽게 만듦.
  • 서블릿과 JSP를 활용하여 MVC 패턴을 적용할 수 있음.
  • ViewResolver를 통해 다양한 템플릿 엔진과 연동 가능함.

Spring MVC 패턴을 이해하면 보다 구조적인 웹 애플리케이션을 개발할 수 있음.

profile
프론트엔드 개발자

0개의 댓글