당니의 개발자 스토리

BeanFactory와 ApplicationContext 본문

스프링/스프링 핵심 원리 - 기본편

BeanFactory와 ApplicationContext

clainy 2024. 1. 21. 21:13

BeanFactoryApplicationContext

이번 시간에는 BeanFactoryApplicationContext에 대해서 알아보겠습니다.

위의 계층구조가 보면, 최상위에 BeanFactory라는 인터페이스가 있습니다. 인터페이스끼리는 상속받는다고 표현하는데, 그래서 이 BeanFactory를 상속받은 ApplicationContext 인터페이스가 BeanFactory 밑에 있는 거에요.

따라서, ApplicationContextBeanFactory에다가 부가기능을 더한 거라고 이해할 수 있겠죠.

그리고 ApplicationContext 밑에는 우리가 사용했던 AnnotationConfigApplicationContext 같은 구현 객체(클래스)가 있습니다.


먼저 BeanFactory에 대해서 설명을 드리자면,

BeanFactory스프링 컨테이너최상위 인터페이스에요. 그리고 BeanFactory에 어떤 기능이 들어있냐면, 스프링 빈을 관리하고 조회하는 역할을 담당하는 기능이 다 들어있어요. getBean()도 다 BeanFactory에서 제공하는 기능이에요.

그래서 지금까지 사용했던 대부분의 기능은 사실 BeanFactory가 제공하는 기능이었습니다.


자 그러면 ApplicationContext는 뭐냐면,

BeanFactory기능을 모두 상속받아서 제공을 하고 있죠. BeanFactory 인터페이스의 상속을 받은거니까요.

cmd + O 누르면, 내 라이브러리 밖에 있는 것까지 다 볼 수 있거든요.

여기서 ApplicationContext를 찾아서 봐봅시다.

ApplicationContext가 있고 여러가지 상속 구조가 있는데, 쭉 가면,

위에 BeanFactory가 있죠. 이런 식으로 구성되어 있습니다.

그래서 ApplicationContext는 BeanFactory의 기능을 모두 상속받아서 제공을 합니다. 그러면, BeanFactory로 빈을 관리하고 검색하는 기능을 이미 제공을 해주는데, ApplicationContext의 차이는 뭐지?

애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 그외에 수많은 부가 기능들이 있어야 돼요. 단순하게 빈을 조회하고 관리하고, 이런 걸 떠나서 애플리케이션을 개발할 때는 되게 공통적으로 사용되는 많은 부가 기능들이 있어요.

자 그러면 어떤 부가 기능들을 제공해주냐,

인터페이스 분리 원칙 기억나시죠? 인터페이스가 굉장히 많이 분리되어 있어요.

ApplicationContextBeanFactory도 받고 있지만, 이 외에도 MessageSource, EnvironmentCapable, ApplicationEventPublisher, 그리고 ResourceLoader라는 이런 여러가지 인터페이스들도 받고 있어요.

ApplicationContext를 다시 열어보면,

ApplicationContextBeanFactory와 관련된 것 뿐만 아니라, 환경설정과 관련된 것, 그리고 메세지 소스, 이벤트 퍼블리셔, 리소스 패턴 리조버 등등 몇가지를 더 갖고 있습니다.

이것들이 뭔지 하나씩 설명을 해드리겠습니다.

메시지 소스를 활용한 국제화 기능은 위에 보이는 메시지 소스인데요. 뭐냐면, 예를 들어서 한국에 들어오면 한국어로 보이고, 영어권에서 들어오면, 영어권으로 출력하는 웹사이트들이 있죠. 이런 걸 국제화 기능이라고 하는데, 이런 거를 파일로 여러개 분리해놓은거에요.

message_KO로 하면, 코드값에 따라서 한글 파일을 쭉 놔두고, message_EN 하면 영어로 쫙 적어놓고, 이런 메세지 소스를 가지고 오면, 내가 있는 곳이 한국어권이면 한국어 메세지가 나오고, 영어권이면 영어 메세지가 나오는 부가 기능을 제공을 해줍니다.

그리고 환경변수에 대해서 설명해드리겠습니다.

실제 운영을 개발하시는 분들은 잘 아실텐데, 개발할 때 크게 세 가지 환경이 있어요.

처음에 내 PC에서 개발하는 환경, 즉 로컬 개발 환경. 그 다음에 테스트 서버에 올려서 여러 시스템을 엮어가지고 실제 테스트 서버에 띄워두고 테스트할 수 있는 테스트 서버, 보통 개발 환경이라고 얘기합니다.

그리고 마지막으로는 실제 프로덕션에 나가는 운영 환경. 이렇게 크게 세 가지가 있어요.

여기서 한가지 정도 더 있는데, 스테이징 환경이라고 운영과 가장 비슷한 밀접한 환경을 만들기도 합니다. 이렇게 해서 각 환경별로 어떤 데이터베이스에 연결해야 될지, 예를 들어서 개발이면 개발 데이터베이스에 연결해야 되고, 운영이면 운영 데이터베이스에 연결해야 되겠죠. 이렇게 환경변수와 관련된 정보를 처리해주는 기능도 제공을 합니다.

메세지 소스환경변수는 되게 공통된 중요한 기능들이죠.

그 다음에 애플리케이션 이벤트는 뭐냐면, 애플리케이션 내에 어떤 이벤트를 발행하고 구독하는 모델을 편리하게 지원해주는 기능이 있습니다.

그리고 리소스 로더라는 건 편리한 리소스 조회를 가능하게 하는데, 파일이나 클래스 path외부 url 같은 데서 파일 같은 걸 읽어드려서 내부에서 쓸 때 리소스를 추상화해서 편리하게 쓸 수 있는 기능을 제공해줍니다.

이런 부가 기능들은 보통 일반적인 애플리케이션 만들 때 필요한 공통 기능들이거든요.

따라서, ApplicationContextBeanFactory에다가 추가로 이러한 부가 기능을 제공해줍니다.


그래서 정리를 해보면,

ApplicationContext는 BeanFactory의 기능을 상속받습니다.

그리고 ApplicationContext는 BeanFactory의 기능을 상속받았기 때문에, 빈 관리기능과 편리한 부가 기능 등을 제공합니다.

그리고 BeanFactory를 직접 사용할 일은 거의 없어요. 부가 기능이 포함된 ApplicationContext만 거의 사용한다고 보시면 됩니다.

그래서 BeanFactory나 ApplicationContext 모두 다 스프링 컨테이너라고 하고, 우리는 ApplicationContext만 쓴다고 생각하시면 됩니다.

그리고 이러한 부가 기능들은 나중에 따로 모아서 한번 강의를 하도록 하겠습니다. 이 강의에서는 스프링의 핵심 기능과 핵심 원리와 핵심 기능들에만 포커싱을 할게요.


다음 시간에는 xml설정하는 거에 대해서 간단하게 알아보겠습니다.