Spring,SpringBoot

SpringBean, IOC, DI

Lahezy 2023. 2. 11.
728x90

스프링은 자바기반 프레임 워크로 개발을 편리하게 해 주기 위해서 사용한다.

이때 다형성을 유지하기 위해서는 OCP, DIP가 위배된다.

이를 해결하기 위해서 스프링에서는 IOC를 지원한다.

 

Container : 빈을 관리하는 것으로, 인스턴스의 생성 주기, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 한다.

Spring Conatiner : Spring Framework의 핵심부에 위치하며, 종속 객체 주입을 이용하여 Application을 구성하는 Component들을 관리한다. 이때 Spring Container에서 생성되는 객체를 Bean이라고 한다.

 


 

IOC( Inversion of Control) 제어의 역전: 개발자가 직접 인스턴스를 생성하고 의존관계 주입을 하는 것이 아니라 IOC Container에서 대신 수행해 준다. 즉, 개발자가 가지고 있던 제어권을 넘겨준 것이다.

  • 이렇게 IOC의 container에서 생성한 인스턴스를 bean이라고 한다.
  • BeanFactory는 IoC container의 기능을 정의하고 있는 interface이다. Bean의 생성, Bean 사이의 의존관계 주입(DI), Bean의 lifecycle 관리 등에 대한 기능을 정의하고 있다.
  • ApplicationContext는 BeanFactory를 상속받는 interface로 BeanFactory의 기능뿐만 아니라, AOP, message 등 추가적인 기능에 대해 정의되어 있다.

DI( Dependency Injection) : 의존관계 주입

  • IOC container는 bean으로 생성된 instance들을 가지고 있다가 의존관계 주입 시에 해당되는 타입을 찾아 주입한다.
  • 의존관계는 정적인 클래스 의존관계와 실행시점에 결정되는 동적인 클래스 의존관계를 분리해서 생각해야 한다
  • 동적인 클래스 의존관계는 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에서 전달해서 클라이언트와 서버의존관계가 연결되는 것을 의존관계 주입이라고 한다.
  • 의존관계 주입 사용 시에는 정적인 클래스 의존관계를 변환하지 않고 동적인 객체 인스턴스 의존관계를 쉽게 변경 가능하다.
  • 이때 DI는 4가지 방법이 있다.
    • 생성자 주입 [처음 생성 시에 단 한번 주입, 불변]
    • 세터 주입
    • 필드 주입(이름이 같으면 의존관계를 알아서 잡아줌, 에러 찾기 힘들다 쓰지 말자)
    • 일반 메서드 주입

IOC 컨테이너, DI 컨테이너

AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC 컨테이너 또는 DI 컨테이너라 한다. 의존관계 주입에 초점을 맞추어 최근에는 주로 DI 컨테이너라 한다. 또는 어셈블러, 오브젝트 팩토리 등으로 불리기도 한다.

 

프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 그것은 프레임워크 맞음(junit)

반면에 내가 작성한 코드가 내가 직접 제어 흐름을 담당하면 프레임워크가 아닌 라이브러리이다.

 


 

참고)

https://velog.io/@gillog/Spring-Bean-%EC%A0%95%EB%A6%AC

https://velog.io/@leemj6825/Spring-Bean%EA%B3%BC-Instance

https://leveloper.tistory.com/33

728x90

댓글