1. Aimmo - MongoDB를 활용한 게시판 API

문승준·2021년 11월 4일
0
post-thumbnail

개발 요구사항과 기술 스택

개발 요구사항

  • 게시글 CRUD
  • 게시글 카테고리
  • 게시글 검색
  • 대댓글(1 depth)
    • 대댓글 pagination
  • 게시글 읽힘 수
    • 같은 User가 게시글을 읽는 경우 count 수 증가하면 안 됨
  • Rest API 설계
  • Unit Test
  • 1000만건 이상의 데이터를 넣고 성능테스트 진행 결과 필요

3명이 한팀이 되어 위 요구사항을 구현하고 배포까지 완료해야하는 과제였다. 게시글 조회수 counting과 성능 테스트는 해본적이 없었지만 크게 어렵지 않을거라 생각했다. 하지만 결국 새로운 기술스택을 적용하는 부분에 막혀 시간을 많이 허비했고, 게시글 조회 counting (중복 방지)은 완벽하게 구현하지 못했고 데이터 성능테스트도 하지 못했다.

기술 스택

  • 에이모 선호 기술스택: python flask, mashmallow, mongoengine
  • 필수 사용 데이터베이스: mongodb

이번 과제에서 중요한건 구현해야할 기능들이 아니라, 새로운 기술스택을 사용하는 것이었다. 무엇보다 NoSQL인 MongoDB를 사용해볼 수 있는 좋은 기회라고 생각했다.


개발 과정

1일차 - MongoDB와의 사투

  • 공식문서의 가이드에 따라 brew install로 설치했다.

  • brew services start mongodb-community가 어떤 의미인지 알게되었고 전에 사용했던 MySQL 로컬서버도 현재 실행중이라는 것을 알 수 있었다.

  • MySQL처럼 유저와 패스워드를 설정해야 된다는 생각에 admin db에 권한을 설정했다. 그런데 무엇이 잘못된걸까? 이때부터 문제가 시작되어 brew services start가 제대로 작동하지 않고 에러가 났다. (애초에 계속 껐다 켰다를 하지 말았어야한다..)

  • mongod를 실행했을때 나오는지 메시지가 error log라는 것을 뒤늦게 알아차리고 해당 내용으로 검색을 했다. 역시나 권한 문제가 원인이었고 관련 디렉토리에 root 권한을 부여하는 방식으로 해결했다. 사실 워낙 많은 것을 따라해보아서 정확히 어떤 부분에서 해결된건진 파악이 어렵다.

  • GUI Tool인 Compass를 활용해 조금 더 편하게 DB를 볼 수 있었다.

  • MongoDB Atlas를 활용해 DB 배포를 했다. 전에 해보았던 RDS 개념을 적용해서 최대한 단순하게 처리하려했다. EC2 서버에서 zsh 환경변수에 DB HOST를 저장했다.

2일차 - Flask가 아닌 Django를 선택하다

  • 기업의 선호 기술 스택이 flask인만큼 팀원들과 flask로 진행해보기로 했다. 흔히 django에 비해 가볍다고하는데 정말 최소한의 구조만 제공해서 마이크로 프레임워크라고 불리기도한다. django 프로젝트 구조에 익숙해서 그런지 수동으로 파일을 만들고 연결해야하는 부분이 익숙하지 않았다.

  • MongoDB 연결을 위해 database 폴더를 만들고 mongoengine을 설치 후 import해 model을 작성했다. DB와 연동하는 과정에서 시간이 많이 지체되었는데 본격적인 로직을 작성하려고보니 과제 제출까지 20시간이 채 안남은 상황이었다.

  • flask를 계속 사용할 것인지 팀원들과 급하게 미팅을 진행했다. 한명도 경험이 없는지라 검색과 공식문서를 참고하는 방법 밖에 없었고 유닛테스트와 배포, API 문서 작성, README 작성 시간까지 고려한다면 최종 과제 제출이 가능할지 의문이었다. 결국엔 아쉽지만 우선 django로 최대한 빨리 과제를 완성하고 추후 flask로 다시 해보기로 정했다.

  • 빠르게 Django 초기세팅을 진행하고 Djongo를 이용해 MongoDB와 연동했다. 평소 Django의 models.py처럼 그대로 작성했는데, NoSQL의 장점과 특징을 살리지 못하고 있다고 느껴져서 아쉬웠다.


느낀점과 개선점

새로운 기술을 빠르게 적용하는 나만의 방법을 알아내자

  • 적재적소에 필요한 기술을 적용할 줄 아는 것도 아주 중요하지만, 개발자로 취업이 목표인 상황에선 내가 사용해본 적이 없어도 빠르게 회사의 기술을 적용할 수 있는 능력이 우선시 되어야 한다. 여러 기술을 경험해 보아야 그중에 무엇이 최선일지 선택할 수 있을테니까. 이번 과제를 통해 나는 그 시험대에 올랐었다. 경험해보지 못한, 어찌보면 개념도 잘 모르는 기술을 사용해 제한된 시간안에 API를 만들어내야 했다.

  • 나는 이번에 새로운 기술을 받아들이고 적용하는데 실패했다. 나의 한계와 부족함을 느끼면서도 최선을 다할 뿐이었다. 굳이 변명을 하자면 이틀이란 시간은 너무 부족했고 점점 마음이 조급해지다보니 집중력도 떨어지곤했다. 하지만 이런 경험을 지금이라도 했다는게 중요하다. 앞으로 이런 경험을 수도 없이 하게 될 테니 과거의 내가 했던 방법들과 미래의 내가 했으면 하는 방법들을 적어보려한다.

