의존성 주입

topics 700-컴퓨터과학
types 실습

https://blog.deercorp.com/frontend-unit-test-you-must-write/

메인 모듈(클래스) - 의존성 주입자 - 하위 모듈

원칙 : 상위 모듈은 하위모둘의 것을 가져오면 안된다. 추상화에 의존해야한다. 이때 세부사항에 의존하지 말아야한다.

의존성을 인자로 전달해준다.

장점 : 위에 직접 메인 모듈이 의존성을 주는 것 보다 의존성이 떨어짐 (= 디커플링된다).

단점 : 클래스 수 증가로 복잡도가 늘어날 수 있음. 약간의 런타임 시간증가를 일으킴.

일반적인 예시

https://mangkyu.tistory.com/150
이예시가 더맘에듬. 참고.
https://velog.io/@moongq/Dependency-Injection

의존성 주입되기 전
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
}
의존성 주입 후
const User = require('./User');

function UsersService(usersRepository) { // check here
  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

//사용법
const usersService = new UsersService(usersRepository);

클래스를 쓸 경우

class UsersService {
  constructor({ usersRepository, mailer, logger }) {
    this.usersRepository = usersRepository;
    this.mailer = mailer;
    this.logger = logger;
  }

  async findAll() {
    return this.usersRepository.findAll();
  }

  async addUser(user) {
    await this.usersRepository.addUser(user);
    this.logger.info(`User created: ${user}`);
    await this.mailer.sendConfirmationLink(user);
    this.logger.info(`Confirmation link sent: ${user}`);
  }
}

module.exports = UsersService;

const usersService = new UsersService({
  usersRepository,
  mailer,
  logger
});
싱글톤에서의 의존성 주입
class Singleton {
    constructor(dependency) {
        if (Singleton.instance) {
            return Singleton.instance;
        }
        Singleton.instance = this;
        this.dependency = dependency;
    }

    doSomething() {
        this.dependency.doSomething();
    }
}
질문

https://medium.com/@su_bak/design-pattern-dependency-injection-%EC%9D%B4%EB%9E%80-8403c62a225c
이렇게 인자로 외부의 값을받는게아니라 초기에 지정을해도 의존성 주입이라고 하나??