
IoC(Inversion of Control)/ IoC ContainerFramework/Spring2024. 10. 8. 14:22
Table of Contents
728x90
IoC(Inversion of Control)
1. IoC 기본 개념 및 원리
: 프로그램의 제어 흐름이 클라이언트 코드에서 프레임워크 or 컨테이너로 역전됨
⇒ 객체 생성, 구성, DI, LifeCycle 관리 등을 IoC 컨테이너에 의해 관리됨
⇒ 객체 or 클래스 간 결합도 ⬇️
2. IoC 주요 개념
- DI(Dependency Injection)
: IoC의 구체적인 구현 방식 중 하나,
객체가 필요한 의존성을 외부에서 주입받는 방법 - Spring Framework : IoC Container 제공
3. IoC 이점
- 유연성 증가
- 테스트 용이성
- 코드 재사용성 증가
- 구성의 일관성
4. Spring의 IoC 구현 방식
1. XML 기반 구성 - spring 초기
2. Java 기반 구성<bean id="engine" class="com.example.Engine"/> <bean id="car" class="com.example.Car"> <constructor-arg ref="engine"/> </bean> - Car 및 Engine 빈 생성 후, Car에 Engine 주입하는 설정
3. Annotation 기반 구성@Configuration public class AppConfig { @Bean public Engine engine() { return new Engine(); } @Bean public Car car(Engine engine) { return new Car(engine); } }
@Component public class Engine { // 엔진 클래스 } @Component public class Car { private final Engine engine; @Autowired public Car(Engine engine) { this.engine = engine; } }
5. IoC 한계 및 단점
- 초기 설정 복잡성
- 디버깅 어려움 - Bean 주입 오류 or 순환 의존성 문제 해결 부분에서 디버깅 과정 hard
- Performance Overhead - 초기화 시점에 모든 Bean이 Load되고 DI되기 때문에 시작 시점이 느림
IoC Container
1. IoC Container 역할 및 기능
- 객체의 생성 및 관리
- Application의 Bean 생성 및 LifeCycle 관리
- 필요한 의존성을 주입하여 Bean이 Application 내에서 적절히 동작하도록 함
- DI(Dependency Injection)
- IoC의 가장 중요한 기능
- Type에 따른 주입 : 기본적으로 스프링은 Type에 따라 DI 수행
@Autowired 사용 시, SpringContainer는 Type에 맞는 Bean 찾아 DI - Name에 따른 주입 : @Qualifier or @Resource 사용 시,
특정 이름을 가진 Bean 주입 가능
⇒ 동일한 Type의 Bean이 여러 개 있을 때 유용함
- Type에 따른 주입 : 기본적으로 스프링은 Type에 따라 DI 수행
- IoC의 가장 중요한 기능
- Bean LifeCycle 관리
- Bean LifeCycle
- 생성(Instantiation) : SpringContainer가 Bean 생성
⇒ Bean의 객체가 메모리에 할당됨 - 의존성 설정(Population) : 필요한 의존성에 주입됨
- 초기화(Initialization) : Bean 생성 및 주입 후, Bean의 초기화 메서드 호출됨
- @PostConstruct 어노테이션 통해 지정 가능
- 소멸(Destruction) : Bean의 생명 주기 종료 시, Bean의 소멸 메서드 호출 후 리소스 정리
- @PreDestroy 어노테이션을 통해 지정 가능
- 생성(Instantiation) : SpringContainer가 Bean 생성
- Bean LifeCycle
- Bean Scope 관리
- Singleton : 기본 Scope
- Prototype : Bean이 요청될 때마다 새로운 인스턴스 생성됨
- Request : 웹 애플리케이션에서 사용됨
- Session : HTTP Session마다 하나의 Bean 인스턴스 생성됨
- Application : ServletContext마다 하나의 Bean 인스턴스 생성됨
💡 Scope란? Bean이 생성되고 유지되는 범위
2. IoC Container 종류
1. BeanFactory : Spring IoC Container의 가장 기본적인 구현체
- 지연 초기화(Lazy Initialization) 방식 사용
⇒ Bean이 실제 요청될 때까지 Bean 생성 X
⇒ 메모리 사용량 절약 가능(초기화 오버헤드 감소).
2. ApplicationContext : BeanFactory를 확장한 IoC ContainerBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); MyBean myBean = (MyBean) factory.getBean("myBean");
- BeanFactory보다 더 많은 기능 존재
⇒ 대부분의 SpringApplication에서 지원
1. Event Publisher 및 Listening : 애플리케이션 이벤트 발행 및 리스너를 통해 이벤트 처리
2. 국제화(MessageSource) : 메세지 소스와의 통합을 통해 국제화 지원
⇒ 다국어 메세지 번들 쉽게 관리 가능
3. 환경 관리(Environment Abstraction) : 프로파일(profile), 속성(property) 관리 기능 제공
4. 자동 스캔 : 클래스 경로에서 자동으로 Bean 스캔 및 등록 가능
⇒ XML 설정 파일 없이도 Bean 구성 가능
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyBean myBean = context.getBean(MyBean.class);
- 주요 구현체들
1. ClassPathXmlApplicationContext : XML 파일로부터 Bean 정의 Load
2. FileSystemXmlApplicationContext : 파일 시스템 경로에서 XML 파일로부터 Bean 정의 Load
3. AnnotationConfigApplicationContext : 자바 클래스를 기반으로 한 구성에서 Bean 정의 Load
출처는 필기 당시 참고하였던 사이트 찾으면 바로 업데이트 하겠습니다.
728x90
'Framework > Spring' 카테고리의 다른 글
DI(Dependency Injection) (2) | 2024.10.09 |
---|---|
Servlet, Servlet Container, DispatcherServlet (0) | 2024.09.30 |
@or-else :: orElse의 팔만대장경
안녕하세요. 성장하고 싶은 개발자 orElse입니다. 지켜봐주세요.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!