[스프링(spring)] @Configuration와@Import

allnight5·2023년 1월 5일
0

스프링

목록 보기
26/62

참조사이트1
참조사이트2
Spring Framework를 이용해서 앱을 개발하다보면 수십~수백개 이상의 빈을 설정하게 될텐데영역별로 설정 파일을 나누면 관리하기도 쉽고 가독성도 좋아집니다. 나누어진 설정 클래스를 가지고 @Autowired와 @Import를 살펴보겠습니다.
Spring MVC는 한 개 이상의 설정 파일을 이용해서 컨테이너를 생성할 수 있습니다.
참조사이트3

@Configuration

스프링 컨테이너를 싱글톤 레지스트리 라고도 하는데 싱글톤 레지스트리는 싱글톤 객체를 생성하고 관리하는 것을 싱글톤 레지스트리라고 한다
스프링 컨테이너는 @Configuration이 붙은 것을 설정 정보로 사용한다
이후 이 안에서 @Bean이라고 적혀있는 메소드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 스프링 컨테이너에 등록된 객체를 빈이라고 한다.
추가로 빈의 이름들은 항상 다른 이름을 부여해야 한다.
같은 이름들을 부여하면, 다른 빈이 무시되거나 기존 빈을 덮어버리는 오류가 발생한다.
@Configuration이 어떻게 중복되는 호출을 막는지는 바이트 코드가 연관이 되어있다고 한다.
첫 번째 설정 클래스입니다.

@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; 
    } 
}

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

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

@Import Annotation란 ?


@Import를 사용하면 설정 파일간의 계층을 만들 수 있습니다.
@Configuration으로 설정한 설정 파일을 두 개 이상 사용하는 경우
Java 파일에 대한 Import를 위해 사용한다.

@Import를 사용하면 설정 파일간의 계층을 만들 수 있습니다.
위에 만든 2개의 클래스를 상속계층처럼 두 개 이상의 설정 파일을 서로 연결시키는 방법은 @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(); } 
}

Non-@Configuration 클래스를 사용하는 경우 @ImportResource 를 사용하자.

public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(...);
    }
}

@Configuration
@AnnotationDrivenConfig
@Import(DataSourceConfig.class) // <-- AppConfig imports DataSourceConfig
public class AppConfig extends ConfigurationSupport {
    @Autowired DataSourceConfig dataSourceConfig;

    @Bean
    public void TransferService transferService() {
        return new TransferServiceImpl(dataSourceConfig.dataSource());
    }
}

AppConfig에서 DataSourceConfig를 import하고 있으므로 스프링 컨테이너 생성 시 AppConfig 클래스만 사용하면 DataSourceConfig 클래스의 설정도 함께 사용하여 초기화

여러 설정 파일을 임포트하는 경우

@Import({ DataSourceConfig.class, TransactionConfig.class })
public class AppConfig extends ConfigurationSupport {
    // @Bean methods here can reference @Bean methods in DataSourceConfig or TransactionConfig
}
profile
공부기록하기

0개의 댓글