본문 바로가기

Java/Spring

Spring 5 입문: Chapter 03B. 여러 개의 @Configuration 설정 클래스 등록하기

더보기

이 프로젝트의 개발 환경

  • 개발 언어 및 개발 환경
    • OpenJDK 17
  • 기타 환경
    • macOS Sonoma 14.1.1
    • IntelliJ IDEA 2020.3 Ultimate Edition

여러 개의 @Configuration 설정 클래스 등록: @Autowired

Spring 프로젝트에서는 적게는 수십 개에서 많게는 수백 여 개 이상의 Bean을 설정하게 됩니다.

설정하는 Bean이 많아지면 한 개의 설정 클래스 파일에서 관리하는 것보다는 Bean 성격에 맞게 분리 후 관리하는 것이 필요합니다.

이전 예제에서 작성한 chap03 패키지와 작성한 클래스를 모두 복사하여 chap03_b를 생성하고, AppContextAppContext1AppContext2로 분리합니다.

package chap03_b;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppContext1
{
	@Bean
	public MemberDao memberDao()
	{
		return new MemberDao();
	}
	
	@Bean
	public MemberPrinter memberPrinter()
	{
		return new MemberPrinter();
	}
}

AppContext2는 나머지 Bean을 관리합니다.

package chap03_b;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppContext2
{
	@Autowired
	private MemberDao memberDao;
	@Autowired
	private MemberPrinter memberPrinter;
	
	@Bean
	public MemberRegisterService memberRegSvc()
	{
		return new MemberRegisterService(memberDao);
	}
	
	@Bean
	public ChangePasswordService changePwdSvc()
	{
		ChangePasswordService svc = new ChangePasswordService();
		svc.setMemberDao(memberDao);
		return svc;
	}
	
	@Bean
	public MemberListPrinter listPrinter()
	{
		return new MemberListPrinter(memberDao, memberPrinter);
	}
}
코드 비고
Line 10:13 @Autowired Spring의 자동 주입을 사용합니다.
다른 설정 클래스에 위치한 Bean을 자동으로 주입합니다.

설정 클래스를 사용하려면 컨테이너를 먼저 생성해야합니다.

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext1.class);

여러 개의 설정 클래스를 사용하려면 컨테이너를 생성 할 때 인자로 모두 전달합니다.

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext1.class, AppContext2.class);
더보기

Spring은 @Configuration 어노테이션이 등록된 클래스를 설정 클래스로써 Bean에 등록합니다.

@Autowired 어노테이션이 등록된 필드는 설정 클래스에서 관리하는 Bean을 자동으로 찾아서 주입합니다.

여러 개의 @Configuration 설정 클래스 등록: @Import

여러 개의 설정 클래스를 등록하는 또 다른 방법은 @Import 어노테이션 사용입니다.

@Import은 설정 클래스에서 참조하고자 하는 다른 설정 클래스를 지정합니다.

이전 예제에서 작성한 chap03_b 패키지와 작성한 클래스를 모두 복사하여 chap03_c를 생성하고, AppContext1을 다음과 같이 수정합니다.

package chap03_c;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(AppContext2.class)
public class AppContext1
{
	@Bean
	public MemberDao memberDao()
	{
		return new MemberDao();
	}
	
	@Bean
	public MemberPrinter memberPrinter()
	{
		return new MemberPrinter();
	}
}
코드 비고
Line 8 @Import 설정 클래스가 어노테이션으로 지정한 다른 설정 클래스를 함께 사용합니다.

AppContext1에서 참조하게 되므로 ApplicationContext 컨테이너는 AppContext2를 지정하지 않아도 됩니다.

AppContext2AppContext1에 의해서 컨테이너에서 함께 초기화됩니다.

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext1.class);
더보기

@Import 어노테이션에서 여러 개의 설정 클래스를 Import하려면 다음과 같이 사용합니다.

@Configuration
@Import( {AppContext1.class, AppContext2.class } )
public class AppContext
{
	...
}

정리 및 복습

  • 설정 클래스에는 @Configuration 어노테이션을 등록합니다.
  • 설정 클래스를 사용하려면 ApplicationContext 컨테이너에서 초기화합니다.
  • 여러 개 설정 클래스를 사용하려면 ApplicationContext 컨테이너에서 초기화 할 때 인자로 설정 클래스를 모두 전달합니다.
  • 설정 클래스가 다른 설정 클래스의 Bean 객체를 가져다 쓰려면 @Autowire 어노테이션을 등록한 필드를 사용합니다.
  • @Autowire은 Bean으로 등록된 객체를 자동으로 주입합니다.
  • 설정 클래스가 다른 설정 클래스를 함께 참조하려면 @Import 어노테이션을 등록하여 클래스를 지정합니다.
  • @Import로 지정된 설정 클래스는 ApplicationContext 컨테이너에서 직접 초기화 할 필요가 없습니다.