CS

[Spring] IoC, SpringContainer, DI

KJihun 2023. 6. 28. 08:50
728x90

 

 

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