Note-Taking / / 2024. 9. 3. 22:51

Annotation 기반의 Container Configuration 개념 정리

Annotation 기반의 Container Configuration은 Spring 프레임워크에서 매우 중요한 개념으로, 전통적인 XML 기반 설정 대신에 자바 어노테이션을 사용하여 Spring 컨테이너를 구성하는 방법입니다. 이 접근 방식은 코드 내에 직접 설정 정보를 포함시키기 때문에 가독성과 유지보수성이 높아지는 장점이 있습니다.

 

1. Annotation 기반의 Container Configuration 개념

 

Spring에서 Annotation 기반의 Container Configuration은 주로 @Configuration@Bean 어노테이션을 사용하여 구현됩니다. 이 방식에서는 Spring IoC(역제어) 컨테이너가 빈(bean)을 구성하고 관리하는 데 필요한 메타데이터를 어노테이션을 통해 제공받습니다.

 

@Configuration: 이 어노테이션은 해당 클래스가 하나 이상의 @Bean 메서드를 포함하며, Spring 컨테이너에서 빈 정의를 생성하고 관리하는 데 사용된다는 것을 나타냅니다.

@Bean: 이 어노테이션은 메서드가 Spring 컨테이너에 의해 관리되는 빈을 생성한다는 것을 나타냅니다. 이러한 빈은 싱글턴이 기본값이며, 메서드 이름이 빈의 이름으로 사용됩니다.

 

2. Annotation 기반의 설정 예시

 

다음은 간단한 예제입니다.

AppConfig라는 클래스 이름은 관례적으로 Spring에서 빈을 생성하는 설정 클래스로 사용되는 이름입니다.

 

Spring에서 @Configuration 어노테이션이 붙은 클래스는 빈 설정 클래스임을 나타내며, 이 클래스 안에서 @Bean 어노테이션을 사용하여 스프링 컨테이너에 관리될 빈을 정의합니다. AppConfig라는 이름은 특별한 의미가 있는 것은 아니지만, 관례적으로 설정 클래스를 의미 있게 명명하기 위해 자주 사용됩니다.

 

이와 같은 관례는 개발자가 코드의 의도를 쉽게 이해할 수 있도록 돕기 위해 사용되며, AppConfig는 “애플리케이션의 설정을 관리하는 클래스”라는 의미로 많이 쓰입니다. 하지만, 반드시 이 이름을 사용해야 하는 것은 아니며, 프로젝트나 팀의 명명 규칙에 따라 다른 이름을 사용할 수도 있습니다. 중요한 것은 해당 클래스가 @Configuration 어노테이션을 통해 스프링 설정 클래스임을 명확히 하는 것입니다.

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean
    public MyRepository myRepository() {
        return new MyRepositoryImpl();
    }
}

이 예제에서 AppConfig 클래스는 Spring 컨테이너에 의해 관리되는 두 개의 빈을 정의하고 있습니다. myServicemyRepository 메서드는 각각 MyServiceImplMyRepositoryImpl 객체를 반환하며, 이는 Spring 컨테이너에 의해 관리됩니다.

 

3. 다양한 어노테이션

 

Spring에서는 @Configuration@Bean 외에도 여러 가지 어노테이션이 있습니다:

 

@Component: 클래스가 Spring 컨테이너에서 관리되는 컴포넌트임을 나타냅니다. @Service, @Repository, @Controller@Component를 확장한 어노테이션들입니다.

@Autowired: Spring이 의존성을 자동으로 주입하도록 지시합니다. 주로 생성자, 필드, 세터 메서드에 사용됩니다.

@Qualifier: @Autowired와 함께 사용되어 같은 타입의 여러 빈 중에서 특정한 빈을 선택하는 데 사용됩니다.

@PropertySource: 외부 프로퍼티 파일을 로드하고 이를 Spring 환경에 등록합니다.

@Value: 특정 프로퍼티 값을 빈의 필드에 주입합니다.

 

4. 장점 및 단점

 

장점:

 

가독성 및 유지보수성: 코드 내에서 설정이 이루어지므로 가독성이 높아지고 유지보수가 쉬워집니다.

유연성: 설정이 코드에 포함되기 때문에 다양한 조건에 따라 설정을 동적으로 변경할 수 있습니다.

 

단점:

 

복잡한 설정: 매우 복잡한 설정은 여전히 XML 기반 설정이 더 적합할 수 있습니다.

코드와 설정의 분리 부족: 모든 설정이 코드에 포함되므로 설정과 비즈니스 로직이 명확하게 분리되지 않을 수 있습니다.

 

5. Annotation과 XML 기반 설정의 혼합

 

Annotation 기반 설정과 XML 기반 설정을 혼합하여 사용할 수도 있습니다. 예를 들어, XML 파일에서 @ComponentScan이나 @Import를 사용하여 어노테이션으로 정의된 빈을 로드할 수 있습니다.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <context:component-scan base-package="com.example"/>

</beans>

6. Lifecycle 관리

 

Annotation 기반 설정에서도 Spring 라이프사이클 콜백을 사용할 수 있습니다. @PostConstruct@PreDestroy 어노테이션을 사용하여 빈의 초기화와 소멸 시점에 특정 작업을 수행할 수 있습니다.

@Component
public class MyBean {

    @PostConstruct
    public void init() {
        // 초기화 작업
    }

    @PreDestroy
    public void destroy() {
        // 소멸 작업
    }
}

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유