NestJS, TypeORM 이해하기
Table of Content
1. NestJS의 공식 문서 살펴보기
1.1 소개
NestJS?
Nest(NestJS)는 효율적이고 확장 가능한 Node.js 서버 사이드 애플리케이션을 구축하기 위한 프레임워크입니다. 점진적 JavaScript를 사용하고 TypeScript 로 빌드되어 완벽하게 지원하며 (그래도 개발자는 순수 JavaScript로 코딩할 수 있음) OOP(객체 지향 프로그래밍), FP(함수형 프로그래밍), FRP(함수형 반응형 프로그래밍)의 요소를 결합합니다.
Nest는 이러한 일반적인 Node.js 프레임워크(Express/Fastify)보다 더 높은 수준의 추상화를 제공하지만, API를 개발자에게 직접 노출합니다. 이를 통해 개발자는 기본 플랫폼에서 사용할 수 있는 수많은 타사 모듈을 자유롭게 사용할 수 있습니다.
1.2 철학
NestJS의 방향성
Nest는 개발자와 팀이 테스트하기 쉽고, 확장 가능하고, 느슨하게 결합되고, 쉽게 유지 관리할 수 있는 애플리케이션을 만들 수 있는 즉시 사용 가능한 애플리케이션 아키텍처를 제공합니다. 이 아키텍처는 Angular에서 많은 영감을 받았습니다.
2. NestJS의 기술 선택 근거
2.1 서버 프레임워크 중 높은 인지도를 가지고 있는 Node.js 기반
Node.js의 흥행, 그러나 문제점이 될 수 있는 부분도 존재
•
Node.js의 장점
◦
높은 성능을 갖고, 빠른 개발이 가능하며, 동시에 많은 연결을 다루는데 적합한 점
▪
높은 성능
•
V8 JavaScript 엔진을 기반으로 하여 매우 빠르게 JavaScript 코드를 실행
▪
빠른 개발
•
async/await, Promise와 같은 비동기 처리를 위한 문법이 기본적으로 제공되며, 이들을 통해 비동기 코드를 마치 동기 코드처럼 쉽게 작성
•
많은 기능을 제공하는 npm(Node Package Manager) 라이브러리들이 존재해, 이미 검증된 코드를 손쉽게 가져다 쓸 수 있음
▪
대규모 트래픽 특화
•
단일 스레드에서 동작하는 이벤트 루프, 비동기 I/O 작업에 특화되어 이 방식은 특히 대규모의 동시 연결을 처리할 때 유리
•
예: 파일 읽기/쓰기, 네트워크 요청 등을 수행할 때, 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 수행
•
Node.js의 단점
◦
과도한 유연함 (= 정해진 아키텍처가 없음)
▪
결과물 소프트웨어의 품질이 일정하지 않음 (=개발자마다 다른 구조로 작성될 가능성 높음)
•
아키텍처가 잘 구조화된 프로젝트 일지라도 코드 작성자 이외의 사람이 코드를 분석할 때는 아키텍처부터 파악해야 하기에 코드의 가독성이 좋지 않음
▪
알맞은 라이브러리를 찾기 위해 사용자가 많은 시간을 소모
2.2 Node.js의 장점을 그대로, 단점을 보완
기술선택의 근거 결론 요약
NestJS와 Spring은 각각 Java와 JavaScript 생태계에서 사용되는 강력한 서버 사이드 프레임워크이다. 하지만 NestJS를 선택한 근거는 다음과 같다.
•
NestJS는 TypeScript 기반의 모듈화된 구조와 비동기 처리 기능을 갖추고 있음. 팀 기획에 따라 MVP 단계부터 계속하여 모듈화된 기능을 확장해 나가는 목표에 적합한 프레임워크로 판단
•
다른 최신 프레임워크와 비교했을 때, NestJS는 그 안정성과 기능성 덕분에 주목 받고 사용되고 있는 백엔드 프레임워크 중 하나로 객체 지향 프로그래밍을 효율적으로 다룰 수 있는 기술
•
꾸준히 성장하는 커뮤니티와 함께 최신 기술 트렌드에 부합하며, 많은 개발자들이 긍정적으로 평가하고 있는 프레임워크임. 팀 내 기술 레벨 성장 속도가 초기부터 시작함에따라 방대한 Spring 생태계의 러닝커브를 극복하는 것 보다 효율적이라고 판단
단점을 극복 할 수 있는 방안 NestJS
•
NestJS는 Node.js 환경에서 동작하는 프레임워크로, Node.js를 기반으로 하고 있음
•
Node.js의 Express 위에서 구축된 프레임워크로, Express의 기능을 확장하여 보다 체계적이고 모듈화된 구조를 제공
•
NestJS는 데이터베이스, 객체 관계 매핑(ORM), 설정(구성)configuration, 유효성 검사 등 수많은 기능을 기본 제공
•
필요한 라이브러리를 쉽게 설치하여 기능을 확장할 수 있는 Node.js 장점은 그대로 활용
•
모듈/컴포넌트 기반으로 프로그램을 작성함으로써 재사용성을 높임
◦
NestJS는 사전에 모듈 구조가 정의되어 있으며 이는 데코레이터(@) 기반으로 제공되어 있어 쉽게 사용 가능
•
제어의 역전(IoC), 의존성 주입(DI), 관점 지향 프로그래밍(AOP) 같은 객체 지향 프로그래밍 개념을 도입
◦
from Angular, from Spring
▪
NestJS의 창시자인 카밀 슬리비에츠(Kamil Myśliwiec)가 Angular, Spring에서 영감을 받아 NestJS를 개발한 것으로 알려짐
▪
NestJS는 Angular의 구조와 디자인 패턴을 따르면서도, Spring의 유용한 개념들을 적용하여 개발자들이 익숙한 패턴으로 Node.js 애플리케이션을 쉽게 만들 수 있도록 설계한 것이 목적
▪
특히 MVC 디자인 패턴, 3 계층 아키텍쳐 등 프로젝트 아키텍처의 부분
▪
IoC, DI를 통한 의존성 주입을 통해 애플리케이션의 구성 요소를 보다 유연하게 교체하고 구성하는 모듈화 구조
•
역할과 기능에 집중하여 개발 할 수 있는 장점, 협업, 유지보수 → 효율
Typescript를 사용하는 장점
•
프로그래밍 언어는 타입스크립트를 기본으로 채택하여 타입스크립트가 가진 타입 시스템의 장점을 활용
◦
타입 안전성
▪
타입 시스템은 컴파일 시점에 데이터 타입을 체크하여 잘못된 타입 사용으로 인한 오류를 방지
◦
코드 가독성과 문서화
▪
함수나 변수의 데이터 타입을 명시적으로 선언하기 때문에 코드의 가독성이 높아지고, 코드 자체가 문서화의 역할
function greet(name: string): string {
return `Hello, ${name}!`;
}
TypeScript
복사
◦
자동 완성 및 코드 탐색
▪
TypeScript의 타입 시스템은 IDE(통합 개발 환경)에서 코드 자동 완성 기능을 보다 강력하게 지원
▪
IDE는 변수나 함수의 타입을 알고 있기 때문에, 적절한 메서드나 속성을 제안
효율적인 러닝커브의 극복을 위한 선택
1.
Java와 Spring의 복잡한 개념, 설정, 그리고 다양한 모듈로 인해 일부 높은 러닝 커브를 가지고 있음
•
특히, 비동기 프로그래밍에 최적화된 Node.js와는 다르게 Java의 비동기 프로그래밍은 상대적으로 복잡
•
강력한 타입 안전성과 다양한 기능을 제공하지만, 복잡한 설정과 개발 속도 측면에서 시간이 더 소요
•
각 라이브러리의 내부 구조의 러닝 커브 또한 높은 편(ex: Spring Security, AOP, Filter 등)
•
오랜 역사를 가진 만큼 강력한 커뮤니티와 광범위한 지원을 받지만 그만큼 문서 자체의 난이도, 버전별 이해도가 별도로 필요할 정도로 방대한 정보가 존재
2.
빠른 개발의 Node.js의 특징과 Spring의 구조적, 언어적인 안정성 등을 모두 활용할 수 있는 NestJS의 장점
•
TypeScript와 Node.js의 비동기 I/O 특성 덕분에 높은 개발 생산성을 제공하며, 빠른 프로토타이핑이 가능
•
NestJS CLI를 사용하여 프로젝트 구조를 빠르게 생성하고, 기본적인 설정을 자동으로 생성
•
Angular와 유사한 모듈화된 구조, Spring이 추구하는 구조화, 객체 지향 프로그래밍의 개념들을 이해하면 빠르게 접근 할 수 있는 러닝 커브
•
비교적 최근에 출현한 프레임워크로, 최신의 커뮤니티와 문서가 존재하여 접근성이 높음
•
계속해서 성장하고 있는 트렌드
3. 비동기식 이벤트 기반 아키텍처?
비동기식 이벤트 기반 아키텍처에서의 Non-blocking I/O를 지원
선요약
•
비동기식 이벤트 기반 아키텍처 = 여러 작업을 동시에 실행할 수 있는 환경을 제공
•
Non-blocking I/O = 하나의 작업이 진행될 때 다른 작업이 영향을 받지 않도록 보장
•
따라서 동시에 여러 작업이 서로 차단되지 않도록 진행되는 두가지 기술의 결합
NestJS의 기반인 Node.js는 Single-Thread 환경에서 비동기식 이벤트 기반 아키텍처를 사용하고 있으며 Non-blocking I/O를 지원하여 동시 요청을 효율적으로 처리하는 높은 성능과 효율성을 달성하는 것이 Node.js의 핵심
Non-blocking I/O 특징을 통해 서버를 구현하면, 요청이 많거나 오래 걸리는 요청이 있어도 멈추거나 요청 대기시간이 없다는 것이다. (*비동기식 이벤트 기반 아키텍처)
동기식(Synchronous) VS 비동기식(Asynchronous)
비동기식 이벤트 기반 아키텍처란?
4. 개발 환경구축
NestJS 개발 환경 구축
VSCode 설치(IDE)
Node.js 설치 환경 구축(MacOS Version)
Node.js 설치 환경 구축(Windows Version)
nvm으로 Node.js 설치(위 해결 후 공통)
npm으로 NestJS CLI 설치(위 해결 후 공통)
5. NVM vs NPM
nvm과 npm 두 용어가 나타나서 혼동될 수 있지만 풀어쓰면 명확해진다.
nvm - Node Version Manager
nvm 은 Node.js 를 설치하는 툴이라 이해하자.
Node.js 의 각 버젼을 유지하면서 시스템을 구성해야 하는 경우를 위해 사용하는 경우에 많이 이용된다. 다시말해 같은 시스템 안에서 여러 Node.js 를 사용하기 위해 버젼별로 Node.js 환경을 격리시키는 역할
우리는 Spring에서 JDK의 버전(Java version)에 종속적인것을 신경써왔었다. 이것은 NestJS는 Node.js의 버전에 종속적이라는 것을 환경 구축에서 신경써야 하는 것과 같다. NestJS는 Node.js 위에서 동작하기 때문에, NestJS의 특정 버전은 특정 Node.js 버전에 종속적이다.
npm - Node Package Manager
node에서 다양한 라이브러리를 다운로드하는 패키지 매니저로 보면 된다.
노드 패키지 매니저. 간단하게 얘기하면 npm 서비스를 통하여 Node.js 로 개발된 프로그램을(npm 패키지) 편리하게 설치, 업데이트 및 삭제를 해 주는 프로그램이다.
Node.js 를 설치하면 npm 도 같이 설치된다.
Java의 MavenCentral처럼 앞으로 우리는 다양한 라이브러리를 npm을 통해서 다운로드 받게 된다. npm에서도 다양한 라이브러리를 검색하고 다운로드 할 수 있다. NestJS CLI 또한 마찬가지 npm i -g @nestjs/cli 로 받은 것 처럼
모듈과 패키지, 라이브러리 모두 결국 함수의 집합이다. 물론 정확한 개념은 차이가 있지만 메인언어의 진영마다 통상적으로 부르는 용어의 차이가 존재하는것으로 보인다. 자바진영에서는 코드상의 동작과 관련된 개념은 대부분 메서드라는 명칭을 쓰지만 JS진영에서는 대부분 함수(function)이라고 부르는 것처럼 라이브러리나, 모듈이나 결국 특별한 기능을 하는 함수의 집합이라고 보는게 편하다.
Related Posts
Search