Programming/Spring framework

스프링의 역할: 객체 조립기(@Configuration)

최동훈1 2021. 10. 19. 16:30

지난 포스팅에서 자바 개발할때, 유지보수를 쉽게 하기 위해서 DI를 전담하고, 의존 대상이 되는 객체들을 미리 생성한 클래스인 Assembler를 만들었다.

 DI를(나중에 공부할 @AutoWired 를 통해 가능) 한 클래스 내에서 모두 처리할수 있고, 미리 의존대상이 되는 객체를 만들어놓기 때문에 유연한 개발이 가능하다.

 

그렇다면 이렇게 장황하게 객체 조립기에 대해 설명한 이유가 무엇일까? 눈치빠르면 바로 이해한다ㅋㅋ

바로 스프링은 객체 조립기의 기능을 제공한다는 것이다.

우선 스프링 컨테이너라는 것이 있는데, 여기에 스프링 설정클래스를 통해 등록된 빈 객체 들이 서로서로 DI를 자동으로 해주고, 또한 해당 객체가 필요할때마다 스프링 컨테이너(ApplicationContext)에 구현된 getBean 메서드를 통해 이미 완성되서 등록되있는 객체를 불러 올 수 있다.

백문이 불여일타라고 코드를 직접 보여주겠다. 그 전 포스팅에서 스프링 없이 쓴 객체 조립기와 비교하면 차이를 쉽게 알수 있다.(기능은 똑같지만)

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

@Configuration
public class AppCtx {
	@Bean
	public MemberDao memberdao() {
		MemberDao m=new MemberDao();
		return m;
	}
	@Bean
	public MemberRegisterService mrsvc() {
		MemberRegisterService mrsvc=new MemberRegisterService(memberdao());
        //memberdao() 메서드를 호출해서 생성자를 통해 DI를 하는 경우.
		return mrsvc;
	}
	@Bean
	public PasswordChangeService pcsvc() {
		PasswordChangeService pcsvc=new PasswordChangeService(memberdao());
		return pcsvc;
	}
}

자바 설정 클래스 이다. 스프링 컨테이너를 구성하는 방법은 여러가지가 있는데, 내가 아직배운 내용은 @Configuration 애너테이션을 이용해서 설정클래스를 만드는 것이다.

@Configuration 애너테이션이 붙은 클래스는 스프링 설정 클래스가 되며, 그 클래스의  @Bean이 붙은 매서드는 메서드의 이름이 빈 객체로 오고 반환타입이 빈 객체의 타입이 된다.

 

즉 여기서 오해 할 수 있는데, 빈 객체는 "메서드의 이름" 이고, 타입은 "메서드의 반환값"이라는 것이다. 즉, @Bean 메서드가 반환하는 객체 1개(싱글톤)만 "메서드의 이름"으로 스프링 컨테이너에 등록 된다.

 

또 주의해야 할 점은 @Configuration 클래스는 그자체로 스프링 컨테이너가 아닌 "스프링 컨테이너를 생성하기 위한 설정 클래스" 라는 것이다. 즉, ApplicationContext라는 클래스나 이것을 상속받은 자손클래스를 통해 "실질적인 스프링 컨테이너"를 설정정보를 이용해서 만들어야 한다. 그래야 비로소 스프링 컨테이너가 만들어지고, 내 설정 클래스의 내용대로 빈 객체와 DI가 등록되는 것이다.

 

아래의 AnnotationConfigApplicationContext란 클래스는 애너테이션을 이용한 설정 클래스로 스프링 컨테이너를 만들수 있도록 구현된 ApplicationContext의 자손클래스이다. 

 

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainforSpring {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context
		= new AnnotationConfigApplicationContext(AppCtx.class);
		//스프링 컨테이너를 만들어준 모습.
		MemberRegisterService msvc=context.getBean(MemberRegisterService.class);
		
		PasswordChangeService psvc=context.getBean("pcsvc",PasswordChangeService.class);
		//빈 객체의 이름을 문자열타입으로 파라미터에 넘겨줌.
		
		msvc.registermember(new Member(9209, 1));
		msvc.registermember(new Member(6429, 7));
		
		psvc.changepwd(new Member(6429,8));
						
	}

}

실행완료 모습.

공부시간 1시간 

순공부시간 30분.