320x100
320x100

객체 의존성

: 객체가 특정 객체에 상호작용을 하는 것

: 현재 객체가 다른 객체와 상호작용 (참조)하고 있다면 현재 객체는 다른 객체에 의존성을 가진 것

: 참조하는 모듈이 바뀌면 의존하는 다른 모듈까지 변경되어야한다

 

 

 

 

 

 

이미지 출처: https://charming-kyu.tistory.com/17

의존성 주입

: 의존 관계를 외부에서 결정하고 주입하는 것

: 객체에 의해서 의존성이 주입되는 것이 아니라 프레임워크 등 외부에 의해서 의존성이 주입되는 설계 패턴

 

- 의존성 주입 방법

1) 생성자를 통한 전달

2) setter를 통한 전달

3) 멤버 변수를 통한 전달

 

- 장점

: 종속성이 감소한다

: 재사용성이 증가한다

: 더 많은 테스트 코드를 작성할 수 있다

: 코드를 읽기 쉬워진다

 

 

 

 

 

 

예제 코드

//users-service.js
const User = require('./User');
const UsersRepository = require('./users-repository');

async function getUsers() {
  return UsersRepository.findAll();
}

async function addUser(userData) {
  const user = new User(userData);

  return UsersRepository.addUser(user);
}

module.exports = {
  getUsers,
  addUser
}

: 위 코드에서 user-service.js는 비즈니스 로직을, user-respository.js에서는 데이터를 정의하고 있다

: service가 특정 repository와 연결되어 있어 다른 repository를 연결한다면 비즈니스 로직까지 변경해야한다

: 게다가 jest를 통해 테스트를 한다고 할대 userRepository에 Mocking된 객체를 만들어줘야한다

 

- 개선

//users-service.js
const User = require('./User');

function UsersService(usersRepository) { // 매개 변수로 넘긴다.
  async function getUsers() {
    return usersRepository.findAll();
  }

  async function addUser(userData) {
    const user = new User(userData);

    return usersRepository.addUser(user);
  }

  return {
    getUsers,
    addUser
  };
}

module.exports = UsersService

: repository를 매개변수로 받아서 repository에 상관없이 코드를 실행할 수 있다

: 즉, user-service는 repository와 결합되어있지 않은 상태이다

 

 

 

 

 

 

 

 

Reference

 

[Design Pattern] DI란 (Dependency Injection) - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

[node.js] DI(의존성 주입) 구현하기

DI (Dependency Injection) 의존성 주입(DI)는 잘 알려진 기술이다. IoC 컨테이너를 이용한 DI는 여러 모듈의 확장성과 독립성에 큰 도움을 준다. 특히 Spring에서 Java Bean을 이용하여 DI를 구현하는 것이 국

charming-kyu.tistory.com

 

300x250
728x90