[TIL CS]의존성 주입에 대하여

조민수·2022년 9월 15일
2

cs

목록 보기
3/5
post-thumbnail

2022-09-03
의존성주입 흔히 D.I라고 불리는 해당 개념에 대하여 간단하게 정리놓을려고 한다(사실 옛날에 spring boot로 프로젝트 할 때 많이 썼던개념)

🚩의존성 주입(Dependency Injection)

의존성 주입이라는 말을 한단어씩 쪼개본다면

의존성:어떤 함수,클래스 등이 내부에 다른함수,클래스를 사용함

주입:어떤 함수,클래스 등이 내부에서 사용하는 다른 함수,클래스를 내부에서 생성하는 것이 아니라 외부에서 생성하여 넣어주는 것을 '주입'이라고 함

결국 느낌은 어떤 함수나 클래스를 외부에서넣어주겠다?라는 말이 되겠다.사실 이게 너무 당연한 말이라 더욱 이해가 안 갈 수 있겠다.
(팩토리패턴에서 팩토리에 원하는 인스턴스를 넣어주는 것 또한 DI인것,,)

이번에는 조금은 더 class의 느낌을 최대한 Java스럽게 내기위해 ts로 코드를 짜보겠다.
상황)게임 Player에게 각 무기를 할당해주는 상황

	class Weapon{
     	 public attack(){
          	console.log("무기공격!"); 
         }
    }

	class Whip extends Weapon{
     	public attack(){
         	console.log("채찍공격!");
        }
    }

	class Player{
     	private weapon:Weapon;
      	
      	constructor(){
         	this.weapon=new Whip(); 
        }
      
      	public attack(){
          this.weapon.attack();
        }
          
    }
	
	const me=new Player();
	me.attack();
	//이렇게 하면 채찍공격이 찍힐 것이다

하지만 해당 코드에서 보면 채찍공격말고 칼공격 총공격 등 다양한 무기들의 증가가 되면 각 player마다 여러가지 무기들을 따로따로한다?
이건 너무나 말도 안되는 중복성이다,,,
따라서 해당부분을 di로 표현하면

	
	class Player{
     	private weapon:Weapon;
      
      	constuctor(weapon:Weapon){
         	this.weapon=weapon; 
        }
      
      	attack(){
         	this.weapon.attack(); 
        }
    }

즉 생성자에서 무기에 대한 정보를 넣어줌으로써(생성자 주입)
문제를 해결한다

	const me=new Player(new Whip())

사실 우리는 너무나 많이 기본적으로 DI를 써오고 있었기에 너무나 위의 상황이 조금은 이제느 억지로 느낄 수 있다.하지만 이게 DI이다 외부에서 의존관계를 결정해주는 것!

근데 이 때 위의 상황을 보면 Player에 대해서 무기 제어권을 외부에서 주는 것으로 이걸 우리는

IOC(제어권의 역전)

이라고 부른다

말 그대로 제어권이 클라이언트 코드 내부에서가 아닌 외부에서 결정해서 넣어주는 것이니까??

🙋‍♂️IOC의 예시는 그럼 무엇이 있지?

프레임워크가 대표적인 제어의 역전개념이 적용된 대표적 기술이다
전통적으로 라이브러리를 사용하는 것은 우리가 직접 제어하는것
하지만 Ioc는 프레임워크에의해 제어되는것

프론트엔드 관점에서 봐보자면

1.Redux

리덕스를 쓰게 되므로써 언제 상태가 업데이트 되는지 신경을 쓸 필요가 없어졌다.상태변화를 리덕스에서 감지해주고 상태변화가 일어났을때에만 알아서 화면이 업데이트 된다.
즉, 제어의 일부분이 리덕스로 역전이 되었기 때문이다

2.React

리액트에서도 상태변화가 일어나면 자동으로 view를 업데이트 해주는 원리 즉 이 또한도 리액트에게 제어권을 넘겨준것이다.

3.EventListener

또한 우리 흔히 이벤트리스너를 통한 어떠한 이벤트가 들어왔을 때에 그에 대한 콜백을 우리는 해주게 된다.이 때 이 콜백 또한 IOC가 일어났고 볼 수 있다.왜냐하면 a태그에 대한 이벤트가 "click"이 일어날 때에 IOC가 일어나지 않으면 무조건 a태그는 정해진 일밖에 못할 것이다 하이퍼링크,,,


🤷‍♂️그렇다면 장점,단점?

장점:
1.모듈들을 쉽게 교체할 수 있는 구조가 되어 테스팅하기 쉽고 마이그레이션하기도 수월
2.애플리케이션의 의존성방향이 좀 더 일관되어 추론하기가 쉬움
3.객체들을 쉽게 교체할 수 있는 코드가 된다

단점:
1.모듈들이 더욱 분리되어 클래스 수가 늘어나 복잡성이 증가되는데 비용이 발생한다(클래스 폭발이라고 부름)


🖥결론:

DI는 우리도 모르게 은근히 많이 쓰이며

직접 다른 하위 모듈에 대한 의존성을 주기보다는 중간에 의존성 주입자가 이 부분을 가로채 메인모듈이 간접적으로 의존성을 주입하는 방식!

profile
컬러감이 있는 프론트엔드개발자

1개의 댓글

comment-user-thumbnail
2022년 10월 10일

잘 보고 갑니다~

답글 달기