IoC (Inversion of Control)
제어의 역전, 의존성 역전 이라고도 한다.
객체의 제어권한을 개발자가 아닌 외부로 넘겨 개발자는 애플리케이션의 핵심 비즈니스 로직에 집중할 수 있게 한다.
IoC를 사용함으로써 결합도 감소 및 응집도를 증가시킴으로써 더욱 유연한 코드작성을 가능하게 해준다.
SpringContainer(Bean, DI)를 통하여 구현한다.
SpringContainer
Bean의 생성, 관리, 의존성 주입(DI)등을 담당하여 IoC를 실현하기 위한 도구
Bean: 스프링 컨테이너에서 생성하고 관리되는 객체
Bean은 스프링 컨테이너에 의해 관리되므로 필요한 곳에서 주입(DI; Dependency Injection)하여 사용한다.
스프링 컨테이너는 Beanfactory와 ApplicationContext 두 종류의 인터페이스로 구현되어 있다.
BeanFactory
빈 팩토리(BeanFactory)는 스프링 컨테이너의 최상위 인터페이스이다.
BeanFactory는 빈을 등록, 생성, 조회 등 빈을 관리하는 역할을 하며,
getBean() 메서드를 통해 빈을 인스턴스화 할 수 있다.
@Bean 어노테이션이 붙은 메서드의 이름을 스프링 빈의 이름으로 사용하여 빈 등록을 한다.
ApplicationContext
애플리케이션 컨텍스트(ApplicationContext)는 BeanFactory의 기능을 상속받아 제공한다.
따라서, 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그 외의 부가 기능을 제공한다.
- 부가 기능
- MessageSource : 메시지 다국화를 위한 인터페이스
- EnvironmentCapable : 개발, 운영, 환경변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
- ApplicationEventPublisher : 이벤트 관련 기능을 제공하는 인터페이스
- ResourceLoader : 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회
ApplicationContext는 다시 두 가지로 나뉜다
- XmlApplicationContext: XML 파일을 이용하여 빈 설정 정보를 제공하는 컨테이너
- AnnotationConfigApplicationContext: 자바 어노테이션을 이용하여 빈 설정 정보를 제공하는 컨테이너
DI (Dependency Injection)
객체가 직접적으로 의존하는 객체를 생성하거나 참조하는게 아닌, 외부에서 주입하는 방식
- 외부에서 필요한 의존성을 주입받는 방식으로 느슨한 결합을 구현하는 데 사용한다.
- 객체 간의 결합도를 낮추고 유연성과 확장성을 갖춘 애플리케이션을 구현할 수 있게 된다.
DI는 주로 아래의 세 가지 방식으로 구현된다.
생성자 주입(Constructor Injection)
객체를 생성할 때, 해당 객체의 의존성을 생성자를 통해 주입하는 방식.
생성자 매개변수를 통해 의존하는 객체를 전달받고, 해당 객체를 내부에서 사용할 수 있게 된다.
객체의 불변성을 지켜줄 수 있기 때문에 가장 추천하는 방식이다.
생성자를 직접 작성하거나 lombok 어노테이션인 @RequiredArgsConstructor를 작성하는 방식 두가지가 있다.
setter 주입(Setter Injection)
객체를 생성한 후, 메서드를 통해 의존성을 주입하는 방식
객체 내에 해당 의존성을 설정하는 메서드를 제공하고, 외부에서 이 메서드를 호출하여 의존성을 주입한다.
필드 주입
외부에서 접근이 불가능하여 테스트 시 어려움을 겪을 수 있다.
불변성 유지가 어려우며 코드의 결합도를 높이는 단점이 있어 자주 사용되지 않는 방식이다.
'CS' 카테고리의 다른 글
[CS] 스케줄링 (0) | 2023.07.15 |
---|---|
[CS] 병행(Concurrency)과 병렬(Parallel) (0) | 2023.07.12 |
[Spring] Spring AOP(Aspect-Oriented Programming) (0) | 2023.07.11 |
[CS] DBMS (0) | 2023.07.08 |
[Network] HTTP/HTTPS의 차이, SSL/TLS이란? (1) | 2023.07.05 |