Declaration

2024. 10. 9. 20:54Spring 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