•
스프링 MVC는 @Controller 및 @RestController 구성 요소가 요청 맵핑, 요청 입력, 예외 처리 등을 표현하기 위해 주석을 사용하는 주석 기반 프로그래밍 모델을 제공한다.
•
주석이 달린 컨트롤러는 유연한 메소드 시그니처를 가지고 있으며 기본 클래스를 확장하거나 특정 인터페이스를 구현할 필요가 없습니다.
◦
다음 예제는 주석으로 정의된 컨트롤러다.
@Controller
public class HelloController {
@GetMapping("/hello")
public String handle(Model model) {
model.addAttribute("message", "Hello World!");
return "index";
}
}
Java
복사
▪
이 예제에서 해당 메소드는 모델을 받아 view의 이름을 String 타입으로 반환한다.
Declaration
•
서블릿의 WebApplicationContext의 표준 스프링 Bean 정의 기법을 사용하여 컨트롤러 Bean을 정의할 수 있다.
•
@Controller 타입은 자동 감지를 가능하게 하는데 이는 Spring Container가 클래스 경로에서 @Component를 감지하고 해당 빈 정의를 자동으로 등록해주기 때문이다.
•
또한 웹 컴포넌트로서의 역할인 컨트롤러임을 나타내는 스테레오 타입으로도 작용한다.
•
어떠한 @Controller Bean들을 자동 감지를 가능하게 하려면 Java Configuration에 ComponentScan을 추가하면 된다.
@Configuration
@ComponentScan("org.example.web")
public class WebConfig {
// ...
}
Java
복사
•
@RestController는 @Controller와 @ResponseBody 어노테이션으로 구성된 복합어노테이션으로 모든 메소드가 @ResponseBody 어노테이션을 상속하므로 HTML 템플릿을 사용한 뷰나 렌더링 대신 응답 본문에 쓰기를 제공한다.
•
AOP Proxies
◦
몇 몇의 경우, AOP 프록시를 런타임에 적용하기 위해 Controller에 decorator 패턴을 사용할 필요가 있다.
▪
대표적인 예로 @Transaction 어노테이션을 Controller에 적용하는 경우가 있다.
◦
이런 경우에서 컨트롤러들은 구체적으로하기 위해 클래스 기반의 프록시를 추천한다. 이것은 특정 어노테이션을 적용함으로써 자동적으로 적용된다.
◦
만약 인터페이스를 구현하고 있는 컨트롤러인 경우 AOP 프록시가 필요하다면 클래스 기반 프록시를 명시적으로 구성할 필요가 있다.
▪
예를 들어 @EnableTtanscactionManagement의 경우, @EnableTranscationManagement(proxyTargetClass = true)와 같이 말이다.
Mapping Requests
•
컨트롤러의 메소드에 요청들을 매핑하기 위해 @RequestMapping을 사용하면 된다.
•
이는 URL, HTTP 메소드, 요청 매개변수, 헤더, 미디어 타입과 매칭하기 위한 다양한 속성들을 가지고 있다.
•
클래스 수준에서 공유 매핑을 표현하기 위해 사용할 수 있고 메소드 수준에서 더 좁고 구체적인 엔드포인트를 명시하기 위해 사용할 수도 있다.