우당탕탕 우리네 개발생활

험난한 Nestjs 입문기 본문

생각정리

험난한 Nestjs 입문기

미스터카멜레온 2023. 10. 28. 09:06
지극히 개인적인 생각들이 많이 포함되어 있습니다. 각색을 하기 시작하면 부족한 부분들이 너무 많이 보이고 계획된 업로드가 힘들 것 같아서 맞춤법도 엄격하게 신경 쓰고 있지 않습니다. 제 생각을 순수하게 표현하기 위해 노력하고 있습니다.

 

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

 

https://khjeong0423.tistory.com/2

 

<퓨처셀프> 를 읽고...(1)

이번 추석도 어김없이 본가를 들러 가족들과 아침예배를 드린 후 아점을 먹고 외갓집으로 향했다. 외가 식구들이 모두 모이면 북적북적하다. 25평 정도 되는 공간에 우리 식구 6명(와이프가 올해

khjeong0423.tistory.com

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

 

https://www.youtube.com/@codegear-21

 

CODE GEAR - 프로그래밍

프로그래밍, 개발팁, 개발 관련 이야기를 통해, 여러분이 개발자로 가는 길에 작은 힘이 되고자 합니다.

www.youtube.com

나에게 주어진 시간은 일주일이었다. 우선 요구사항을 정독하며 새로운 프레임워크를 적용했을 때 발목을 잡을 수 있는 기능에 대해 정리를 했다.(가령, 파일업로드의 경우 은근 까다롭다. 파일 업로드를 담당하는 라이브러리가 제각각이며, 파일을 실제로 어디에 저장할지도 결정을 해야 하기 때문이다. 위 과제의 요구사항에는 저장소에 대한 명시가 명확하지 않았다) 그다음에는 바로 ERD 가 어떤 식으로 나오게 될지 초안을 작성했다. 이렇게 내 나름의 계산을 해보니 일주일 중 이틀에서 길게는 3일을 과감하게 Nestjs와 TypeORM 학습에 투자할 수 있겠다라고 판단이 섰다. 판단을 하고 나서 바로 유튜브 검색을 시작했다. 요새 핫한 Nestjs이니만큼 분명 기본 강의 영상들을 올려두신 재야의 고수님들이 계시지 않을까라고 판단을 했기 때문이다. 아니나 다를까 너무 감사하게도 좋은 채널을 발견했다. 여러분께도 꼭 공유하고 싶다. <code gear> 라는 채널이다. 이 분은 개인 블로그도 운영하시면서 강의 영상을 많이 올려두셨다. 커리큘럼을 쭉 보니 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. 일주일이라는 시간을 온전히 과제에 몰입했다. 내가 너무 함께해보고 싶은 회사 중 하나이기도 하고 과제 아이템이 흥미로웠다. 모든 프로젝트가 그렇듯 예상치 못한 부분에서 허들이 생기고 골머리를 싸매서 해결하는 과정들이 꼭 있다. 처음 배운 기술을 이용해 완벽한 수준의 결과물을 내려고 하니 자연스럽게 초집중 상태가 되었다. 어쩔 수 없는 사람인지라 제출기한이 다 왔을 때는 집중력이 많이 떨어졌다. 결과는 늘 아쉬운 법이기에 이번에도 다르지 않지만 끝내 제출을 완료했다. 수확을 많이 얻은 상태로 이 글을 쓴다.