의존성 주입
| 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
이렇게 인자로 외부의 값을받는게아니라 초기에 지정을해도 의존성 주입이라고 하나??