Annotation-based Container Configuration

Dev.Hammy·2024년 2월 11일
0

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

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

어떤 선택을 하든 Spring은 두 가지 스타일을 모두 수용할 수 있으며 심지어 함께 혼합할 수도 있습니다. JavaConfig 옵션을 통해 Spring은 대상 컴포넌트의 소스 코드를 건드리지 않고 비침습적인 방식으로 어노테이션을 사용할 수 있으며 도구 측면에서 모든 구성 스타일이 Visual Studio 코드 및 Theia, Eclipse용 Spring Tools에서 지원된다는 점을 지적할 가치가 있습니다.

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

[Note]
XML 삽입 전에 어노테이션 삽입이 수행됩니다. 따라서 XML 구성은 두 접근 방식을 통해 연결된 속성에 대한 어노테이션을 재정의합니다.

언제나 그렇듯, 후처리기(post-processors)를 개별 빈 정의로 등록할 수 있지만 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를 암시적으로 등록합니다.

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

0개의 댓글