본문 바로가기

Spring

[Spring] IoC 컨테이너와 빈

컨테이너

컨테이너란 개발자가 작성한 코드의 처리과정을 위임받은 독립적인 관계로 생각하면 된다. 컨테이너는 적절한 설정만 되어있다면 누구의 도움없이도 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 관리한다.

이는 개발자가 다른 라이브러리에 의존하지 않고 직접 코드를 작성해나가는 것임으로 완성된 프로그램에 대한  이해도를 상승시키는 효과가 있다.

 

 

IoC : Inversion of Control, DI : Dependency Injection

IoC는 역제어라는 뜻으로, 제어는 개발자가 아닌 외부에서 당담한다. IoC는 즉 컨테이너이다. 

다만 스프링에서 IoC를 가장 철저하게 사용했다는 것뿐이지 스프링만의 기능은 아니다.

 

DI는 의존성 주입이라는 뜻으로, 여기서의 의존성은 임의의 클래스가 외부 클래스를 사용한다는 것을 의미한다.

BookService가 BookRepositroy 클래스를 의존하는 상황!

만약 의존성 주입 특성을 사용하지 않는 상태에서 해당 함수에 접근하면, 위의 코드는 에러가 발생할 것이다.  

하지만 의존성 주입을 사용하면 내부가 아닌 외부에서 객체를 생성되어 사용할 수 있도록 넣어주기 때문에 정상적으로 작동된다.

 

IoC의 개념을 설명하고자 할때, DI와 IoC는 동일하다고 말하기도 한다. 이를 제대로 알기 위해서는 의존성 분리를 알아야한다. 왜냐하면 의존성 주입은 의존성을 분리시켜 사용하기 때문이다.

 

의존관계 역전 원칙을 사용하여 의존관계를 분리하게 되는 데, 객체 지향 프로그래밍에서 사용되는 원칙으로, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존 관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있음을 의미한다. 이는 제어의 방향이 반전이 되었음을 의미하며, 곧 역제어인 IoC를 의미하게 되는 것이다.

 

 

Beans

IoC 방식으로 관리하는 객체로, 스프링은 Bean 객체의 생성 및 제어를 담당한다. 의존성 주입을 하기 위해서는 의존의 대상이 되는 클래스와 외존을 하는 클래스 모두 Bean으로 설정되어야 하며, 싱글톤으로 객체를 관리하고 싶을 때에도 Bean으로 등록해 두면 좋다.