NestJS와 GraphQL : 도입 배경과 기본 개념 #1

Hyeongyeom
tesser-team
Published in
8 min readMar 13, 2023

--

안녕하세요. 테서의 서비스 개발 팀에서 백엔드 직무를 맡고 있는 최현겸입니다.

이번 포스팅에서는 현재 테서에서 사용하고 있는 기술 스택 중 NestJSGraphQL에 대해 소개하고자 합니다. NestJS와 GraphQL은 Node.js 기반의 프레임워크와 API 쿼리 언어로서, 두 기술 모두 인기가 높아지고 있습니다.

저희 개발팀에서 어떻게 이 두 기술을 도입하게 되었는지, 그리고 이 두 기술의 현황에 대해 알아보려고 합니다.

들어가며

왜 초기 스타트업들은 Java가 아닌 Node.js를 선택할까요? 그 이유는 바로 Node.js의 강력한 생산성 덕분입니다.

국내 프로그래밍 언어의 점유율 부동의 1등을 지키고 있는 언어는 바로 Java입니다. 그럼에도 몇몇 스타트업들은 자바가 아닌 Node.js를 선택하고 있습니다. 그 이유는 Node.js가 Java에 비해 단일 스레드, 비동기식 I/O를 통해 높은 성능, 가벼운 메모리 사용량, 빠른 속도 등 특정 부분에서 우수하기 때문입니다.

또한, Node.js의 비동기식 I/O 모델은 대용량 데이터 처리와 같은 작업에서 우수한 성능을 보입니다.이벤트 기반 아키텍처를 사용하기 때문에, 비동기식 코드를 작성하여 멀티 스레드 대신 단일 스레드에서도 높은 처리량을 달성할 수 있습니다. 그 중에서도 가장 큰 장점을 가지는 것은 생산성입니다.

Node.js로 서버를 구축하는 대표적인 기업 중 하나는 페이팔입니다. PayPal의 기술 블로그에서 자바를 사용하던 웹 애플리케이션을 자바스크립트와 Node.js로 교체했을 때 다음과 같은 이점이 있다고 서술했습니다.

  • 더 적은 인력으로 약 두 배 빠르게 구축
  • 33% 더 적은 코드 라인으로 작성
  • 40% 더 적은 파일로 구성

일반적으로 스타트업에서는 비교적 적은 인원으로 시스템을 개발합니다. 따라서, 개발 언어의 고려 요소 중 생산성 측면이 매우 중요합니다. 이런 관점에서, 스타트업들은 노드의 개발 속도와 성능을 활용하여 빠르게 서비스를 출시하고, 사용자 수가 증가할 때 쉽게 확장할 수 있는 유연한 인프라를 구축할 수 있는 노드를 선호하지 않을까 생각합니다.

NestJS와 GraphQL의 도입 배경

ExpressJS vs NestJS

출처: linearloop

저희 팀은 자유도가 높고 안정적인 ExpressJS 가 아닌 NestJS를 선택했습니다. 지금부터 저희 팀이 Express가 아닌 NestJS를 선택한 이유를 하나씩 살펴보겠습니다.

Express는 Node.js에서 가장 대표적인 웹 프레임워크 중 하나입니다. 다양한 플러그인, 미들웨어, 라이브러리, 도구 등이 존재하여 필요한 모듈을 선택해 쉽게 구축할 수 있습니다. 또한, 생태계가 넓고 활발하기 때문에 대부분의 문제에 대한 솔루션을 찾을 수 있습니다. 특히, Express의 자유로운 구조는 개발자들이 필요에 따라 유연하게 코드를 작성할 수 있도록 도와줍니다.

하지만 자유도가 높은 대신 프로젝트 규모가 커질수록 확장성, 유지보수, 커뮤니케이션 측면에서 저희 팀의 개발 방식과 맞지 않다고 판단했습니다.

NestJS는 위에서 언급한 ExpressJS의 단점을 극복하기 위해 나온 프레임워크입니다. 아래의 NestJS 공식 홈페이지에서 발췌한 글을 보면 NestJS의 장점을 엿볼 수 있습니다.

Nest는 개발자와 팀이 테스트 가능하고 확장이 가능하며, 느슨한 결합과 유지보수성이 뛰어난 애플리케이션을 만들 수 있도록 아키텍처를 제공합니다. 이 아키텍처는 Angular(느슨한 결합과 뛰어난 확장성을 가짐)에서 영감을 받았습니다.

NestJS는 Express.js의 강점을 그대로 유지하면서도, 다음과 같이 3가지 측면에서 ExpressJS의 단점을 보완하였습니다.

특히, NestJS는 타입스크립트를 기본 언어로 채택하고 있습니다. 이로 인해 타입 안정성과 코드 일관성을 높일 수 있는 장점이 있습니다. 저희 팀은 ExpressJS의 자유도 보다는 구조화된 NestJS 의 장점을 가져가고자 하였습니다.

REST API vs GraphQL

