Angular와 NestJS를 사용하며 개발하는 게 어느덧 일상이 되었다.
백엔드는 클린 아키텍처에 가깝게 프로젝트를 구성하고, 프론트엔드는 FSD(Future Sliced Design) 아키텍처에 맞춰 프로젝트를 정리했다. 그런데 혼자서 두 개의 프로젝트를 완벽하게 처리하려다 보니, 엄청난 비용이 들어간다는 걸 절실히 깨닫게 되었다.
처음에는 백엔드에서 클린 아키텍처를 무조건 따르기보다는 기존의 레이어드 아키텍처를 유지하면서, 물리적인 디렉터리 구조에서 참조 방향성을 명확히 하는 것. 그리고 점진적으로 클린 아키텍처에 가까워지도록 하는 것으로 타협을 봤다. 반면, 프론트엔드는 FSD가 필요했던 만큼, 문서의 방향대로 프로젝트를 진행했다.
그다음에는 레포지토리 분리에서 오는 불편함이 문제라고 생각해 Monorepo 구조를 고민하기 시작했다. Turbo, Nx 같은 Monorepo 관리 툴을 사용해봤지만, 해당 내용을 배우는 것 자체가 어렵게 느껴졌다. 진입장벽을 낮추기 위해 결국 pnpm을 사용해 두 개의 프로젝트를 모노레포로 관리하도록 했다. 하지만 그럼에도 불편함은 여전했다.
그렇다면, 나는 왜 이렇게 극도로 불편함을 느끼는 걸까?
회사에서는 각자 맡은 파트만 처리하면 되지만, 혼자서 사이드 프로젝트를 진행할 때는 오히려 프론트엔드와 백엔드를 나누는 것이 더 많은 비용을 발생시킨다는 걸 깨닫게 됐다.
앱을 개발해야 한다면 기존 스택을 유지하는 게 당연히 맞다. 하지만 앱을 만들게 되면, 자연스럽게 관리 사이트가 따라오게 된다. 그리고 앱, 관리자 사이트, API 서버를 각각 따로 만들면 개발 비용이 더 커질 수밖에 없다.
만약 관리자 사이트가 단순한 CRUD 위주라면, API를 제공하는 백엔드에서 템플릿 엔진을 통해 페이지까지 함께 제공하면 더 효율적이지 않을까?
그러던 중, 어떤 1인 개발자 유튜버의 영상을 보고 생각이 정리되기 시작했다. 그분은 스벨트킷을 이용해 규모 있는 프로젝트들을 개발하다가, 최근 Ruby on Rails 8이 나오면서 다시 해당 프레임워크로 돌아갔다고 했다. 그 영상을 보면서, 상당히 혹했다.
과거에는 개발자라면 직접 이것저것 만들어봐야 한다고 생각했지만, 요즘 나는 프레임워크가 더 많은 걸 해주길 바라고 있었다.
결국, Ruby on Rails를 사용하지는 않았다. Node.js 생태계를 벗어나고 싶지 않았기 때문이다. 하지만 그분의 영상을 계기로 Ruby on Rails를 조사하던 중 Hotwire를 알게 되었고, 다시 한번 내 방향성을 찾게 되었다.
나는 풀스택 프레임워크가 필요하다. 하지만 Node.js 진영에는 대부분 리액트 기반으로 프론트엔드에 힘을 준 프레임워크들이 넘쳐난다. Next.js, Nuxt, Remix, 그리고 스벨트킷까지. 하지만 이 프레임워크들은 내 니즈와 맞지 않았다. 백엔드 레이어가 부실하고, 프론트와 백엔드의 경계가 모호하다는 느낌이 들었다.
Ruby on Rails는 백엔드 기반의 풀스택 프레임워크임에도 현대적인 프론트엔드 개발 환경까지 굉장히 편하게 통합했다는 점에서 매력적으로 다가왔다.
물론 Ruby on Rails 같은 환경을 Node.js에서 구현하는 게 쉽지 않다는 건 알고 있었다. 하지만 나는 기존에 익숙한 NestJS를 활용하기로 했다. NestJS는 익숙한 만큼, SSR이 필요한 부분은 기존 방식대로 템플릿 엔진을 설정하고, Vite를 이용해 최소한의 프론트엔드 개발 환경을 구성한 뒤, NestJS에서 렌더링 전에 전처리하는 파이프라인을 잘 짜면 해결되지 않을까 생각했다. (NestJS에서 TailwindCSS만 잘 연결되면 소원이 없겠다는 마음으로...)
어찌저찌 성공하긴 했지만, 개발 환경이 굉장히 불편해졌다. 이럴 바엔 차라리 다시 모노레포 환경으로 돌아가는 게 낫겠다고 생각하던 찰나, 나는 AdonisJS를 다시 만나게 되었다.
사실 NestJS를 알기 전, 처음 사용해봤던 프레임워크가 AdonisJS였다. 그런데 오랜만에 다시 보니, 완전히 다른 모습이었다.
TypeScript 기반에, 템플릿 엔진도 직접 내장하고, 프론트엔드 개발 환경 통합에도 엄청난 노력을 기울인 것이 느껴졌다. 알고 보니 AdonisJS는 Laravel에서 영감을 받았고, Laravel은 Ruby on Rails에서 영향을 받았다고 한다.
나는 이 녀석을 한 번 믿어보기로 했다..
무작위 포스트가 추천됩니다.
어떠한 기능 또는 어떤 대상체에 계산과 같은 처리를 수행하는 문자 또는 기호를 연산자라 한다. Java에서의 연산자는 크게 단항, 이항, 삼항, 대입 연산자로 나뉘며, 이항 연산자는 산술, 비교, 논리 연산자로 나뉠 수 있다.
우리는 이미 생성자를 한번 사용한 적이 있다. 객체를 생성할 때 new 키워드 다음에 선언한 클래스명() 이 생성자 이다.
싱글톤이란 어떤 클래스가 최초 한번만 메모리를 할당하고 그 메모리에 객체를 만들어 사용하는 디자인 패턴을 말한다.