BackEnd/Nest.js

[Nest.js] Get Started

Grace 2023. 4. 27. 17:29

NestJS의 장점

NestJS는 Node.js에 기반을 둔 웹 API 프레임워크로서 Express 또는 fastify 프레임워크를 래핑하여 동작합니다. Express와 Fastify는 모두 Node.js를 쉽게 사용하기 위해 만들어진 프레임워크입니다. NestJS는 Express를 사용하는데, 이러한 이유는 Express가 가장 널리 사용되고 있고 수 많은 미들웨어가 호환되기 때문입니다.

Node.js는 손쉽게 사용할 수 있고 뛰어난 확장성을 가지고 있지만, 과도한 유연함으로 인해 프로젝트의 품질이 일정하지 않고 알맞은 라이브러리를 찾기 위해 사용자가 많은 시간을 할애해야 합니다. 이에 반해 NestJs는 데이터베이스, 객체 관계매핑(ORM) 설정, 유효성 검사 등 수많은 기능을 기본 제공합니다. 그러면서도 필요한 라이브러리르 쉽게 설치하여 기능을 확장할 수 있습니다.

NestJS는 앵귤러로부터 영향을 받아 모듈/컴포넌트 기반으로 프로그램을 작성함으로써 재사용성을 높입니다. 또 제어 반전, 의존성 주입, 관점 지향 프로그래밍 같은 객체 지향 개념을 도입했습니다. 프로그래밍 언어는 타입스크립트를 기본으로 채택하여 타입스크립트가 가진 타입 시스템의 장점을 누릴 수 있습니다.

유저 서비스

모든 웹 애플리케이션의 필수 기능이라고 할 수 있는 유저 서비스를 만들면서 공부할 예정입니다.

유저 서비스는 다음과 같은 기능을 제공해야 합니다.

  • 회원가입 화면을 통해 유저 정보(이메일, 이름, 패스워드)를 입력받아 신규 회원 가입 처리를 수행하고 회원 정보를 데이터베이스에 저장합니다. 유저는 ‘가입 준비’ 단계에 있게 됩니다.
  • 회원 가입 과정에서 입력받은 이메일로 회원 가입 이메일을 전송합니다. 유저는 이메일을 확인하고 회원 가입 인증을 요청합니다. 이메일 본문에는 회원 가입 검증 요청 링크가 포함되어 있습니다. 이 링크를 통해 회원 가입 인증 요청이 들어오면 가입 준비 단계에서 승인 완료 상태로 변경됩니다. 이때 이메일 인증의 응답으로 바로 액세스 토큰을 전달하여 로그인 상태로 바꿉니다.
  • 회원 가입이 완료된 사용자가 이메일과 비밀번호로 로그인 요청을 보낼 경우 이를 처리합니다. 로그인 기능은 사실 사용자 에이전트에 액세스 토큰을 발급하는 일입니다.
  • 로그인한 사용자는 자신의 정보를 조회할 수 있습니다.

아래는 주 기능을 제외한 부가적으로 구현해야 하는 기능입니다.

  • 환경 변수 설정: 서버는 여러 환경에서 실행됩니다. 개발자의 로컬 개발 환경, 개발된 기능을 실제 사용자에게 배포하기 전에 테스트용 서버에 배포하는 스테이지 환경, 그리고 실제 운영하는 프로덕션 환경으로 보통 구성합니다. 각 환경에서 사용되는 변수가 달라지는 것들이 있다면 환경 변수를 다르게 구성할 수 있어야 합니다.
  • 요청 유효성 검사: 프론트에서 들어오는 요청은 잘못된 값을 가지는 경우가 빈번합니다. 사용자가 값을 잘못입력하기도 하고 프론트에서 걸러지지 않은 잘못된 값이 유입되는 경우도 있습니다. 이 경우 서버에서는 핵심 로직을 수행하기 전에, 값이 제대로 전달되었는지 판단하여 잘못 전달된 경우라면 400 Bad Request 에러로 응답해야 합니다.
  • 인증: 사용자의 리소스에 접근하기 위해서는 권한이 필요하고 로그인 과정을 거쳐야 합니다. 로그인을 거친 유저는 요청마다 로그인을 할 필요는 없고 인증 과정을 거친 다음 후속 동작을 수행할 수 있습니다. 인증을 처리하는 방법은 여러 가지가 있지만, JWT를 이용하는 방식을 사용할 예정입니다.
  • 로깅: 서버를 운용하기 위해서는 로그를 잘 기록해야 합니다. 특히 이슈가 발생했을 때 원인을 빠르고 정확하게 파악하는 데에 로그는 매우 유용하게 사용됩니다. 사내 사용자가 무슨 동작을 수행했는지 감사 로그를 남겨 외부에 기록을 제출해야 하는 경우도 있습니다.
  • 헬스 체크: 서버의 심장이 잘 뛰고 있는지, 즉 서버의 상태가 양호한지 주기적으로 검사합니다. 만약 서버 상태가 좋지 않다면 경고를 울려서 개발자가 빠르게 대응할 수 있게 방안을 마련해야 합니다.
  • CQRS: 복잡한 소프트웨어를 만들다 보면 소스 코드가 얽히게 되는 경우가 생깁니다. 예를 들어 데이터베이스에 변형을 가하는 명령과 데이터 읽기 요청을 처리하는 조회 로직을 분리함으로써 성능, 확장성, 보안을 강화할 수 있습니다.
  • 클린 아키텍처: 소프트웨어의 계층을 분리하고 저수준의 계층을 고수준의 계층에 의존하도록 합니다. 의존의 방향이 바뀌는 경우가 있다면, 의존관계 역전 원칙을 활용하여 안정적인 소프트웨어를 작성할 수 있어야 합니다.
  • 단위 테스트: 소프트웨어의 변경이 생긴다면 반드시 테스트를 해야 합니다. 단위 테스트는 유저의 입장에서 수행하는 테스트가 아닌 개발자가 테스트 코드를 이용하여 수행하는 최소 단위의 테스트 기법입니다. 내가 만든 코드 조각이 동작하는 조건을 기술하고, 주어진 입력에 대해 원하는 결과가 나오는지 검사합니다.

'BackEnd > Nest.js' 카테고리의 다른 글

[Nest.js] 파이프와 유효성 검사  (0) 2023.05.16
[Nest.js] Config 패키지  (0) 2023.05.16
[Nest.js] 프로바이더  (0) 2023.05.16
[Nest.js] 인터페이스  (0) 2023.05.08
[Nest.js] 백엔드 개발 기본 지식  (0) 2023.04.27