View Controllers

2024. 10. 15. 04:46Spring Framework/Web on Servlet Stack

Spring MVC의 View Controllers

View Controllers는 Spring MVC에서 ParameterizableViewController를 설정하는 단축 기능입니다. 이 컨트롤러는 클라이언트의 요청을 특정 뷰로 즉시 전달(forward)하는 역할을 합니다. 주로 정적인 페이지를 제공할 때 사용되며, Java 컨트롤러의 로직 없이 뷰만 응답할 수 있는 상황에서 유용합니다.

View Controller란?

View Controller는 HTTP 요청을 처리하는 Java 코드가 필요 없고, 단순히 특정 URL에 대한 요청을 특정 JSP, HTML, 또는 템플릿 뷰로 연결할 때 사용됩니다. 이 방법을 사용하면 Java 컨트롤러 클래스나 메서드를 작성하지 않고도 Spring이 해당 URL을 처리하여 뷰로 직접 포워딩할 수 있습니다. 이를 통해 불필요한 컨트롤러 코드 생성을 줄일 수 있습니다.

View Controller를 설정하는 방법

Spring MVC에서 View Controller를 설정하기 위해서는 WebMvcConfigurer 인터페이스의 addViewControllers() 메서드를 오버라이드하여 ViewControllerRegistry에 뷰를 등록하면 됩니다.

다음은 / 경로에 대한 요청을 home이라는 뷰로 포워딩하는 Java 설정의 예입니다:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

구성 요소 설명:

  • addViewControllers(): 이 메서드는 Spring MVC에서 뷰 컨트롤러를 등록할 수 있도록 제공합니다. ViewControllerRegistry를 사용하여 URL 경로와 해당 뷰 이름을 매핑합니다.

  • addViewController("/"): 루트 URL(즉, /)에 대한 요청이 들어오면 해당 요청을 처리할 컨트롤러를 등록하는 부분입니다.

  • setViewName("home"): / 요청을 받으면 home이라는 뷰로 포워딩하도록 설정합니다. 이 home 뷰는 보통 JSP, Thymeleaf 템플릿 또는 기타 뷰 리졸버(View Resolver)에서 정의된 템플릿일 수 있습니다. 예를 들어, home.jsp라는 파일이 있을 경우 그 파일이 렌더링됩니다.

이 방식은 Java 컨트롤러의 로직이 불필요한 간단한 페이지(예: 정적 페이지)나 고정된 콘텐츠를 제공할 때 매우 유용합니다.

View Controller의 사용 예

정적 페이지간단한 리다이렉션이 필요한 경우 View Controller가 적합합니다. 예를 들어, 아래와 같은 경우 View Controller를 사용하면 좋습니다:

  1. 홈 페이지 포워딩: 사용자가 사이트의 루트 URL(예: /)에 접속하면 바로 특정 JSP나 HTML 파일로 포워딩합니다.

  2. 정적 페이지: 자주 변경되지 않는 법적 페이지(예: 약관, 개인정보 보호 정책 등)에 대한 요청을 처리할 때 사용됩니다.

  3. 간단한 리다이렉트: 사용자가 오래된 URL로 접속할 때 새로운 URL로 리다이렉트하는 기능도 View Controller로 처리할 수 있습니다.

요청 경로와 Annotated Controller의 충돌

@RequestMapping 어노테이션을 사용하여 특정 URL을 Java 컨트롤러 메서드로 매핑한 경우, 동일한 URL에 대해 View Controller를 사용할 수 없습니다. 이는 Spring MVC가 URL에 매핑된 컨트롤러 메서드가 해당 엔드포인트를 소유하고 있다고 판단하기 때문입니다.

다음과 같은 이유로 View ControllerAnnotated Controller는 동일한 URL을 처리할 수 없습니다:

  • 강한 엔드포인트 소유권: URL이 @RequestMapping을 사용한 컨트롤러 메서드와 매핑되면, Spring은 해당 URL에 대한 모든 HTTP 메서드를 해당 컨트롤러가 처리한다고 간주합니다. 이로 인해 동일한 URL에 대해 View Controller를 설정하려고 하면 충돌이 발생합니다.

  • 디버깅 도움: Spring은 충돌 시 클라이언트에게 명확한 오류 메시지를 제공하기 위해 405 (METHOD_NOT_ALLOWED) 또는 415 (UNSUPPORTED_MEDIA_TYPE)와 같은 응답 코드를 반환할 수 있습니다. 이는 클라이언트가 잘못된 HTTP 메서드로 요청을 보냈거나, 잘못된 콘텐츠 타입을 요청했을 때 유용한 디버깅 정보를 제공합니다.

따라서 Annotated ControllerView Controller가 동일한 URL을 처리하는 것을 피해야 합니다.

권장 사항

  • URL 분리: View Controller와 @RequestMapping이 동일한 URL을 처리하지 않도록 명확히 분리하는 것이 좋습니다. 예를 들어, /home 경로는 View Controller가 처리하고, /user/home은 Java 컨트롤러 메서드로 처리하는 방식으로 URL을 구분할 수 있습니다.

View Controller와 @RequestMapping의 차이점

  • View Controller는 URL에 대한 요청을 뷰로 직접 포워딩하는 기능을 제공하며, 별도의 Java 로직을 실행하지 않습니다.

  • @RequestMapping을 사용하는 Annotated Controller는 URL에 대한 요청을 받아 Java 메서드를 실행하고, 그 결과에 따라 뷰를 선택하거나 다른 비즈니스 로직을 처리할 수 있습니다.

예를 들어, View Controller는 단순히 뷰만 렌더링할 때 사용되고, @RequestMapping은 요청 처리 로직이 필요한 경우에 사용됩니다.

요약

  • View Controllers는 단순히 요청을 특정 뷰로 포워딩할 때 사용하는 단축 기능입니다.
  • addViewControllers() 메서드를 사용하여 정적 URL과 뷰 이름을 연결할 수 있습니다.
  • Annotated Controllers와 동일한 URL을 처리하지 않도록 주의해야 하며, URL을 명확하게 분리하여 관리하는 것이 좋습니다.
  • 주로 정적 페이지간단한 리다이렉션이 필요한 경우 View Controller를 사용합니다.

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

Default Servlet  (0) 2024.10.15
View Resolvers  (0) 2024.10.15
Message Converters  (0) 2024.10.15
Content Types  (0) 2024.10.15
Interceptors  (1) 2024.10.14