Annotation-based Container Configuration(한글)

Spring을 구성하는 데 XML보다 어노테이션이 더 낫나요?

어노테이션 기반 구성이 도입되면서 이 접근 방식이 XML보다 '더 나은' 방식인지에 대한 의문이 제기되었습니다. 짧은 대답은 “상황에 따라 다릅니다.” 입니다. 긴 대답은 각 접근 방식에는 장단점이 있으며, 일반적으로 어떤 전략이 더 적합한지는 개발자가 결정해야 한다는 것입니다. 주석은 정의 방식 때문에 선언에 많은 컨텍스트를 제공하므로 더 짧고 간결한 구성으로 이어집니다. 그러나 XML은 소스 코드를 건드리거나 다시 컴파일하지 않고도 컴포넌트를 배선하는 데 탁월합니다. 일부 개발자는 소스에 가까운 와이어링을 선호하는 반면, 다른 개발자는 주석이 달린 클래스가 더 이상 POJO가 아니며 더 나아가 구성이 분산되고 제어하기 더 어려워진다고 주장합니다.

어느 쪽을 선택하든 Spring은 두 가지 스타일을 모두 수용할 수 있으며 심지어 함께 혼합할 수도 있습니다. 한 가지 짚고 넘어가야 할 점은 Spring은 JavaConfig 옵션을 통해 대상 구성 요소의 소스 코드를 건드리지 않고 비침습적인 방식으로 주석을 사용할 수 있으며, 도구 측면에서 모든 구성 스타일이 Eclipse, Visual Studio Code 및 Theia용 Spring Tools에서 지원된다는 점입니다.

XML 설정의 대안으로 XML 선언 대신 바이트코드 메타데이터를 사용하여 구성 요소를 와이어링하는 어노테이션 기반 구성이 제공됩니다. 개발자는 XML을 사용하여 Bean 와이어링을 설명하는 대신 관련 클래스, 메서드 또는 필드 선언에 어노테이션을 사용하여 구성을 구성 요소 클래스 자체로 이동합니다. 예: AutowiredAnnotationBeanPostProcessor에서 언급했듯이, 어노테이션과 함께 BeanPostProcessor 를 사용하는 것은 Spring IoC 컨테이너를 확장하는 일반적인 수단입니다. 예를 들어, @Autowired 어노테이션은 Autowiring Collaborators에 설명된 것과 동일한 기능을 제공하지만 더 세분화된 제어와 더 넓은 적용 가능성을 가지고 있습니다. 또한 Spring은 @PostConstruct@PreDestroy 와 같은 JSR-250 어노테이션을 지원할 뿐만 아니라 @Inject@Named`와 같은 `jakarta.inject 패키지에 포함된 JSR-330(Java용 의존성 주입) 어노테이션을 지원합니다. 이러한 어노테이션에 대한 자세한 내용은 관련 섹션에서 확인할 수 있습니다.

어노테이션 주입은 XML 주입 전에 수행됩니다. 따라서 XML 구성은 두 가지 접근 방식을 통해 유선 연결되는 property에 대한 주석을 재정의합니다.

항상 그렇듯이 post-processors를 개별 Bean 정의로 등록할 수도 있지만, XML 기반 Spring 구성에 다음 태그를 포함하여 암시적으로 등록할 수도 있습니다(context 네임스페이스가 포함되어 있는 것을 주목하세요):

<?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:annotation-config/>

</beans>

<context:annotation-config/> 요소는 암시적으로 다음과 같은 post-processor를 등록합니다:

<context:annotation-config/> 는 어노테이션이 정의된 동일한 애플리케이션 컨텍스트에 있는 Bean에 대한 어노테이션만 찾습니다. 즉, DispatcherServlet 에 대한 <context:annotation-config/>WebApplicationContext 에 넣으면 서비스가 아닌 컨트롤러의 @Autowired Bean만 확인합니다. 자세한 내용은 DispatcherServlet을 참조하세요.