IoC(Inversion of Control) : 제어의 역전
메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정 되는 것 을 의미합니다.
객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성하게 하여 가독성 및 코드의 중복, 유지보수를 편하게 할 수 있게 합니다.
일반적으로 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 객체가 생성되고 실행됩니다.
1. 객체 생성
2. 의존성 객체 생성 (클래스 내부에서 생성)
3. 의존성 객체 메소드 호출
하지만, 스프링에서는 다음과 같은 순서로 객체가 만들어지고 실행 됩니다.
1. 객체 생성
2. 의존성 객체 주입 (스스로가 만드는 것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.)
3. 의존성 객체 메소드 호출
예를 들어 서블릿을 개발해서 서버에 배포할 수는 있지만, 배포하고 나서는 개발자가 직접 제어할 수 있는 방법은 없습니다.
대신 서블릿에 대한 제어 권한을 가진 컨테
이너가 적절한 시점에 서블릿 클래스의 객체를 만들고 그 안의 메소드를 호출합니다.
이 방식은 대부분의 프레임워크에서 사용하는 방법으로, 개발자는 필요한 부분을 개발해서 끼워넣기의 형태로 개발하고 실행하게 됩니다.
프레임워크가 이러한 구조를 가지기 때문에, 개발자는 프레임워크에 필요한 부품을 개발하고, 조립하는 방식의 개발을 하게 됩니다.
이렇게 조립된 코드의 최종 호출은 개발자에 의해서 제어되는 것이 아니라, 프레임워크의 내부에서 결정된 대로 이루어지게 되는데, 이러한 현상을 제어의 역전 이라고 표현합니다.
대부분의 프레임워크에서 IoC를 적용합니다. 그렇기 때문에 스프링을 IoC 컨테이너라고만 해서는 스프링을 정확하게 정의 할 순 없습니다.
스프링과 다른 프레임워크의 차별점은 의존관계 주입 이라는 새로운 용어를 사용할 때 분명하게 들어납니다.
DI (Dependency Injection) : 의존성 주입
제어의 역전이 일어날 때 스프링이 내부에 있는 객체들간의 관계를 관리할 때 사용하는 기법 입니다.
자바에서는 일반적으로 인터페이스를 이용해서 의존적인 객체의 관계를 최대한 유연하게 처리할 수 있도록 합니다.
의존성 주입은 말 그대로 의존적인 객체를 직접 생성하거나 제어하는 것이 아니라, 특정 객체에 필요한 객체를 외부에서 결정해서 연결 시키는 것 을 의미합니다.

첫번째 방법은 A객체가 B와 C 객체를 New 생성자를 통해서 직접 생성하는 방법이고, 두번째 방법은 외부에서 생성된 객체를 setter()를 통해 사용하는 방법입니다.
두 가지 방법중 DI 의 예시로 적절한 방법은 어떤 방법일까요?
정답은 두번째 방법입니다.
두번째 방식은 A객체에서 B,C 객체를 사용(의존)할 때 A객체에서 직접 생성하는 것이 아니라 외부(IoC 컨테이너) 에서 생성된 B,C 객체를 조립(주입) 시켜 setter 혹은 생성자를 사용하는 방식입니다.

🌱 참고 :
스프링에서는 객체를 Bean 이라고 부르며, 프로젝트가 실행될 때 사용자가 Bean으로 관리하는 객체들의 생성과소멸에 관련된 작업을 자동적으로 수행해주는데 객체가 생성되는 곳을 스프링에서는 Bean 컨테이너라고 부릅니다.
즉, 우리는 클래스의 기능을 추상적으로 묶어둔 인터페이스를 가져가다 사용하면 됩니다.
나머지는 스프링에서 객체를 주입해주기 때문입니다.
따라서 이러한 의존성 주입으로 인해 모듈 간의 결합도가 낮아지고 유연성이 높아집니다
출처 🙇🏻
https://velog.io/@gillog/Spring-DIDependency-Injection
https://leveloper.tistory.com/33
'Dev > Spring & Spring Boot' 카테고리의 다른 글
| Servlet & Servlet Container (0) | 2022.11.13 |
|---|---|
| [Spring Boot] @SpringBootApplication 역할 및 내부 구현 (0) | 2022.10.23 |