2024. 12. 9. 19:38ㆍBACKEND
Node.js 환경에서 API 서버를 개발 할 때 처음엔 express를 사용했었다 그 당시에는 express가 너무 자유로워서 개발자들 마다 실력차이가 심하고 보일러플레이트 마다 안티패턴이 존재하거나 상대적으로 적을 수 있다고 생각이 들었다. 그러다가 nest.js를 접하면서 spring boot와 많이 닮아있는 nest.js가 만족스러웠는데 Lalavel에 영향을 받아 비슷한 구조를 가진다고 한다.
공식문서, Chat GPT, 기타 검색을 통해 각 프레임워크에 차이가 궁금했는데 GPT의 답변이 요약과 정리가 잘 되어있다는 생각이 들었고 이해하는데 도움이 많이 된다는 생각이 들어 질문과 답변을 비루하게 나마 포스트로 남긴다.
AdonisJS 와 nest.js의 특징, 장점, 단점에 대해 설명해줘
AdonisJS와 NestJS는 모두 Node.js 기반의 백엔드 웹 프레임워크로, 개발자들이 웹 애플리케이션을 손쉽게 구축할 수 있도록 도와줍니다. 각 프레임워크의 특징, 장점, 단점을 비교해서 설명드리겠습니다.
AdonisJS
AdonisJS는 Rails에서 영감을 받아 전통적인 MVC 패턴을 채택한 Node.js 웹 프레임워크로, 개발 생산성과 일관성을 중요하게 생각합니다.
특징
- MVC 아키텍처: AdonisJS는 전통적인 Model-View-Controller (MVC) 아키텍처를 사용하여 애플리케이션 구조가 명확하고 관리하기 쉽습니다.
- ORM 내장: 프레임워크에 Lucid ORM이 내장되어 있어, 데이터베이스 상호작용을 쉽고 명료하게 수행할 수 있습니다.
- 완전한 생태계 제공: AdonisJS는 인증, 데이터베이스 관리, 이메일 서비스 등 다양한 기능을 프레임워크에 내장하고 있어 추가 패키지를 별도로 설치하지 않아도 됩니다.
- 강력한 CLI 도구: 프로젝트 설정, 모델 생성, 마이그레이션 등 여러 작업을 빠르게 처리할 수 있는 CLI 도구를 제공합니다.
장점
- 생산성: 루비 온 레일즈와 유사한 경험을 제공하기 때문에 빠른 개발이 가능하며, 내장된 도구들이 많아 추가 설정 없이도 다양한 기능을 쉽게 사용할 수 있습니다.
- 일관성: 모든 기능이 프레임워크에 통합되어 있어 코드의 일관성이 높습니다. 또한 프로젝트를 쉽게 확장할 수 있도록 구조화되어 있습니다.
- 강력한 ORM: Lucid ORM을 통해 객체지향적인 데이터베이스 관리를 할 수 있어 생산성이 높아집니다.
- 유지보수 용이: 프레임워크에서 제공하는 일관된 패턴과 내장 도구 덕분에 유지보수가 쉽습니다.
단점
- 제한된 생태계: NestJS와 같은 다른 인기 프레임워크에 비해 생태계가 작아 외부 패키지나 커뮤니티의 도움을 구하기 어려울 수 있습니다.
- 유연성 부족: 프레임워크의 설계가 고정되어 있어 유연하게 커스터마이징하거나 대체 도구와의 조합이 제한될 수 있습니다.
- 경량성 부족: 많은 기능이 기본으로 포함되어 있기 때문에 불필요한 부분을 포함하게 되면 경량성이 떨어질 수 있습니다.
NestJS
NestJS는 Angular의 철학에서 영감을 받아 타입스크립트 기반의 구조화된 아키텍처를 제공하는 Node.js 프레임워크입니다. 대규모 백엔드 애플리케이션 구축에 적합하며, 모듈화된 구조를 강조합니다.
특징
- 모듈 아키텍처: NestJS는 모든 기능을 모듈 단위로 관리하도록 하여 코드의 재사용성을 높이고, 애플리케이션을 쉽게 유지보수할 수 있게 합니다.
- 타입스크립트 기본 지원: NestJS는 타입스크립트를 기본적으로 지원하며, 이를 통해 개발 중에 타입 오류를 방지하고 코드의 안정성을 높입니다.
- 디커플링과 DI(Dependency Injection): 의존성 주입을 지원하여 코드의 디커플링을 촉진하고, 유연한 설계를 가능하게 합니다.
- 풍부한 생태계: GraphQL, WebSocket, Microservices와 같은 다양한 통합 기능을 제공하며, 외부 라이브러리와의 통합이 용이합니다.
장점
- 대규모 애플리케이션에 적합: 모듈화된 아키텍처와 의존성 주입 덕분에 대규모 애플리케이션에서 복잡한 로직을 효율적으로 관리할 수 있습니다.
- 타입 안전성: 타입스크립트를 사용함으로써 코드 작성 중에 오류를 사전에 방지할 수 있고, 유지보수 시 버그 발생 가능성을 줄일 수 있습니다.
- 유연한 아키텍처: 미들웨어, 가드, 인터셉터 등 다양한 커스터마이징이 가능하며, 소프트웨어 디자인 패턴을 효과적으로 활용할 수 있습니다.
- 풍부한 플러그인과 통합 가능성: GraphQL, REST API, WebSocket 등 다양한 기술을 지원하며 쉽게 통합할 수 있는 생태계를 갖추고 있습니다.
단점
- 학습 곡선: 모듈화, 의존성 주입, 데코레이터 등 Angular에서 영감을 받은 복잡한 구조로 인해 처음 사용하는 개발자는 학습하는 데 시간이 걸릴 수 있습니다.
- 추가 코드 요구: NestJS의 구조적인 아키텍처 덕분에 작은 기능을 구현하는 데도 추가적인 코드가 필요할 수 있으며, 초기 개발 속도가 느려질 수 있습니다.
- 타입스크립트 의존: 타입스크립트를 기본으로 사용하기 때문에 자바스크립트에 익숙한 개발자에게는 부담이 될 수 있습니다.
요약 비교
특징 AdonisJS NestJS
아키텍처 | MVC | 모듈화, DI |
언어 | 자바스크립트(타입스크립트 지원) | 타입스크립트 |
ORM | Lucid ORM 내장 | 선택적(TypeORM, Sequelize 등) |
사용 용도 | 빠른 생산성 중심의 프로젝트 | 대규모 애플리케이션 |
장점 | 생산성, 내장 도구, 일관성 | 타입 안전성, 유연한 구조, 모듈화 |
단점 | 제한된 생태계, 경량성 부족, 유연성 부족 | 학습 곡선, 초기 개발 속도, 추가 코드 |
AdonisJS는 일관된 구조와 내장된 도구들을 통해 빠른 개발을 지향하는 반면, NestJS는 유연성과 모듈화된 아키텍처를 통해 대규모 프로젝트의 확장성과 유지보수성을 중시합니다. 각각의 프레임워크는 프로젝트의 요구 사항과 개발자의 선호에 따라 선택할 수 있습니다.
adonisJS가 nest.js에 비해서 개발자들이 사용하지 않는 이유가 뭐라고 생각하니?
AdonisJS가 NestJS에 비해 개발자들이 덜 사용하는 이유는 여러 가지가 있을 수 있습니다. 이를 몇 가지 주요 요인으로 분석해 보겠습니다.
1. 커뮤니티와 생태계의 크기
- 커뮤니티의 크기와 활발함: NestJS는 빠르게 성장하는 커뮤니티를 형성했으며, 대규모 오픈소스 기여와 적극적인 지원 덕분에 더 많은 개발자들이 사용하고 있습니다. 반면, AdonisJS의 커뮤니티는 비교적 작은 편입니다. 더 많은 개발자들이 참여하고, 문제를 해결하기 위한 풍부한 리소스를 갖춘 NestJS와 비교했을 때, AdonisJS는 제한적인 커뮤니티 지원과 레퍼런스로 인해 진입 장벽이 있을 수 있습니다.
- 라이브러리와 플러그인: NestJS는 다양한 통합 기능을 지원하고 있으며, 인기 있는 Node.js 라이브러리들과도 쉽게 호환됩니다. 반면, AdonisJS는 기본 기능들이 많이 포함되어 있어 필요한 도구를 쉽게 사용할 수 있지만, NestJS만큼의 플러그인 생태계와 확장성을 제공하지 못합니다. 개발자들은 더 풍부한 생태계와 플러그인을 선호하기 때문에 NestJS를 선택할 가능성이 높습니다.
2. 유연성과 확장성
- 아키텍처의 유연성: NestJS는 DI(Dependency Injection), 모듈 아키텍처, 가드, 인터셉터 등과 같은 다양한 디자인 패턴을 제공하며, 대규모 프로젝트에서의 유연성과 확장성을 고려해 설계되었습니다. 이는 대규모 애플리케이션을 개발하거나 팀 프로젝트에서 역할을 나눌 때 더 좋은 장점으로 작용합니다.
- 제약된 구조: AdonisJS는 Rails와 유사한 정형화된 구조를 따르며, 개발자가 프레임워크의 규칙에 맞춰야 하는 부분이 많습니다. 이로 인해 작고 빠르게 개발되는 프로젝트에서는 생산적이지만, 더 복잡한 시스템을 설계하려고 할 때 유연성이 떨어질 수 있습니다. 다양한 아키텍처를 고려하는 경우 개발자들은 NestJS의 유연한 구조를 더 선호할 수 있습니다.
3. 타입스크립트 지원
- 타입스크립트 선호: NestJS는 타입스크립트를 기본으로 사용하도록 설계되었습니다. 타입스크립트는 코드의 안정성을 높이고, 더 나은 개발자 경험을 제공하기 때문에 많은 기업과 개발자들이 선호하고 있습니다. 타입 안전성을 제공하는 NestJS 덕분에 오류를 미리 예방하고 유지보수가 쉬워지며, 이는 팀 개발 환경에서도 큰 장점으로 작용합니다.
- 타입스크립트와의 통합성: AdonisJS도 타입스크립트를 지원하지만, 처음부터 타입스크립트 기반으로 설계된 것이 아니기 때문에 완벽한 통합성에서 약간의 부족함이 있을 수 있습니다. 타입스크립트를 기본으로 선택하는 트렌드에 맞춰서 개발자들은 NestJS를 더 선호하게 됩니다.
4. 사용성과 학습 곡선
- 학습 곡선: AdonisJS는 간결하고 생산성을 높이기 위한 구조 덕분에 초반 학습이 쉬운 편입니다. 그러나 대규모 프로젝트에 대한 경험이 부족한 개발자들이 복잡한 요구 사항을 다룰 때는 오히려 제약이 될 수 있습니다. 반면, NestJS는 처음 학습할 때는 약간의 학습 곡선이 있지만, 타입스크립트와 객체 지향 프로그래밍, Angular 스타일의 모듈화 등이 익숙해지면 복잡한 요구 사항을 처리하는 데 더 강력한 기능을 제공합니다.
- 일관된 경험 부족: AdonisJS는 특정 방식으로 개발하도록 고정된 구조를 사용하여 개발자에게 일관성을 제공합니다. 그러나 다양한 방식으로 시스템을 구축하려는 개발자들에게는 이러한 제약이 불편하게 느껴질 수 있습니다. NestJS는 개발자가 프로젝트의 요구 사항에 맞춰 자유롭게 구조를 변경하고 커스터마이징할 수 있도록 돕기 때문에 더 유연한 개발 경험을 제공합니다.
5. 기업 및 프로젝트 도입 사례
- 엔터프라이즈 도입 사례: NestJS는 기업 환경에서 더 많이 채택되어 왔으며, 특히 대규모 애플리케이션을 개발하는 데 필요한 아키텍처와 기능을 갖추고 있습니다. 기업에서 많이 사용되는 프레임워크는 그만큼 커뮤니티 지원도 활발하고 실무 사례도 많기 때문에, 개발자들이 선택할 때 더 신뢰할 수 있는 선택지가 됩니다.
- 스타트업과 소규모 프로젝트: AdonisJS는 초기 설정이 간편하고 개발 속도가 빨라 소규모 프로젝트나 MVP에 적합합니다. 하지만 대기업이나 엔터프라이즈 환경에서의 도입 사례가 상대적으로 적기 때문에 대규모 시스템을 설계하려는 팀에서는 NestJS를 더 많이 선택하는 경향이 있습니다.
결론
AdonisJS는 사용하기 쉬운 구조와 높은 생산성 덕분에 소규모 프로젝트나 빠르게 시작해야 하는 경우에 적합하지만, 상대적으로 작은 커뮤니티와 제한된 유연성, 타입스크립트와의 통합 부족 등이 단점으로 작용하여 개발자들이 NestJS에 비해 덜 사용하는 경향이 있습니다. 반면, NestJS는 대규모 프로젝트를 위한 확장성과 모듈화된 구조, 타입스크립트 지원, 활발한 커뮤니티 덕분에 많은 개발자들이 선호하게 되었습니다. 각 프레임워크의 특성을 고려하여 개발자는 자신의 프로젝트 요구 사항에 맞는 프레임워크를 선택하는 것이 중요합니다.
nest.js가 확장성이 adosJS에 비해 비교적 확장성과 유연성이 좋다고 했는데 어떤 상황에서 그런 특징이 발휘되는지 예를 들어줘
NestJS의 확장성과 유연성이 AdonisJS에 비해 더 잘 발휘되는 상황을 몇 가지 예시를 통해 설명하겠습니다. NestJS는 주로 대규모 애플리케이션을 개발하거나 복잡한 요구 사항을 처리해야 할 때 그 강점이 잘 드러납니다.
1. 대규모 모듈화된 시스템 개발
NestJS는 모듈 기반 아키텍처를 채택하고 있어, 대규모 시스템을 여러 기능별 모듈로 나눠 관리하기가 쉽습니다. 예를 들어, 대형 전자상거래 시스템을 구축한다고 가정해 봅시다. 이 시스템에는 사용자 관리, 주문 관리, 상품 관리, 결제 등 여러 기능이 존재합니다.
- NestJS에서는 각 기능을 모듈 단위로 구분할 수 있습니다. 예를 들어, UserModule, OrderModule, ProductModule, PaymentModule과 같이 각각의 모듈을 독립적으로 정의하여 관리할 수 있습니다. 각 모듈은 서로 독립적이며 필요한 경우 서로 의존성을 주입받아 사용할 수 있어 코드의 재사용성과 유지보수가 쉬워집니다.
- 이러한 모듈 구조 덕분에 팀이 기능별로 나누어 개발하는 데 용이하며, 팀원이 새로운 기능을 추가하거나 유지보수할 때 다른 모듈에 영향을 미치지 않도록 설계할 수 있습니다. 반면 AdonisJS는 전통적인 MVC 구조를 사용하기 때문에 기능별로 나누어 개발할 수는 있지만, NestJS만큼 모듈 단위로 관리하거나 의존성을 주입하는 부분에서의 유연함은 부족할 수 있습니다.
2. 의존성 주입(Dependency Injection)을 통한 확장성
NestJS는 **의존성 주입(Dependency Injection, DI)**을 기본적으로 지원합니다. 이를 통해 다양한 객체 간의 관계를 유연하게 관리할 수 있으며, 여러 객체의 생성을 프레임워크가 책임져 줍니다.
- 예시: 다국어 지원
I18nService는 필요할 때 다른 모듈에서 주입 받아 사용합니다. 이를 통해 코드 중복 없이 각 모듈에서 동일한 서비스를 사용할 수 있습니다.import { Injectable } from '@nestjs/common'; @Injectable() export class I18nService { translate(key: string): string { // 다국어 번역 로직 } }
- 반면 AdonisJS는 의존성 주입 개념이 내장되어 있지 않기 때문에, 서비스나 공통 기능을 모듈이나 클래스 간에 재사용하려면 직접 인스턴스를 생성하거나 특정 구조에 맞춰야 하는 제약이 있을 수 있습니다. 이는 코드 관리나 테스트 시 불편함을 초래할 수 있습니다.
- 다국어 지원 기능을 추가하려면 다국어 서비스가 여러 모듈에서 공통으로 필요할 수 있습니다. 이때 NestJS에서는 다국어 서비스를 I18nService와 같은 형식으로 작성하고 이를 각 모듈에 쉽게 주입할 수 있습니다.
3. 미들웨어와 인터셉터, 가드를 통한 요청 처리의 유연성
NestJS는 미들웨어, 인터셉터, 가드 등의 기능을 제공하여 HTTP 요청/응답 흐름을 더욱 세밀하게 제어할 수 있습니다.
- 미들웨어: 특정 경로에 대해 요청이 들어오기 전에 실행되어야 하는 공통 로직을 작성할 수 있습니다. 예를 들어, 사용자 인증 미들웨어를 통해 특정 경로에 대한 요청을 필터링할 수 있습니다.
- 가드(Guards): 특정 요청이 컨트롤러에 도달하기 전에 실행되며, 사용자가 특정 권한을 가지고 있는지 확인하는 등의 인증 및 권한 부여 로직을 처리하는 데 사용됩니다.위와 같은 가드를 사용하면 특정 컨트롤러나 경로에 대해 관리자만 접근할 수 있도록 제한할 수 있습니다. NestJS는 이러한 구조를 통해 보안 로직을 재사용하고, 유연하게 설정할 수 있습니다.
- 반면 AdonisJS도 미들웨어를 지원하지만, 인터셉터나 가드와 같은 세밀한 요청 흐름 제어를 지원하지는 않습니다. 이는 복잡한 인증이나 권한 부여 로직을 구현할 때 유연성이 부족하게 느껴질 수 있습니다.
- import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; @Injectable() export class RolesGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); const user = request.user; return user && user.roles.includes('admin'); } }
4. 멀티 프로토콜 지원 및 확장성
NestJS는 다양한 프로토콜을 지원하며, REST API뿐만 아니라 GraphQL, gRPC, WebSocket, Microservices 등도 쉽게 구현할 수 있습니다.
- 예시: 마이크로서비스 아키텍처 대규모 애플리케이션에서 서비스 간의 통신을 위해 마이크로서비스 아키텍처를 도입하려는 경우, NestJS는 마이크로서비스 모듈을 쉽게 추가하여 메시지 브로커를 사용한 비동기 통신을 지원합니다. 위 예시는 RabbitMQ와 같은 메시지 브로커를 사용하여 요청을 처리하는 예시로, NestJS는 마이크로서비스 구축에 필요한 기능들을 손쉽게 지원합니다. 반면 AdonisJS는 주로 REST API와 관련된 기능에 집중하고 있어, 마이크로서비스 아키텍처와 같은 확장성을 제공하는 데에는 제한이 있을 수 있습니다.
- import { Controller } from '@nestjs/common'; import { MessagePattern } from '@nestjs/microservices'; @Controller() export class MathController { @MessagePattern('add') add(data: number[]): number { return data.reduce((a, b) => a + b); } }
5. 테스트 코드 작성의 용이성
NestJS는 테스트 코드 작성에 매우 유리한 구조를 제공합니다. 의존성 주입을 통해 각 컴포넌트를 독립적으로 테스트할 수 있으며, 유닛 테스트와 통합 테스트를 쉽게 작성할 수 있는 환경을 제공합니다.
- 모킹(Mock)과 의존성 주입반면 AdonisJS는 이러한 테스트 환경 구축에 있어 NestJS만큼 유연한 테스트 도구나 지원을 제공하지 않기 때문에, 대규모 프로젝트에서 테스트 코드를 관리하는 것이 더 어렵고 복잡해질 수 있습니다.
- NestJS의 모듈 기반 구조는 **모킹(Mock)**을 사용하여 특정 의존성을 가짜로 만들어 테스트할 수 있습니다. 예를 들어, UserService가 DatabaseService에 의존한다고 할 때, 테스트 환경에서는 DatabaseService를 가짜로 만들어 실제 데이터베이스에 접근하지 않고 테스트할 수 있습니다.
요약
NestJS는 대규모 애플리케이션에서 확장성과 유연성을 극대화하기 위한 다양한 도구와 설계 패턴을 제공합니다. 모듈화된 구조, 의존성 주입, 미들웨어, 인터셉터, 가드, 멀티 프로토콜 지원 등은 복잡한 비즈니스 로직을 다루고 대규모 팀 개발이 필요한 상황에서 그 진가를 발휘합니다. 반면 AdonisJS는 빠르게 개발하고 생산성을 높이는 데 적합하지만, 복잡하고 확장성이 필요한 상황에서는 상대적으로 유연성이 떨어질 수 있습니다.
nest.js에서는 이미 제공하는 filter, pipe, interceptors, guards 등의 미들웨어를 제공해주고 DI를 기본으로 채택하기 때문에 유연하고 확장성이 좋지만
러닝커브가 비교적 높은편이고, 아도니스에서는 filter, pipe, interceptors, guards 등의 미들웨어를 제공하지 않기 때문에
개발자가 직접 미들웨어를 만들어서 적용해야 하는 부분이 있니?
네, 정확히 이해하셨습니다. NestJS와 AdonisJS 간의 주요 차이점 중 하나는 NestJS가 제공하는 다양한 기능들로 인해 러닝 커브가 비교적 높은 반면, AdonisJS는 개발자가 이러한 기능을 직접 만들어야 할 수 있다는 점입니다. 이를 좀 더 구체적으로 설명드리겠습니다.
NestJS
- 기본 제공 기능: NestJS는 filter, pipe, interceptor, guard 같은 고급 미들웨어 기능을 기본적으로 제공합니다. 이들은 특정 요청 흐름을 관리하고 다양한 시나리오에 대응할 수 있도록 설계된 추상화된 클래스들로, 개발자가 복잡한 요구 사항을 쉽게 처리할 수 있도록 도와줍니다.
- 필터(Filter): 예외 상황을 처리하는 기능을 제공하며, 전역 또는 특정 경로에 대해 예외를 관리합니다.
- 파이프(Pipe): 들어오는 데이터를 변환하거나 유효성을 검사하는 데 사용됩니다.
- 인터셉터(Interceptor): 요청 전후의 로직을 가로채어 처리할 수 있습니다. 예를 들어, 로깅, 캐싱, 응답 변경 등을 위해 사용됩니다.
- 가드(Guard): 요청이 특정 컨트롤러나 경로로 접근할 수 있는지 권한을 제어합니다.
- 의존성 주입(DI): 의존성 주입을 기본적으로 채택하고 있어 모듈 간의 의존성을 관리하는 것이 매우 쉬워지며, 코드의 유지보수와 테스트가 용이합니다.
AdonisJS
- 미들웨어 제공 제한: AdonisJS에서는 filter, pipe, interceptor, guard와 같은 고급 기능들이 기본적으로 제공되지 않습니다. 대신 기본적인 미들웨어만 제공하며, 추가적인 기능이 필요할 경우 개발자가 직접 미들웨어를 작성해야 합니다.
- 필터 및 파이프 기능 없음: NestJS와 같은 데이터 유효성 검사나 변환을 담당하는 파이프와 필터가 따로 제공되지 않으므로, 이런 기능이 필요하다면 개발자가 직접 관련 로직을 작성해야 합니다. 예를 들어, 입력 데이터를 유효성 검사하려면 미들웨어에서 데이터를 검사하거나 별도의 유효성 검사 모듈을 만들어야 합니다.
- 인터셉터 및 가드 없음: 요청 전후의 로직을 관리하거나 권한을 제어하는 가드 및 인터셉터의 기능이 내장되어 있지 않습니다. 이러한 기능이 필요하다면, 개발자는 기존의 미들웨어를 확장하여 사용해야 합니다. 권한 제어 로직도 미들웨어에서 직접 처리해야 하므로, NestJS처럼 세분화된 컨트롤이 어렵습니다.
- 의존성 주입 부족: 의존성 주입(DI)이 기본적인 개념으로 내장되어 있지 않으며, 따라서 모듈 간의 관계를 관리할 때 개발자가 인스턴스를 직접 생성해야 할 경우가 많습니다. 이는 코드의 테스트와 유지보수를 어렵게 만들 수 있습니다.
결론
- NestJS는 이미 미리 정의된 필터, 파이프, 인터셉터, 가드 등의 고급 기능들을 제공하여 개발자가 복잡한 로직을 쉽게 구현할 수 있는 반면, 이로 인해 처음 접하는 개발자에게는 학습해야 할 내용이 많아 러닝 커브가 높습니다.
- AdonisJS에서는 이러한 기능들이 기본적으로 제공되지 않기 때문에, 개발자가 직접 미들웨어를 구현하여 데이터 검증, 권한 검사, 요청 전후 처리와 같은 기능을 수행해야 합니다. 이는 초기에는 더 직관적이고 간단하지만, 복잡한 로직을 구현할 때에는 유연성과 재사용성 면에서 제한이 있을 수 있습니다.
따라서, NestJS는 다양한 내장 기능 덕분에 확장성과 유연성이 뛰어나지만, 그에 따른 학습 곡선이 높다는 특징이 있고, AdonisJS는 간단한 구조로 시작하기에는 좋지만 복잡한 요구사항이 있을 경우 직접적인 구현이 필요하게 됩니다.
nest.js와 adonis.js의 특징을 읽다보면 adonis.js는 그냥 express.js를 사용해서 개발하는 것과 별 차이가 없는 것 같아보이는데?
AdonisJS와 Express.js는 표면적으로 비슷해 보일 수 있지만, 실제로는 몇 가지 중요한 차이점이 있습니다. AdonisJS는 Express.js 위에서 발전된 프레임워크로, 개발 편의성을 높이기 위해 여러 기능이 추가되어 있고 더 많은 구조화와 일관성을 제공합니다. AdonisJS와 Express.js를 비교하면서 그 차이점을 더 명확히 설명해드리겠습니다.
AdonisJS vs Express.js: 주요 차이점
- 프레임워크의 목적
- Express.js는 경량 웹 서버 프레임워크입니다. Express는 미니멀리즘을 추구하며 기본적으로 HTTP 서버와 간단한 라우팅을 제공하는 매우 기본적인 도구입니다. Express는 개발자에게 자유를 주는 대신, 많은 부분을 직접 설계하고 구현해야 합니다.
- 반면, AdonisJS는 전체 웹 애플리케이션 프레임워크로, 개발자가 더 쉽게 프로젝트를 설정하고 빠르게 기능을 추가할 수 있도록 다양한 기능들을 미리 포함하고 있습니다. 이를 통해 AdonisJS는 Rails 또는 Laravel과 같은 전체적인 생태계를 제공하려고 합니다.
- 구조화된 아키텍처
- Express.js는 MVC 패턴이나 프로젝트 구조에 대해 강요하지 않습니다. 개발자가 원하는 방식으로 애플리케이션을 설계할 수 있는 높은 자유도를 제공하지만, 그로 인해 팀 개발에서는 코드가 비일관적이거나 관리하기 어려워질 수 있습니다.
- AdonisJS는 MVC 패턴을 채택하고 프로젝트를 구조화하여, 프로젝트 초기 설정이 쉽고 일관성을 유지할 수 있습니다. 파일 구조와 아키텍처가 기본적으로 명확하게 제공되므로 개발자가 그 규칙을 따르기만 하면 됩니다. 이로 인해, 특히 팀 프로젝트에서 코드의 일관성과 유지보수성이 크게 향상됩니다.
- 내장 기능과 생산성 도구
- Express.js는 매우 간단한 프레임워크로서 HTTP 라우팅 및 미들웨어 설정과 같은 기본적인 기능만 제공합니다. 이러한 단순함은 장점이 될 수 있지만, 실제 애플리케이션을 개발하려면 많은 외부 라이브러리를 사용하고 이를 직접 구성해야 합니다. 예를 들어, 데이터베이스와 연결하거나, 인증 시스템을 구현하거나, 폼 데이터를 처리하는 등의 기능을 추가하려면 직접 필요한 모듈을 설치하고 설정해야 합니다.
- AdonisJS는 인증(auth), 데이터베이스 ORM(Lucid ORM), 유효성 검사와 같은 기능들을 내장하고 있습니다. 예를 들어 사용자 인증 기능을 구현할 때, AdonisJS는 간단한 설정만으로 인증 관련 기능을 빠르게 추가할 수 있습니다. 이런 내장 기능 덕분에 AdonisJS는 생산성이 높아지고, 프로젝트 초기 설정과 개발 속도가 Express.js보다 훨씬 빠를 수 있습니다.
- ORM 지원
- Express.js는 ORM(Object Relational Mapper)을 제공하지 않습니다. 개발자는 원하는 ORM 또는 데이터베이스 라이브러리를 선택해 사용할 수 있습니다. Sequelize, Mongoose, TypeORM 등 다양한 ORM을 사용할 수 있지만, 그 설정과 연결은 개발자 몫입니다.
- AdonisJS는 자체적으로 Lucid ORM을 내장하고 있어 데이터베이스와의 상호작용을 간편하게 수행할 수 있습니다. Lucid ORM은 Active Record 패턴을 사용해 객체지향적으로 데이터베이스 작업을 할 수 있게 해주며, 마이그레이션 및 관계 설정 등 다양한 편의 기능을 제공합니다. 이 내장된 ORM 덕분에 데이터베이스 작업이 훨씬 간단하고 일관성을 유지할 수 있습니다.
- 유효성 검사 및 폼 데이터 처리
- Express.js에서는 요청 유효성 검사를 위한 별도의 모듈(예: express-validator)을 설치하고 사용해야 합니다. 폼 데이터 처리 역시 body-parser 등의 모듈을 추가해야 합니다.
- AdonisJS는 요청 유효성 검사와 폼 데이터 처리를 쉽게 수행할 수 있는 기능을 내장하고 있습니다. 이는 프로젝트 초기 설정을 줄여주며 코드 작성 시 오류를 방지할 수 있는 장점이 있습니다.
- 명령줄 도구(CLI)
- Express.js에는 기본적인 CLI 도구가 없으며, 프로젝트 생성이나 파일 생성을 위해서는 별도의 스크립트나 커맨드라인에서 수작업으로 해야 합니다.
- AdonisJS는 자체적인 CLI(Command Line Interface) 도구를 제공하여, 프로젝트 생성, 마이그레이션 관리, 모델 생성 등을 빠르게 수행할 수 있습니다. 이는 개발 생산성을 높이는 중요한 요소입니다.
요약 비교
특징 AdonisJS Express.js
목적 | 전체 웹 애플리케이션 프레임워크 | 경량 웹 서버 프레임워크 |
아키텍처 | MVC 아키텍처 강제 | 자유로운 구조 |
내장 기능 | 인증, ORM, 유효성 검사 등 포함 | 최소 기능 제공, 외부 라이브러리 의존 |
ORM | Lucid ORM 내장 | 없음, 직접 선택 및 설치 필요 |
유효성 검사 | 내장 유효성 검사 지원 | 외부 모듈 필요 |
생산성 도구(CLI) | 자체 CLI 도구 제공 | 없음, 수동으로 설정 필요 |
결론
AdonisJS는 Express.js에 비해 더 많은 내장 기능과 구조를 제공하는 전체적인 웹 애플리케이션 프레임워크입니다. 즉, Express.js는 HTTP 서버 기능을 간단하게 구현할 수 있는 프레임워크로서 최소한의 기능을 제공하며 개발자가 필요한 모든 것을 직접 설계하고 구현해야 합니다. 반면 AdonisJS는 Rails나 Laravel과 유사한 방식으로, 많은 기본 기능을 제공하여 개발자가 웹 애플리케이션을 더 빠르고 쉽게 개발할 수 있도록 돕습니다.
따라서 Express.js는 "완전히 자유롭게" 애플리케이션을 구축하고 싶은 경우 적합하며, AdonisJS는 일관성 있고 구조화된 방식으로 빠르게 프로젝트를 진행하고 싶은 경우 적합합니다. Express와 달리 AdonisJS는 프레임워크가 제공하는 기본적인 아키텍처와 도구들을 통해 높은 생산성을 제공하며, 이는 규모가 어느 정도 있는 프로젝트나 복잡한 웹 애플리케이션에 더 잘 맞습니다.
'BACKEND' 카테고리의 다른 글
EXPLAIN 사용법 찍먹 해보기 (0) | 2025.03.26 |
---|---|
JSON_ARRAYAGG와 JSON_OBJECTAGG 차이 (Mysql 8.0) (0) | 2025.02.12 |
Nest.js 공부하기 (2) (0) | 2024.11.27 |
Nest.js 공부하기 (1) (3) | 2024.11.04 |
Prisma 공부하기 (3) | 2024.10.20 |