
안녕하세요!
오늘은 제가 다니고 있는 학원 주변인 신사역 주변 맛집 추천 서비스인 오늘의 점심을 소개하기 위해 글을 썼습니다.
사실 이 프로젝트는 끝낸지 거의 한달반이 되었는데, 이제서야 글을 쓰는 이유는 배포하고서 글 써야지 하다가 배포를 이제야 했기때문입니다! ㅋㅎㅎ..
오늘의 점심이라는 서비스는 사용자들이 이용해 본 음식점들 중 남들에게 추천해주고 싶은 맛집들을 등록하여 지겨운 점심메뉴 고르는 시간을 줄여주자는 생각에서 제작하게 되었습니다.
이번 프로젝트는 프론트엔드 1명, 백엔드 1명으로 팀을 구성하여 진행했고 저는 Django를 사용, 백엔드를 담당했습니다.
7월 3일 ~ 7월 12일까지 약 열흘간 진행했고 배포는 8월 20일에 진행했습니다.
회원가입, 장소등록 등 10여개의 API를 작성했고 사실 API작성은 거의 하루만에 끝난 것 같은데, 맨날 개인프로젝트만 하다가 처음으로 백엔드만 맡아서 했더니 프론트엔드 맡아주신 팀원분과의 소통 같은 부분에서 오히려 더 시간을 많이 쓴 것 같네요.
위에는 API명세서 입니다. 이번 프로젝트 진행하기 전까지만 해도 이런 문서화에 대한 개념이 아예 없었는데, 이런 문서화 작업 없이는 프론트-백 사이 소통에도 많은 문제가 생긴다는 것을 알게된 프로젝트가 아닌가 싶네요..ㅎㅎ
오늘의점심이라는 서비스 자체가 백엔드에서는 크게 할 일이 없어서 하루이틀 사이에 API 다 만들고 나머지 시간은 거의 프론트엔드에서 API사용할 때, 뭐 안된다하면 디버깅 해주는 데 사용한 것 같습니다.
그렇다보니 제가 블로그에도 쓸 말이 많지는 않네요:(
오늘의점심을 만들면서 처음 사용해본게 API명세서 말고도 또 있는데요.
바로 JWT를 이용한 로그인 처리입니다. 왜 JWT를 이용한 로그인 방식을 택했냐? 사실 JWT여야 한다기 보다는 코딩을 배우는 입장에서 새로운 것을 경험해보고 싶은 마음에 택하게 되었습니다. 세션을 통한 로그인 방식은 개인프로젝트에서 사용해 본적이 있었거든요!
JWT를 사용하기로 하면서 쿠키,세션과 토큰에 대해서도 좀 더 자세히 공부할 수 있는 기회가 됐습니다.
django에서 JWT로그인은 simple jwt라는 라이브러리를 사용하여 간단하게 구현할 수 있었습니다. 보안쪽을 생각하면 좀 더 커스텀할 수 있는 부분이 있을 것 같은데, 이번 프로젝트에서는 기본적인 설정만 사용하여 진행하기로 했습니다.
SIMPLE_JWT = { "ACCESS_TOKEN_LIFETIME": datetime.timedelta(minutes=5), "REFRESH_TOKEN_LIFETIME": datetime.timedelta(days=1), "ROTATE_REFRESH_TOKENS": True, "BLACKLIST_AFTER_ROTATION": True, "SIGNING_KEY": os.environ.get("JWT_SECRET_KEY"), }
위에는 제가 오늘의 점심에서 적용한 simple jwt 설정인데요. access token은 유효기간을 5분 refresh token은 하루를 적용시켜 줬습니다. 또 refresh token을 통해 새로운 access token을 발급받을 때, refresh token 또한 재발급 시키고 기존의 refresh token은 블랙리스트 처리해 주었습니다.
django에서는 위 설정 이외에는 로그아웃 시에 refresh token을 프론트로부터 전달받아 블랙리스트 처리하는 것 외에 직접 코드 작성하는 부분은 거의 없었는데, 오히려 프론트쪽에서 구현해야 할 코드들이 많았던 것 같습니다.
이번 프로젝트에서 django를 사용한 부분은 여기까지인 것 같고 이제 배포 이야기를 해볼까요?!
오늘의 점심 배포는 EC2에 도커를 이용해서 진행했고 RDS(postgres)로 데이터베이스를 구성하였습니다.!
위에는 오늘의 점심의 아키텍쳐인데요. 사실 이렇게까지 배포가 늦어진데는 도커를 사용해서 배포하고자 하는 욕심도 큰 영향을 끼친 것 같습니다.
이번 프로젝트 진행 전에 도커 관련 강의도 듣고 공부도 했었는데, 공부하면서는 그렇구나~ 하다가 막상 사용해보려니 공부한 내용을 어떻게 적용해야할지 감도 안오더라구요. 그러다가 이번에야 말로 도커를 사용해보자 하고 들었던 강의도 한번 더 듣고 이곳 저곳 검색도 많이 해가며 며칠에 걸쳐 겨우겨우 도커를 이용한 배포에 성공했습니다.
감도 못잡고 있던게 이상할 정도로 오늘의 점심 배포를 끝내고 나니 다른 프로젝트들에 도커를 적용하는 건 순식간이더라구요 ㅎㅎ! 이전에 도커 사용하려다가 검색만 해보고 뭔 말인지 모르겠다고 도망쳤던 기억이 나면서 이번 프로젝트 과정에서 가장 큰 성취감을 느낀 순간인 것 같네요.
도커 배포에는 AWS의 ECS라는 서비스를 많이 이용하는 것 같던데, 거기까지는 아직 시도를 못했봤네요. ECS로 배포하는 것도 생각해보지 않은 건 아닌데 그쪽부터는 프리티어 적용이 안되는 걸로 알고있어서..취준생은 웁니다..
배포 이후 도메인 연결하고 tls 인증은 lets encrypt의 webroot 방식을 이용하여 받았습니다. 역시 도커를 사용해서 인증절차를 받았고 도커 볼륨을 이용해서 인증파일들을 nginx에 넘겨주어 처리해줬습니다.
위에서 받은 인증서는 유효기간이 90일이라 따로 갱신을 해줘야 한다는데, crontab을 이용해서 매주 한번씩 인증서 갱신을 위한 도커 명령어를 실행할 수 있게 세팅해줘서 그런 번거로움을 덜 수 있었습니다.
뭐랄까 배포를 진행하면서 이번 프로젝트 정리할 때는 배포 관련해서 할 말이 제일 많겠다 싶었는데, 막상 글을 적으려니 할말이 없네요 하하.. 배포 관련 이야기는 여기서 끝내고 회고로 넘어가 보겠습니다!
늘 그렇지만 프로젝트는 진행할 때마다 느끼는 점이 참 많은 것 같습니다.
이번 프로젝트에서는 제가 처음으로 백엔드만!을 담당했는데요. 사실 백엔드 담당해서 뭘했다라고 하기도 민망할 정도로 간단한 CRUD를 하는 api들만 만든건 아닌가 하는 생각이 드네요. 이런 고민을 이야기하니 주변에서는 작은 사이즈의 사이드 프로젝트에서는 백엔드가 할 일보다 프론트가 할 일이 많은 경우가 많다고들 하는데, 나도 더 활약하고 싶어!ㅋㅎㅎ..
위에서는 간단한 api만 만들고 뭐 한것도 없는 것처럼 이야기 했지만 사실 api 만들고 나서 프론트엔드 팀원의 디버깅을 도와주는 일도 많이 해서 프로젝트 기간을 빠듯하게 보내긴 했습니다.
이번에 팀을 이뤄서 함께 진행한 팀원분께서 백엔드쪽을 잘 모르시다보니 api 명세서에 다 적어놨는데도 다시 저한테 물어보시고 하는 등 소통에서도 좀 문제가 있다고 느꼈고 그렇다고 명세서에 다 적어놨으니까 알아서 하세요라고 할 수는 없는 노릇이라 직접 코드 봐드리며 설명드리고 하는데도 시간을 많이 썼고, 이외에도 api 사용하다가 에러나는 것들을 다 저한테 얘기하셔서 디버깅 해드리는데도 정말 많은 시간을 쓴 것 같습니다.
실제로 디버깅을 하다보면 프론트엔드 측에서 만료된 토큰을 재발급 받지않고 그대로 사용하거나 data를 잘못 넘겨주는 등의 문제인데도 api 사용중에 에러났다고 저한테 말씀하시니 참 난감한 경우가 많았네요 ^^;
그나마 제가 리액트를 다룰 줄 알아 프론트쪽 문제 찾아서 고쳐 줄 수 있었으니 금방금방 넘어갔지 아니였으면 디버깅하는데만 시간이 배로 들지 않았겠나 조심스레 예상해봅니다. 아는게 힘이다!
이번 프로젝트 이전에 AWS를 이용했던건 라이트세일을 이용해서 bylog를 배포했을 때뿐이였는데, 그때도 책이랑 인터넷에 나와있는 내용을 그대로 따라하기도 했고 배포과정에서 권한 문제 등으로 고생을 많이 했어서 배포에 대한 두려움이 있었습니다만 이번에 도커를 사용해서 EC2에 배포를 진행해보고 nginx 설정들도 직접 만져보면서 이제는 그 두려움을 많이 걷어낸 것 같습니다. 아마 이게 이번 프로젝트에서 가장 크게 얻어가는 것 같네요.
프로젝트를 진행하며 개인 프로젝트던지 팀 프로젝트던지 늘 느끼는 것도 많고 아쉬운 점들도 많은 것 같습니다. 이번 프로젝트 역시 기간을 짧게 가져가려다 보니 완성도 측면에서 아쉬움이 많이 남네요. 그럼에도 불구하고 구경이라도 한번 해보겠다! 하시는 분들을 위해 링크 남깁니다.
오늘의 점심 https://todaylunch.store/
백엔드 github https://github.com/Gobyungyong/today_lunch_deploy
프론트엔드 github https://github.com/Gobyungyong/goodplace_project
이번 포스팅은 여기까지입니다. 긴 글 읽어주셔서 감사합니다! :)