여니의 프로그래밍 study/Spring & Spring Boot

[스프링부트] 스프링 컨테이너와 스프링 빈

여니's 2022. 1. 16. 17:32

출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com


 다형성

https://eboong.tistory.com/407

 

[Ch2] 객체 지향 프로그램, 객체 지향 특징 (상속,다형성,추상화,캡슐화), 오버라이딩 및 오버로딩

<< 절차적 지향 언어 대신 객체 지향 언어를 사용하게 된 계기 >> : 초기에는 프로그램의 규모가 크지 않았다. 그래서 개발자들은 기능을 중심으로 코딩을 하였다. 그러나 소프트웨어가 발전하면

eboong.tistory.com

 


스프링 컨테이너

: 객체관리를 수행하는 그릇으로 생각하면 된다.

즉 주입(DI)을 이용하여 객체를 관리하는 컨테이너!

빈의 생성 및 관계, 사용, 생명 주기 등을 주로 담당한다. 

 

스프링 컨테이너를 사용하는 이유? 장점?

> 객체간의 의존성을 낮추기 위함.

> 싱글톤 패턴의 문제점을 해결하면서 객체 인스턴스를 싱글톤으로 관리한다. 

강의 들으면서 더 추가해나갈 예정

 

 

빈 (Bean)

: 컨테이너에 의해 관리되는 애플리케이션의 핵심을 이루는 객체이다. 

 


스프링 빈 저장소

빈 이름 : 메소드명

빈 객체 : 반환되는 객체

 

스프링 컨테이너에서 스프링 빈을 조회하는 방법

ac.getBean(타입)

ac.getBean(빈 이름, 타입) 

 

ac.getBeansOfType(타입)

> 해당 타입의 모든 빈을 조회할 수 있다.

 

ac.getBeanDefinitionNames()

> 스프링에 등록된 모든 빈 이름을 조회한다. 

 

 


 

스프링 상속 관계 

> 부모 타입으로 조회하면 자식들도 함께 조회된다.

모든 자바 객체의 최고 부모인 Object 타입으로 조회하면 모든 스프링 빈을 조회하게 된다.

 

1) 부모 타입으로 조회시, 자식이 둘 이상이면 중복 오류가 발생한다.

NoUniqueBeanDefinitionException

 

> 따라서 타입 뿐만 아니라 빈 이름을 지정해 불러오면 오류가 나지 않는다.

ac.getBean(빈이름, 타입)

 

 


 

BeanFactory

>> 스프링 컨테이너의 최상위 인터페이스이다.

스프링 빈을 관리하고 조회하는 역할을 담당

getBean()을 비롯한 대부분의 기능을 제공하는 인터페이스. 

 

ApplicationContext

>> BeanFactory 기능을 모두 상속받아서 제공한다.

빈을 관리하고 조회하는 기능은 물론이고

편리한 부가기능을 제공한다.

 

(부가기능)

1) 메세지소스를 활용한 국제화 기능

2) 환경변수

3) 애플리케이션 이벤트

4) 편리한 리소스 조회

 

 

AnnotationConfigApplicationContext

>> ApplicationContext 인터페이스의 구현체

(참고로 ApplicationContext 인터페이스의 구현체의 종류는 여러가지가 있음)

 


@Configuration

: 클래스 선언 앞에 기술하는 어노테이션

해당 클래스가 빈의 설정을 할 것을 나타냄.

 

 

@Bean 

: 메소드 앞에 기술하는 어노테이션

해당 메소드를 스프링 컨테이너에 등록하기 위함.

 


다양한 설정 형식 지원

> 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계가 되어 있음.

 

어떻게 다양한 형식의 설정 정보를 받아들일 수 있게 되어있는걸까?

 

바로 역할과 구현을 개념적으로 나눈 것이다. 

오직 스프링은 BeanDefinition(추상화)만 알면 된다. 

즉 BeanDefinition에만 의존함.

BeanDefinition을 빈 설정 메타 정보라고 한다. 

 

 

즉, 

AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를

사용해서 AppConfig.class를 읽고

BeanDefinition을 생성한다. 

 

(교재 65p)