1. IoC (Inversion of Control) - 제어의 역전
IoC란 객체 생성과 제어 권한을 개발자가 아닌 스프링 컨테이너가 관리하는 것.
즉, 프로그램의 제어 흐름을 프레임워크가 대신 담당하는 구조를 말한다.
•
원래는 개발자가 new 키워드를 활용하여 객체를 직접 생성한다.
•
IoC에서는 Spring 컨테이너가 대신 객체를 생성하고 관리한다.
•
필요할 때 요청만 하면 스프링이 제공해준다.
[개발자] → 요청 → [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 방식 비교
방식 | 장점 | 단점 |
생성자 주입 | 불변성 보장, 테스트 용이 | 코드가 약간 길어짐 |
필드 주입 | 코드 간결 | 테스트 어려움, 순환참조 위험 |
세터 주입 | 선택적 의존성에 사용 가능 | 필수 의존성 보장 어려움 |
6. 정리
개념 | 의미 |
IoC | 제어 권한을 스프링 컨테이너가 가짐 |
DI | 의존 객체를 외부에서 주입받음 |
"IoC는 객체 생성과 제어를 스프링 컨테이너가 담당하는 구조입니다.
DI는 그 IoC의 구현 방식으로, 객체가 필요한 의존성을 외부에서 주입받아 결합도를 낮추고 테스트를 용이하게 만듭니다."
[Spring IoC 컨테이너]
↓ 객체 생성 & 주입
[OrderService] ← 의존 → [UserRepository]
↓ ↓
비즈니스 로직 처리 데이터 처리
Java
복사