내일배움캠프 2기 🐢최종 프로젝트 - 거뮤니티(초보 개발자 질의응답 커뮤니티)

김태인·2022년 8월 17일
0

프로젝트

목록 보기
7/7

프로젝트명 : 거뮤니티

진행 날짜 : 2022-07-07~08-16
팀원 : 황영상(팀장), 김태인, 김희정, 한건희
도메인 주소 : https://gomunity.shop
프로젝트 깃허브 주소 : Back-End GitHub / Front-End GitHub

거뮤니티란?


🍭거뮤니티 리드미 살펴보기

README.MD


📚기술스택

🚀아키텍쳐


😱 배포는 어떻게?

  • Docker를 통해 이미지를 빌드하여 Nginx와 Gunicorn Django와 PostgreSQL을 EC2로 배포하였음
  • letsencrypt를 통해 SSL 인증을 하여 https 배포를 진행했으며 letsencrypt가 무료이기에 사용을 진행함
  • 프론트는 S3를 통해 정적 배포를 진행했으며, CloudFront를 통하여 https인증을 진행하였음
  • CloudFront를 통해 서버 업데이트시 무효화를 통해 빠른 적용을 할 수 있어서 좋았음

🪃ERD


🛠Simulation

🤡 메인페이지 (공지사항)

🤓 회원가입

로그인

질의응답 게시판 글쓰기

  • TOAST UI EDITOR가 적용되어 있어 마크다운 형식으로 글을 작성하거나 이미지를 업로드가 가능하다

게시글 추천

  • 작성된 Hashtag를 기반으로 코사인 유사도를 통해 질문글을 추천해준다!

댓글 및 좋아요 기능

자료게시판 글쓰기


📸기억에 남는 구현 기술

JWT 로그인 리프레쉬 토큰 구현

거뮤니티는 초보 개발자가 질문할 수 있는 질의응답 커뮤니티로
회원들이 접속할때마다 매번 로그인 하는것은 UX가 좋지 않을것이라 생각하여 JWT토큰을 활용하여 좀 더 편리한 로그인을 구현하고자 했다

토큰을 활용하여 로그인을 진행했을때에 이점은
유저가 매번 사이트를 방문할때 로그인을 하지 않아도, 리프레쉬 토큰이 남아있다면 해당 정보를 통해 다시 토큰을 발급받아 쉽게 로그인 상태를 유지할 수 있기 때문에 커뮤니티 서비스를 진행하는 입장에서는 최적의 방법이라 판단했다

JWT 보안 이슈

하지만 JWT토큰 또한 보안상의 이슈는 항상 존재하기때문에
토큰의 유효시간은 15분으로 설정을 하였고, 리프레쉬 토큰은 60일정도를 줌으로써 유저의 경험은 해치지 않되 효율적인 구조로 웹을 이용할 수 있도록 구성하였다

JWT Serializer

프론트엔드에서 유저의 닉네임을 활용하기위해 nickname을 payload에 추가로 넘겨달라는 요청을 받았고
JWT 시리얼라이저를 통해 claim 커스텀을 진행하였다

@classmethod 를 활용하여 token에 추가적인 정보를 담아 전달했다

S3 이미지 업로드

거뮤니티는 프로젝트는 배포를 목표로 진행했기에 S3를 통해 이미지를 업로드/관리 하는것을 목표했으며,
S3 스토리지를 활용하기 위해 boto3를 pip install / import 하여 진행했다

Boto3란?

Python을 AWS CLI에서 사용하기 위한 AWS SDK(Software Development Kit)이다.

이미지 이름 중복이슈 해결

다수의 사용자가 동일한 이미지를 업로드하였을 시 저장되는 파일명이 중복되는것을 고려하여 이미지 업로드시upload_s3 함수에 user를 인자로 받아 1차적으로 중복될 수 있는 경우의 수를 제외했다

추가로 datetime을 활용하여 유저와+시간을 더해 2차적으로 중복될 수 있는 여지를 줄여 이미지 이름을 생성하여 저장되도록 구현했다

