스프링은 객체 지향의 SOLID 원칙을 지키기 위해 어플리케이션을 동작 시키는 사용 영역과,
각 객체들의 생성과 의존관계 주입을 책임지는 구성 영역으로 코드를 분리 시킵니다.
단순 자바코드로 config 클래스를 만든 후 사용 영역에 주입할 수도 있지만 스프링은
어노테이션 기반으로 사용할 수 있는 스프링 컨테이너와 스프링 빈을 제공합니다.
스프링 컨테이너 생성
스프링 컨테이너는 ApplicationContext 라는 인터페이스를 통해 사용할 수 있습니다.
ApplicationContext ac = new AnnotationConfigApplicationContext();
코드를 보면 ApplicationContext의 실제 구현체로는 AnnotationConfigApplicationContext 가 들어간걸 알 수 있습니다. 스프링 컨테이너는 기본적으로 3가지 방법으로 설정 정보를 얻어옵니다.
- 어노테이션 기반의 자바 코드 방식
- XML 기반의 방식
- 커스텀 방식
예전에는 XML 방식도 많이 사용했지만, 최근에는 대부분 어노테이션 기반의 자바 코드 방식으로 설정 정보를 얻어옵니다.
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository()
{
return new MemoryMemberRepository();
}
}
위 코드에 있는 어노테이션들에 대해 알아보겠습니다.
@Configuration
ApplicationContext가 스프링 컨테이너를 만들때 설정 정보로 인식하게 만들어줍니다.
@Bean
설정 정보를 읽어올때 @Bean 어노테이션이 붙어있는 메서드를 모두 호출 후, 반환되는 값을 스프링 빈으로 등록합니다.
스프링 빈은 메서드의 이름이 key, 메서드의 반환값이 value가 된 형태로 스프링 컨테이너에 저장됩니다. 위의 코드를 예로 들면, key는 memberRepository가 되고 value는 MemoryMemberRepository 구현체가 됩니다.
스프링 컨테이너에서 스프링 빈 조회
그렇다면 스프링 컨테이너에서 스프링 빈을 조회하고 싶다면 어떻게 해야 할까요?
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = applicationContext.getBean(beanDefinitionName);
System.out.println(bean);
}
우선 applicationContext에서 getBeanDefinitionNames 라는 메서드를 사용해서 스프링 빈으로 등록되어있는 모든 key값을 가져옵니다. 여기서 key값들은 앞에서 봤듯이 @Bean 메서드의 이름입니다.
application의 getBean 메서드안에 우리가 받아온 beanDefinitionName을 넣어주면 ( for문을 통해서 Name 하나하나에 접근해줬습니다. ) 제가 개별적으로 등록한 스프링 빈과 스프링 자체에서 생성한 빈들 모두가 조회됩니다.
로그 상단에 org.springframework 로 시작하는 부분은 스프링 내부에서 자동적으로 생성된 스프링 빈입니다. 하단의 두개가 제가 생성한 스프링 빈인데, 중요한건 @Configuration을 붙인 AppConfig 자체도 스프링빈으로 등록된다는 것입니다.
지금까지 스프링 컨테이너를 생성하는 방법과 스프링 빈을 어노테이션 기반으로 등록하는 방법,
그리고 간단하게 스프링 빈을 모두 조회하는 방법에 대해 알아봤습니다.
다음 시간에는 스프링 빈을 조회하는 방법에 대해 더 자세히 알아보겠습니다.