본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2025 1학기 스프링 부트 스터디] 여민호 #7주차

반응형

[전 강의] 

이전 강의에서는 스프링 컨테이너의 생성과 스프링 빈 추가 및 조회,

그리고 그 빈끼리의 상속관계에 대해 배웠다.


이어서 배울 내용

#섹션 5 - 6. BeanFactory와 ApplicationContext

BeanFactory와 ApplicationContext에 대해 알아보자

먼저 BeanFactory에 대해 알아보자

 

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

- 스프링 컨테이너 구조에서 가장 기본이 되는 인터페이스라는 뜻 ( 다른 컨테이너의 기반 )

 

2. 다양한 역할을 담당한다.

- BeanFactory는 스프링 빈을 관리하는 역할, 조회하는 역할을 한다.

(+) getBean( )을 제공한다

-> getBean( )은 스프링 컨테이너에 등록된 빈을 꺼내오는 메서드이다.

 

다음으로 ApplicationContext에 대해서도 알아보자

1. BeanFactory를 확장한 인터페이스이다.

- 즉 BeanFactory의 기능을 모두 상속 받아 제공한다.

 

2.BeanFactory와 비슷한 기능을 가진다

-* 그럼 둘의 차이는 뭘까 *-

--> ApplicationContext의 수많은 부가기능이 존재

 

1. 메시지소스를 활용한 국제화 기능 2. 환경변수
3. 애플리케이션 이벤트 4. 편리한 리소스 조회

#섹션 5 - 7. 다양한 설정 형식 지원 - 자바 코드 ,XML

지금까지 한 코드가 자바 코드이다. 

XML은 요즘 들어 잘 사용하지 않지만 어느정도 알아두면 좋다

<라이브 코딩>

XMLAppConfig 사용 자바 코드
xml 기반의 스프링 빈 설정 정보

자바 코드와 XML와 비슷하다

-- 간단하게 넘어감 --

#섹션 5 - 8 스프링 빈 메타정보 - BeanDefinition

BeanDefintion는 스프링이 빈을 관리하는 원리를 이해하는데 핵심적인 역할

즉) 빈이 어떤 클래스인지, 어떤 설정인지, 어떻게 생성 및 초기화되는지 설명하는 메타 정보

위 사진으로 설명하면 

1. Annotated BeanDefintionReader를 통해 AppConfig.class의 설정 정보를 읽고

2. BeanDefinition을 생성한다(빈 메타정보 생성)

 

추가적인 BeanDefinition 정보가 있지만 자세히 알아보진 않는다.

사용할 일이 거의 없기에 

- 이해해야할 내용은 "스프링이 다양한 형태의 설정  정보를  BeanDefinition으로 추상화해서 사용하는 것" 이다.


#섹션 6 - 1. 웹 애플리케이션과 싱글톤

웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.

 

<순수한 DI 컨테이너>

1. 사용자가 appConfig 호출
2. 요청이 될때마다 객체를 생성함
3. 객체가 계속해서 생성됨

그래서 여러 요청이 들어오면 호출이 될때마다 새로운 객체를 생성해야한다.

따라서 고객 트래픽이 초당 100이면 초당 100개 객체가 생성되고 소멸된다 

-> 메모리 낭비가 심하다

 

*해결방안*

해당 객체가 딱 1개만 생성되고, 공유되도록 설계한다.

 

#섹션 6 - 2. 싱글톤 패턴

<중요>

싱글톤 패턴 = "클래스의 인스턴스가 딱 1개만 생성되도록 하는 디자인 패턴"

1. static 에서 객체 인스턴스를 미리 하나만 생성해서 올려둠

2. 생성한 객체의 인스턴스가 필요하면 오직 getInstance( ) 메서드를 통해서만 조회할수 있음

3. 딱 1개의 객체 인스턴스만 존재해야하므로, 생성자를 private으로 막아서 외부에서 새롭게 생성되는 객체 인스턴스를 막음

 

<장점> 이미 만들어진 객체를 공유해서 효율적으로 사용이 가능하다.

 

<단점> 하지만 문제점이 많다

(1) 싱글톤 패턴 구현 코드 자체가 많이 들어간다.

(2) DIP를 위반한다.

(3) 테스트하기 어렵다

등등등...

 

위 문제를 해결하기 위해 싱글톤 컨테이너가 존재한다

 

싱글톤 컨테이너는 다음 스터디부터 시작해보겠습니다~

반응형