Docker Image Build 배포

금번 프로젝트는 Docker를 활용하여 이미지를 빌드하고, 배포하는 과정을 전반적으로 경험해보는 시간이 되었다

env를 활용하지않고 진행시 github 등에 가장 중요한 시크릿키가 노출되어 보안상 큰 이슈를 불러올 수 있고, 절대는 있어서는 안되는 일이기에 Secret Key 관리에 대한 중요성을 깨닫기도 했고
env를 통해 시크릿키를 숨겨놓고 활용할 수 있는 방법등도 활용해보았다

내부 개발용과 product용 env 별도 관리

실제 현업에서의 활용은 어떻게 진행되는지 경험해보지 못했으나, 최종 프로젝트에서는 프로덕트 배포 이후에도 추가적인 지속 개발이 진행되어야 했기에 product용 env와 내부 개발용 env를 별도로 생성하여 관리하여 진행했다

Docker 이미지 빌드 후 pip install requirements 에러

추천 시스템을 활용을 위해 해당 프로젝트에는 numpy를 설치하여 사용을 해야했는데
requiremenets 에 freeze 되어있는 numpy의 설치가 무한으로 진행되는 문제가 발생했다 (설치되지 않음)

해당 에러를 잡기 위해 장장 8시간의 이상의 구글링과 테스트를 거쳤는데,
Dockerfile의 python 버전을 변경해줌으로 해결이 되었다

기존에는 python:3.8-alpine 을 활용을 하여 빌드를 진행했으나 구글링과 테스트 결과 경량화 버전인 alpine에서 머신러닝에 활용되는 numpy등의 설치가 용량에 관한 문제들로 빈번히 설치가 어려운 문제가 있는것을 확인하였고 (불가능 한것은 아니나 많은 테스트에서 실패했다)

이를 python:3.8-buster 로 변경을 함으로써 numpy 설치를 진행하여 해결할 수 있었다

배포 및 https 인증은 어떻게?

백엔드의 서버는 EC2 안에서 Nginx와 Gunicorn, Django,PostgreSQL 등이 도커 이미지 빌드를 통해 구성되어있으며 https 인증은 letsencrypt를 사용하여 무료로 SSL인증을 진행했고, 도메인은 Route53을 사용했다

프론트는 S3를 통해 정적배포를 진행했으며 AWS CloudFront를 활용하여 Gabia 도메인을 연결, SSL인증을 진행했다

👻소감

약 한달의 기간으로 진행되었던 금번 내일배움캠프 AI트랙 2기 최종 프로젝트를 종료했다

금번에 사용한 기술스택은 기존에 배웠던것을 총망라해서 개발을 진행했으며,

Django DRF를 통한 개발이 좀더 익숙해지는 시간이 될 수 있도록 CRUD를 구성했고,

JavaScript 공부도 추가로 진행하며 백엔드와 프론트가 분리된 상황에서의 개발 경험도 다시 한번 쌓았다

도커를 통해 Nginx, Gunicorn, Django, PostgreSQL을 배포하였으며
Route53, CloudFront 와 S3를 통해 배포도 진행해보며 이전에는 경험하지 못했던 것들을 많이 다뤄본것이 큰 자산이 될 것 같다

참 다사다난했던 한달이였던 것 같다

수많은 에러코드를 만나면서
트러블 슈팅을 진행했을때 그것을 기록하여 문서화 하는것이 추후에 동일한 에러를 만났을때 대처할 수 있는 가장 좋은 방법이라는걸 많이 깨닫게 되었다

TDD를 통한 개발의 중요성, CI/CD를 통한 배포의 자동화의 중요성
무엇하나 서투르게 해선 안되겠다는 느낌을 많이 받았다

아직 갈길이 멀다

끊임없이 블로그 작성도 진행하고 개발공부를 효율적으로 진행할 수 있도록
간트차트를 활용하여 일정을 조율해보려한다

취업하는 그날까지 화이팅!

profile
코딩이 취미가 되는 그날까지

0개의 댓글