간단이론정리/SPRING

Inversion of Control, 제어의 역전

눕고싶은사람 2024. 6. 10. 20:53

IoC는 주로 면접에서 많이 묻는 내용이 아닐까. DI(Dependency Injection, 의존성 주입)와 함께 말이다.

두 가지 내용을 가볍게 정리하여 살펴보고자 한다.

 

1. IoC

- 기존 개발 방식에서 개발자가 직접 흐름을 제어하지 않고 프레임워크or라이브러리가 대신 제어 하는 것.

public class Coffee {
  private Americano americano;
    
    public Coffee() {
    	americano = new Americano();
    }
}

커피 클래스는 아메리카노를 필드로 갖고 생성자 내부에서 직접 생성하여 초기화 한다.

개발자가 직접 관리하는 것이다.

public class Coffee {

  @Autowired
  private Americano americano;
}

이제 스프링 컨테이너가 아메리카노를 관리하게 되는. 즉 제어가 역전 된 것이다.

어쩌면 번거로울 수도 있는 부분들을 프레임워크가 관리하도록 하여 개발에 있어서 도움을 받을 수 있게 된다.

 

IoC의 필요와 장점은 결국 아래와 같다.

  • 코드의 유연성, 재사용성의 증가
  • 테스트용 객체를 쉽게 만들 수 있어 테스트 용이성 증가
  • 객체 간 결합도가 낮아 유지보수성 증가
  • 개발자가 비즈니스 로직에 집중 할 수 있도록 함

 

2. DI(Dependency Injection, 의존성 주입)

DI는 IoC 구현을 위한 디자인 패턴 중 하나이며,

객체의 의존 관계를 외부에서 주입 하는 패턴을 말한다.

 

2-1. DI의 종류

 

생성자 주입(Spring에서 권장 하는 방식)

public class Coffee {
    private Americano americano;
    
    public Coffee(Americano americano) {
    	this.americano = americano;
    }
}

 

setter 주입

public class Coffee {
    private Americano americano;
    
    public void setAmericano(Americano americano) {
    	this.americano = americano;
    }
}

 

Interface 주입

public class AmericanoInjection {
	void inject(Americano americano);
}
public Coffee implements AmericanoInjection {
    private Americano americano;
    
    @Override
    public void inject(Americano americano) {
    	this.americano = americano;
    }
}

 

DI를 사용하게 되면 아래와 같은 기댓값이 있다.

  • 변경에 덜 취약해진다.
  • 모의 객체 주입으로 인해 단위 테스트가 쉬워진다.
  • 코드 가독성이 높아진다.
  • 재사용성이 높아진다.

DI는 객체가 의존하는 또 다른 객체를 외부에서 선언하고 이를 주입 받아 사용하는 것이다.


IoC를 구현하기 위한 패턴은 많지만 가장 흔하게 들을 수 있는 DI를 적어보았다.

그냥 개념을 간단하게 보기 위한 글이며, 예시 같은 것들에 오류가 있을 수 있다.

 

괜시리 용어에 놀라 위축 될 때가 있는데, 그 때에 '이게 뭐였지?' 라는 늪에 빠지지 않는 내가 되길 바란다.

 

 

 

 

참고

https://bitkunst.tistory.com/entry/ABOUTSeries-12-IoC-Inversion-of-Control-%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84-DI-Dependency-Injection-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85

 

ABOUT.Series (12) IoC (Inversion of Control; 제어의 역전) & DI (Dependency Injection; 의존성 주입)

이번 포스팅에서는 제어의 역전(IoC; Inversion of Control)과 의존성 주입(DI; Dependency Injection)에 대해 알아보고자 한다. (예제 코드는 TypeScript를 사용하였다.) < 목차 > IoC (Inversion of Control) - 제어의 역전

bitkunst.tistory.com

https://oneul-losnue.tistory.com/364#IoC%EB%A-%BC%--%EA%B-%AC%ED%--%--%ED%--%--%EB%-A%--%--Pattern

https://velog.io/@ohzzi/Spring-DIIoC-IoC-DI-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0

 

[Spring DI/IoC] IoC? DI? 그게 뭔데?

스프링을 공부하다 보면 꼭 나오는 이야기가 있다. 스프링은 IoC 컨테이너로 빈을 관리한다. 스프링은 DI를 사용한다 .DI 방법에는 생성자 주입, setter 주입, 필드 주입 등이 있다.... 아니 근데 대체

velog.io

https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

 

의존관계 주입(Dependency Injection) 쉽게 이해하기

이번 글에서는 DI(의존성 주입, 의존관계 주입)의 개념을 설명한다. DI란 용어가 주는 위압감과 부담감 때문에 이해를 미뤄뒀거나, 처음 접하는 분들이 쉽게 이해할 수 있도록 쉽게 설명하고자 한

tecoble.techcourse.co.kr

 

'간단이론정리 > SPRING' 카테고리의 다른 글

ORM, JPA, Hibernate 그리고 Spring Data JPA  (0) 2024.06.12