스프링을 처음 접하게 된다면 IoC 컨테이너에 대한 개념을 이해하고 학습을 진행하는 것이 중요하다고 생각합니다. 스프링의 핵심 기술중 하나로 중요도가 매우 높기 때문입니다. 또한 DI를 이해하기 위해서는 IoC 컨테이너가 선행되어야 합니다. 그래서 이번 글에 IoC 컨테이너에 대해 다루어 보겠습니다.
IoC 컨테이너
IoC 컨테이너의 다양한 기능중 가장 기본적인 기능과 역할은 코드를 대신해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리하는 것입니다. 이러한 오브젝트들을 우리는 빈이라고 부릅니다. 이러한 빈들을 컨테이너가 만들고 관리하게 하는 것이 DI를 비롯한 스프링의 주요 기술을 적용하기 위한 조건이 됩니다.
기본적으로 프레임 워크란 프로그램 흐름의 제어를 개발자가 아닌 프레임 워크에게 맡겨 주요 기능 개발에 집중할 수 있도록 도와주는 것입니다. 이러한 점이 프레임 워크와 라이브러리의 큰 차이점이라고 생각합니다. 많이 사용되는 제어의 역전 또한 여기서 비롯된 단어입니다. 그렇다면 컨테이너는 어떻게 빈들을 생성하고 관리하는 것일까요
빈을 만들기 위해 빈에 관한 메타 정보를 IoC 컨테이너에게 전달해야 합니다. 컨테이너는 이러한 메타 정보를 통해 빈을 생성하고 관리할 수 있습니다. 메타정보는 다양한 리소스로 전달될 수 있습니다. 이러한 리소스를 전용 리더를 통해 읽어 BeanDefinition 타입의 오브젝트로 변환하고 이 메타정보 오브젝트를 컨테이너가 활용하는 것입니다. 리소스는 xml파일이나 어노테이션을 통해 만들 수 있습니다.
BeanDefinition
그렇다면 빈의 핵심 메타정보를 알아보겠습니다.
이름 | 내용 | 디폴트 값 |
beanClassName | 빈 오브젝트의 클래스 이름. 빈 오브젝트는 이 클래스의 인스턴스가 된다. | 없음. (필수항목) |
scope | 빈 오브젝트의 생명주기를 결정하는 스코프를 지정한다. 크게는 싱글톤/비싱글톤 스코프로 구분할 수 있다. | 싱글톤 |
lazyInit | 빈 오브젝트의 생성을 최대한 지연할 것인지를 지정한다. 이 값이 true이면 컨테이너는 빈 오브젝트의 생성을 꼭 필요한 시점(사용 시점)까지 미룬다 | false |
dependOn | 먼저 만들어져야 하는 빈을 지정할 수 있다. 빈 오브젝트의 생성 순서가 보장돼야 하는 경우 이용한다. 하나 이상의 빈 이름을 지정할 수 있다. | 없음 |
autowireCandidate | 명시적인 설정이 없이도 미리 정해진 규칙을 가지고 자동으로 DI 후보를 결정하는 자동와이어링의 대상으로 포함시킬지의 여부 | true |
primary | 자동와이어링 작업 중에 DI 대상 후보가 여러 개가 발생하는 경우 최종 선택의 우선권을 부여할지 여부. 만약 모든 후보 빈들이 false로 설정이 되어 있다면 예외가 발생한다. | false |
abstract | 메타정보 상속에만 사용할 추상 빈으로 만들지의 여부. 추상 빈이 되면 그 자체는 오브젝트가 생성되지 않고 다른 빈의 부모 빈으로만 사용된다 | false |
initMethod | 빈이 생성되고 DI를 마친 뒤에 실행할 초기화 메소드의 이름 | 없음 |
annotationMetadata | 빈 클래스에 담긴 어노테이션과 그 애트리뷰트 값. 어노테이션을 이용하는 설정에서 활용한다. | 없음 |
이중에서 반드시 기억해야하는 항목은 클래스 이름입니다. 오브젝트를 생성하기 위해서는 클래스 정보를 반드시 알아야 하기에 빈 정의를 위해서 가장 중요합니다.
간략히 IoC 컨테이너의 역할과 역할의 중심이 되는 빈에 대해 알아보았습니다. 다음에는 빈을 컨테이너에 등록하는 방법에 대해 알아보겠습니다!
'Spring' 카테고리의 다른 글
연관관계 (단방향과 양방향) 정리 (0) | 2024.10.17 |
---|---|
싱글톤 (프로토타입과 스코프) (0) | 2024.04.18 |
어노테이션이란? (0) | 2024.04.02 |
트랜잭션 어노테이션 (@Transactional, 속성, 정책, 방법) (0) | 2024.03.28 |
Mockito 프레임워크 정리(TDD 작성, 테스트 코드 작성) (0) | 2024.03.22 |