의존성 주입에 대하여
메뉴 관련 service 파일을 수정하는 과정에서 문제가 발생했다.
메뉴 등록시, 해당 메뉴를 등록할 업장(가게)이 존재하지 않으면 오류를 발생시키려고 했는데, 해당 코드에서 의존성을 주입한 this.storesRepository를 읽어오지 못하는 것이다. 어떤 부분이 문제인가 싶어 의존성 주입한 부분을 다시 살펴봤다.
// service 파일 내부
constructor(menuRepository, storesRepository) {
this.menuRepository = menuRepository;
this.storesRepository = storesRepository;
}
// router 파일
const storesRepository = new StoresRepository(prisma);
const menuRepository = new MenuRepository(prisma);
const menuService = new MenuService(menuRepository);
const storesService = new StoresService(storesRepository);
...
문제는 router 파일에 있었는데,
# 실패
const menuService = new MenuService(menuRepository);
const storesService = new StoresService(storesRepository)
# 성공
const menuService = new MenuService(menuRepository, storesRepository);
위의 코드를 아래처럼 수정해주었더니 정상적으로 불러온다.
왜 이렇게 되는 걸까?
의존성 주입(Dependency Injection, DI)
소프트웨어 설계 패턴 중 하나로, 클래스나 구조체가 작동하는 데 필요한 의존성(여기서는 다른 클래스의 인스턴스나 객체)을 외부에서 제공하는 방식이다. 이 패턴은 모듈 간 결합도를 낮추고, 유닛 테스트 용이성을 높이며, 코드의 재사용성과 유지 보수성을 개선한다.
MenuService 클래스가 MenuRepository와 StoresRepository 두 개의 리포지토리에 의존하고 있다면, 이 클래스는 두 개의 의존성을 모두 받아야 정상적으로 작동할 수 있다. MenuService의 생성자는 constructor를 통해 두 의존성을 모두 매개변수로 받도록 설계되었는데....
저렇게 둘로 분리해두면 MenuService의 인스턴스 생성 시 menuRepository만 주입하고 storesRepository는 주입하지 않는다.(당연함)
MenuService 클래스의 생성자가 두 개의 매개변수를 요구하는데, 두 번째 매개변수인 storesRepository를 제공하지 않았기 때문에 this.storesRepository가 undefined가 되었던 것이다. 결과적으로 MenuService 내에서 storesRepository에 접근하지 못하게 된다ㅠㅠ
만약 첫 번째 방법처럼 의존성을 주입하려면?
궁금해서 찾아봄
각각의 의존성을 별도로 주입받는 방식을 수정하여 MenuService가 하나의 의존성만 받도록 변경해야 함! 여기서 `의존성 래퍼 객체`라는 걸 사용할 수 있다고 한다.
class Dependencies {
constructor(menuRepository, storesRepository) {
this.menuRepository = menuRepository;
this.storesRepository = storesRepository;
}
}
const dependencies = new Dependencies(menuRepository, storesRepository);
const menuService = new MenuService(dependencies);
constructor(dependencies) {
this.menuRepository = dependencies.menuRepository;
this.storesRepository = dependencies.storesRepository;
}
`의존성 컨테이너`라는 것도 사용할 수 있다. 또는 `DI 라이브러리`...
의존성을 자동으로 주입하고 관리해 주는 도구라고 한다. JavaScript 및 Node.js 생태계에서는 InversifyJS, Awilix와 같은 여러 DI 라이브러리가 있다는데... 사실 그냥 지금처럼 명시적으로 의존성 여러 개를 주입해주는 게 낫다고 함
'TIL' 카테고리의 다른 글
TypeScript에 대하여 (0) | 2024.03.05 |
---|---|
Redis에 대해서 (1) | 2024.02.29 |
JavaScript의 변수 선언과 구조 분해 할당(destructuring assignment) (0) | 2024.02.21 |
액세스 토큰과 리프레시 토큰으로 자동 로그인 구현하기 (0) | 2024.02.21 |
전개 연산자를 이용하여 prisma 데이터 등록하기 : 20240201 발췌 (0) | 2024.02.21 |