포도가게의 개발일지
Dependency Injection? IoC? 본문
DI란?
- 의존성을 주입한다
의존이란?
- 객체 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);
}
}
- 위와 같이 외부에서 미리 생성되어있는 객체를 주입하여 사용하게 되는 것을 의존성주입이라 한다. 이렇게 되면 의존성이 약해진다.
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 |