본문 바로가기
FrameWork & Runtime/Spring

Spring Framework와 DI&IOC

by jaeaemin 2022. 2. 21.

 

Spring Framework

: support for dependency injection, transaction managemint, web app, data access ...

Spring  분산형, 기업형 응용 프로그램 개발을 위한 API
 결합력을 낮추는 DI , DB Transaction 처리, 로그 처리 ..
Java SE 일반적인 로컬 응용 프로그램 개발을 위한 API
파일 I/O , 콘솔 I/O , 윈도우 IO , 네트워크 I/O , Thread ...

Java EE 에 비해 Spring의 기술의 도입으로 "MVC , Transaction , 인증과 권한"이 유용해짐 

 

 

  지원 해결
MVC DI  느슨한 결합과 인터페이스 
트랜잭션 AOP  
인증과 권한 Servlet Filter   

 

 

 

[1] 느슨한 결합과 인터페이스 

 

https://dinfree.com/lecture/backend/javaweb_3.1.html

위는 웹 프로그램의 MVC 패턴의 예시이다.

이러한 경우 DAO (데이터 접근 객체) 코드 상에서 소스코드 상의 Update가 필요하다면 어떻게 될까? 

이 때는 2가지 방법을 생각할 수 있다.

(1) DAO 코드에 새롭게 수정될 코드를 바로 덮어씌어 버린다.

(2) DAO에 새로운 코드를 추가한 뒤, Controller의 연결을 기존 연결을 끊고 새로운 코드와 연결시킨다.

 

하지만 2가지 모두 다 Controller의 코드 수정이 필요하다. ( 기존 클래스 참조 X , 새로운 클래스로 참조 ) 

결국 2가지 모두 다 수정하고 재배포를 해야하므로 결합도가 높아지게된다. 

 

 

이를 해결하기 위해서 인터페이스를 사용하게 된다.

인터페이스를 사용하게되면, DAO의 인터페이스를 생성한 뒤에 클래스 부품들을 끼워넣어서 Service를 구동하게 된다.

이 때 어떤 부품을 끼울지에 대해서는 UI 계층에서 입력시켜준다.

이를 통해서 코드 수정없이 DAO의 새로운 코드가 Service 단에서 수행이 가능하게 된다.

 

 

 

 

 

 

DI ( Dependcy Injection ) 

Spring은 DI를 지원한다, 각 부품들에 대해 어노테이션을 설정(Bean 설정 정보)해준다면 컨테이너가 자동으로 최적의 조건으로 클래스 사이의 종속성을 주입시켜준다. 

정리하면 DI는 스프링이 다른 프레임워크와 차별화되어 제공하는 의존성 관계 주입으로 객체를 직접 생성하지 않고, 외부에서 생성한 뒤에 주입시켜주는 방식이다. ( 이를 통해 결합도는 낮아지고, 유연성은 높아진다 )

  • 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하면 된다
  • 객체 레퍼런스를 컨테이너로부터 주입 받아서, 실행 시에 동적으로 의존관계가 생성된다.
  • 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해준다.
  • 이를 통해 코드가 단순해지고, 컴포넌트 간 결합도가 제거된다.

 

Composistion has A
- 강한 결합 - 
Association has A
- 느슨한 결합 -
class A
{
     private B b;
      
     public A() {
          b = new B();
     }
}
class A
{
     private B b;
     
     public void setB(B b) {
          this.b = b;
     }
}
A라는 클래스가 생성될 시 
B라는 클래스를 생성하여 A의 클래스가 가지게 된다.
==> A가 B를 일체형으로 가졌다 has-a 관계 ( B: 종속 객체 )
A라는 클래스가 생성되고
외부에서 SetB 메서드를 통해서 B라는 클래스를 조립해서 가지게 된다.
==> B 클래스는 조립형
A라는 클래스가 만들어지자 마자 무조건 B라는 부품이 생성 A라는 클래스와 별개로 B라는 클래스를 "주입"시켜주어야 함 

B b = new B() =>  Dependency 객체
SetB(b) => Injection (의존성 주입)
// 의존되는 객체가 생성

 

 

주입하는 방법의 종류

Setter Injection
<setter method 사용 >
B b = new B();
A a = new A();
a.setB(b);
Constuction Injection
< 생성자를 사용 >
B b = new B();
A a = new A(b);
Method Injection
< 매서드 사용 >
 

 

다시말하면 DI는 부품을 생성하고 부품을 조립하는 역할을 가진다.

 

 

 

 

 

IOC 컨테이너 

 

IoC의 개념 

Ioc(제어권의 역전)은, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.

컴포넌트 의존관계 결정 및 생명주기를 해결하기 위한 디자인 패턴

 

개발자가 아닌 프레임워크가 제어권을 주입시킨다.

 

 

올바른 DI를 주문하기 위해서는 명세화된 주문서가 필요하다. 

이러한 주문서는 XML 파일과 Annotation으로 만들어 질 수 있다.

 

컨테이너란 무엇인가?

부품(객체)들을 담는 박스로 dependecy container, 이러한 박스에서 부품을 생성하고 여러 부품들을 담게된다.

담겨진 부품들을 작은 단위, 큰 단위로 조립하는 공간 

 

 

IOC 컨테이너란 무엇인가?

 IOC(Inversion of control)란 "제어의 역전" 이라는 의미로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아닌 , 외부에서 결정하는 것을 의미한다는 것을 위에서 언급했다.

 IOC 컨테이너는 이러한 기능을 제공하는 프레임워크로, 객체에 대한 생성 및 생명주기를 관리하는 기능을 제공한다.

  •  IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
  • POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다. (plain old java object)
  • 개발자들이 직접 POJO를 생성할 수 있지만, 주로 컨테이너에게 맡긴다.

 

IoC의 분류

DL [의존성 검색] 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는 것
// 컨테이너 종속성이 증가하여, 주로 DI를 사용함 
DI  [의존성 주입] 각 클래스간의 의존관계를 Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것 

 

 

 

Spring DI 컨테이너 

Spinrg DI 컨테이너가 관리하는 객체를 Bean이라고 한다.
이 Bean들을 관리하는 의미의 컨테이너를 Bean Factory라고 부른다.


BeanFactory - Bean을 등록, 생성, 조회, 반환 관리한다.
- 보통은 BeanFactroy를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용함
- getBean() 메서드가 정의됨
ApplicationContext - Bean을 등록, 생성, 조회, 반환 관리하는 기능은 같음
- Spring의 각종 부가 서비스를 추가로 제공함
- Spring이 제공하는 ApplicationContext 구현 클래스의 종류 다양
반응형