저희 회사는 다양한 클라이언트 요구사항에 대처하기 위해 GraphQL를 선택했습니다. REST API는 간단하고 직관적인 구조를 가지고 있어 사용하기 편리하고 비교적 쉽게 API 를 구현하고 사용할 수 있습니다.

예를 들어 /users ,/pets ,/market는 사용자, 애완동물, 상품과 관련된 정보를 제공하는 엔드포인트입니다. 각각의 엔드포인트가 무엇을 요구하는지 바로 알 수 있을 만큼 직관적입니다. 엔드포인트(URI)와 HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 간단하게 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있습니다.

하지만 이 접근 방식의 단점은 UI가 변경되어 이전보다 더 많은(또는 더 적은) 데이터가 필요하거나 혹은 다른 클라이언트에서 환경에서 같은 엔드포인트를 사용하고자 할 때 문제가 생깁니다. REST API의 단점으로 많이 거론되는 바로 ‘오버패칭’과 ‘언더패칭’ 문제입니다. 오버패칭이란 필요한 정보 외에도 불필요한 정보까지 받게 되는 것을 말합니다. 언더패칭이란 반대로 필요한 정보를 서버에서 가져오지 못해 추가 요청을 해야 하는 경우를 말합니다.

이에 따라 새로운 데이터 요구 사항을 고려하여 백엔드도 조정해야 하므로 비생산적이며 개발 프로세스가 느려질 수 있습니다.

출처: cosmic blog

위 사진은 한 Person에 대한 필요한 정보를 가져오는 방법의 차이를 보여줍니다. 비교된 사진을 보면, GraphQL은 서버에서 추가 작업 없이 클라이언트 측에서 변경하여 필요한 정보만 가져올 수 있습니다. 클라이언트가 정확한 데이터 요구 사항을 지정할 수 있으므로 프론트엔드에서 디자인 및 데이터가 변경되어야 할 때 백엔드 조정이 필요하지 않습니다.

하지만 저희 회사는 웹 서비스를 제공하는 스타트업으로서, 빠르고 효율적인 서버 개발이 필수적입니다. 특히 회사에서는 모바일, 웹, 데스크톱 등 다양한 클라이언트 환경에서 동일한 API 서버를 사용해야 하는 경우가 많습니다. 그렇기 때문에 저희는 이러한 오버패칭과 언더패칭 문제를 해결하고 GraphQL의 유연한 특성 때문에 GraphQL을 선택하게 되었습니다.

NestJS와 GraphQL의 현황

출처: star-history

위 사진은 NestJS와 GraphQL 의 각각 GitHub Stars 수의 추세 그래프입니다. Github Stars 만을 가지고 완전히 신뢰할 수는 없지만 분명 갈수록 NestJS와 GraphQL의 인기가 높아진 다는 것을 확인할 수 있습니다.

출처: npm trends

이와 마찬가지로 NestJS와 Graphql 통합 모듈인 @nestjs/graphql 패키지의 설치 수를 보면 분명 상승 추세임을 확인할 수 있습니다. 현재는 NestJS 또는 GraphQL을 많은 기업과 스타트업에서 도입하여 사용하고 있습니다. 국내에는 NestJS를 토스, 당근 마켓, 인프런 등 여러 스타트업 회사에서 MSA 방식으로 도입했습니다. 채용 사이트 NodeJS 개발자 구인 공고를 보면 기술 스택으로 NestJS와 GraphQL 키워드가 전보다 훨씬 많아진 것을 확인할 수 있습니다.

NestJS와 GraphQL이 현재 많은 개발자들과 기업들에게 주목받고 있으며, 이에 따라 블로그 글, 학습 강의, 도서 등이 많아지고 있습니다. NestJS를 사용하려는 개발자들의 수요는 더욱 높아질 전망이며, 앞으로 더 많은 기업들이 채택해 활용할 것으로 예상됩니다.

마치며

NestJS는 꾸준히 발전하고 있습니다. 한 달 전 version 10.2.0을 릴리즈하였고, npm registry와 github에서도 활발한 업데이트와 활동이 이루어지고 있습니다. 다양한 개발자들이 컨트리뷰션을 하고 있습니다. GraphQL의 미래에 대해서는 다양한 의견이 있지만, 대체로 긍정적으로 평가되고 있습니다. 현재는 Facebook에서 주도하여 개발하고 있지만, 오픈 소스로 공개되어 있기 때문에 전 세계적으로 커뮤니티에서 기여하고 있습니다.

저희 개발 팀은 NestJS와 GraphQL의 장점을 효율적으로 활용할 수 있도록 노력하고 있습니다. 인기 있는 최신 기술로 소개되는 NestJS와 GraphQL이 앞으로도 지속해서 발전하여 우리 회사에서 더 안정적인 서비스 개발이 이루어졌으면 합니다.

이번 포스팅에서는 저희 회사의 기술 스택으로 NestJS와 GraphQL을 도입하게 된 배경 그리고 간단하게 NestJS와 GraphQL의 현황에 대해 살펴봤습니다. 2편으로는 NestJS와 GraphQL의 주요 개념에 대해 살펴보겠습니다.

--

--