1. @Autowired Annotation이란?


Spring Framework를 이용해서 앱을 개발하다보면 수십~수백개 이상의 빈을 설정하게 될텐데, 당연히 이러한 설정을 클래스 파일 하나에 다 담아야 하는 것은 아닙니다. 영역별로 설정 파일을 나누면 관리하기도 쉽고 가독성도 좋아집니다. 나누어진 설정 클래스를 가지고 @Autowired와 @Import를 살펴보겠습니다.

Spring MVC는 한 개 이상의 설정 파일을 이용해서 컨테이너를 생성할 수 있습니다. 다음은 첫 번째 설정 클래스입니다.

@Configuration 
public class AppConf1 { 
    // 메서드명은 해당 빈의 이름이고, 생성되어 반환되는 객체가 바로 Bean 객체입니다.
    @Bean 
    public MemberDao memberDao() { return new MemberDao(); } 
    @Bean 
    public MemberPrinter memberPrinter() { return new MemberPrinter(); } 
}

이어서 두 번째 설정 클래스를 보겠습니다. 두 번째 설정 클래스에서는 첫 번째 설정 클래스에 있는 빈 객체를 사용하는데 이 때, @Autowired를 이용해 Spring Container에서 해당 타입의 빈 객체를 가져옵니다.

@Configuration 
public class AppConf2 { 
    @Autowired // 스프링 컨테이너에서 MemberDao 타입의 빈 객체를 찾아 주입한다. 
    private MemberDao memberDao; 
    
    @Autowired // 스프링 컨테이너에서 MemberPrinter 타입의 빈 객체를 찾아 주입한다. 
    private MemberPrinter memberPrinter; 
    @Bean 
    public MemberRegisterService memberRegSvc() { return new MemberRegisterService(memberDao); } 
    @Bean 
    public ChangePasswordService changePwdSvc() { 
        ChangePasswordService pwdSvc = new ChangePasswordService(); 
        pwdSvc.setMemberDao(memberDao); 
        return pwdSvc; 
    } 
    @Bean 
    public MemberListPrinter listPrinter() { return new MemberListPrinter(memberDao, memberPrinter); } 
    @Bean 
    public MemberInfoPrinter infoPrinter() { 
        MemberInfoPrinter infoPrinter = new MemberInfoPrinter(); 
        infoPrinter.setMemberDao(memberDao); 
        infoPrinter.setPrinter(memberPrinter); 
        return infoPrinter; 
    } 
    @Bean 
    public VersionPrinter versionPrinter() { 
        VersionPrinter versionPrinter = new VersionPrinter(); 
        versionPrinter.setMajorVersion(5); 
        versionPrinter.setMinorVersion(0); 
        return versionPrinter; 
    } 
}

위 코드에서 보는 것처럼 @Autowired Annotation을 붙이면 Spring Container에서 해당 타입의 빈을 주입받습니다.

다음으로 위의 2개의 설정 클래스를 이용해 스프링 컨테이너를 생성하는 코드는 다음과 같습니다.

ApplicationContext ctx = null; 

// AnnotationConfigApplicationContext 클래스의 생성자는 가변 인자이기 때문에 
// 설정 클래스 목록을 아래와 같이 콤마로 구분해서 전달한다.
ctx = AnnotationConfigApplicationContext(AppConf1.class, AppConf2.class);

2. @Import Annotation이란?


설정 파일도 클래스의 상속계층처럼 어떠한 계층을 가질 수는 없을까요🤔?

물론 있습니다. 두 개 이상의 설정 파일을 서로 연결시키는 방법은 @Import 애노테이션을 사용하는 것입니다.

@Import를 사용하면 설정 파일간의 계층을 만들 수 있습니다.

@Configuration 
@Import( {AppConf1.class, AppConf2.class} ) // AppConf1, AppConf2 두 가지 설정 클래스를 포함시킨다. 
public class AppConfImport { 
    @Bean 
    public MemberDao memberDao() { return new MemberDao(); } 
    @Bean 
    public MemberPrinter memberPrinter() { return new MemberPrinter(); } 
}