스프링 컨테이너도 제대로 모르고 개발한 나.. 반성해

SOUTH DARIA·2022년 9월 18일
2

인삿말🙇🏻‍♀️

안녕하세요 다리아입니다 :)
제가 IT 커뮤니티의 면접을 보았습니다..
면접은 기술 면접 & 컬처핏 면접 을 동시에 하는 형식으로 진행되었는데요.
...

기술면접이 너무 어려운 거에요 저에게..
답을 제대로 한 게 하나도 없어서 쥐구멍으로 숨고 싶었습니다🥹
(특히.. 제 벨로그를 알고 계셨는데.. 나는 찌끄라기였..단)

나름 실무적인 지식을 많이 쌓으려고 노력했다고 생각했는데, BeanFactory와 ApplicationContext의 차이점을 물어보시는데 머릿속이 하얘지더라구요.

그래서 면접 끝나자마자 서치 좀 했습니다...

스프링 컨테이너란? 💁🏻‍♀️

스프링에서 DI를 이용하여 애플리케이션을 구성하는 여러 Bean들의 Lifecycle과 애플리케이션의 서비스 실행 등을 관리하며 생성된 인스턴스들에게 기능을 제공하는 것

  • 작성된 코드를 컨테이너가 빈을 스스로 참조한 뒤 알아서 관리한다. (컨테이너에 미리 세팅 필요)
  • 빈 팩토리(BeanFactory)와 애플리케이션 컨텍스트(ApplicationContext) 두 가지로 다룬다.

컨테이너?

컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것

객체관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있다.

IoC 컨테이너란? 😵‍💫

Ioc?

(Inversion Of Control, 제어 반전)

  • 컴포넌트 의존관계 설정(Component dependency resoulution)
  • 설정(Configuration)
  • 생명주기(LifeCycle)

위의 보기들을 해결하기 위한 디자인 패턴(Design Pattern) 중 하나로, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.

IoC 컨테이너?

스프링 프레임워크의 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너

  • IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
  • POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
  • 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.
  • 개발자는 비즈니스 로직에 집중할 수 있다.
  • 객체 생성 코드가 없으므로 TDD가 용이하다.

POJO(Plain Old Java Object)란?
특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object
Java Bean 객체가 대표적이다. ( ex : getter, setter )

BeanFactory란? 🫘

Spring 빈 컨테이너에 접근하기 위한 루트 인터페이스.

  • 빈을 생성하고 의존관계를 설정하는 기능을 담당하는 가장 기본적인 IoC 컨테이너이자 인터페이스

ApplicationContext이란? 💁🏻‍♀️

ApplicationContext는 해당 애플리케이션에 대한 구성정보를 제공하는 인터페이스

애플리케이션에 대한 구성정보라는 것은 등록한 Bean에 대한 또한 포함이어서 위와 같이 특정 타입의 Bean의 리스트(Test 객체를 상속 받은 하위 객체까지 전부)를 가져온다거나 하는 등 Bean의 정보를 가져올 수 있다.

BeanFactory 인터페이스를 상속 받은 인터페이스이다.

BeanFactory와 ApplicationContext 차이점은? 💁🏻‍♀️

가장 큰 차이점은 로딩방식이 다르다는 것이다.

  • BeanFactory: Lazy-Loading방식을 사용
    지연 로딩은 해당 Bean을 호출할 때에야 Bean이 인스턴스화 되는 것으로 적은 필요한 Bean을 그 때 그 때 인스턴스화 해 pre-loading보다 속도가 빠르다.
  • ApplicationContext: Pre-Loading방식을 사용
    해당 Bean에 대한 설정 등을 스프링 컨테이너에서 이미 로드했을 때 Bean이 인스턴스화 되고 ApplicationContext에서 Bean을 호출할 때 기존에 인스턴스화된 Bean을 호출한다. 많은 Bean이 등록되어 있는 시스템일수록 더더욱 강점을 보일 수 있다.

또한 초점을 두고 있는 기능이 다르다.

  • BeanFactory : Bean을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 둠.
  • ApplicationContext : 별도의 정보를 참고해서 빈의 생성, 관계 설정 등의 제어를 총괄하는 것에 초점을 둠.

BeanFactory VS ApplicationContext

ApplicationContext Win💪🏻!!

스프링 공식 문서에 따르면 특별한 이유가 없을 시에는 ApplicationContext 사용을 권장한다.

BeanFactory 후처리를 명시적으로 등록하려면 다음 예제은 작업이 필요하다.

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// populate the factory with bean definitions

// now register any needed BeanPostProcessor instances
factory.addBeanPostProcessor(new AutowiredAnnotationBeanPostProcessor());
factory.addBeanPostProcessor(new MyBeanPostProcessor());

// now start using the factory

하지만 ApplicationContext의 경우 BeanFactory의 모든 기능이 구현되어 있고, 추가적인 기능들을 제공한다.

Environment

소스 설정 및 프로퍼티 값 조회 기능

local, dev 등 Profile 별 소스 설정이 가능하다.
예를 들어, local는 local db를 바라보게 하고, prod는 prod의 db를 바라보도록 설정할 수 있다.

MessageSource

메시지에 대한 국제화(i18n)을 제공하는 인터페이스

메세지 설정 파일을 모아서 각 국가마다 로컬라이징이 가능하다.
(번역 기능 사용가능)

profile
고양이와 함께 - 끄적끄적 개발하고 이씁니다 ~!

0개의 댓글