[Nest.js] Layerd Architecture ( 계층화 구조 ) 는 무엇이고 왜 사용할까?
🐳 왜 Nest.js의 구조를 알아야 하는가
뭐든지 새로운 것을 배울 때는 그 기술들이 왜 나오고 어떤 메커니즘으로 동작하는지 아는 것이 가장 중요하다.
특히나 Nest.js는 다른 node.js 프레임워크에는 없는 Architecture 문제를 해결하기 위해 만들어진 프레임워크인 만큼 구조를 이해하는 것이 중요하다.
그런 의미에서 Nest.js의 동작 구조가 어떻게 되는지 한 번 알아보자
🐳 Nest.js의 구성요소
- Module : 어플리케이션의 기능 또는 기술 등으로 조직화한 것으로 Provider, Service, Controller, Repository 등으로 구성되어 있다. Nest.js의 기본 구성요소이다.
- Provider : 의존성을 주입하는 개념으로 Provider에는 Service, Repository 등이 있다. @Injectable() 데코레이터를 통해 구현한다.
- Services : 비즈니스 로직을 캡슐화 하는 레이어로 데이터를 가공하고 외부의 API와 통신한다. Controller에게 request를 받아 처리 결과를 다시 Controller에게 보낸다.
- Controller : Client에게 request를 받아 Server에게 전달한다. 즉 요청을 받아 올바른 Service에게 요청을 전달하는 Router 같은 역할을 한다.
- Repository : Service에서 DB에 접근해도 되지만 DB와 통신해야 하는 경우 한 번의 추상화를 더 거치기 위해 Repository를 만들기도 한다. 즉 비즈니스 로직과 데이터 액세스 부분을 분리한다는 것이다. Repository를 만듦으로써 데이터 액세스를 일관되게 할 수 있고, 테스트하기 더 쉬운 구조로 만들 수 있다. 그리고 추상화 과정을 거치는 것이므로 당연하게도 확장성과 코드 재사용성이 높아진다.
🐳 Nest.js의 동작 구조도
위의 그림은 내가 이해한 Nest.js의 구조이다.
1. Client가 request를 보낸다.
2. 알맞은 Controller에게 request를 보낸다.
3. Validation Pipe를 거쳐 데이터의 유효성 검증을 실행한다.
4. Controller는 request를 받아 알맞은 Service의 로직을 실행한다.
5. Service는 로직을 실행한다. 이 때 DB에 접근해야 하는 경우 Repository로 request를 보낸다.
6. Repository는 DB와 통신해 데이터를 가지고 오거나 데이터를 입력한다.
7. 실행 결과를 Controller에게 보낸다.
8. Controller는 Response를 Client에게 보낸다.
🐳 결론
그렇다면 왜 이런 구조를 사용하는 것일까?
개발자라면 확장성, 유지보수성, 가독성을 고려하지 않을 수 없다.
Nest.js는 위의 동작 구조처럼 크게 3가지 레이어로 나눈다.
요청을 받아서 라우팅 해주는 Controller
비즈니스 로직을 처리하는 Service
데이터 액세스를 담당하는 Repository
이렇게 레이어를 나눔으로써 각각의 단계를 추상화하여
유지보수하기 쉽고, 테스트하기 용이하고, 확장성과 재사용성이 좋은 구조를 가질 수 있게 해준다.
위의 구조를 통해서 지금 하고 있는 부분이 어떤 부분을 구현하려는 것인지. 어떤 장점이 있기 때문에 이렇게 하는 건지 이해하는데 도움이 되길 바랍니다 !
( 아직 저도 모자르지만 .. )
'Node.js > Nest.js' 카테고리의 다른 글
[Nest.js] Layered Architecture ( 계층화 구조 ) 는 무엇이고 왜 사용할까? (0) | 2023.06.24 |
---|---|
[Nest.js] Controller 라우팅 에러 (url 동적할당/ 정적할당) (0) | 2023.06.11 |
[Nest.js] Custom Repository Unit Testing (TypeORM) (0) | 2023.06.10 |
[Nest.js] Entity와 DTO의 차이점 - [Error] unnamed portal parameter (0) | 2023.06.06 |
[Nest.js] ERROR [ExceptionsHandler] invalid input syntax for type integer (0) | 2023.06.03 |