험난한 Nestjs 입문기

Posted by 미카 on October 27, 2023 · 7 mins read
지극히 개인적인 생각들이 많이 포함되어 있습니다. 각색을 하기 시작하면 부족한 부분들이 너무 많이 보이고 계획된 업로드가 힘들것 같아서 맞춤법도 엄격하게 신경쓰고 있지 않습니다. 제 생각을 순수하게 표현하기 위해 노력하고 있습니다.

권고사직을 받고 3개월 반 남짓인 현 시점에도 여전히 구직에 열을 올리고 있는 상황이다.

최종 면접에서 무려 4방이나 낙마를 하면서 자존감이 많이 떨어져 있는 상태.. 하지만 원대한 목표가 명확히 있기 때문에 실패를 통해 많은 것들을 배우고 있다.(조금 무섭긴 하지만 <퓨처셀프> 라는 책은 나에게 너무 큰 도움이 되었다. 참고: [book]퓨처셀프를 읽고...(1) 감사하게 국가에서 지원금(실업수당)을 받으면서 1일 1커밋을 지켜가며 꾸준히 내 자신을 갈고 닦고 있다. 잔디가 벌써 3줄이상 쌓여 있는 모습을 보니 내심 흐뭇하다. 각설하고, 험난한 Nestjs 입문기 썰을 풀어보겠다. 최근에 눈여겨보던 스타트업의 공고가 올라왔다. EO 라는 유튜브채널을 통해 대표님 인터뷰 영상을 보게 되었는데, 식별한 문제를 해결하기 위해 노력하고 결실을 이뤄가는 모습들에 마음이 뜨거워졌다. 회사는 근래까지 많은 성장을 이루었고 성장세가 멈출 기미가 보이지 않는다. 백엔드 엔지니어 직무를 지원했는데 감사하게도 서류 합격을 받았다. 다음 프로세스는 사전과제였다. 사전과제는 내가 너무 좋아하는 전형이고 감사함을 느끼는 전형이다. 평상시 코딩을 하고 싶어도 아이템이 마땅치 않아 플레이 그라운드를 끄적일 때가 많은데, 구체적인 아이템을 제시해주기 때문이다. 사전과제를 완수하면서 늘 배우는 것이 많았다.(내 잔디가 푸르러 지는 것은 덤이었다.) 이번 과제에서 제시된 핵심 기술스택은 Nestjs, typescript, TypeORM 이었다. 안그래도 요즘 구직을 하면서 수많은 스타트업들이 Node.js 를 사용한다고 하면 Nest.js 를 프레임워크로 사용하는 경우가 많길래 궁금하던 찰나였는데 마음이 설렜다.(TypeORM 도 마찬가지 였다.) Express.js 와 Mongoose 를 주 무기로 사용하여 개발하던 나에게 이 과제는 큰 도전이었다. Nestjs 와 TypeORM 을 한번도 사용해보지 않은 상태에서 우선적으로 기본을 익히고 요구사항까지 구현을 해야했기 때문이다.

나에게 주어진 시간은 일주일이었다. 우선 요구사항을 정독하며 새로운 프레임워크를 적용했을 때 발목을 잡을 수 있는 기능에 대해 정리를 했다.(가령, 파일업로드의 경우 은근 까다롭다. 파일 업로드를 담당하는 라이브러리가 제각각이며, 파일을 실제로 어디에 저장할지도 결정을 해야하기 때문이다. 위 과제의 요구사항에는 저장소에 대한 명시가 명확하지 않았다) 그 다음에는 바로 ERD 가 어떤식으로 나오게 될 지 초안을 작성했다. 이렇게 내 나름의 계산을 해보니 일주일 중 이틀에서 길게는 3일을 과감하게 Nestjs 와 TypeORM 학습에 투자할 수 있겠다 라고 판단이 섰다. 판단을 하고 나서 바로 유튜브 검색을 시작했다. 요새 핫한 Nestjs 이니 만큼 분명 기본 강의 영상들을 올려두신 재야의 고수님들이 계시지 않을까 라고 판단을 했기 때문이다. 아니나 다를까 너무 감사하게도 좋은 채널을 발견했다. 여러분께도 꼭 공유하고 싶다. <코드기어(codegear)> 라는 채널이다. 이 분은 개인 블로그도 운영하시면서 강의 영상을 많이 올려두셨다. 커리큘럼을 쭉 보니 Nestjs 의 기초부터 TypeORM 의 적용, 권한관리, jwt 를 이용한 인증 등 과제에 필요한 모든 내용을 포함하고 있었다. 강의를 들으며 공부를 시작했다. 스터디카페에서 매일 9시간씩 공부를 하며 삼일째되는 날에 강의를 다 들을 수 있었다. 삼일이 지난 시점에서 Nestjs 를 이제라도 시작할 수 있었다는 사실이 너무 뜻깊고 감사했다. 그동안 Expressjs 를 통해 백엔드 개발을 하면서 생산성 측면에서 감탄을 해왔고, 구현하고자 하는 기능들에 필요한 라이브러리들 또한 쉽게 구할 수 있었기에 만족도가 높았었다. 하지만 줄곧 아쉽다고 생각해왔던 부분은 아키텍쳐 디자인이 자유분방하다는 점이었다. 물론 지극히 개인적인 생각이다. 이 부분에 대해서는 스프링 프레임워크에 대한 얘기를 꺼내보고 싶다. 스프링은 아키텍쳐부터 시작해서 철학에 맞는 엄격한 규칙들을 가지고 있다. 엄격함은 높은 수준의 통일화를 만든다. 이러한 특징은 팀워크에서 놀라운 힘을 발휘한다고 생각해왔다. 스프링에 대한 철학과 이해가 충분한 사람이라면 모르는 프로젝트에 투입되더라도 적어도 구조에 대한 이해로 시간을 낭비하는 일이 없어진다. Expressjs 의 높은 생산성과 자유분방한 구조는 팀워크의 측면에서 봤을 때 은근한 트레이드오프라고 생각해왔고, 생산성이 조금 줄더라도 엄격한 구조를 갈망하고 있었다. Nestjs 는 그런 의미에서 나에게 큰 선물같은 느낌이었다. Expressjs 기반으로 한단계 더 랩핑이 된 프레임워크이기에 낯설지도 않고 친숙한 부분이 훨씬 많았다.

Nestjs 와의 첫만남에 기뻐하던 순간도 잠시 나에게 주어진 사전과제를 본격적으로 하기 시작하면서 여러 위기들을 맞닥드렸다. 대표적으로 Module 이라는 개념을 가장 중시하는 Nestjs 에서 다양한 라이브러리들을 적용하기가 생각보다 까다로웠다. Expressjs 를 사용할 때면 필요한 util 파일들을 따로 만들어서 함수를 정의하고 이를 export 한 걸 각 service 에서 import 하여 사용을 했었다. 하지만 Nestjs 의 철학에 맞으려면 각 Module 에 라이브러리에서 포함하는 service 들을 받아 주입시키고 사용을 했어야했다. 특히 .env 파일을 dotenv 라이브러리를 통해 손쉽게 사용하던 이전과 달리 ConfigModule 이라는 것을 통해 환경변수를 동적으로 받아야하는 Nestjs 의 방법을 이해하느라 시간을 꽤 할애했다.(ConfigModule 은 깊게 공부를 할 예정이다.) 또한 파일을 다루는 Multer 라이브러리에 대한 적용부터 aws 라이브러리까지 평상시 너무 쉽게 다뤘던 부분들이 발목을 잡았다. 시간이 오래 걸리긴 했지만 치트를 쓰지 않고 Module 철학을 이해하는 방식으로 라이브러리들을 적용하는데 성공하였다. 결과를 완벽히 내야하는 과제이지만 이미 이 시점부터 ‘이번엔 Nestjs 를 충분히 고민해보고 이를 배울 수 있는 기회를 가졌다는 부분에 더 의의를 둬야겠다’ 라고 생각했던 것 같다. 두번째로는 TypeORM 과 Nestjs 의 조합의 장점을 살리는 디자인을 고민하는게 상황을 어렵게 만들었다. TypeORM 을 통해 mysql 을 이용했는데, mysql 은 대표적인 RDBMS 이고 RDBMS 는 정규화라는 특성을 가지고 있다. 데이터를 저장하기에 가장 효율적이고 이상적인 구조를 만들어보는 걸 정규화라고 한다. 하지만 아이러니하게도 과한 정규화가 가끔은 독이 되는 경우도 있어 역정규화라는 개념도 존재한다. 과제의 요구사항을 분석하면서 나름의 기준으로 이상적인 정규화를 진행했다. 이를 기반으로 ERD 를 그려 놓은 후 Nestjs 와 TypeORM 을 공부하게 된건데, TypeORM 의 Join 구현이 생각보다 불편하고 유연하지 않구나라고 개인적으로 느끼게 되면서 고민이 많아졌다. 그래서 아쉽지만 기존 ERD 를 일부 역정규화했다. 시간이 많지 않기 때문에 이를 기반으로 개발을 시작했고, 기능구현이 한창일 때 나의 타협한 구조때문에 발생되는 문제들이 하나 둘 생겨났다. 실무(Nestjs 를 사용하고 있는)에선 어떤지 모르겠지만, 다른 기능을 관장하는 Service 들에 대한 종속성이 꽤 꼬이기 시작했고 보기에 그리 좋아보이진 않았다. 또한 기능 구현을 하다보니 기능의 문제점을 발견했는데 이미 짜여진 ERD 를 고치지 않는 이상 기능의 문제점을 해결할 수 없는 상황도 생겼다. 완수는 해야겠다는 생각에 최대한의 방법으로 요구사항은 지켰지만 이미 아쉬움은 컸다.

어찌보면 기본을 배운 이후 바로 심화단계에 돌입해본건데 역시 호락호락하진 않구나라는 점을 느꼈다. 하지만 충분히 Nestjs 와 TypeORM 의 장점을 느낄 수 있는 시간이었고, 꾸준히 심화학습을 통해 내것으로 만들고 싶은 욕심이 생겼다. 새로운 동료들과 일하게 된다면 꼭 Nestjs 를 사용해보고 싶다는 생각을 해본다.

Ps. 일주일이라는 시간을 간만에 과제에 모두 쏟아 부었다. 내가 너무 함께해보고 싶은 회사 중 하나이기도 하고 과제 아이템이 흥미로웠다. 모든 프로젝트가 그렇듯 예상치 못한 부분에서 허들이 생기고 골머리를 싸매서 해결하는 과정들이 꼭 있다. 처음 배운 기술을 이용해 완벽한 수준의 결과물을 내려고 하니 간만에 초집중을 했다. 제출기한이 다 왔을 때는 집중력이 많이 떨어져 아쉬웠다. 그래도 잘 완수했고, 수확을 많이 얻은 상태로 이 글을 쓴다.