본문 바로가기

프리온보딩 백엔드/TIL(Today I Learned)

[Assignment 1] AIMMO(에이모) TIL

 

  • 진행 날짜 - 2021.11.01 pm 16:00 ~ 2021.11.03 am 10:00
  • 과제 필수 포함 사항
  • 사용자 생성, 인증 및 인가 기능 구현
  • 게시글 작성, 수정, 삭제, 확인, 목록 확인 기능 구현
    • 삭제 및 수정은 해당 사용자의 글만 가능
    • Read의 경우 Pagination 구현 필수
  • 게시글 검색 기능 및 조회수 기능 구현
    • 같은 사용자가 게시글을 읽는 경우에는 조회수가 증가하면 안됨
  • 댓글 및 대댓글 기능 구현
    • 댓글 및 대댓글 pagination 구현
  • Unit Test
  • 1000만 건 이상의 데이터를 넣고 성능테스트 진행
  • 데이터베이스는 MongoDB를 사용해야 함

 

 

  • 13팀 과제 Github 리포지토리
 

GitHub - preOnboarding-Team13/Assignment_1_AIMMO_nest: Pre Onboarding Assignment AIMMO (Nest js)

Pre Onboarding Assignment AIMMO (Nest js). Contribute to preOnboarding-Team13/Assignment_1_AIMMO_nest development by creating an account on GitHub.

github.com

 

GitHub - preOnboarding-Team13/Assignment_1_AIMMO_express

Contribute to preOnboarding-Team13/Assignment_1_AIMMO_express development by creating an account on GitHub.

github.com


 

🏫 사용한 프레임워크 & 라이브러리

  • Nest JS    
  • config     
  • TypeOrm  
  • Passport(local, jwt) 
  • bcrypt 
  • class-validator & class-transformer 

 

 

 

💯 구현 목록

 

  ✅ 게시글 작성, 게시글 확인, 게시글 목록 확인, 게시글 수정, 게시글 삭제가 되는 API
      ✔ Delete와 Update는 해당 유저만 가능 (유저 생성 및 인증, 인가 기능도 필요)
      ✔ Read는 paginateion 구현 필수
      
  ✅ 대댓글(1 depth) 기능 구현
      ✔ 대댓글 pagination 구현
      
  ✅ 게시글 읽힘 수 기능 추가
      ✔ 같은 User가 게시글을 읽는 경우 count 수 증가하면 안 됨
      
  ✅ Rest API 설계
  
  ❌ 게시글 검색 기능
  
  ❌ Unit Test
      ✔ user, auth, board 관련 테스트
      ✖ comments 관련 테스트


  ❌ 1000만건 이상의 데이터를 넣고 성능 테스트를 진행

 

 

 

 

 

 

📋 ERD   

 

 

 

📋 API 명세서   

 

GitHub - preOnboarding-Team13/Assignment_1_AIMMO_nest: Pre Onboarding Assignment AIMMO (Nest js)

Pre Onboarding Assignment AIMMO (Nest js). Contribute to preOnboarding-Team13/Assignment_1_AIMMO_nest development by creating an account on GitHub.

github.com

 

 

 

 

💭 Project Review  

 

프리온보딩 백엔드 코스 1차 과제로 AIMMO 회사에서 내주신 과제를 진행하였습니다. 저희 13조는 총 6명으로 이루어져 있었는데, 그중 4명이 Express를 사용하셨고 저를 포함한 한 분이 Nest Js를 사용하고 있는 상태였습니다. 해당 과제를 6명이 같이 하기에는 인원이 많았고, Express로 개발하시던 분 중에 Nest Js로 해보고 싶다는 분이 계셔서 3명씩 팀을 나눠 개발했습니다.

 

팀은 다르지만 수행할 과제는 같았기 때문에 6명이 모여 함께 API를 설계하고, 코딩 컨벤션과 깃 컨벤션을 정했습니다.

그 중에서 깃 컨벤션을 함께 정하면서 새로운 사실을 많이 알게 되었습니다. 저는 그동안 git commit message에 중요성을 크게 느끼지 못해서 1줄로 짤막하게 전송했습니다. 

 

예전에 했던 프로젝트의 commit message. 그저 말문이 막히는...

때문에 제가 하는 commit 방식으로는 내가 무엇을 작업하였는지 알 수 없다는 단점이 있었습니다. 지금 와서 옛날에 한 프로젝트를 보니까 무슨 작업을 했는지 알 수가 없습니다... 😨

 

 

 

 

 

나란 녀석 성장하고 있었구나!!!

 

