안녕하세요.
Hynn 입니다.
이번 포스팅에서는 의존성, dependency 이라는 개념에 대해서 간략하게 설명드리도록 하겠습니다.
이는 이후에 이어질 "Test Code" 작성시 알아야 될 개념이기때문에, 개념의 대한 이해가 된다면, 각자 독립적인 테스트 코드 작성이 가능해집니다.
====================
====================
1. 의존성은 무엇입니까?
의존성, 즉 "Dependency" 의 개념은, 하나의 구성요소를 작동하기 위해서 다른 구성요소에 의존하는 관계를 지칭합니다.
즉 만약 MVC Pattern 을 이용해서 작성한 JavaScript 파일이 존재한다고 가정해보도록 하겠습니다.
이렇게 작성하게 되면, 아래의 흐름도로 작성이 됩니다.

이렇게 작성하게 될 경우, 각각의 파일은 아래와 같은 의존성을 가지게 됩니다.
- Route : 라우터 파일은 Controller 에서 생성한 정보를 토대로 요청/응답을 처리/생성하게 됩니다. 즉 이 경우, Controller 에 의존성을 갖게 됩니다.
- Controller : 컨트롤러 파일에서는 Route 에서 요청을 받고, Service 와 통신하여 필요한 데이터를 가져오거나, 생성하거나, 업데이트 혹은 삭제를 하게 됩니다. 이 경우 에서는 Service 에 의존성을 갖게 됩니다.
- Service : 서비스 파일에서는 Application 의 동작 및 작동에 대한 기능이 포함되어 있고, 이를 수행하기 위한 데이터는 Repository 와 통신하여 데이터를 확인합니다. 이 경우 Repository 에 의존성을 갖게 됩니다.
- Repository : 레퍼지토리 파일에서는 DB 와 통신하여 데이터를 가져오거나, 생성, 삭제 및 업데이트를 수행합니다. 이 경우에는 "의존성" 을 가지고 있지 않습니다.
즉 이러한 의존성은, 결과적으로 각각의 파일이 개별적으로 잘 동작하고 있는지를 확인할 수가 없습니다.
위의 예시에서는 "Repostiroy" 만 개별 확인이 가능합니다. 다른 파일들은 각각의 의존성을 가진 코드가 올바르게 동작해야만 확인할 수 있습니다.
이는 오류가 발생시 일일히 "Console.log" 를 코드의 요소마다 배치하여 어느 단계에서 콘솔이 동작하지 않는지, 어느단계부터 실행이 되지 않는지를 파일 전체를 찾아가며 확인을 해야 합니다.
이러한 경우, 테스트 과정에서 매우 비효율적인 과정을 겪게 됩니다.
이를 개선하기 위한 방법을 여러가지 확인해볼 수 있습니다.
먼저 이러한 MVC Pattern 에서 할 수 있는 가장 간단한 방법은 아래와 같은 방법이 존재합니다.

물론 위 방법과 다른방식의 접근도 가능합니다.
이러한 방법은 Module 이라는 JavaScript 파일을 하나 생성함으로써, 각각의 서비스가 Module 에 연결을 처리합니다.
이렇게 할 경우, Module.js 의 역활은 Route,Controller, Service, Repository 를 연결됨으로서, 각각의 구성요소를 중앙집중화 하게 되고, 이는 각각의 파일이 가지고 있는 의존성(Dependency) 를 분리할 수 있습니다.
즉, 위 예시에서의 Module.js 역활은 각각의 파일의 구성요소를 가져오고, 내보냄으로서, 구성요소 자체의 코드에서 의존성을 분리함으로서, 코드가 "Module" 화가 됩니다. 이렇게 할 경우, 각각의 파일을 독립적으로 유지 및 관리, 보수가 가능합니다.
2. 실제 작성 예시보기
실제 Route,Controller, Service, Repository 의 코드는 별개의 필요가 존재하지 않아, Module 의 예시만을 작성해보겠습니다.
const mysql = require('../models');
const CommentRepository = require('./comment.repository');
const CommentService = require('./comment.service');
const CommentController = require('./comment.controller');
const Repository = new CommentRepository({mysql});
const Service = new CommentService({CommentRepository : Repository});
const Controller = new CommentController({ CommentService : Service});
// Repository Code test
// Repository.findAll().then((data)=>console.log(data));
// Service Code test
// Service.list().then((data)=>console.log(data));
//Controller Code test
// Controller.getList().then((data)=>console.log(data));
// { Key of exports Repository, Service and Controller}
module.exports = {
Repository,
Service,
Controller,
}
위의 방식이 테스트코드라고 할 수는 없을 수 있습니다.
위의 모듈의 작성 예시를 본다면, mysql 에 DB 에 접근가능한 정보를 담고, 각각의 Repository, Service, Controller 를 변수에 담습니다.
그리고 각각의 파일에서는 Class 를 이용해 작성을 완료하게 됩니다.
그리고 주석처리 한 것을 통해 각각의 파일이 동작하는지만 개별적인 확인이 가능하게 됩니다.
이렇게 되면 각각의 파일은 Module 에 집중화되고, Module 을 통해서 개별파일의 대한 문제를 확인할 수 있게 됩니다.
예시로 들었던 MVC 역시도 일종의 디자인 패턴이기도 합니다.
각각의 패턴 및 상황에 따라 다른 디자인 패턴을 적용해야 할 수 있으니 상황에 맞게 사용하시는 것을 권장드립니다.
감사합니다.
'개발공부일지 > JavaScript' 카테고리의 다른 글
JavaScript - 정적(Static) Method 에 관하여 (0) | 2023.01.11 |
---|---|
JavaScript - Class 함수 (Feat.생성자 함수/Template) (0) | 2023.01.09 |
JavaScript - Cookie 이해하기 (0) | 2023.01.04 |
JavaScript - Array Function ( ForEach, Filter, Some, map, reduce) (0) | 2022.11.22 |
JavaScript - 고차함수에 대하여 (0) | 2022.11.21 |
댓글