IoC (Inversion of Control, 제어의 역전)
IoC(제어의 역전)은 객체의 생성, 사용, 소멸과 같은 제어 권한을 개발자가 아닌 스프링 프레임워크가 관리하는 개념이다.
전통적인 개발 방식에서는 객체를 직접 생성하고 관리해야 하지만, IoC를 적용하면 객체의 생성과 의존성 주입을 컨테이너(Spring Container)가 담당하게 된다.
주요 이점
- 객체 간의 결합도(Coupling) 감소: 유지보수가 용이
- 객체 관리 자동화: 개발자가 객체 생성, 소멸을 신경 쓰지 않아도 됨
- 코드의 재사용성 증가
DI (Dependency Injection, 의존성 주입)
DI(의존성 주입)은 IoC를 구현하는 방법 중 하나로, 객체 간의 의존 관계를 스프링 컨테이너가 자동으로 주입해주는 방식이다.
핵심 원리
- 개발자가 객체를 직접 생성하는 것이 아니라, 외부에서(스프링 컨테이너) 생성된 객체를 주입 받아 사용
- 이를 통해 클래스 간의 결합도가 낮아지고, 유지보수성이 증가
방식
- 생성자 주입(Constructor Injection)
- 생성자를 통해 의존성을 주입
- 필수 의존성이 있을 때 적합
- 변경 불가능한(Immutable) 객체 생성 가능
- 세터 주입(Setter Injection)
- Setter 메서드를 통해 의존성을 주입
- 선택적(옵션) 의존성이 있을 때 유용
- 필드 주입(Field Injection) [추천되지 않음]
@Autowired를 필드에 직접 사용하여 주입
- 단점: 테스트 어려움, DI 컨테이너 없이 사용이 어려움
스프링 컨테이너 (Spring Container)
스프링 컨테이너는 IoC와 DI를 구현하는 핵심 요소로, 빈(Bean) 객체들을 생성하고 관리하는 역할을 한다.
주요 스프링 컨테이너 종류
- BeanFactory
- 가장 기본적인 컨테이너
- 필요할 때만 객체를 생성하는 Lazy Loading 방식
- 메모리 효율적이지만, 기능이 제한적
- ApplicationContext (일반적으로 더 많이 사용)
- BeanFactory를 확장한 인터페이스
- 스프링 애플리케이션에서 주요 기능 제공 (트랜잭션 관리, AOP 등)
- 객체를 미리 생성(Eager Loading)하여 성능 최적화
컨테이너의 주요 역할
- 객체의 생성 및 소멸 관리
- 의존성 자동 주입(DI 적용)
- 빈(Bean) 라이프사이클 관리
- AOP(Aspect-Oriented Programming) 등의 부가 기능 지원
정리
- IoC: 객체의 생성 및 관리를 개발자가 아닌 스프링 컨테이너가 담당하는 개념
- DI: IoC를 구현하는 방식 중 하나로, 의존성(Dependency)을 외부에서 주입하는 기법
- 스프링 컨테이너: IoC와 DI를 담당하는 핵심 요소로, 객체(Bean)를 생성하고 주입하는 역할
IoC와 DI를 활용하면 객체 간의 결합도를 낮추고 유연한 애플리케이션을 만들 수 있다.