검색과 공식문서

  • 새로운 용어 자체를 검색해서 전체적인 설명을 본다. 공식문서, 위키, 블로그 등 해당 기술이 왜 탄생했고 어떠한 특징을 가지고 있는지 파악하는데 집중하자. 왜 쓰는지 모르고 사용할 바엔 원래 쓰던 기술을 쓰는게 나을거다. 중요한건 개념, 특징, 다른 기술과 비교 및 차이점이다. 최소한 이 세가지를 설명할 수 있어야 다음으로 넘어 갈 수 있다.

  • "Flask와 MongoDB로 게시판 CRUD 개발" 같은 검색어는 좋은 시작점이 아니다. 기술과 기능을 연결하는 것은 나중 문제이고 우선 기술 자체에 집중해보자. 저렇게 완성된 정답을 찾으려한다면 블로그 샘플 코드 짜깁기가 되거나 코딩하는 내내 "이걸 왜 쓰는거지?"라는 의문에 휩싸이게 될거다.

  • 공식문서나 블로그를 보고도 이해가 안된다면 유튜브 영상을 찾아보자. 시간이 없다는 생각에 한번도 그생각을 못했었는데 오히려 짧은 영상안에 시각과 청각 자료가 모두 포함되어있다. 기본적인 개념을 파악하는데 큰 도움을 받을수 있다.

튜토리얼

  • 공식문서의 흐름을 따라가면 자연스럽게 튜토리얼로 넘어가게 된다. 여기서 내가 실수한 부분은 튜토리얼을 이용해 나의 문제를 해결하려했다는 점이다. 튜토리얼은 튜토리얼일뿐 내가 하고자 하는 기능구현과는 완전 별개이다. 함부로 튜토리얼 코드를 나의 프로젝트에 사용하려한다면 오히려 끔찍한 혼종을 만들어버릴 수도 있다. 해보고 싶다면 튜토리얼만 따로 해보자.

  • 처음부터 완벽한 뼈대를 갖추고 시작하려는 마음을 버리자. 코드는 언제든지 지우고 수정할 수 있다. 완벽을 추구할 시간에 차라리 하나의 기능이라도 작동되게 만들자. 내가 만든 코드가 일단 작동되게하는 것은 자신감을 심어준다. 그런 의미에서 튜토리얼을 한번 따라해보는 것은 좋은 학습 방법이 될 수 있다.

실제 코드 예시는 나중에 본다

  • 답답하고 급한 마음에 github의 레포지토리를 뒤적거렸지만 막상 제대로 참고하거나 배운 것은 없었다. 다른 레퍼런스를 참고하는 것은 더 나은 코드를 위한 것이지 문제해결 방법이 될 순 없다. 나의 코드를 이해하지 못하면 다른 사람 코드도 이해하지 못한다. 어느정도 해당 기술에 익숙해지고 일부 기능을 구현하고나서, 더 나은 방법이 있을지 고민하기 위해 참고하자.

실패를 통해 배운 것들

기본기에 충실하자

  • 기능을 구현하는 것만큼 컨벤션, 커밋메시지, README.md에 신경쓰자. 주어진 시간 동안 코드만 작성하다가 끝나는 것은 최악의 상황이다. 비록 기능구현이 부족할지라도 과제 프로젝트를 일단 완성하는 것을 목표로하자.

  • 개발속도는 경험이 쌓이면서 점차 늘어날 것이다. 하지만 잘못된 코딩 습관이 자리 잡으면 고치기가 어렵고 팀 협업에 걸림돌이 될 것이다. 막무가내로 코드를 작성해서 던져놓지 말고, 하나의 기능이라도 제대로 이해하고 정성을 들여서 개발하는 것을 목표로 하자. 개발자는 결국 코드로 판단되고 평가받을 수 밖에 없다.

실패는 실패로 끝나지 말아야한다

  • 이번에 flask, mongoengine, MongoDB를 제대로 활용하지 못했다고해서 해당 기술들을 포기한 건 아니다. 해당 기술이 존재하는 한 언제 어떻게 다시 마주칠지 모른다. 다음번에 만났을 때는 더 제대로 활용하겠다는 다짐을 한다. 그러기 위해선 되돌아볼 필요가 있다. NoSQL과 flask에 대한 기본 개념은 이해했으니 이제는 그것을 가지고 무언가를 만들어볼 차례이다.

  • 중단된 flask 코드들은 아직 레포지토리에 남아있다. 함께한 팀원들도 나만큼 모두 아쉬움을 느꼈던 것 같다. 지금 당장은 한달 동안 8개의 과제를 진행하는 중이라 다들 시간이 없고 정신적으로도 여유가 없는 상태이다. 앞으로의 과제 중에 또 flask를 이용해야 될 수도 있는데 남겨진 레포지토리는 나중에라도 꼭 완성시켜야겠다.

profile
개발자가 될 팔자

0개의 댓글