2024. 10. 9. 20:54ㆍSpring Framework/Web on Servlet Stack
Spring MVC에서 컨트롤러 빈(Controller Bean)을 정의하려면 Servlet의 WebApplicationContext
에서 표준 Spring 빈 정의를 사용할 수 있습니다. @Controller
애노테이션은 컨트롤러 클래스에 사용되며, 이 클래스가 웹 컴포넌트임을 나타내는 역할을 합니다. 또한, Spring의 일반적인 @Component 클래스를 클래스 경로에서 자동으로 감지하고, 이를 빈 정의로 자동 등록하는 방식과 동일하게 @Controller
애노테이션도 자동 감지가 가능합니다.
자동 감지 설정
@Controller
빈을 자동으로 감지하고 등록하려면, Java 설정에 컴포넌트 스캔을 추가할 수 있습니다. 아래 예시는 @ComponentScan
을 사용하여 @Controller
애노테이션이 붙은 클래스를 스캔하는 방법을 보여줍니다:
@Configuration
@ComponentScan("org.example.web")
public class WebConfig {
// 추가 설정 가능
}
위 코드는 org.example.web
패키지를 스캔하여 해당 패키지 내의 @Controller
클래스들을 자동으로 감지하고 빈으로 등록합니다.
XML 설정 방식
Java 설정 대신 XML 설정을 사용할 수도 있습니다. 다음은 위와 동일한 기능을 하는 XML 설정 예시입니다:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.example.web"/>
</beans>
이 XML 설정은 Java 설정과 마찬가지로 org.example.web
패키지를 스캔하여 @Controller
클래스를 감지하고 등록합니다.
@RestController
@RestController
는 복합 애노테이션으로, 이 자체가 @Controller
와 @ResponseBody
로 메타 애노테이션되어 있습니다. 즉, @RestController
가 붙은 컨트롤러 클래스는 모든 메서드가 기본적으로 @ResponseBody
를 상속받아 메서드의 반환 값을 HTML 템플릿을 통한 뷰 렌더링 대신 HTTP 응답의 본문으로 직접 작성하게 됩니다. RESTful API를 개발할 때 많이 사용됩니다.
AOP 프록시 (AOP Proxies)
컨트롤러에 AOP 프록시를 런타임에 적용해야 하는 경우가 있습니다. 예를 들어, 컨트롤러에 직접 @Transactional
애노테이션을 사용하는 경우가 있습니다. 이 경우 컨트롤러에 대한 프록시는 클래스 기반 프록시(class-based proxy)를 사용하는 것이 권장됩니다. 이는 애노테이션이 컨트롤러에 직접적으로 적용된 경우 자동으로 적용됩니다.
인터페이스 기반 프록시
만약 컨트롤러가 인터페이스를 구현하고 있고, AOP 프록시가 필요하다면 클래스 기반 프록시를 명시적으로 설정해야 할 수 있습니다. 예를 들어 @EnableTransactionManagement
설정에서 @EnableTransactionManagement(proxyTargetClass = true)
로 변경하거나, XML 설정의 <tx:annotation-driven/>
을 <tx:annotation-driven proxy-target-class="true"/>
로 변경할 수 있습니다.
참고: Spring Framework 6.0부터는 인터페이스 프록시를 사용할 때, 인터페이스에만
@RequestMapping
이 적용된 경우 Spring MVC는 이를 컨트롤러로 인식하지 않습니다. 이 문제를 해결하려면 클래스 기반 프록시를 활성화하거나, 인터페이스에도@Controller
애노테이션을 명시적으로 추가해야 합니다.
@Controller
@RequestMapping("/api")
public interface MyController {
@GetMapping("/hello")
String sayHello();
}
이러한 내용을 바탕으로 Spring MVC에서 컨트롤러를 정의하고 사용하는 방법은 매우 유연하며, 상황에 맞는 다양한 설정 방법을 제공합니다.
<참고> : [https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann.html](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann.html)
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Handler Method (0) | 2024.10.09 |
---|---|
Mapping Requests (0) | 2024.10.09 |
@RequestParam (0) | 2024.10.09 |
Controller Advice (0) | 2024.10.09 |
Exceptions (0) | 2024.10.09 |