포도가게의 개발일지

Dependency Injection? IoC? 본문

Spring boot

Dependency Injection? IoC?

grape.store 2022. 1. 31. 16:32
반응형

DI란?

 - 의존성을 주입한다

 

의존이란?

https://www.youtube.com/watch?v=fGOU7JqNHyE

- 객체 A가 객체 B의 속성이나 기능을 사용하려할때 인스턴스를 만들어 사용하게 되는데 이러한 경우 A가 B의 의존적이다라고 한다.

public class Robot {

    public static void Robot(){
    // 이렇게 직접 객체를 새롭게 생성하여 일체형으로 사용하게되는 것이 강한 결합을 의미한다.
    // 주입을 하지 않아 코드를 직접 수정해주어야 한다.
        Battery batteryA = new BatteryA();
        -> // Battery batteryA = new BatteryB();
        batteryA.name();
    }


}

interface Battery{
    void name();
}

class BatteryA implements Battery{
    private String BatteryA;
    public BatteryA(){}

    @Override
    public void name(){
        System.out.println(this.BatteryA);
    }
}

class BatteryB implements Battery{
    private String BatteryB;
    public BatteryB(){}

    @Override
    public void name(){
        System.out.println(this.BatteryB);
    }
}

https://www.youtube.com/watch?v=fGOU7JqNHyE

- 위와 같이 외부에서 미리 생성되어있는 객체를 주입하여 사용하게 되는 것을 의존성주입이라 한다. 이렇게 되면 의존성이 약해진다.

public class Robot {

	// type을 interface battery로 받아 batteryA , BatteryB로 쉽게 갈아낄수있다.
    public static void Robot(Battery b){
	// 아래와 같이 미리 만들어진 객체를 주입하여 사용하는것을 의존성 주입이라 한다.
        b.name();
    }

}

interface Battery{
    void name();
}

class BatteryA implements Battery{
    private String BatteryA;
    public BatteryA(){}

    @Override
    public void name(){
        System.out.println(this.BatteryA);
    }
}

class BatteryB implements Battery{
    private String BatteryB;
    public BatteryB(){}

    @Override
    public void name(){
        System.out.println(this.BatteryB);
    }
}

- 이렇듯 일체형으로 사용하게 되면 배터리가 전부 소진되었을시 새로 로봇을 사거나 만들어주어야 한다. -> 코드 수정시 전체적인 수정을 초례할 수 있다.

- 하지만 분리하여 조립하듯이 짜게되면(의존성 주입) 배터리만 교체하는것만으로 재사용 가능해진다. -> 코드 수정이 용이하다.

 

IoC?(Inversion of Control)

- 제어의 역전 사실 프로그래머가 직접 객체의 생성과 소멸 객체간 관계같은 객체의 제어를 수행해주어야 한다. 하지만 이렇게 되면 코드가 매우 복잡해지고 Java같은 경우에는 더욱더 객체 소멸 을 가비지컬렉터가 대신해주기 때문에 힘들게된다.

 

- 때문에 객체의 라이플사이클과 의존관계를 개발자가 아니라 여러  프레임워크, 컨테이너에서 제어권을 넘겨주는 것이다. 그것을 Spring에서 해주는게 Spiring ioc 컨테이너이다.

 

예를들어) 컴퓨터를 조립하기 위해 부품 명세서를 개발자가 발급하게 되고 각 부품(객체)를 box(컨테이너)에 담게 된다.

 

 

Bean & Ioc container

 

Bean(빈)

- 스프링 ioc 컨테이너가 관리하는 객체

- 과거에는 xml로도 bean 등록을 하였지만 시간이지나면서 어노테이션을 이용하여 bean등록을 하게 되었다.

Bean Factory

  • bean을 관리하는 컨테이너
  • bean을 등록 생성 조회 반환 관리
  • 보통 bean factory를 사용하지않고 extends한 applicationcontext를 사용
  • getBean() 메서드가 정의되어 있음

ApplicationContext

  • bean을 등록 생성 조회 반환을 관리하는 기능
  • 스프링의 각종 부가서비스를 추가로 제공
  • 스프링이 제공하는 applicationcontext 구현 클래스가 여러 종류가 있음

why?

  • 의존성 주입을 해서 의존관계를 약화시키기 위해
  • BookService라는 인스턴스를 전역적으로 하나만 만들어서 singleton으로 사용하고 싶을 때 bean으로 만들고 ioc 컨테이너를 사용하면 매우 편리하다.
  • spring ioc 컨테이너에 등록되는 빈들은 기본적으로 singleton scope으로 bean으로 등록된다.

싱글톤 : 객체를 하나만 만들어서 사용하는 것

프로토타입 : 매번 다른 객체를 만들어서 사용

 

 

'Spring boot' 카테고리의 다른 글

[Java] JVM과 자바 메모리 구조  (0) 2022.01.22
[Spring] java.lang.IllegalStateException: Failed to load ApplicationContext  (0) 2022.01.21
[JAVA] Generic  (0) 2022.01.21
[Spring]Transaction?  (0) 2022.01.20
[JAVA] Annotation?  (0) 2022.01.20
Comments