https://sundaland.tistory.com/371
[ ▶ 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를 사용한다.
'Web on Servlet Stack' 카테고리의 다른 글
Path Matching (0) | 2024.10.15 |
---|---|
View Resolvers (0) | 2024.10.15 |
Content Types (1) | 2024.10.15 |
Validation (0) | 2024.10.15 |
Type Conversion (0) | 2024.10.15 |