의존성 주입(DI: Dependency Injection)이란 객체들간의 의존성을 사용하려는 객체로 전달하려는 것을 의미합니다.
즉, 하나의 객체가 다른 객체에게 의존성을 제공하는 방법입니다.
단위 테스트(UnitTest) 코드를 작성할 때, Repository Layer의 경우 DB를 Mocking하여 실제 DB에 접근하지 않고 테스트 코드를 수행할 수 있어야합니다.
현재 코드는 PostRepository 클래스가 Posts 모델을 가져와 findAllPost Method에서 바로 사용 => Mocking하기 어려운 상태!!
PostRepository 클래스에서 사용하는 Posts 모델을 모듈에서 가져와 바로 사용하는 것이 아닌, 외부에서 해당하는 모델을 주입하도록 변경하여야합니다.
이런 행위를 의존성 주입(DI: Dependency Injection)이라고 합니다.
저희는 의존성 주입을 구현하기 위한 여러가지의 방법 중 생성자 주입(Constructor Injection)을 이용하여 의존성을 주입하도록 하겠습니다.
PostRepository 클래스의 생성자를 호출할 때 전달받은 PostsModel을
this.PostsModel
멤버 변수에 할당하도록 수정하고,
PostRepository 클래스의 모든 Method에서는 전역으로 가져온 Posts(Posts 모델)를 사용하지 않고this.PostsModel
을 사용하도록 코드를 수정하면 된다!
// repositories/posts.repository.js
class PostRepository {
constructor(PostsModel) {
this.postsModel = PostsModel;
}
findAllPost = async () => {
const posts = await this.postsModel.findAll();
return posts;
};
}
// services/posts.service.js
const PostRepository = require('../repositories/posts.repository');
const { Posts } = require("../models/index.js");
class PostService {
postRepository = new PostRepository(Posts);
}
Repository Layer의 테스트 코드를 작성할 때, Sequelize Model에 대한 의존성을 주입하여 원하는 객체를 가지고 테스트 코드를 사용할 수 있게 되었습니다!
Sequelize Model(Posts)대신 Mock 객체를 삽입하면 DB의 Mocking이 가능해짐!!