Skip to content

원티드 프리온보딩 개인과제를 진행합니다. 시나 소설 등 문학 작품의 일부분을 공유하는 SNS 서비스 입니다.

Notifications You must be signed in to change notification settings

tkdqor/pre-onboarding-3rd-SNS

Repository files navigation

pre-onboarding-3rd-SNS


✅ 프로젝트 개요

  • 원티드 프리온보딩 개인과제를 진행합니다.
  • 시나 소설 등 문학 작품의 일부분을 공유하는 SNS 서비스입니다.
  • 사용자들은 해당 서비스에서 회원가입 및 로그인 이후 본인이 좋아하는 글을 생성하고 다른 사용자들의 글을 확인할 수 있습니다.
  • 해시태그로 해당 글의 주제나 단어, 작가를 기재한다면 다른 사용자들로부터 검색이 용이해집니다.

📌 1차 개발기간 : 2022.07.20 ~ 2022.07.26


📌 고도화 예정 Issues

  • 게시글 목록 4가지 기능 동시에 적용시키기 - 진행 완료
  • Redis를 이용해 게시글 목록 정보 캐시로 가져오기
  • Docker를 이용해서 배포하기
  • 해시태그 모델을 포함한 모델링 재구성

🛠 사용 기술

  • API
    python badge django badge DRF badge DRF_SimpleJWT badge

  • DB
    SQLite badge

  • ETC


📌 과제 분석

과제소개
🗣아래 서비스 개요 및 요구사항을 만족하는 SNS 백엔드 서비스를 구현해주세요.
  1. 이메일을 ID로 유저 회원가입

  2. 유저 로그인 시 JTW 토큰을 발급하고 추후 사용자 인증으로 사용

  3. 제목, 내용, 해시태그 등을 입력하여 게시글 생성

  4. 게시글 수정

  5. 게시글 삭제

  6. 게시글 상세보기

  7. 게시글 목록

요구사항
  • 이메일을 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로 로그인된 유저가 중간 테이블에 있다면 좋아요 취소, 없다면 좋아요 성공으로 설정

✒️ 이슈 관리

image

깃허브 이슈와 간단차트를 통해 태스크 및 일정관리를 했습니다.


✨🍰✨ 코드 컨벤션

image

Formatter

  • isort
  • black

Lint

  • flake8

로컬에서 pre-commit 라이브러리를 사용해서 커밋 전 세가지 라이브러리를 한번에 실행하고 통과되지 않는다면 커밋이 불가능하게 설정합니다.


🌟 API 명세서

image

  • 회원가입은 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 호출 테스트 결과
  • 회원가입
image
  • 로그인
image
  • 유저가 좋아요를 누른 게시글 목록
image
  • 유저가 삭제한 게시글 목록
image
  • access token 및 refresh token 재발급
image
  • 게시글 생성
image
  • 게시글 목록 조회
image
  • 게시글 목록 조회 정렬 기능

  • 작성일(오름차순)

image
  • 작성일(내림차순)
image
  • 좋아요 수(오름차순)
image
  • 좋아요 수(내림차순)
image
  • 조회수(오름차순)
image
  • 조회수(내림차순)
image
  • 게시글 목록 조회 키워드 검색 기능
image
  • 게시글 목록 조회 필터링 기능
image
  • 게시글 목록 조회 페이지 기능
image
  • 게시글 상세 보기
image
  • 게시글 수정
image
  • 게시글 삭제 및 복구
image image
  • 특정 게시글 좋아요 및 좋아요 취소
image image

📋 ERD

image

최종 모델링입니다. User 모델과 Post 모델은 1:N 관계로 설정했습니다.
좋아요 기능을 위해 User 모델과 Post 모델 중간 테이블이 설정되어 있습니다.


📂 어드민 페이지

image

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 기재

About

원티드 프리온보딩 개인과제를 진행합니다. 시나 소설 등 문학 작품의 일부분을 공유하는 SNS 서비스 입니다.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages