Web

Ch03. 두 개 이상의 설정파일 사용, @AutoWired, @Import

tose33 2022. 6. 23. 18:26

두 개 이상의 설정 파일 사용

스프링은 두 개 이상의 설정파일 (@Configuraton 클래스)을 사용할수 있다.

다음과 같이 AnnotationConfigApplicationContext 객체로 설정 파일을 불러올때 파라미터로 모든 설정파일을 전달하면 된다.

AnnotationConfigApplicationContext의 생성자의 인자는 가변인자이기 때문에 가능하다.

private static ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf1.class, AppConf2.class);

 

두 개 이상의 설정 파일 사용 1 :다른 설정파일의 객체 사용 (@Autowired)

하나의 설정 파일에서 다른 설정 파일의 객체를 사용할때는 @Autowired 애노테이션을 이용한다. 

@Autowired 애노테이션을 붙이면 해당 타입의 빈을 찾아 필드에 할당한다. 

@Configuration
public class AppConf2
{
    @Autowired
    private MemberDao memberDao;
    @Autowired
    private MemberPrinter memberPrinter;
}

 

이렇게 하면 해당 설정 파일에서 memberDao 필드를 그냥 맴버 사용하듯이 사용하면 된다. 

 

@Bean
public MemberRegisterService memberRegSvc()
{
    // Autowired 된 멤버필드의 memberDao 사용
    return new MemberRegisterService(memberDao); 
}

 

두 개 이상의 설정 파일 사용 2 : @Import 

@Import 애노테이션은 함께 사용할 설정 클래스를 지정한다.

@Configuration
@Import(AppConf2.class);
public class AppConf1
{

이렇게 하면 스프링 컨테이너를 생성할때 AppConf1 만 인자로 전달해도, AppConf2 클래스의 설정도 함께 사용해 초기화한다. 

 

 


 

 

@Autowired, 의존 객체 자동 주입

스프링 빈에 의존하는 객체에 @Autowired 애노테이션을 붙이면, 자동으로 객체가 주입된다.

 

다음과 같이 MemberInfoPrinter 클래스가 의존하는 객체 MemberDao, MemberPrinter에 @Autowired 애노테이션을 붙이면

public class MemberInfoPrinter
{
    @Autowired
    private MemberDao memberDao;
    @Autowired
    private MemberPrinter printer;

 

설정 클래스의 해당 빈 메소드에 의존 주입을 위한 세터가 필요 없어진다 .

    @Bean
    public MemberInfoPrinter infoPrinter()
    {
        MemberInfoPrinter infoPrinter = new MemberInfoPrinter();
        // @Autowired
//        infoPrinter.setMemberDao(memberDao());
//        infoPrinter.setPrinter(memberPrinter());
        return infoPrinter;
    }

 

 


getBean() 메소드

- 잘못된 이름을 전달하면 NoSuchBeanDefinitionException 예외가 발생한다.

 

- 잘못된 타입을 전달하면 BeanNotOfRequiredTypeException 예외가 발생한다.

 

- 빈 이름을 지정하지 않고 타입만으로 빈을 구 할수 있다. 

1. 해당 타입의 빈 객체가 단 하나라면, 해당 빈을 리턴한다.

2. 해당 타입의 빈 객체가 없다면 NoSuchBeanDefinitionException 예외가 발생한다.

3. 해당 타입의 빈 객체가 여러개라면 NoUniqueBeanDefinitionException 예외가 발생한다. 

 

따라서 타입만으로 빈 객체를 얻으려면 해당 타입의 빈이 유일할때만 가능하다. 

 


주입 대상 객체를 모두 빈 객체로 설정할 필요는 없다 

주입할 객체는 꼭 빈 객체일 필요는 없고, 그냥 일반 객체여도 상관은 없다. 

하지만 빈 객체로 등록하지 않은 객체는 getBean() 메서드로 구할수 없고 스프링 컨테이너에서 제공하는 기능들을 당연히 사용할수 없다. 

 

주입하는 객체를 꼭 빈객체로 만들필요는 없지만, 의존 주입 대상은 스프링 빈으로 등록하는 것이 보통이다. 

 

 

 

 

출처 : 스프링5 프로그래밍 입문 (최범균 저)