2024. 10. 15. 04:46ㆍSpring 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를 사용하면 좋습니다:
홈 페이지 포워딩: 사용자가 사이트의 루트 URL(예:
/
)에 접속하면 바로 특정 JSP나 HTML 파일로 포워딩합니다.정적 페이지: 자주 변경되지 않는 법적 페이지(예: 약관, 개인정보 보호 정책 등)에 대한 요청을 처리할 때 사용됩니다.
간단한 리다이렉트: 사용자가 오래된 URL로 접속할 때 새로운 URL로 리다이렉트하는 기능도 View Controller로 처리할 수 있습니다.
요청 경로와 Annotated Controller의 충돌
@RequestMapping
어노테이션을 사용하여 특정 URL을 Java 컨트롤러 메서드로 매핑한 경우, 동일한 URL에 대해 View Controller를 사용할 수 없습니다. 이는 Spring MVC가 URL에 매핑된 컨트롤러 메서드가 해당 엔드포인트를 소유하고 있다고 판단하기 때문입니다.
다음과 같은 이유로 View Controller와 Annotated Controller는 동일한 URL을 처리할 수 없습니다:
강한 엔드포인트 소유권: URL이
@RequestMapping
을 사용한 컨트롤러 메서드와 매핑되면, Spring은 해당 URL에 대한 모든 HTTP 메서드를 해당 컨트롤러가 처리한다고 간주합니다. 이로 인해 동일한 URL에 대해 View Controller를 설정하려고 하면 충돌이 발생합니다.디버깅 도움: Spring은 충돌 시 클라이언트에게 명확한 오류 메시지를 제공하기 위해
405 (METHOD_NOT_ALLOWED)
또는415 (UNSUPPORTED_MEDIA_TYPE)
와 같은 응답 코드를 반환할 수 있습니다. 이는 클라이언트가 잘못된 HTTP 메서드로 요청을 보냈거나, 잘못된 콘텐츠 타입을 요청했을 때 유용한 디버깅 정보를 제공합니다.
따라서 Annotated Controller와 View 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 |