Notice
Recent Posts
Recent Comments
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

DI/IoC (면접 대비) 본문

숙련 Spring/스탠다드반 Spring

DI/IoC (면접 대비)

dev.hyuck 2026. 1. 17. 15:03

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