노드심화 5-5

·2022년 12월 29일
0

study

목록 보기
45/81
post-thumbnail

Layered Architecture Pattern 테스트 코드 (2)

Sequelize Model 의존성 주입하기 (DI: Dependency Injection)

의존성 주입(DI: Dependency Injection)이란 객체들간의 의존성을 사용하려는 객체로 전달하려는 것을 의미합니다.
즉, 하나의 객체가 다른 객체에게 의존성을 제공하는 방법입니다.

단위 테스트(UnitTest) 코드를 작성할 때, Repository Layer의 경우 DB를 Mocking하여 실제 DB에 접근하지 않고 테스트 코드를 수행할 수 있어야합니다.

DB Mocking 위해 필요한 전 단계

현재 코드는 PostRepository 클래스가 Posts 모델을 가져와 findAllPost Method에서 바로 사용 => Mocking하기 어려운 상태!!

PostRepository 클래스에서 사용하는 Posts 모델을 모듈에서 가져와 바로 사용하는 것이 아닌, 외부에서 해당하는 모델을 주입하도록 변경하여야합니다.

이런 행위를 의존성 주입(DI: Dependency Injection)이라고 합니다.

저희는 의존성 주입을 구현하기 위한 여러가지의 방법 중 생성자 주입(Constructor Injection)을 이용하여 의존성을 주입하도록 하겠습니다.

  • 생성자 주입(Constructor Injection)의 경우 객체의 생성자(Constructor)를 호출할 때, 의존성을 전달하여 해당하는 객체는 전달받은 의존성을 이용해 코드를 실행하는 것을 말합니다.

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이 가능해짐!!

profile
개발자 꿈나무

0개의 댓글