코드스테이츠_국비교육/[Section2]

39.01_[Spring] IoC, DI_22.10.18

생각없이 해도 생각보다 좋다. 2022. 10. 18. 23:45

>IoC, Inversion of Control

제어의 역전을 의미하는 용어이다.

클래스 간 의존 관계를 형성하기 위한 방법으로는 클래스 내부에서 new 키워드로 다른 클래스의 객체를 생성하는 것이 있을 것이다.

하지만 이는 단점이 많은 방법이고 불편하다.

이를 편리하게 하며 단점을 극복하기 위해 Framework가 의존 관계를 형성하게 만드는 방법을 IoC(제어 역전)라고 한다.

>Spring IoC Container

Spring IoC Container는  Spring Framework에서 IoC 기능을 담당한다.

Container라고 불리우는 이유는 내부에 다른 객체를 만들어 놓고 이를 관리하기 때문인데, 이 객체들을 Bean이라고 하며, Spring Framework내에서는 Bean을 Spring Bean 이라고 한다.

즉, Spring IoC Container 는 Spring Bean을 관리하며 IoC 기능을 담당한다.

>DI, Dependency Injection

의존성 주입을 의미하는 용어이다.

Framework의 IoC(제어 역전) 기능을 구현하는 방법이 다양한데 그 중 하나가 DI이다.

그리고 대표적이고 가장 많이 사용되며, Spring Framework에서는 사실상 DI를 공부하는 것이 Spring IoC를 공부하는 것이라고 생각하자.

이런 DI(의존성 주입)도 다양한 방법으로 의존성 주입을 실행하는데, 가장 대표적이고 많이  쓰는 것이 생성자를 이용한 방법이다. 우선은 생성자를 이용한 주입만 알아두고 나머지는 딥 공부때 알아보자!

>Spring IoC Container의 종류

BeanFactory는 Spring IoC Container의 최상위 컨테이너인 인터페이스이다.

Bean의 LifeCycle을 관리하며, getBean과 같은 메서드가 있다.

ApplicationContext는 가장 많이 쓰는 Spring IoC Container이며, BeanFactory의 확장판이다. BeanFactory를 상속받기 때문에 BeanFactory의 기능을 모두 가지고 있고, 추가로 부가적인 기능들을 가지고 있다.

특별한 이유가 없다면 ApplicationContext Container를 쓰는 것을 추천하는 것이 공식 문서상 내용이다.

>Bean

Spring내에서의 Bean을 다룰 것이기 때문에 정확히는 Spring Bean이라는 표현이 옳다.

Spring Bean이란 Spring IoC Container 내부에서 관리되는 객체이다.

Spring Bean을 사용한다는 것은 우리가 작성한 코드를 Spring Bean으로 등록하고 이를 활용한다는 것이다.

이후 Bean은 따로 말이 없으면 모두 Spring Bean을 의미한다.

>Bean을 사용하는 이유

Bean의 장점은 대표적으로 세가지가 있다.

첫째는 DI(의존성 주입)는 Bean으로만 사용할 수 있는 방법이기 때문에, DI를 사용하기 위해 Bean을 사용해야만 한다.

따라서 Bean은 의존성 관리를 할 수 있게 해준다.

둘째는 Bean Scope을 활용할 수 있기 때문이다.

Bean Scope라는 것은 Bean을 어떤 방식으로 등록하고 어떻게 사용할 지를 정하는 방식이라고 생각하자.

이는 Bean을 등록할 때 애너테이션으로 정해주는데, 아무것도 안하면, 즉 기본값은 싱글톤 방식으로 사용한다.

싱글톤 방식은 Bean 등록 시 만들어진 Bean(객체)을 계속 공유해서 쓰는 것이다.(항상 같은 주소값)

Bean을 가져다가 쓸 때 매번 새로이 객체를 만들지 않기 때문에 효율적으로 애플리케이션을 사용할 수 있게 한다.

마지막으로는 LifeCycle Interface를 지원해주기 때문이다.

LifeCycle Interface는 Bean이 만들어질때 추가적인 작업을 해주는 기능이 있다.

>Bean등록 방법

Spring Bean으로 등록하는 방법은 XML을 이용해서 직접 등록해주는 방법과 애너테이션(@)을 이용하는 방법이 있는

데, 대부분을 후자로 사용하기 때문에 당장은 후자의 방법만 알고 있어도 무관하다.

>Bean Life Cycle

말 그대로 Bean이라는 객체의 Life Cycle을 의미한다.

Bean이 인스턴스화(생성)되는 시기와 방법, Container내에 존재하는 동안 수행하는 작업, 그리고 소멸하는  시기와 방법

을 Bean Life Cycle로 표현한다.

Bean의 Life Cycle 은 Spring IoC Container가 관리한다.