[java]Spring DI, IoC 간략 정리
DI(Dependency Injection)
- DI는 객체(빈)들 간의 의존관계를 외부에서 결정하고 주입하는 것이다.
- 쉽게 생각하면 DI는 개발자가 직접 객체를 new 로 생성하는 것이 아니라 컨테이너가 이를 생성시켜 주는 것
- 기존에는 개발자가 직접 객체의 생성과 소멸을 제어했는데 DI로 인해 객체의 생성과 소멸 등 클래스간 의존관계를 스프링 컨테이너가 제어해줌.
- 코드에서 직접적인 연관관계가 발생하지 않아, 각 클래스의 변경들이 자유로워짐.(느슨한 결합)
- 각 클래스들간의 연관 관계를 클래스 자체 내에서 맺어주지 않고 스프링 자체에서 설정을 통해 맺어줌으로 결합도를 낮춤
- 클래스들 간 의존 관계를 최소화 할 수 있다.
- 스프링에서는 의존하는 객체를 컨테이너 실행 시 객체를 주입하기 때문에 DI라고 부릅니다
- 스프링에서 의존 객체를 주입하는 방법은 두가지
- setter를 이용한 방법
- 생성자를 이용한 방법
IoC(Inversion of Control)
- IoC란 Inversion of Control의 줄임말이며, 제어의 역전이라고 한다.
- 스프링 애플리케이션에서는 오브젝트(빈)의 생성과 의존 관계 설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 스프링 컨테이너가 담당한다.
- 스프링 애플리케이션에서는 객체(빈)의 생성과 관계설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 스프링 컨테이너가 담당하는데, 이를 IoC 컨테이너라고 한다.
- 스프링 애플리케이션의 객체(빈)을 IoC 컨테이터가 관리해줌으로써 개발자의 부담이 줄고 비즈니스 로직에 더욱 집중할 수 있다는 장점
- 이를 스프링 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC라고 부른다.
- 따라서, 스프링 컨테이너를 IoC 컨테이너라고도 부른다.
ETC
- DI와 IoC의 차이는?
- DI는 의존관계를 어떻게 가질 것인가에 대한 문제고, IoC는 누가 소프트웨어의 제어권을 갖고 있느냐의 문제다. IoC 컨테이너가 빈을 생성할 때 빈들간의 의존관계를 DI를 통해 해결한다.
- DI는 IoC 사용을 필수로 요구하지 않는다는 점을 주의해야 한다.