3. 스프링 DI(Dependency Injection) #6 getBean() 메서드 사용

2021. 7. 9. 00:12JAVA/Spring

본 글은 최범균 저자의 초보 웹 개발자를 위한 스프링5 프로그래밍 입문 도서 내용의 복습을 위해 작성된 글입니다.

9. getBean() 메서드 사용

getBean() 메서드의 형식

VersionPrinter versionPrinter = ctx.getBean("versionPrinter", VersionPrinter.class);

getBean 메소드 첫번째 인자 : Bean의 이름

getBean 메소드 두번째 인자 : Bean의 타입

 

getBean() 메서드의 예외(Exception) 발생 상황

1. Bean의 이름 중 존재하지 않는 Bean 이름의 사용

VersionPrinter versionPrinter = ctx.getBean("versionPrinter2", VersionPrinter.class);

위와 같이 versionPrinter 대신에 versionPrinter2 Bean 이름을 사용하게 되면 예외를 발생시킨다.

 

2. Bean의 실제 타입과 getBean() 메서드의 두번째 인자에 지정한 클래스 타입이 다른 경우

VersionPrinter versionPrinter = ctx.getBean("listPrinter", VersionPrinter.class);

listPrinter Bean의 실제 타입은 MemberListPrinter 클래스 타입이다. 따라서 위 문장을 컴파일 수행 시 컴파일러는 listPrinter Bean의 이름이 VersionPrinter 클래스 타입을 기대하였지만 실제 타입은 MemberListPrinter 클래스 타입이라고 알려줄 것이다.

 

3. Bean 이름을 지정하지 않고(첫번째 인자 생략) 타입만으로 Bean을 구하는 경우

VersionPrinter versionPrinter = ctx.getBean(MemberPrinter.class);

단, 해당 타입(MemberPrinter.class)의 Bean 객체가 한 개만 존재하면 빈을 구해서 리턴한다. 해당 타입의 빈 객체가 존재하지 않거나 2개 이상인 경우 예외를 발생시킨다.

 

10. 주입 대상 객체를 모두 빈 객체로 설정해야 하나?

주입할 객체가 꼭 스프링 빈이어야 할 필요는 없다.

@Configuration
public class AppCtxNoMemberPrinterBean{
	private MemberPrinter printer = new MemberPrinter();	// 빈이 아님
    
    ...생략
    
    @Bean
    public MemberListPrinter listPrinter(){
    	return new MemberListPrinter(memberDao(), printer);
    }
}

위의 설정 코드는 MmeberPrinter를 Bean으로 설정하지 않았다. 하지만 listPrinter 메소드에서 MemberListPrinter 객체 생성과정에서 생성자의 인자로 printer 객체를 사용해서 의존 주입을 수행하는 것을 볼 수 있다. 위와 같이 하여도 MemberListPrinter 객체는 정상 작동한다.

 

객체의 스프링 빈 등록/미등록 차이

  • 스프링 컨테이나가 객체를 관리하는지의 여부
// MemberPrinter를 빈으로 등록하지 않았으므로 의존 주입이 되지 않고 예외가 발생한다.
MemberPrinter printer = ctx.getBean(MemberPrinter.class);

스프링 컨테이너는 자동 주입, 라이프 사이클 관리 제공한다. 단, 빈으로 등록한 객체에만 기능을 적용한다.

 

정리하며

  1. getBean() 메서드의 형식은 첫번째 인자는 Bean의 이름, 두번째 인자는 Bean의 타입이 들어간다.
  2. getBean() 메서드에서 빈의 이름이 존재하지 않거나 Bean의 이름과 타입이 일치하지 않으면 예외가 발생한다.
  3. 주입 대상 객체를 모두 빈 객체로 설정하는 것은 필수는 아니지만 의존 주입 대상은 스프링 빈으로 등록하는 것이 보통이다.

References

초보 웹 개발자를 위한 스프링5 프로그래밍 입문, 최범균 저