개발/Spring

[Spring DI] 2. Spring DI 설정

nova_dev 2020. 11. 8. 16:00
반응형

Spring 
Spring DI 설정

Spring에서 DI를 설정하는 방법과 @Configuration, @Bean 어노테이션에 대해 공부해보자.
그리고 @Configuration 설정과 @Bean의 싱글톤 객체에 관해 알아보자.

 

 Spring에서의 DI 설정

앞에서 스프링은 객체 조립기와 같은 DI 역할을 수행한다고 말했다. 그러면 Spring이 DI를 해줄 수 있도록 설정하려면 어떻게 해야할까? 먼저 스프링이 어떤 객체를 생성하고, 의존을 어떻게 주입할 것인지를 정의한 설정 정보를 작성해야 한다. 아래 예시를 살펴보자.

@Configuration
public class AppCtx {

	@Bean
	public MemberDao memberDao() {
		return new MemberDao();
	}
	
	@Bean
	public MemberRegisterService memberRegSvc() {
		return new MemberRegisterService(memberDao());
	}
	
	@Bean
	public ChangePasswordService changePwdSvc() {
		ChangePasswordService pwdSvc = new ChangePasswordService();
		pwdSvc.setMemberDao(memberDao());
		return pwdSvc;
	}
 }

@Configuration 어노테이션은 스프링 설정 클래스를 의미한다. 이 어노테이션을 붙여야 스프링 설정 클래스로 사용할 수 있다.

@Bean 어노테이션은 해당 메서드가 생성한 객체를 스프링 빈이라고 설정한다. 위 코드에서는 세 개의 메서드에 @Bean 어노테이션을 붙였는데 각각의 메서드마다 하나의 빈 객체를 생성한다. 이 때 메서드 이름을 빈 객체의 이름으로 사용한다. 예를들어 memberDao() 메서드를 이용하여 생성된 빈 객체는 memberDao 라는 이름으로 스프링에 등록된다.

설정 클래스를 전부 만들었다면, 객체를 생성하고 의존 객체를 주입하는 것은 스프링 컨테이너이므로 이제 설정 클래스를 이용하여 컨테이너를 생성해야 한다. 스프링 컨테이너를 생성해 주는 것은 아래와 같다.

ApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class)

컨테이너를 사용하면 getBean() 메서드를 이용하여 사용할 객체를 구할 수 있다.

MemberRegisterService regSvc = ctx.getBean("memberRegSvc", MemberRegisterService.class);

위 코드에서는 컨테이너 이름이 memberRegSvc인 Bean 객체를 구하는 것을 보여준다. 

물론, 우리는 스프링 컨테이너를 생성해 주는것과 빈 객체를 구해오는 것 모두 어노테이션으로 스프링이 알아서 해결할 수 있도록 설정할 수 있지만, 개념적인 이해를 위해 지금은 위와 같이 직접 가져온다고 생각하자.

 

 @Configuration 설정 클래스의 @Bean설정과 싱글톤

스프링 컨테이너가 생성한 빈은 싱글톤 객체이다. 스프링 컨테이너는 @Bean이 붙은 메서드에 대해 한 개의 객체만 생성한다. 

@Configuration
public class AppCtx {

	@Bean
	public MemberDao memberDao() {
		return new MemberDao();
	}
	
	@Bean
	public MemberRegisterService memberRegSvc() {
		return new MemberRegisterService(memberDao());
	}
	
	@Bean
	public ChangePasswordService changePwdSvc() {
		ChangePasswordService pwdSvc = new ChangePasswordService();
		pwdSvc.setMemberDao(memberDao());
		return pwdSvc;
	}
}

예를 들어 위와 같이 memberDao를 Bean객체로 설정했을 때, 다른 메서드에서 memberDao()를 몇 번 호출하더라도 항상 같은 객체를 리턴한다는 것을 의미한다.

스프링은 설정 클래스를 그대로 사용하지 않는다. 대신 설정 클래스를 상속한 새로운 설정 클래스를 만들어서 사용한다. 스프링이 런타임에 생성한 설정 클래스의 memberDao()메서드는 매번 새로운 객체를 생성하는 것이 아니라 한 번 생성한 객체를 보관했다가 이후에는 동일한 객체를 리턴한다.

 

 

관련글

위 글은 스프링5 프로그래밍 입문 (저자: 최범균) 책을 공부하면서 작성한 글입니다. (링크)

[스프링 DI] 1. 스프링 DI(Dependency Injection)란? (링크)
[스프링 DI] 2. Spring DI 설정 (링크)
[스프링 DI] 3. Spring에서 두 개 이상의 설정 파일 이용하기 (링크)
[스프링 DI] 4. getBean() 메서드 사용과 Bean 관련 Exception 정리 (링크)

 

 
 

 

 

반응형