템플릿 엔진은 동적 웹 페이지 생성을 위한 도구로, 정적 부분과 동적 데이터를 결합하여 HTML 등의 문서를 생성합니다. 대표적으로 Thymeleaf, JSP, FreeMarker 등이 있으며, 서버 사이드 렌더링(SSR)에 사용됩니다.
Servlet만 사용 - 하나의 서블릿에서 비즈니스 로직과 화면 렌더링을 모두 처리하여 유지보수가 어려웠습니다.
JSP 도입 - HTML 내에 Java 코드를 삽입할 수 있게 되었으나, 여전히 비즈니스 로직이 JSP 파일에 존재하는 문제가 있었습니다.
MVC 패턴 적용 - 각 영역의 책임을 명확히 분리:
MVC 패턴의 문제점:
모든 요청을 단일 진입점(하나의 컨트롤러)에서 처리하여 공통 기능을 중앙화하는 패턴입니다. 이를 통해 코드 중복을 줄이고 일관된 처리가 가능해집니다.
다양한 컨트롤러(Handler)를 유연하게 지원하기 위한 패턴으로, 서로 다른 인터페이스를 가진 클래스들을 연결합니다. 각각의 컨트롤러에 맞는 어댑터를 통해 프론트 컨트롤러와 연결됩니다.
Spring MVC는 프론트 컨트롤러 패턴과 어댑터 패턴을 적용한 구조로 다음 핵심 요소로 구성됩니다:
Spring MVC의 핵심 프론트 컨트롤러로, HttpServlet을 상속받아 모든 요청을 처리합니다. Spring Boot에서는 자동으로 등록되며 모든 URL 매핑을 담당합니다.
@Component("/example-controller")
public class ExampleController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("example-controller가 호출 되었습니다.");
return null;
}
}
@Component("/view-controller")
public class ViewController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("view-controller가 호출 되었습니다.");
// "test"는 논리적인 ViewName
return new ModelAndView("test");
}
}
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
인터셉터(Interceptor): 핸들러 실행 전후에 추가 로직 실행 (스프링 기능)
필터(Filter): 모든 요청/응답에 대한 전처리/후처리 (서블릿 기능)
Spring MVC는 MVC 패턴, 프론트 컨트롤러 패턴, 어댑터 패턴을 통합하여 웹 애플리케이션의 구조를 체계화했습니다. DispatcherServlet이 중앙 제어 지점으로 모든 요청을 처리하고, 각 컴포넌트가 명확한 책임을 갖는 구조로 설계되어 있습니다.
이 구조는 확장성과 유연성이 뛰어나 다양한 요구사항에 맞게 애플리케이션을 구성할 수 있으며, Spring Boot를 통해 대부분의 설정이 자동화되어 개발자는 비즈니스 로직에 집중할 수 있습니다.
현대 웹 개발에서는 주로 애노테이션 기반(@Controller, @RequestMapping 등)으로 MVC 패턴을 구현하며, 이는 더 간결하고 직관적인 코드 작성을 가능하게 합니다. 또한 REST API 개발을 위해 @RestController를 활용하여 데이터 중심의 응답을 쉽게 만들 수 있습니다.
추천 태그: #SpringMVC #MVC패턴 #DispatcherServlet #웹개발 #Spring #백엔드