본문 바로가기
부트캠프 개발일기/Spring

37일차: Spring Container 실습

by shyun00 2023. 4. 5.

❯ AnnotationConfigApplicationContext 를 사용해 스프링 컨테이너를 인스턴스화 하는 방법

ApplicationContext는 아래 애너테이션이 달린 클래스를 파라미터로 전달받는다.

(@Configuration, @Component, JSR-330 메타데이터)

 

@Configuration 클래스가 입력으로 제공되면 해당 클래스 자체가 Bean 의 정의로 등록되고, 클래스 내에서 선언된 모든 @Bean 메서드도 Bean 의 정의로 등록된다.

 

@Component 클래스와 JSR-330 클래스가 제공되면 Bean 정의로 등록되며 필요한 경우 해당 클래스 내에서 @Autowired 또는 @Inject와 같은 DI 메타데이터가 사용되는것으로 가정한다.

❯ @Bean 애너테이션 사용

@Bean은 메서드 레벨의 애너테이션으로 @Configuration-annoted 또는 @Component-annoted 클래스에서 사용 가능하다.

@Bean 애너테이션이 추가된 메서드는 빈을 구축하는데 필요한 매개변수를 인자로 지정하여 의존성을 나타낼 수 있다.

  • 애너테이션 방식의 configuration
@Configuration
public class DependencyConfig {

    @Bean
    public TransferServiceImpl transferService() {
        return new TransferServiceImpl();
    }
}
  • 빈 정의가 있는 인터페이스를 구현하여 Bean configuration 설정
public interface BaseConfig {

    @Bean
    default TransferServiceImpl transferService() {
        return new TransferServiceImpl();
    }
}

@Configuration
public class DependencyConfig implements BaseConfig {

}

@Configuration 애너테이션 사용

@Configuration 은 해당 객체가 Bean definitions의 소스임을 나타내는 애너테이션이다.

@Bean-annoted 메서드를 통해 Bean을 선언한다.

❯ Bean 사이에 의존성 주입

빈이 서로 의존성을 가질 때, 생성자 주입을 통해 표현할 수 있다.

@Configuration
public class DependencyConfig {

    @Bean
    public BeanOne beanOne() {
        return new BeanOne(beanTwo());
    }

    @Bean
    public BeanTwo beanTwo() {
        return new BeanTwo();
    }
}

❯ 애너테이션을 사용해 스프링 컨테이너를 구성하는 방법

@Import 애너테이션 : 구성을 모듈화 하는데 사용되며 다른 구성클래스에서 @Bean definitions 을 가져올 수 있다.

@Configuration
public class DependencyConfigA {

    @Bean
    public A a() {
        return new A();
    }
}

@Configuration
@Import(DependencyConfigA.class)
public class DependencyConfigB {

    @Bean
    public B b() {
        return new B();
    }
}

보통 Bean은 1개의 구성파일만 import 하지 않고 여러 구성클래스간에 서로 의존성을 가진다.

@Configuration 클래스를 사용하면 자바 컴파일러는 구성 모델에 제약을 둔다. 다른 Bean에 대한 참조는 반드시 유효한 구문이어야 한다.

❯ Component Scan 

설정 정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.

수작업으로 작업하게되면 누락되거나 설정정보가 커지는 문제가 발생하는데, @ComponentScan을 통해 이를 해결할 수 있다.

@ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록해준다.

(@Configuration이 붙은 설정정보도 자동으로 등록되는데, 이는 @Configuration에 @Component애너테이션이 붙어있기 때문이다.)

 

참고자료 : 스프링 공식 문서