Study/Spring

[Spring] Spring IoC Container 그리고 Bean

개발개발개발 2021. 8. 29. 16:44

Spring IoC Container

이번에는 스프링의 특징이자 핵심인 Inversion of Control(IoC) 에 대해 공부하였다.  IoC는 객체의 생성 / 삭제 / 관리 등 주기에 대해 관리를 한다. 내부적으로 조작할 객체를 외부로부터 주입받도록 하며 이때 외부로부터 주입받는 작업을 DI(dependency injection) 라고 한다. 

개발자 대신 위 작업을 대신해주는 등 프로그램의 제어 흐름 구조가 뒤바뀐다고 하여 붙여진 이름이다. 그리고 이때 IoC에 관리되는 객체를 Bean 이라고 부른다. Bean은 IoC에 의해 인스턴스화, 조립 및 관리 된다. 컨테이너는 메타데이터를 읽어 인스턴스화, 구성 및 조립할 객체에 대한 정보를 가져오게 된다. 

 

Spring IoC container

Application 클래스는 메타데이터와 결합되어 ApplicationContext를 만들고 초기화한다. 그 후 완전히 구성되고 실행 가능한 시스템을 갖게 된다. 

 

ApplicationContext

ApllicationContext 인터페이스는 IoC 컨테이너를 나타내며 앞서 말한 빈의 관리를 담당한다. 또한 BeanFactory 상속받고 있어 Bean Factory의 모든 기능을 지원할 수 있다. 

XML, Java 주석 또는 코드를 메타데이터 형식으로 사용할 수 있다. 

 

Bean 등록 방법 

XML 설정

<beans>를 root element로 사용해야 한다. 네임스페이스와 태그를 가진 설정을 한다. 

자동인식을 통한 빈 등록

빈으로 사용될 클래스에 특별한 어노테이션을 부여하면 이런 클래스를 자동으로 찾아 빈으로 등록하게 할 수 있다.   바로 @Component 어노테이션을 등록하는 것이다. 특정 어노테이션이 붙은 클래스를 자동으로 찾아 빈으로 등록해주는 방식을 자동인식 빈 등록 기능이라 하며 '빈 스캐너'가 이 작업을 담당하고 있다. 

개발자가 직접 컨트롤이 가능한 클래스에 선언한다.(@Bean 과의 차이점) 

자바 코드에 의한 빈 등록

자바 코드에 의한 빈 등록을 할 수 있다. 이 방법은 하나의 클래스 안에서 여러 개의 빈을 정의할 수 있다. @Configuration 어노테이션을 등록하는 것이다. 

 

 

Bean의 속성

1. Scope

스프링은 기본적으로 모든 bean을 싱글톤으로 생성하여 관리한다. (bean은 '한 번' 생성) 그 외에 아래와 같은 설정이 존재한다. 

"prototype" : 빈 사용할 때 마다 새로운 객체 생성

"request : http 요청마다 새로운 객체 생성

"session" : 세션마다 새로운 객체 생성

2. init-method 

스프링 컨테이너는 빈을 생성할 때 디폴트 생성자를 호출한다. 그렇기때문에 객체 생성 후 멤버 변수의 초기화 작업이 필요하다면 bean element의 init-method 를 사용하여 초기화 할 수 있다.

 

3. destory-method

init-method 는 Bean을 생성할 때 사용하며, 빈이 삭제될 때는 destory-method를 이용할 수 있다. 

4. lazy-init 

ApplicationContext는 기본적으로 PreLoading 방식을 사용한다 

하지만 참조가 잘 되지 않으며 많은 메모리를 차지하여 시스템에 부하를 주는 객체가 있을 수 있다. 이럴 때는 객체 생성 시점을 정하는 lazy-init 속성을 사용하여 Lazy-Loading화 할 수 있다. 

PreLoading : 컨테이너 구동시점에 객체들이 생성

 

의존 관계를 주입하는 방법

@Autowired

-> XML의 타입에 의한 자동와이어링 방식을 생성자, 일반, 수정자, 필드 메소드의 네 가지로 확장한 것

- 생성자 주입

단 하나의 생성자에만 사용할 수 있다. 

생성자 호출 시 딱 1번만 호출 된다. 

- 일반 메소드 

생성자 주입과 달리 오브젝트 생성 후 차례로 호출이 가능하여 여러 개 생성이 가능

수정자 메소드 주입과 생성자 주입의 장점을 모두 갖추었다. 

@Resource

필드 주입, 수정자 주입

 

@Inject

필드 주입, 수정자 주입, 생성자 주입, 일반 메소드에 적용

@Autowired와 매우 유사하지만 required 엘리먼트에 해당하는 선택 기능이 없다. 

 

 

출처 : https://gunju-ko.github.io/toby-spring/2019/03/25/IoC-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-DI.html

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/beans.html

'Study > Spring' 카테고리의 다른 글

[Spring] Handler Method(ResponseEntity)  (0) 2021.09.12
[Spring] @ModelAttribute  (0) 2021.09.08
[Spring] Dispatcher Servlet  (0) 2021.08.24
[Spring] @RequestMapping  (0) 2021.08.19
[Spring] Request Mapping - httpMethod  (0) 2021.08.15