개발환경/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보다 훨씬 유연하며 통합이 간편하기 때문입니다.