Spring/핵심원리

[스프링 핵심원리 - 기본편] 내용 정리3

슈코 2023. 8. 22. 08:58
인프런 김영한님의 강의를 듣고,
내용을 정리하며 저의 생각도 정리하였습니다.

 

스프링 컨테이너와 스프링 빈

스프링 컨테이너를 공부하면서 가장 먼저 눈에 들어온 몇가지 개념이 있다.

 

ApplicationContext

- '스프링 컨테이너'라고 불리는 인터페이스( 다형성 적용 )

- 사실은 'BeanFactory'가 스프링 컨테이너의 최상위 인터페이스이다

 

Spring Bean

- 스프링 DI 컨테이너에 의해 관리되는 POJO

 

@Configuration

- 해당 애노테이션이 붙어있는 클래스를 스프링 설정을 담당하는 클래스로 인식한다

- 해당 애노테이션으로 설정클래스임을 알리고, @Bean을 메소드에 붙여 스프링 빈으로 등록한다

 

@Bean

- 해당 애노테이션이 붙어있는 메소드를 스프링 빈으로 등록

 

@Component

- 자동으로 스프링 컨테이너에 빈을 등록하는 방법이다

- 하위 애노테이션으로 @Configuration, @Controller, @Service, @Repository

 

 

쉽게 표현하면 ApplicationContext를 스프링 컨테이너라고 한다.

ApplicationContext는 인터페이스인데, 그렇기 때문에 다형성이 적용되어 있다.

(애노테이션 기반, XML 기반 등등)

지난 시간에 AppConfig를 사용해서 직접 객체를 생성하고, DI를 했지만 스프링 컨테이너를 사용하면 더 편리한 이용이 가능하다.

 

@Configuration을 애노테이션을 붙인 클래스는 스프링 설정을 담당하는 클래스로 인식하고, 그 안에 @Bean 애노테이션을 붙인 메소드를 스프링 빈으로 등록한다!

여기서 스프링 빈이란, 스프링 DI Container에 의해 관리되는 POJO(Plain Old Java Object)이다. 즉 스프링빈은 스프링이 관리하는 객체라고 할 수 있다.

 

이렇게 @Configuraion과 @Bean을 이용하여, 스프링 컨테이너에 빈을 등록할 수 있는데

@Component를 이용하면 자동으로 등록할 수 있다.( 이 부분은 다음 쳅터에서! )

 

new AnnotationConfigApplicationContext(AppConfig.class)로 생성 시 스프링 컨테이너가 생성되고 파라미터로 넘어온 AppConfig.class의 정보를 활용(@Bean이 붙어있는 메소드)하여 스프링 빈을 등록한다

빈의 이름은 직접 등록할 수 도 있지만, 메서드의 이름을 사용한다.

( 중복되지 않도록 주의 )

 

스프링 컨테이너에 등록된 객체 예시

 

그리고 스프링 컨테이너는 설정 정보를 참고하여 의존관계를 주입(DI)한다

 

 

결과적으로, 해당 과정을 확실하게 이해해야 다음에 등장하는 의존관계 자동주입을 이해할 수 있다.

회사에서 업무를 진행할때는 대부분 의존관계 자동주입을 사용하는 경우가 많기 때문에 제대로 된 이해없이 처음보면

모든 것이 낯설다. 결국 어떤 방법을 사용하던, 원리는 스프링 컨테이너가 객체를 관리하게끔 설정하는 것 이다.

 

스프링 빈 설정 메타정보 - BeanDefinition

- 'BeanDefinition' 추상화( 빈 설정 메타정보 )

( 역할 / 구현을 개념적으로 나누는 것 )

- 스프링 컨테이너는 메타정보를 기반으로 스프링 빈을 생성한다!

- XML을 읽어서 BeanDefinition을 만들면 된다 or Java 코드를 읽어서 BeanDefinition을 만들면 된다

( 스프링 컨테이너는 Java 코드인지 XML 기반인지 몰라도 된다! 오직 BeanDefinition만 알면 된다 )