🌱 스프링 삼각형
이전 포스팅 중 '스프링 개요'에서 스프링을 구성하는 핵심 요소에 대하여 알아봤었다.
오늘은 그중에서 IoC에 대하여 조금 더 상세하게 포스팅하려고 한다.
🌱 IoC (Inversion of Control)
IoC(Inversion of Control, 제어의 역전)란,
Bean의 생성과 의존 관계 설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 스프링 컨테이너가 담당한 관리하는 것을 뜻한다.
즉, 객체를 제어하고 관리하는 역할이 개발자로부터 스프링 컨테이너로 역전된다는 뜻이다.
무엇인가 주최가 바뀐다는 것 같긴하나 Bean과 스프링 컨테이너는 무엇인지, 또한 왜 IoC를 사용해야하는지 아직 감이 잡하지 않을 것이다.
차근차근 알아가 보도록 하자.
🌱 Bean과 스프링 컨테이너의 관계
Bean이란, 스프링 컨테이너가 관리하는 자바 객체를 뜻한다.
우리가 흔히 new 연산자를 통해 생성한 객체가 아닌 스프링 컨테이너에 의하여 관리되는 객체를 의미한다.
스프링 컨테이너란, 스프링에서 빈(Bean)을 관리하는 공간을 뜻한다.
스프링 컨테이너는 IoC 컨테이너 혹은 DI 컨테이너라고도 불리는데, 이는 스프링 컨테이너가 IoC 혹은 DI를 도맡아 진행하기 때문이다.
즉, 스프링 컨테이너는 스프링 Bean들을 생성하고, 이들의 의존 관계를 연결해주는 역할을 한다.
🌱 스프링 컨테이너
스프링 컨테이너는 크게 두 종류로 나눌 수 있다.
하나는 BeanFactory이고, 다른 하나는 ApplicationContext 이다.
ApplicationContext 컨테이너가 BeanFactory의 기능을 포괄하면서 추가적인 기능을 제공하기 때문에 대부분의 경우에는 ApplicationContext를 사용한다.
BeanFactory와 ApplicationContext 관계를 살펴보면 아래와 같다.
- BeanFactory
- 스프링 컨테이너의 최상위 인터페이스이다.
- 스프링 빈을 관리하고 조회하는 역할을 담당한다. - ApplicationContext
- BeanFactory 기능을 모두 상속받아서 제공한다.
- 다음과 같은 부가기능들을 제공한다.
1. 메시지 소스를 활용한 국제화 기능
2. 환경변수 - 로컬, 개발, 운영 등을 구분해서 처리
3. 애플리케이션 이벤트 관리
4. 편리한 리소스 조회
🌱 Bean 객체를 스프링 컨테이너에 등록하기
이제 스프링 컨테이너에 Bean 객체를 등록하는 방법을 알아보자.
등록 방법에는 크게 두 가지가 있다.
1. Component Scan
Component Scan은 @Component 어노테이션을 명시하여 Bean에 추가하는 방법이다.
우리가 자주 사용하는 어노테이션인 @Conteroller, @Service, @Repository 등도 내부적으로는 @Component를 가지고 있다.
결론적으로 @Component를 사용하면 쉽게 스프링 Bean으로 등록할 수 있다.
2. 직접 등록
두 번째 방법은 자바 코드로 직접 등록하는 방법이다.
@Configuration 어노테이션과, @Bean 어노테이션을 사용하면 스프링 Bean으로 등록할 수 있다.
각 각의 특징을 정리해보자면 다음과 같다.
- @Component
- 자동으로 스프링 컨테이너에 빈을 등록하는 방법이다.
- 스프링의 컴포넌트 스캔 기능이 @Component 어노테이션이 있는 클래스를 자동으로 찾아서 빈으로 등록한다.
- @Component 하위 어노테이션으로 @Controller, @Service, @Repository 등이 있다. - @Configuration + @Bean
- 수동으로 스프링 컨테이너에 빈을 등록하는 방법이다.
- 개발자가 직접 제어가 불가능한 라이브러리를 빈으로 등록할 때 불가피하게 사용된다.
- 유지보수성을 높이기 위해 애플리케이션 전범위적으로 사용되는 클래스나 다형성을 활용하여 여러 구현체를 빈으로 등록 할 때 사용한다.
- 1개 이상의 @Bean을 제공하는 클래스의 경우, 반드시 @Configuration을 명시해 주어야 싱글톤이 보장된다.
🌱 IoC 사용 이점
Bean들을 관리해주 것이 스프링 컨테이너라는 것을 알았다.
그렇다면 이러한 스프링 컨테이너에게 제어권을 넘기게 됨으로써 얻는 이점은 무엇일까?
- 의존성 관리를 IoC 컨테이너가 하므로 비즈니스 로직에만 신경을 쓰면 된다.
- 객체의 생성과 소멸 등 생명주기를 관리해주므로 메모리를 효율적으로 사용할 수 있다.
- 라이프사이클 인터페이스를 이용하여 원하는 작업을 할 수 있다.
References.
1. 하세가와 유이치(한빛미디어), 스프링4 입문
2. 김영한(인프런), 스프링 핵심 원리 - 기본편
3. ChanBLOG - [Spring] Spring의 IoC(Inversion of Control)과 Bean
4. 뱀귤 블로그 - [Spring] IoC, DI
'Spring' 카테고리의 다른 글
[Security] JWT 소개 (0) | 2023.02.12 |
---|---|
[Spring] 스프링 AOP (0) | 2023.02.07 |
[Spring] 스프링 DI (2) | 2023.02.02 |
[Spring] 스프링 MVC (0) | 2023.01.29 |
[Spring] 스프링 개요 (0) | 2023.01.27 |