개발새발/Spring

[Spring] Bean과 DI, IoC

0xff 2024. 8. 24. 20:03

이 글은 나와 같은 Spring 초심자들을 위해 작성되었다.

본 글에서 서술할 내용들을 알고있다면 글을 읽지 않아도 좋다.

 

 

Spring의 문서에서는 Bean에 대해 아래와 같이 서술하고있다.

 

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container
 are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

 

Spring의 Bean은 IoC에 의해 관리되며, 인스턴스화되는 객체라고 한다.

 

IoC는 Spring에서의 아주 중요한 관리 패턴이다.

 

IoC ( Inversion of Control ) 란 직역하자면 제어의 역전을 의미하는데,

전통적으로 개발자가 직접 개체 ( instance ) 의 생명주기를 관리했던 반면

Spring에서는 이를 Spring framework에 위임하는 것이다.

 

알기 쉽게 예를 하나 들어보겠다.

 

public class ApiController {
    private final ApiService apiService;

    public ApiController(ApiService apiService) {
        this.apiService = apiService;
    }
}

일반적인 자바 어플리케이션 개발 시에는, ApiController의 생성자를 호출하며, apiService를 생성하여 넘겨줄 것이다.

하지만 Spring IoC에서는 반대다.

 

@RestController
@RequiredArgsConstructor
public class ApiController {
    private final ApiService apiService;
}

 

Spring framework는 @RestController annotation에 의해 ApiController 또한 Spring에 관리되는 Bean으로 보고,

ApiController와 그 하위 Bean들의 생명주기를 관리한다.

 

ApiController와 ApiService 등의 생성과 종료를 Spring이 알아서 관리해주는 것이다.

 

위 소스코드와 같이 Spring에 의해 의존성이 주입되는 것을 DI ( Dependancy Injection ) 이라고 한다.

 

 

이렇게 Spring의 IoC를 사용한다면 어떤 장점이 있을까.

 

가장 큰 장점은 코드간의 결합도가 낮아진다는 것이다.

 

개발자가 직접 클래스의 생성자를 주입하다 보면, 해당 클래스에서 요구하는 인자들이 변하였을 때, 해당 클래스를 사용하는

모든 곳에서 생성자를 수정해야 한다.

 

하지만 Spring IoC에서는 DI를 통해 자동으로 필요한 Bean들을 주입해줌으로서 이런 수고로움이 필요하지 않게 된다.

 

또한 모든 Bean은 기본적으로 singleton 패턴을 따른다.

 

Spring이 미리 객체를 생성해두고, 필요한 곳들에 생성된 객체들을 주입함으로서, 성능과 메모리상 이점도 챙길 수 있다.