IoC 컨테이너
객체의 생성, 라이프사이클 관리, 의존성 주입을 책임지는 Spring프레임워크의 핵심 구성 요소이다
제어의 역전(Inversion of Control, IoC) 원칙을 구현하여 애플리케이션의 객체와 객체 간의 의존성을 관리한다
IoC
객체 생성 및 의존성 관리를 개발자가 아닌 컨테이너가 담당하는 디자인 원칙이다
즉, 객체는 자신이 사용할 의존성을 직접 생성하거나 관리하지 않고, 외부에서 주입받는다
IoC 의 핵심 개념
- 객체 간의 결합도를 낮추어 코드 재사용성과 유지보수성을 높임
- 애플리케이션의 구성 요소를 유연하고 확장 가능하게 설계
IoC 컨테이너의 주요 역할
1. 빈 등록 및 관리
- 개발자가 정의한 빈을 생성하고 컨테이너에 등록
- 빈의 라이프사이클(생성, 초기화, 소멸)을 관리
2. 의존성 주입(DI)
- 빈 간의 의존성을 분석하고 필요한 객체를 자동으로 주입
3. 빈 스코프 관리
- 빈의 생성 및 사용 범위를 지정하여 효율적으로 리소스 관리
4. AOP (Aspect Oriented Programming) 지원
- IoC 컨테이너는 애스펙트를 적용하여 횡단 관심사를 관리
IoC 컨테이너의 구현체
1. BeanFactory
- Spring IoC 컨테이너의 가장 기본적인 구현체
- 지연 로딩(Lazy Loading) 방식으로 필요한 시점에 빈을 생성
- 가벼운 애플리케이션에 적합
2. ApplicationContext
- BeanFactory를 확장한 고급 컨테이너
- 빈 생성을 포함하여 AOP, 이벤트 리스닝, 메시지 소스 처리 등 다양한 기능 제공
- 대부분의 Spring 애플리케이션에서 기본으로 사용
IoC 컨테이너 동작 방식
1. 설정 파일 또는 어노테이션 읽기
- XML 파일, 자바 설정 클래스, 또는 어노테이션에서 빈 설정 정보를 읽음
2. 빈 등록
- 설정 정보를 기반으로 빈 정의를 IoC 컨테이너에 등록
3. 빈 생성 및 초기화
- 등록된 빈을 생성하고 초기화 메서드 실행
4. 의존성 주입
- 빈 간의 의존성을 주입하여 연결
5. 빈 관리
- 빈의 상태를 관리하고 컨테이너 종료시 필요한 경우 소멸 메서드 호출
IoC 컨테이너 예시
XML 설정
<beans xmlns="http://www.springframework.org/schema/beans">
<bean id="myBean" class="com.example.MyClass">
<property name="dependency" ref="myDependency"/>
</bean>
<bean id="myDependency" class="com.example.MyDependency"/>
</beans>
Java Config
@Configuration
public class AppConfig {
@Bean
public MyClass myBean() {
return new MyClass(myDependency());
}
@Bean
public MyDependency myDependency() {
return new MyDependency();
}
}
어노테이션 기반
@Component
public class MyClass {
private final MyDependency dependency;
@Autowired
public MyClass(MyDependency dependency) {
this.dependency = dependency;
}
}
@Component
public class MyDependency {
}
IoC 컨테이너의 장점
- 의존성 관리:
- 객체 간의 의존성을 명확히 정의하고 자동으로 주입함으로써 결합도를 낮춤
- 코드 간결화:
- 객체 생성 및 관리 코드가 줄어듦
- 테스트 용이성:
- 객체 의존성이 외부에서 주입되므로 단위 테스트 작성이 쉬워짐
- 유연한 설정:
- XML, Java Config, 어노테이션 등 다양한 방식으로 설정 가능
- 기능 확장성:
- AOP, 이벤트 처리, 리소스 로딩 등 IoC 컨테이너의 다양한 부가 기능 활용 가능
IoC 컨테이너를 활용한 예제
서비스 계층 의존성 주입
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void performOperation() {
userRepository.save(new User("John Doe"));
}
}
@Repository
public class UserRepository {
public void save(User user) {
System.out.println("Saving user: " + user.getName());
}
}
메인 애플리케이션
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(MyApp.class, args);
UserService userService = context.getBean(UserService.class);
userService.performOperation();
}
}
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] @ManyToOne, @OneToMany (1) | 2024.12.22 |
---|---|
[Spring Boot] Eager, Lazy (0) | 2024.12.21 |
[Spring Boot] 빈이란 (1) | 2024.12.15 |
[Spring Boot] ApplicationRunner (0) | 2024.12.14 |
[Spring Boot] ORM, @Query (1) | 2024.12.14 |