- 원티드 프리온보딩 개인과제를 진행합니다.
- 시나 소설 등 문학 작품의 일부분을 공유하는 SNS 서비스입니다.
- 사용자들은 해당 서비스에서 회원가입 및 로그인 이후 본인이 좋아하는 글을 생성하고 다른 사용자들의 글을 확인할 수 있습니다.
- 해시태그로 해당 글의 주제나 단어, 작가를 기재한다면 다른 사용자들로부터 검색이 용이해집니다.
📌 1차 개발기간 : 2022.07.20 ~ 2022.07.26
📌 고도화 예정 Issues
- 게시글 목록 4가지 기능 동시에 적용시키기 - 진행 완료
- Redis를 이용해 게시글 목록 정보 캐시로 가져오기
- Docker를 이용해서 배포하기
- 해시태그 모델을 포함한 모델링 재구성
과제소개
🗣아래 서비스 개요 및 요구사항을 만족하는 SNS 백엔드 서비스를 구현해주세요.
-
이메일을 ID로 유저 회원가입
-
유저 로그인 시 JTW 토큰을 발급하고 추후 사용자 인증으로 사용
-
제목, 내용, 해시태그 등을 입력하여 게시글 생성
-
게시글 수정
-
게시글 삭제
-
게시글 상세보기
-
게시글 목록
요구사항
-
이메일을 ID로 유저 회원가입
-
유저 로그인 시 JTW 토큰을 발급하고 추후 사용자 인증으로 사용
-
제목, 내용, 해시태그 등을 입력하여 게시글 생성
- 제목, 내용, 해시태그는 필수 입력사항이며, 작성자 정보는 request body에 존재하지 않고, 해당 API를 요청한 인증정보에서 추출하여 등록
- 해시태그는 #로 시작되고 ,로 구분되는 텍스트가 입력
-
게시글 수정
- 작성자만 수정 가능
-
게시글 삭제
- 작성자만 삭제 가능
- 작성자는 삭제된 게시글을 다시 복구할 수 있음
-
게시글 상세보기
- 모든 사용자는 모든 게시물에 보기권한이 있음
- 작성자를 포함한 사용자는 본 게시글에 좋아요를 누를 수 있음
- 좋아요된 게시물에 다시 좋아요를 누르면 취소
- 작성자 포함한 사용자가 게시글을 상세보기 하면 조회수 1 증가(횟수 제한 없음)
-
게시글 목록
- 모든 사용자는 모든 게시물에 보기권한이 있음
- 게시글 목록에는 제목, 작성자, 해시태그, 작성일, 좋아요 수, 조회수가 포함
- 아래 4가지 동작을 쿼리 파라미터로 구현 ex) ?search=..&orderBy=
- Ordering (= Sorting, 정렬)
- Searching (= 검색)
- Filtering (= 필터링)
- Pagination (= 페이지 기능)
- 회원가입과 로그인의 권한은 누구나 접근할 수 있게 설정
- 로그인 성공 시, 클라이언트에게 access token과 refresh token을 리턴해주기 위해 DRF simplejwt 라이브러리 이용
- access token 만료 시, 재발급을 위해 DRF simplejwt의 TokenRefreshView 이용 / 재발급 시 refresh token도 갱신되게끔 settings 설정
- 좋아요 기능을 위해 User 모델과 Post 모델 M:N관계로 설정
- 게시글 목록 조회 기능 구현 시, 쿼리 파라미터에 따라 if문을 설정하고 django ORM의 filter, order_by, annotate 메서드 이용
- 게시글 수정 및 삭제 권한을 작성자 본인에게만 접근 가능하게 하기 위해 BasePermission 클래스 오버라이딩 진행
- 게시글 삭제의 경우, 복구를 위해 is_deleted 필드의 값을 Boolean으로 설정
- 좋아요 api url의 경우, POST로 로그인된 유저가 중간 테이블에 있다면 좋아요 취소, 없다면 좋아요 성공으로 설정
깃허브 이슈와 간단차트를 통해 태스크 및 일정관리를 했습니다.
Formatter
- isort
- black
Lint
- flake8
로컬에서 pre-commit 라이브러리를 사용해서 커밋 전 세가지 라이브러리를 한번에 실행하고 통과되지 않는다면 커밋이 불가능하게 설정합니다.
- 회원가입은 email과 password를 입력받고 email에 대한 유효성 검사 후 진행합니다.
- 로그인은 회원가입시 입력한 email과 password를 통해서 진행하고 성공 시 access token과 refresh token를 리턴해줍니다.
- 유저가 좋아요를 누른 게시글 목록은 로그인된 유저가 좋아요를 누른 게시글의 id와 제목을 응답해줍니다.
- 유저가 삭제한 게시글 목록은 로그인된 유저가 삭제한 게시글의 id와 제목, 삭제여부를 응답해줍니다.
- access token 및 refresh token 재발급은 refresh token 입력이 필요하고 simplejwt의 settings 설정으로 요청 시 access token과 refresh token 모두 갱신해줍니다.
- 게시글 생성은 제목, 내용, 해시태그 정보를 필수로 입력해야 합니다.
- 게시글 목록 조회는 제목, 작성자, 해시태그, 작성일, 좋아요 수, 조회수가 포함되며 쿼리 파라미터인 sort, search, hashtags, page&page_count에 따라 각각 정렬, 검색, 필터링, 페이지 기능을 수행합니다.
- 정렬 기능은 작성일, 좋아요 수, 조회수에 따라 각각 오름차순, 내림차순으로 정렬이 가능합니다.
- 검색 기능은 입력된 키워드가 포함된 게시글 목록을 응답합니다.
- 필터링 기능은 해시태그 하나에 대해서만 검색이 가능합니다.
- 페이지 기능은 현재 페이지와 1 페이지 당 게시글 수를 조정할 수 있습니다.
- 게시글 상세보기는 해당 게시글이 삭제된 경우, 삭제되었다는 메세지와 함께 404 not found 에러를 발생시킵니다. 또한, 횟수 제한 없이 요청 때마다 조회수가 증가합니다.
- 게시글 수정은 제목, 내용, 해시태그만 수정이 가능합니다.
- 게시글 삭제 및 복구는 PATCH 메소드로 한 번 요청 시 해당 post의 is_deleted 필드의 값을 True 또는 False로 변경합니다. 삭제된 게시글은 조회가 불가능하고 다시 복구하기 위해서는 다시 요청을 해야합니다.
- 특정 게시글 좋아요 및 좋아요 취소는 특정 게시글의 id값을 넣고 요청했을 때 좋아요가 진행됩니다. 이미 좋아요가 된 상태에서 요청하게 되면 좋아요 취소가 진행됩니다.
🚀 API 호출 테스트 결과
최종 모델링입니다. User 모델과 Post 모델은 1:N 관계로 설정했습니다.
좋아요 기능을 위해 User 모델과 Post 모델 중간 테이블이 설정되어 있습니다.
django 어드민 페이지로 Post 모델의 데이터를 관리합니다.
# --- 제목(title) - 50자 이내로 ---
# <타입(type)> <제목(title)>
# 예시(ex) : Docs(Add) Commit docs Add
# --- 본문(content) - 72자마다 줄바꾸기 ---
# 예시(ex) :
# - Workflow
# 1. 커밋 메시지에 대한 문서 제작 추가.
# 2. commit message docs add.
# --- 꼬리말(footer) ---
# <타입(type)> <이슈 번호(issue number)>
# 예시(ex) : Fix #122
# --- COMMIT END ---
# <타입> 리스트
# init : 초기화
# feat : 기능추가
# add : 내용추가
# update : 기능 보완 (업그레이드)
# fix : 버그 수정
# refactor: 리팩토링
# style : 스타일 (코드 형식, 세미콜론 추가: 비즈니스 로직에 변경 없음)
# docs : 문서 (문서 추가(Add), 수정, 삭제)
# test : 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음)
# chore : 기타 변경사항 (빌드 스크립트 수정 등)
# ------------------
# 제목 첫 글자를 대문자로
# 제목은 명령문으로
# 제목 끝에 마침표(.) 금지
# 제목과 본문을 한 줄 띄워 분리하기
# 본문은 "어떻게" 보다 "무엇을", "왜"를 설명한다.
# 본문에 여러 줄의 메시지를 작성할 땐 "-" 혹은 "번호"로 구분
# ------------------
- Class
- Pascal case
- Model
- Pascal case
- Function
- snake case
- Variables
- snake case
- main : 최종적으로 문제가 없는 기능을 포함하는 브랜치
- feature : issue에 부여한 기능을 개발하는 브랜치로 기능 개발이 완료되면 main 브랜치에 Merge 진행
# url : GET, POST api/v1/posts
class PostsView(APIView):
"""
Assignee : 상백
GET : 게시글 목록을 조회하는 메서드입니다.
POST : 게시글을 생성하는 메서드입니다.
"""
...
- class 하단에 해당 class에 대한 설명을 여러 줄 주석으로 기재
- API에 대한 코드라면 한 줄 주석으로 API URL 기재