안녕하세요 다리아입니다 :)
제가 IT 커뮤니티의 면접을 보았습니다..
면접은 기술 면접 & 컬처핏 면접 을 동시에 하는 형식으로 진행되었는데요.
...
기술면접이 너무 어려운 거에요 저에게..
답을 제대로 한 게 하나도 없어서 쥐구멍으로 숨고 싶었습니다🥹
(특히.. 제 벨로그를 알고 계셨는데.. 나는 찌끄라기였..단)
나름 실무적인 지식을 많이 쌓으려고 노력했다고 생각했는데, BeanFactory와 ApplicationContext의 차이점을 물어보시는데 머릿속이 하얘지더라구요.
그래서 면접 끝나자마자 서치 좀 했습니다...
스프링에서 DI를 이용하여 애플리케이션을 구성하는 여러 Bean들의 Lifecycle과 애플리케이션의 서비스 실행 등을 관리하며 생성된 인스턴스들에게 기능을 제공하는 것
컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것
객체관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있다.
(Inversion Of Control, 제어 반전)
위의 보기들을 해결하기 위한 디자인 패턴(Design Pattern) 중 하나로, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.
스프링 프레임워크의 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너
POJO(Plain Old Java Object)란?
특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object
Java Bean 객체가 대표적이다. ( ex : getter, setter )
Spring 빈 컨테이너에 접근하기 위한 루트 인터페이스.
ApplicationContext는 해당 애플리케이션에 대한 구성정보를 제공하는 인터페이스
애플리케이션에 대한 구성정보라는 것은 등록한 Bean에 대한 또한 포함이어서 위와 같이 특정 타입의 Bean의 리스트(Test 객체를 상속 받은 하위 객체까지 전부)를 가져온다거나 하는 등 Bean의 정보를 가져올 수 있다.
BeanFactory 인터페이스를 상속 받은 인터페이스이다.
가장 큰 차이점은 로딩방식이 다르다는 것이다.
또한 초점을 두고 있는 기능이 다르다.
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의 모든 기능이 구현되어 있고, 추가적인 기능들을 제공한다.
소스 설정 및 프로퍼티 값 조회 기능
local, dev 등 Profile 별 소스 설정이 가능하다.
예를 들어, local는 local db를 바라보게 하고, prod는 prod의 db를 바라보도록 설정할 수 있다.
메시지에 대한 국제화(i18n)을 제공하는 인터페이스
메세지 설정 파일을 모아서 각 국가마다 로컬라이징이 가능하다.
(번역 기능 사용가능)