오늘은 요즘 개발하고 있는 학교 커뮤니티 서담의 검색 Extension의 개발기를 이야기해보려한다.
평소처럼, 혼자서 프로젝트를 하던 와중 동아리 단톡방에서 학교 선배가 같이 프로젝트를 진행 할 사람을 구한다는 글을 보았다.
그 프로젝트는, 우리 학교 커뮤니티 서비스인 서담의 검색 전용 구글 크롬 Extension 개발 프로젝트였다.
일단, 서담은 Django로 개발되어 있는데 현재 총 글이 70만건 정도 되어가고 서담 사이트내에서 검색이 원할하지 않다는 특징이있다.
사람들이 제일 많이 사용하는, "익명게시판 2"는 글이 제일 많고 어떤 검색어에 대한 검색 쿼리를 날리면 결과를 받을 때 까지 보통 15초~30초 정도의 시간이 걸리니.. 이미 말 다했다.
심지어 서버에 부담이 된다고 현재는 본문 검색도 지원하고 있지 않은 상황이였다.
그래서 이것을 해결하고, 더 좋은 검색을 위한 프로젝트인 가칭 "서담서치"의 개발을 동아리 선배가 제안하였고, 그 제안을 받아들여 프로젝트를 시작하게 되었다.
일단, 프로젝트를 진행 할 인원들을 다 모으고나서 파트 분배를하였는데 파트는 아래와 같이 나뉘었다.
내가 맡은 파트는 역시나 평소에 자주하고 관심있는 Backend API 구축이다.
그 후, 각 파트에대해 필요한 기본 기능에 대해 PM을 맡은 선배에게 브리핑을 받고 API 설계에 들어가게 되었다.
제대로 된 API 설계를 위해서 처음부터 계획을 잡고 시작하는게 좋을 것 같다고 생각하여, 아래의 글을 참고하여 API 설계를 시작하였다.
버전 관리는 Github를 사용하기로 했다.
이슈 트래킹을 위해서, 협업 툴로 Youtrack을 사용하기로 했다.
API를 그냥 그대로 쓸 수는 없기에, 웹 서버 및 Reverse Proxy로 NginX를 선택했다.
API 구현 형태는 REST API의 형태를 제대로 만들기 어렵다 판단하여, 일단 HTTP API로 선택했다. 응답형식은 현재 가장 많이 사용하고있는 JSON을 선택했다.
DB는 라즈베리파이에 부담이 되지 않을 가벼운 DB가 필요했고 SQLite3를 선택했다.
Authentication을 위한 인증방식은 JWT를 사용하기로했고, Access Token과 Refresh Token 모두 사용하기로 정했다.
유저가 서담의 회원이여지만, 검색이 작동 될 수 있도록 해야 했기에 서담 회원임을 인증 할 수 있는 방법을 생각했어야했다.
shiftpsh님이 처음에 solved-ac를 만들었을 때 사용한 방법이 생각나 그 방법을 참고하기로 했다. 심지어 그걸 블로깅까지 해놓으셔서 참고하기 좋았다.API 버전과 End-point 설계
{API_URL}/{version}/{END_POINT}와 같은 방식으로 관리하기로 마음 먹었다.HTTP API를 구현하기로 했지만, 그래도 REST 형식에 맞추고 싶었기에 최대한 그 방식에 맞추기로 했다.API 응답 설계
개발 언어 및 프레임워크 및 ORM 정하기
아래와 같은 생각을 하였고, 결국 Javascript, Express, Prisma를 선택하였다.
Spring은 Xexpress를 선택하는 것이 개발 속도가 빠르게 나온다. 하지만, express는 swagger 문서 작성이 너무 힘들다...FastApi 안해봤다. 하지만, 예제를 보니 할만 할 수도 있다고 생각이 든다.Django는 너무 과하고, Flask는 너무 가볍다.Sequelize 혹은 Prisma인데, 개발하기에는 Prisma가 편하니까 Prisma로 가자.SQLAlchemy 를 쓰는 것 같은데, 이것도 안써봐서 모르겠다.→ 아무리 생각해봐도 평소에 자주쓰던 Express 써야 할 것 같다.
-> Express에 swagger도 붙여서, 프론트엔드 파트에서 쉽게 API를 사용 할 수 있는 documentation 작성도 하기로하였다.
-> 이 부분은 주관적인 생각이 꽤 많이 들어갔으니, 자신의 생각과 다를 수 있습니다.
개발 방법론
TDD에 대해 공부를 해보았고 간단하게 사용해본적밖에 없었다.TDD를 한 번 적용해보고 싶다는 생각을 했고, 실제로 적용하여 개발하는중이다.Jest와 Supertest를 통해 진행하기로하였다.배포 방법
CircleCI를 사용하여 CI/CD를 진행하기로 했다.CircleCI가 테스트를 진행하게 설정하였다.CircleCI가 배포까지 진행한다.CI/CD를 진행 할 때는, Docker 컨테이너를 이용하기로 하였다.Docker가 서버에서 build된 후 새로운 컨테이너로 교체되도록 하였다.Docker 내부에서는 PM2로 API 프로세스를 관리하여, 중간에 API가 crash되어도 auto restart 될 수 있도록 설정하였다. 또, PM2에서 로그를 남겨 Docker 볼륨을 통해 로그를 저장 할 수 있도록 설정하였다.백엔드는 생각하는 것보다 신경써야 할 것이 엄청나게 많고, 모르는 기술과 개발 방법론을 알아가면서 개발을 하는 것은 언제나 흥미로운 것 같다.
현재 개발중인 이 API가 실제로 production에서 작동 할 때 어떤 문제가 발생 할지는 모르겠지만, 최대한 API에 문제가 생기지 않게 하나하나 꼼꼼히 체크하면서 개발해야겠다.