Backend
home

Spring 개념: DI (의존성 주입) & IoC (제어의 역전)

생성 일시
2025/05/04 16:20
태그
SpringBoot
게시일
2025/05/22
최종 편집 일시
2025/05/21 15:14

1. IoC (Inversion of Control) - 제어의 역전

정의
IoC란 객체 생성과 제어 권한을 개발자가 아닌 스프링 컨테이너가 관리하는 것.
즉, 프로그램의 제어 흐름을 프레임워크가 대신 담당하는 구조를 말한다.
쉽게 말해
원래는 개발자가 new 키워드를 활용하여 객체를 직접 생성한다.
IoC에서는 Spring 컨테이너가 대신 객체를 생성하고 관리한다.
필요할 때 요청만 하면 스프링이 제공해준다.
IoC 구조
[개발자] → 요청 → [Spring IoC 컨테이너] → 필요한 객체 제공
Java
복사
IoC는 객체 생성과 제어의 주도권을 개발자가 아닌 스프링 컨테이너가 갖는 구조이다.

2. DI (Dependency Injection) - 의존성 주입

정의
DI는 객체가 필요한 의존 객체를 스스로 생성하지 않고 외부에서 주입받는 방식이다.
쉽게 말해
객체 A가 객체 B를 필요로 할 때 → A가 B를 직접 생성하지 않고, 외부(Spring)가 대신 넣어준다.
이를 통해 유지보수, 테스트가 쉬워진다.

 DI 없는 전통 방식 (new로 직접 생성)

public class OrderService { private final UserRepository userRepository = new UserRepository(); // 직접 생성 public void order() { // 로직 수행 } }
Java
복사
문제점:
UserRepository 구현이 바뀌면 OrderService도 수정해야 함 (강한 결합)
테스트가 어려움 (Mock 객체 주입이 힘듦)

Spring DI 방식 (의존성 주입)

@Component public class OrderService { private final UserRepository userRepository; // 생성자 주입 (Spring이 UserRepository를 자동으로 주입해줌) @Autowired public OrderService(UserRepository userRepository) { this.userRepository = userRepository; } public void order() { // 로직 수행 } }
Java
복사
장점:
UserRepository 구현체를 외부에서 주입받음 → 유연하고 테스트 용이
OrderService는 구현 세부사항을 몰라도 됨 (느슨한 결합)

DI 구조 그림

[Spring 컨테이너] ↓ 주입 [OrderService] ← 의존 → [UserRepository]
Java
복사
Spring의존성(Dependency)을 주입(Injection) 해주는 구조.

3. IoC와 DI의 관계

개념
역할
IoC
객체 제어권을 스프링이 가짐 (큰 개념)
DI
의존 객체를 외부에서 주입 (IoC 구현 방식)
쉽게 말해:
IoC는 "누가 객체를 관리하나?" → Spring이 한다!
DI는 "어떻게 의존성을 넣나?" → Spring이 외부에서 주입한다!

4. 면접에서 자주 묻는 포인트

IoC란?
객체의 생성과 제어권을 스프링 컨테이너가 담당하는 구조이다.
DI란?
객체가 필요한 의존성을 외부(Spring)로 부터 주입받는 방식이다.
DI 방식 종류?
생성자 주입, 필드 주입, 세터 주입이 있다.
실무에서는 생성자 주입 권장.

5. DI 방식 비교

방식
장점
단점
생성자 주입
불변성 보장, 테스트 용이
코드가 약간 길어짐
필드 주입
코드 간결
테스트 어려움, 순환참조 위험
세터 주입
선택적 의존성에 사용 가능
필수 의존성 보장 어려움
면접용 꿀팁: "Spring에서는 생성자 주입을 권장합니다. 불변성을 보장하고 테스트가 용이하기 때문입니다."

6. 정리

개념
의미
IoC
제어 권한을 스프링 컨테이너가 가짐
DI
의존 객체를 외부에서 주입받음
면접 답변 꿀팁
"IoC는 객체 생성과 제어를 스프링 컨테이너가 담당하는 구조입니다.
DI는 그 IoC의 구현 방식으로, 객체가 필요한 의존성을 외부에서 주입받아 결합도를 낮추고 테스트를 용이하게 만듭니다."
[Spring IoC 컨테이너] ↓ 객체 생성 & 주입 [OrderService] ← 의존 → [UserRepository] ↓ ↓ 비즈니스 로직 처리 데이터 처리
Java
복사