개발환경/Spring
Spring MVC 버전별 Controller 사용 예시
idkbj
2025. 7. 12. 21:58
반응형
1. Spring MVC 2.5
🔹 View 반환 (JSP 등)
@Controller
public class HelloController {
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView mav = new ModelAndView("hello");
mav.addObject("message", "Hello from Spring 2.5");
return mav;
}
}
ViewResolver 설정 (XML):
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
🔹 JSON 반환
Spring MVC 2.5는 @ResponseBody도 없고, REST 컨트롤러 개념도 없기 때문에 JSON 응답을 위해서는 View 객체로 JSON을 렌더링해줄 별도의 View 구현체가 필요합니다.
→ 이때 사용할 수 있는 것이 MappingJacksonJsonView입니다.
하지만 이것만 등록해도 자동으로 동작하지는 않으며, 컨트롤러에서 명시적으로 해당 View를 반환하거나, ContentNegotiatingViewResolver 등을 활용해야 합니다.
@Controller
public class HelloController {
@RequestMapping("/json")
public ModelAndView helloJson() {
Map<String, String> data = new HashMap<>();
data.put("message", "Hello from Spring 2.5");
return new ModelAndView("jsonView", data); // jsonView는 ViewResolver에서 정의됨
}
}
ViewResolver 설정 (XML)
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
2. Spring MVC 3.x
🔹 View 반환
- ModelAndView 또는 Model 사용
- ViewResolver는 여전히 필요 (XML 또는 Java 설정)
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello from Spring 3.x");
return "hello"; // ViewResolver로 JSP 찾음
}
}
🔹 JSON 반환 (@ResponseBody, Jackson 필요)
@Controller
public class HelloRestController {
@RequestMapping("/api/hello")
@ResponseBody
public Map<String, String> hello() {
return Collections.singletonMap("message", "Hello from Spring 3.x");
}
}
JSON 설정 추가 (XML 예시):
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
3. Spring MVC 4.x
🔹 View 반환
- Java Config 가능 (ViewResolver도 Java 기반으로 설정 가능)
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
🔹 JSON 반환
- @RestController or @ResponseBody 사용
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public Map<String, String> hello() {
return Collections.singletonMap("message", "Hello from Spring 4.x");
}
}
Spring Boot 사용 시 JSON 자동 처리됨 (별도 설정 필요 없음)
4. Spring MVC 5.x
🔹 View 반환
- 거의 동일 (Thymeleaf, JSP, FreeMarker 등 다양한 View 엔진 사용 가능)
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
🔹 JSON 반환
- @RestController 사용 + Spring Boot 자동 설정
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "Hello from Spring 5.x";
}
}
특징:
- Jackson이 자동 등록됨
- ResponseEntity 사용 가능
5. Spring MVC 6.x (Spring Framework 6 / Boot 3.x)
🔹 View 반환
- View Resolver 방식은 동일하지만 대부분 Thymeleaf 선호
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
🔹 JSON 반환
- 거의 모든 JSON 처리 자동화됨 (Spring Boot 3.x 기준)
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public Map<String, String> hello() {
return Map.of("message", "Hello from Spring 6.x");
}
}
특징:
- Native Image 대응
- Jackson 3 지원
- Virtual Threads와 잘 연동됨
📋 정리표: View vs JSON 반환 (버전별)
Spring 버전View 반환 방식JSON 반환 방식ViewResolver 필요
2.5 | ModelAndView | 수동 처리 (Writer로 JSON 쓰기) | ✅ XML 설정 필수 |
3.x | Model, ModelAndView | @ResponseBody + Jackson | ✅ |
4.x | Model, Java Config 가능 | @RestController, JSON 자동 변환 | ✅ (Java 기반 가능) |
5.x | JSP or Thymeleaf with ViewResolver | Spring Boot 자동 설정, @RestController | ⚠️ (Boot는 자동) |
6.x | Thymeleaf 등 현대 템플릿 엔진 사용 | Jackson 3, AOT 최적화 자동화 | ⚠️ (대부분 자동) |
Spring MVC 6.* (Spring Framework 6 / Spring Boot 3+)에서 Thymeleaf가 선호되는 이유는 단순히 전통적인 JSP 대체 이상의 의미가 있습니다. 다음은 그 이유를 기술적, 실용적, 개발자 경험 측면에서 정리한 내용입니다.
1. Spring Boot와의 강력한 통합
- Spring Boot 3+에서 Thymeleaf는 자동 설정 지원:
- spring-boot-starter-thymeleaf를 의존성에 추가하면 ViewResolver, TemplateEngine 등이 자동 등록됨.
- 별도 설정 없이도 src/main/resources/templates/에 있는 .html 파일을 뷰로 사용 가능.
📌 JSP는 Spring Boot에서 기본적으로 지원되지 않음
(내장 톰캣에서 JSP 서블릿 처리하려면 복잡한 설정 필요)
2. HTML 친화적인 문법
- Thymeleaf는 정상 HTML 문법 안에서 작동하도록 설계됨 (JSP는 그렇지 않음)
- 예: HTML5 파일로 열어도 Thymeleaf 템플릿은 브라우저에서 깨지지 않음.
- 개발자는 디자인 도구로 미리 보기 가능, 디자이너와 협업 용이
<!-- Thymeleaf 예시 -->
<p th:text="${message}">Hello, World!</p>
3. 서버사이드 렌더링에 적합한 구조
- Spring MVC 6.x는 클라이언트/서버 분리보다는 서버사이드 렌더링(SSR) 기반 웹 앱에도 초점을 둠
- Thymeleaf는 SSR에 적합하며, 프론트엔드 프레임워크를 쓰지 않아도 꽤 풍부한 UI를 구현 가능
4. 강력한 기능 지원
- 조건 분기, 반복, URL 빌딩, 메시지 국제화 등을 내장 문법으로 지원
<ul>
<li th:each="user : ${userList}" th:text="${user.name}">User</li>
</ul>
- Fragments (레이아웃 재사용)
<div th:replace="layout/header :: header"></div>
5. 표준화된 템플릿 엔진
- JSP는 Servlet Container 종속적이고 제한이 많지만,
- Thymeleaf는 독립된 템플릿 엔진이므로 다른 JVM 환경에서도 재사용 가능
6. 템플릿 캐싱 및 성능 최적화
- Spring Boot에서는 Thymeleaf의 템플릿 캐시도 자동 설정되고,
- 개발/운영 모드에 따라 캐시 자동 on/off (즉시 반영 vs 성능)
7. Spring 공식 선호 및 문서화
- Spring 팀이 공식 문서, 가이드, 샘플에서 Thymeleaf를 기본 뷰로 사용
- Spring Initializr에서도 기본 템플릿으로 Thymeleaf 포함
❌ JSP의 단점 (대비 용)
JSP단점
✅ 오래된 기술 | ❌ Spring Boot와 잘 통합되지 않음 |
✅ 서블릿 기반 | ❌ HTML 유효성 깨짐, 디자이너 협업 어려움 |
✅ 서블릿 필터 의존 | ❌ 오류가 런타임에만 발생, 디버깅 어려움 |
✅ WAR 배포 시 사용 가능 | ❌ JAR 기반 내장 톰캣에서 사용하려면 복잡함 |
🔚 결론
Spring MVC 6.x에서 Thymeleaf가 선호되는 가장 큰 이유는
현대적인 개발 환경(Spring Boot, HTML5, 서버사이드 렌더링)에 최적화되어 있고, JSP보다 훨씬 유연하며 통합이 간편하기 때문입니다.