Spring & Java
DI/IoC (면접 대비) 본문
DI/IoC가 뭔줄 알아?
Spring DI/IoC : 의존성 주입, 객체를 주입 한다.
= 스프링이 주입을 한다! 라고 이해하고 있음.
DI와 IoC를 설명해야 되는 순간이라면 느슨한 결합과 인터페이스라는 개념이라고 보면 된다.
느스한 결합은 뭐냐? 스프링이 가장 핵심적으로 중요시 여기는 아키텍처 원칙 중 하나 이 " 느슨한 결합 "을 왜 써야 될까?
객체들은 서로 너무 강하게 결합 되어있기 때문에 테스트도 힘들고 변경도 어렵기 때문이다.
예를들어 A객체가 B객체를 내부적으로 계속 생성하고 B 객체가 C 객체를 생성하고 이런 구조를 가지게 된다. 반대로, 느슨한 결합은 인터페이스를 통해서 이 친구들을 서로 참조하게 된다.
예시로 몇가지 보여주면
강하게 결합 된 예시로 보여주면 이렇다.
public class A {
B D;
public A() {
B = new B();
}
public class B {
C B;
public B() {
C = new c();
}
}
스프링 세상 속에서는 어떻게 느스한 결합을 하는지 알아 볼 필요가 있다.


서비스 코드가 A1,B1을 바라보고 있는데, B2를 바라보게 되는 것을 우리는 학습 해야 된다.
B1 b = B1() b.getData() --> B2 b = B2() b.getData()
B1에서 B2로 변경 되었는데 강하게 결합 되어 있다는 사실 자체가 코드 변경이 일어나는 그런 순간들이 발생하면 안되기 때문에, 위 사진 처럼 코드 결합이 강하다고 표현하게 되는 겁니다.

그래서 서비스코드는 인터페이스를 바라보게 만들고 인터페이스에서 A1이든 B1,B2든 갈아 끼우는 행위를 인터페이스가 하는 역할이라고 생각하면 된다.
객체 생성과 조립을 위한 외부설정 XML Annotaion 을 사용해서 객체 주입의 그림만 그려 놓으면 알아서 주입을 자동으로 잘 시켜준다의 개념으로 이해하게 됐다.
느슨한 결합과 인터페이스의 기본 개념이라고 보면 되는데 해당 이론을 조금 더 숙달 해야 될 것 같다.
● Ioc ( Inversion of Control ) : 제어의 역전, 객체의 생성 및 제어를 개발자가 아닌 스프링 컨테이너가 담당하는 구조.
● 기존 방식 vs IoC 방식
기존 : 개발자가 객체 생성 및 연결
Ioc : 컨테이너가 객체 생성 및 연결
비유 : 내가 일일이 부품을 사서 조립하던 것을 > 조립된 완제품을 공급 받는 방식

A를 만들면 B를 만들고 B를 만들면 C를 만들고 D를 만들면 D를 만들고 그 과정에서 C가 고장나면 다 고장나는 전통식 개발입니다. 하지만 우리는 IoC Container를 사용해 제어의 역전이 일어났다고 보면 됩니다. D 과정을 먼저 만들고 C과정을 만들고 B 과정을 만들고 A과정을 만들어 한 방향만 바라보게 만드는것이 아닌, 모든 방향에 인터페이스를 연결해서 하나의 마치 설국 열차를 만든다고 보면 굉장히 편해지는 겁니다.
DI ( Dpendency Injection ) 란 ?
정의 : 객체 간의 의존 관계를 외부에서 주입해주는 방식
< 종류 >
생성자 주입 ★ ★ ★ ★ ★
세터 주입
필드 주입
< 장점 >
코드 간 결합도 감소
테스트 용이성 향상
유지보수 용이
Spring에서의 DI 구현
생성자 주입 ( Constructor Injection ) ★ ★ ★ ★ ★ 가장 많이 쓴다 생각하면 됩니다.
장점 :
● 객체 생성 시점에 의존성 주입이 보장되어, 불변 객체 구성에 유리함
● 테스트 코드 작성 시 명시적인 생성자를 의존성 주입이 가능함
● 필수 의존성을 강제할수 있어서 컴파일 타임 오류를 방지함
● 스프링 프레임워크 팀과 대부분의 커뮤니티에서 가장 권장하는 방식
단점 :
● 의존성이 많아질 경우 생성자 파라미터가 길어짐
● 순환 참조 발생 시 복잡 도 증가
TIL :
https://velog.io/@ydh6226/Spring-%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84