웹/Spring

[Spring Boot] 스프링 빈(Spring Bean)과 IoC(제어의 역전) 개념 정리

개발하는소유밍 2024. 1. 16. 02:10

IoC 컨테이너란?

제어의 역전(IOC, Inversion Of Control)의 약어

객체의 생성 및 생명주기에 대한 모든 객체에 대한 제어권이 바뀌었다는 것을 의미

 

컨테이너에 IoC를 사용하는 이유

IoC에서는 객체를 직접 생성 및 호출하는 방식이 아닌, 외부에서 객체를 생성 혹은 호출
이를 통해 개발자는 로직에 집중하고, IoC에서는 인스턴스를 관리해주기 때문에
객체끼리의 결합도를 낮추고 유지 보수성 및 재사용성을 높일 수 있음

 

1. DI(Dependency Injection, 의존성 주입)

개발자가 객체를 new 로 생성하지 않고, IoC컨테이너에 존재하는 Bean 객체를 주입하면 싱글톤, 편의, 성능 이슈 등 개선

 일반 자바 객체로 DI를 직접 구현할 수도 있지만, Spring 에서 제공하는 IoC 컨테이너의 DI를 이용하면 편리하고 효율적

 

2. 객체의 Scope

자바 객체를 IoC 컨테이너의 빈으로 만들면 객체의 Scope를 관리하기 용이함

기본적으로 싱글톤 Scope로 등록되는데,

따라서 전반적으로 어플리케이션 하나의 인스턴스만 사용해도되는 객체에 아주 편리하게 사용 가능

 

3. 라이프 사이클 인터페이스 지원

특히 라이프 사이클 인터페이스는 Spring IoC 컨테이너에 등록된 빈들에만 국한되어 일반 자바 객체는 사용할 수 없음

라이프 사이클 인터페이스를 이용해 어떤 빈이 만들어질때 빈에 추가적인 작업을 할 수 있는데,

예를 들어 클래스들이 모두 구현되지 않은 상태에서는 의존 객체를 사용하는 클래스의 단위 테스트를 만들기가 어려운데

라이프 사이클 인터페이스를 사용하면 그런 상황에서도 테스트를 수행할 수 있음


스프링 빈(Spring Bean) 이란?

Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean) 이라고 하며, //자바 객체 ⊃ Bean : 자바객체가 더 큰 개념

이 Bean들을 관리하는 컨테이너를 Bean Factory라고 하는데, 이는 위에서 설명한 IoC 컨테이너의 구현체 중 하나임

또, 이 Bean Factory에 추가적인 기능들을 붙여 만든 것이 Application Context

보통은 Bean Factory보다 Application Context를 많이 사용함

 

이 컨테이너가 Bean으로 등록 된 객체를 관리하는데, 어떻게 자바 객체를 찾을까?

▷ Component Scan을 통해서 등록된 빈을 찾는다.

 @Controller, @Service, @Repository, @Component와 같은 어노테이션을 의미

 어노테이션이 붙으면 Bean으로 등록

 

 자바 설정 파일을 이용한 등록된 빈을 찾는다.

 @Configuration 클래스 선언부에 추가 + @Bean 어노테이션이 붙은 반환하는 메서드를 Bean으로 인식하고 찾음

 

XML 설정 파일을 이용한 등록된 빈을 찾는다.

 가장 전통적인 방식이고, XML 파일에 빈을 등록하는 방식이지만, 최근에는 거의 사용하지 않습니다

 

이렇게 등록된 Bean들을 스프링 컨테이너가 찾아서 관리^0^!

300x250