Spring

Bean, IoC 컨테이너의 기본 개념 정립하기

teo_99 2023. 4. 16. 15:10

이번에 스프링을 처음 사용해보면서 다양한 용어들을 새롭게 접하게 되었습니다.

그 중 가장 자주 들었던, 그리고 궁금했던 주제인 빈과 IoC에 대해 작성하면서 공부해보려고 합니다.


IoC(Inversion of Control)

IoC란 무엇일까?

빈이란 무엇인지 설명하기 전에, IoC의 개념부터 알아볼 필요가 있을 것 같습니다.
Spring을 사용하기 전까지 저희는 1. 객체의 생성, 2. 객체의 사용을 모두 직접 관리했습니다.

public static void main(String[] args) {
    RacingGameController racingGameController = new RacingGameController(
        new ConsoleInputView(),
        new ConsoleOutputView()
    ); // 생성
    
    racingGameController.run(); // 사용
}

위와 같이 객체의 생명주기를 직접 관리해왔는데요,
사용 책임은 남겨두고, 생성 책임을 Spring 컨테이너에게 위임하는 것을 IoC(제어의 역전)이라고 합니다.

즉, 쉽게 말해서 객체의 생성을 관리하는 주체가 Spring 프레임워크가 된다는 것입니다.

그렇다면 이런 과정이 왜 필요한걸까요?
왜 저희는 객체의 생성 책임을 Spring 프레임워크에게 넘겨주어야 할까요?

이제부터는 IoC가 왜 중요한지, 왜 필요한지 알아보는 시간을 가져보겠습니다.

객체의 생성이란

보다 원론적인 이야기를 먼저 해보겠습니다.

객체의 생성이란 무엇을 의미할까요?

엥, 그냥 new 키워드로 생성하는 거 아니야?

 

맞는 말이지만, 이것은 객체 생성의 단편적인 부분입니다.

객체지향에서 객체는 어떤 책임을 수행하기 위해 협력합니다.
워드 커닝 헴과 켄트 벡은 다음과 같이 이야기하기도 했습니다.

"어떤 객체도 섬이 아니다"


협력을 한다는 것은 의존성이 존재한다는 것을 의미합니다.
기본적으로 객체는 유틸적인 성향이 매우 강한 것이 아니라면 다른 객체와의 의존성을 가지기 마련입니다.

그리고 이런 의존성은 객체의 생성 시점에 결정될 수 있습니다.

그렇기에 객체의 생성은 의존성을 결정하는 과정으로 볼 수 있습니다.

Car car = new Car(new Engine(), new Wheel());
// Car 객체는 Engine 객체, Wheel 객체와 영구적인 의존성을 가진다


다시 돌아가보죠!

객체의 생성은 의존성을 결정하는 과정이라고 했습니다.
그렇다면 객체의 생성을 Spring 프레임워크에게 넘겨주는 것은 무엇을 의미할까요?

맞습니다. 의존성 제어 과정을 Spring 프레임워크에게 맡기는 것입니다.

IoC 컨테이너에게 생성과 의존성 관리를 맡겨라


객체의 생성 책임, 즉 의존성 관리를 개발자가 맡게 되면 신경쓸 부분이 많아집니다.
혹시 이 객체를 어디서 생성해 주입해줄까에 대한 고민을 해보신 적이 있으신가요?

Spring의 IoC 컨테이너를 활용하면 이런 고민을 할 필요가 없습니다.
IoC 컨테이너는 의존성 관리와 더불어 객체의 생명주기를 관리해줍니다.

생명주기에 관해서는 https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes 를 참고해주세요.

따라서 프로덕션 코드 개발자는 오로지 객체의 사용에만 초점을 맞출 수 있게 됩니다.

쉽게 말해 Spring IoC 컨테이너는 어려운 개념이 아닌 개발 편의를 위한 하나의 관리 도구입니다.

객체의 생성을 IoC 컨테이너에게 맡기세요.
그렇게 되면 개발자는 객체의 사용에만 집중할 수 있습니다.


Bean

Bean이란

Bean이란 무엇일까요?
앞서 IoC 컨테이너는 객체의 생명주기와 의존성을 관리한다라고 했습니다.

여기서 말하는 대상 객체가 바로 Bean을 의미합니다.
즉, Spring Bean은 Spring IoC 컨테이너에서 관리되는 객체를 의미합니다.

Spring 에서는 객체를 @Component, @Controller, @Service, @Repository 등을 통해 Bean으로 등록할 수 있습니다.

Spring Stereotype


이외에도 Bean을 생성하는 방법, Bean의 생명 주기를 지정하는 방법이 여럿 존재하는데요,
이런 부분은 방대한 내용이기도 하고, 현재 아티클의 범위를 벗어날 수 있기 때문에 여기서는 다루지는 않겠습니다.

 


마치며

IoC의 개념과 IoC 컨테이너, 그리고 Bean의 기본적인 개념을 알아보았습니다.

지적할 부분이나 궁금한 점이 있으시다면 언제든지 댓글 남겨주세요!

 


참고자료

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction

https://www.baeldung.com/spring-interview-questions#Q11