AdonisJS 알아보기
원제 · Exploring AdonisJS
핵심 요약
Adonis.js는 외부 의존성을 최소화하고 인증 및 ORM 등 핵심 기능을 내장하여 안정적인 풀스택 타입스크립트 애플리케이션을 구축할 수 있는 라라벨 스타일의 프레임워크입니다.
하이라이트
Adonis.js는 인증, ORM, 파일 업로드, 속도 제한 등 백엔드 필수 기능을 내장한 '배터리 포함' 타입스크립트 풀스택 프레임워크입니다.
프론트엔드 구축 시 하이퍼미디어(Edge 템플릿), Inertia.js를 통한 React/Vue 통합, 순수 REST API 서버 모드 등 세 가지 핵심 접근 방식을 지원합니다.
외부 라이브러리 의존성을 최소화하여 요즘처럼 빈번한 공급망 공격 위협으로부터 상대적으로 안전한 백엔드 환경을 제공합니다.
Lucid ORM을 내장하여 원시 SQL 쿼리 없이도 클래스 기반으로 데이터베이스 테이블과 관계를 설정하고 관리할 수 있습니다.
서버 사이드 렌더링(SSR) 기능을 제공하여 SEO(검색 엔진 최적화) 문제를 해결하고 클라이언트 사이드 성능을 최적화할 수 있습니다.
타임라인
Adonis.js 프레임워크의 정체성과 장점
Adonis.js는 수많은 개별 라이브러리를 조합해야 하는 현대의 복잡한 개발 방식과 대조적으로, 프레임워크 단에서 완성된 빌딩 블록을 제공합니다. 이는 공급망 공격 위협을 낮추고 의존성 관리의 피로도를 줄여줍니다. 특히 Next.js와 같은 방식보다 더 많은 백엔드 기능을 기본으로 갖추고 있어 대규모 풀스택 앱 구축에 적합합니다.
- Adonis.js는 자바스크립트 생태계의 '라라벨'과 같은 배터리 포함 풀스택 프레임워크입니다.
- 인증, 캐싱, 속도 제한, ORM 등이 외부 의존성 없이 프레임워크 내부에 이미 구현되어 있습니다.
- 타입스크립트를 기본 지원하며 백엔드 우선 철학을 바탕으로 안정적인 애플리케이션 유지가 가능합니다.
프론트엔드 구축을 위한 세 가지 아키텍처
Adonis.js는 동일한 컨트롤러 구조 내에서 뷰 레이어를 다르게 설정할 수 있는 유연성을 제공합니다. 고도의 인터랙티브한 리액트 앱이 필요 없는 블로그와 같은 단순 프로젝트의 경우 Edge 템플릿 엔진을 활용한 하이퍼미디어 방식이 복잡성을 획기적으로 낮춰줍니다.
- 하이퍼미디어 방식은 Edge 템플릿 엔진과 Alpine.js를 결합해 서버에서 완전한 HTML을 생성합니다.
- Inertia.js를 사용하면 React를 프론트엔드로 활용하면서도 백엔드 컨트롤러와 직접 데이터를 공유할 수 있습니다.
- REST API 모드를 선택하면 백엔드 로직에만 집중하는 순수 API 서버로 활용 가능합니다.
데이터베이스 설정과 ORM 활용법
데이터베이스 관리는 에이스(Ace) 명령어 세트를 통해 자동화됩니다. 모델과 마이그레이션을 생성하고 외래 키 관계를 설정하는 과정은 라라벨과 유사한 프로그래밍 방식을 따르며, 타입 안전성을 보장하는 스키마 업데이트가 자동으로 이루어집니다.
- Lucid ORM을 사용하여 데이터베이스 스키마와 모델 관계를 클래스 기반으로 정의합니다.
- 마이그레이션 파일과 시더(Seeder)를 통해 데이터베이스 구조 변경과 초기 테스트 데이터 채우기를 체계적으로 관리합니다.
- 사용자 모델과 포스트 모델 간의 일대다 관계를 데코레이터 선언으로 간편하게 설정합니다.
보안 정책 적용 및 권한 부여
인증(Authentication)만으로는 충분하지 않은 실제 웹 서비스 환경에서 Bouncer는 보안 정책을 클래스 단위로 관리하게 해줍니다. 이를 통해 특정 사용자가 타인의 게시물을 수정하거나 삭제하지 못하도록 하는 인가 로직을 직관적이고 중앙화된 방식으로 구현할 수 있습니다.
- Bouncer 패키지는 특정 사용자가 특정 자원에 접근하거나 수정할 권한이 있는지 인가(Authorization)를 확인합니다.
- 정책 클래스를 정의하여 게시물 소유자와 현재 사용자의 ID를 비교하는 등 정교한 권한 제어가 가능합니다.
- 컨트롤러 메서드 수준에서 Bouncer를 호출하여 인가되지 않은 사용자의 접근을 차단합니다.
설명
Made with Restream. Livestream on 30+ platforms at once via https://restream.io