그런데 요번에 다같이 모여서 깃 컨벤션 규칙을 정하면서 git commit message를 제대로 작성하는 방법에 대해 알 수 있었습니다. 덕분에 위처럼 좋은 commit message를 작성할 수 있게 됐죠!

 

 

 

코딩 컨벤션 및 깃 컨벤션 규칙을 정하고 ERD를 작성한 후, 저희팀은 Nest Js를 사용하여 해당 과제를 진행하였습니다.  API 명세서도 다 같이 의논하여 작성하였기 때문에 개발은 금방 할 수 있을 것 같았습니다. 하지만 저희 팀은 MongoDb와 TypeOrm의 함정에 빠져버렸습니다...

 

 

TypeOrm이 MongoDB 지원한다고 했단 말이야!

 

 

TypeOrm은 MySQL, PostgreSQL, Oracle, Microsoft SQL, SQLite, MongoDB를 지원해주는 ORM이며 Nest Js의 TypeScript 환경에서도 사용할 수 있습니다. 그리고 저를 포함하여 팀원들이 가장 많이 사용했던 ORM이었기 때문에 망설임 없이 TypeOrm을 사용하여 해당 프로젝트를 진행하였습니다. 처음에는 이상이 없었으나 하면 할수록 문제가 발생하였습니다.

 

 

TypeOrm으로 MongoDB를 사용하게 되면 제일 많이 보는 Cannot read property ‘prototype’ of undefined 일 것입니다. 해당 오류를 고치기 위해 여기저기 찾아보게 되었고, 결과적으로 TypeOrm은 MongoDB v4 이상을 지원하지 않기 때문에 발생하는 오류인것을 알게 되었습니다. MongoDB v4를 사용하고 있었는데, TypeOrm에서 제공해주는 find, save 등의 메소드들을 사용하여 데이터베이스에 접근하려고 하면 데이터를 읽을 수가 없기 때문에 위의 오류가 발생하는 것이었습니다. 그래서 MongoDB 버전을 다운그레이드 함으로써 해당 오류는 해결할 수 있었습니다.

 

 

 

 

 

왜 Query Builder 지원 안해줘요 ㅠㅠ

 

하지만 가장 큰 문제는 다른 곳에 있었습니다. TypeOrm은 MongoDB를 지원해주지만 대단히 적은 부분만 지원해주는 것 같습니다. TypeOrm은 MongoDB의 경우에 Query Builder 기능을 지원해주지 않습니다. 그래서 간단한 쿼리는 find, save 등의 메소드로 해결할 수 있지만 join(mongoDB의 경우에는 populate) 기능을 사용해서 정제된 데이터를 가져오기에는 한계가 있었습니다. 이러한 사실을 너무 늦게 깨달아 버렸고, 사용하고 있던 TypeOrm 코드를 Mongoose로 바꾸기에는 많은 시간이 흐른 뒤였습니다. 당장 과제를 2일 안에 해결해야 했고, 테스트 코드도 미완성된 부분이 많았기에 Query Builder를 사용하지 않고도 개발할 수 있는 부분은 최대한 완성도를 높이는 방향으로 하기로 하였습니다.  

 

TypeOrm이 MongoDB에서 Query Builder 기능을 제공해주지 않기 때문에 아쉬웠던 점은 검색 기능을 구현하지 못한 부분이었습니다. 물론 단순히 Like 문만 사용하면야 구현은 가능하지만 동시에 Page 기능도 넣어야 했기 때문에, 제출 시간이 얼마 남지 않은 상황에서 Query Builder를 사용하지 않고 해당 기능을 구현하는 다른 방법을 찾기 위해서는 많은 시간을 투자해야 할 수 있을 것 같았습니다. 그래서 과감하게 검색 기능을 포기하고 다른 미흡한 부분들을 보완해 나가는 방향으로 가기로 했습니다. 

 

 

 

 

 

👩‍💻 반성점 OR 다음 프로젝트 부터 고치고 싶은 것

 

우여곡절 끝에 과제 제출을 완료하였으나, 기술 선택하는 부분에 있어서 제대로 알아보지 못하고 적용하는 바람에 원하는 부분까지 구현하지 못한 것이 아쉽습니다. 그래도 팀원들과 함께 2일 동안 과제 프로젝트를 함께 하며 깃 컨벤션에 대해 공부도 하였고, 팀원들의 다양한 의견을 들으며 나에게 부족했던 부분들을 메울 수 있었습니다. 다음 프로젝트에서는 좀 더 꼼꼼하게 기술을 조사하고 적용하여 완성도 높은 결과물을 만들어 내고 싶습니다.