Spring 프레임워크에서 MVC 패턴은 웹 애플리케이션을 구조적으로 설계하는 중요한 디자인 패턴임. 이를 통해 애플리케이션의 유지보수성과 확장성을 높일 수 있음. 아래에서 Spring MVC 패턴의 개념과 동작 방식에 대해 설명함.
MVC(Model-View-Controller) 패턴은 애플리케이션을 세 개의 주요 구성 요소로 분리하는 설계 패턴임.
Spring에서는 이 패턴을 기반으로 웹 애플리케이션을 설계함.
MVC 패턴을 적용하지 않으면 하나의 서블릿이나 JSP에서 비즈니스 로직과 뷰 렌더링을 모두 처리해야 함. 이 경우 유지보수가 어려워지며, 단순한 UI 변경도 수백 줄의 코드와 함께 수정해야 하는 문제가 발생함.
UI 변경과 비즈니스 로직 변경은 각각의 라이프 사이클이 다름. 이를 하나의 코드에서 관리하면 유지보수성이 떨어짐. MVC 패턴은 이러한 문제를 해결하고 역할을 분리하여 변경이 독립적으로 이루어질 수 있도록 함.
뷰 템플릿(JSP, Thymeleaf 등)은 화면을 렌더링하는 데 최적화되어 있음. 따라서 이 부분을 뷰(View)에서 담당하고, 컨트롤러와 모델은 본연의 역할을 수행하는 것이 가장 효율적임.
Spring MVC 패턴은 여러 구성 요소를 포함하며, 각각의 역할이 명확하게 분리됨.
@Controller 또는 @RestController 어노테이션을 사용하여 정의함.@Service 어노테이션을 사용하여 정의하며, 컨트롤러에서 호출됨.@Repository 어노테이션을 사용하며, JPA나 MyBatis 등을 통해 DB와 연동됨.Spring MVC에서 클라이언트의 요청이 처리되는 흐름은 다음과 같음.
DispatcherServlet이 요청을 받음.Model에 담아 반환함.ViewResolver가 데이터를 적절한 뷰로 변환하여 클라이언트에게 응답함.Spring Boot 환경에서 간단한 컨트롤러를 구현한 예제임.
@RestController
@RequestMapping("/api")
public class ExampleController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Spring MVC!";
}
}
/api/hello 요청이 들어오면 "Hello, Spring MVC!" 응답을 반환함.RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/result.jsp");
dispatcher.forward(request, response);
서블릿을 컨트롤러로 사용하고, JSP를 뷰로 사용하는 방식으로 MVC 패턴을 구현할 수 있음.
@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()를 사용하여 뷰로 이동함.@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);
}
}
<c:forEach var="member" items="${members}">
<tr>
<td>${member.id}</td>
<td>${member.username}</td>
<td>${member.age}</td>
</tr>
</c:forEach>
Spring MVC 패턴을 이해하면 보다 구조적인 웹 애플리케이션을 개발할 수 있음.