스프링 Spring
4. Spring의 IoC (Inversion of Control)와 DI (Dependency Injection) 개념
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. IoC(Inversion of Control)란?
IoC(Inversion of Control, 제어의 역전)는 객체의 생성과 실행 흐름을 개발자가 아닌 프레임워크(Spring)가 관리하는 개념입니다.
기존의 Java 애플리케이션에서는 객체를 개발자가 직접 생성하고 관리했지만,
Spring에서는 객체의 생명주기를 프레임워크가 대신 관리합니다.
📌 IoC가 필요한 이유
✔ 객체 간의 결합도를 낮출 수 있음 → 코드 변경 시 영향 최소화
✔ 객체의 생성, 주입, 소멸을 자동으로 관리 → 개발자가 직접 객체를 생성할 필요 없음
✔ 테스트 용이 → 객체의 의존성을 쉽게 교체 가능
📌 IoC는 "Spring이 객체의 생성과 관리를 대신 담당하는 개념"임.
2. DI(Dependency Injection)란?
DI(Dependency Injection, 의존성 주입)는 객체가 필요로 하는 의존성을 직접 생성하지 않고, 외부에서 주입받는 방식입니다.
IoC 컨테이너가 객체의 생성과 의존성 주입을 관리하며, 개발자는 직접 객체를 생성할 필요가 없습니다.
📌 DI의 종류
✔ 생성자 주입(Constructor Injection) → 생성자를 통해 객체를 주입
✔ 필드 주입(Field Injection) → @Autowired를 사용하여 필드에 직접 주입
✔ Setter 주입(Setter Injection) → Setter 메서드를 사용하여 객체를 주입
📌 DI는 "객체가 필요한 의존성을 직접 생성하는 것이 아니라, 외부에서 주입받는 방식"임.
3. IoC와 DI의 관계
IoC는 제어의 흐름을 프레임워크(Spring)가 관리하는 개념이고,
DI는 IoC를 실현하는 방법 중 하나입니다.
📌 IoC와 DI의 관계 정리
✔ IoC → "Spring이 객체의 생명주기를 관리"하는 개념
✔ DI → "Spring이 객체의 의존성을 주입"하는 기법
📌 IoC와 DI를 함께 사용하면 객체 간의 결합도를 줄이고 유지보수를 쉽게 할 수 있음.
✅ 여기까지 Spring의 IoC와 DI 개념을 배웠습니다!
👉 "그렇다면, Spring Boot에서 IoC와 DI는 어떻게 동작할까요?"
✅ 2부에서 Spring Boot의 IoC 컨테이너와 Bean 관리 방식에 대해 배워봅시다!
2. 상세 주제 정리
1. Spring IoC 컨테이너 – Bean 관리 방식
Spring은 IoC 컨테이너(ApplicationContext)를 통해 Bean을 생성하고 관리합니다.
Bean이란 Spring이 관리하는 객체를 의미하며, 모든 Spring 애플리케이션의 기본 단위입니다.
📌 Spring에서 Bean 등록 방식
✔ @Component 사용 → 기본적인 Bean 등록 방식
✔ @Service, @Repository, @Controller 사용 → 역할에 따른 자동 등록
✔ @Bean 사용 → 개발자가 직접 Bean을 등록할 때 사용
📌 Spring IoC 컨테이너는 "Bean을 생성, 주입, 소멸하는 역할"을 담당함.
2. Spring Boot에서 DI 적용 예시
Spring Boot에서 DI(의존성 주입)를 구현하는 방법을 살펴보겠습니다.
📌 1) 생성자 주입(Constructor Injection) – 가장 권장되는 방식
@Service
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
✔ @Autowired를 사용하여 생성자 주입
✔ 필드가 final이므로, 불변성을 유지할 수 있음
📌 생성자 주입이 "가장 권장되는 방식"임.
📌 2) 필드 주입(Field Injection) – 사용 지양
@Service
public class OrderService {
@Autowired
private PaymentService paymentService;
}
✔ 필드에 직접 @Autowired를 적용하는 방식
✔ 테스트가 어려워지고, 의존성 주입이 강제되지 않기 때문에 사용을 지양해야 함
📌 필드 주입은 "테스트가 어려워지고, 유지보수가 어려워질 수 있음"
📌 3) Setter 주입(Setter Injection) – 선택적 의존성이 필요할 때 사용
@Service
public class OrderService {
private PaymentService paymentService;
@Autowired
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
✔ @Autowired를 Setter 메서드에 적용하여 주입
✔ 선택적(옵셔널) 의존성이 필요할 때 사용할 수 있음
📌 Setter 주입은 "의존성이 변경될 가능성이 있는 경우 적절함"
3. 실무에서의 DI 패턴 – 언제 어떤 주입 방식을 선택해야 할까?
주입 방식설명권장 여부
생성자 주입 | 생성자를 통해 주입, 필드 불변성 유지 | ✅ 적극 권장 |
필드 주입 | @Autowired로 필드에 직접 주입 | ❌ 사용 지양 |
Setter 주입 | Setter 메서드를 통해 주입 | ⚠️ 선택적 의존성이 필요할 때 사용 |
📌 Spring Boot에서는 "생성자 주입"을 가장 권장함.
✅ 여기까지 Spring Boot에서 IoC & DI의 동작 방식과 실무 적용법을 배웠습니다!
👉 "그렇다면, Spring Boot에서 @Component, @Service, @Repository, @Controller는 어떻게 다를까요?"
✅ 다음 회차에서 Spring Boot의 Bean 등록 방식과 애너테이션 차이를 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <8. Spring에서 RequestParam vs PathVariable 차이점> (0) | 2025.03.25 |
---|---|
Spring 기초 <7. Spring Boot에서 REST API 개발 (GET, POST, PUT, DELETE)> (0) | 2025.03.24 |
Spring 기초 <6. Spring MVC 기본 개념과 동작 원리 (DispatcherServlet 구조)> (0) | 2025.03.23 |
Spring 기초 <5. Spring에서 @Component, @Service, @Repository, @Controller 차이> (0) | 2025.03.22 |
Spring 기초 <3. Spring Boot 프로젝트 설정 (Gradle vs Maven, Dependency Management)> (0) | 2025.03.20 |
Spring 기초 <2. Spring Boot 3.x와 Spring 6의 주요 변경 사항> (1) | 2025.03.19 |
Spring 기초 <1. Spring Framework vs Spring Boot vs STS 차이점> (2) | 2025.03.18 |