Skip to content

개발자 유머짤 공유 플랫폼 구축 프로젝트(백엔드)

Notifications You must be signed in to change notification settings

FreakPeople/freak-devtoon-back

Repository files navigation

📖 데브툰 백엔드 애플리케이션

개발자 유머짤 공유 플랫폼 구축 프로젝트 입니다.

📒 팀 노션 | 🎨 프론트엔드 레포지토리 | 🎨 이슈 & PR 관리



1. 기술 스택

  • 백엔드
    • Java 21
    • SpringBoot 3.2.5
    • Spring Data JPA
    • Spring Security
    • JUnit5
    • Gradle
    • MySQL8.0
    • Docker
    • GitHub Actions
  • 프론트
    • React



2. 프로젝트 구조

기본경로 : main ──> java ──> yjh ──> devtoon

main...
├── devtoon
│    ├── auth
│    ├── bad_words_warning_count
│    ├── comment
│    ├── common
│    ├── cookie_wallet
│    ├── member
│         ├── application
│         ├── constant
│         ├── docs
│         ├── domain
│         ├── dto
│              ├── request
│              ├── response
│         ├── infrastructure
│         ├── presentation
│    ├── payment
│    ├── policy
│    ├── promotion
│    ├── webtoon
│    │      
│    ├── DeliveryApplication.java
│
test...
├── devtoon
     ├── auth
     ├── bad_words_warning_count
     ├── comment
     ├── cookie_wallet
     ├── member
     ├── payment
     ├── policy
     ├── promotion
     ├── webtoon

main

  • auth : 인증 도메인을 구현한다.
  • bad_words_warning_count : 사용자 비속어 카운트 도메인을 구현한다.
  • comment : 댓글 도메인을 구현한다.
  • common : 모든 도메인에서 공통적으로 사용하는 기능(설정파일, Entity 공통필드, 예외처리)을 포함한다.
  • cookie_wallet : 회원의 쿠키 지갑 도메인을 구현한다.
  • member : 회원 도메인을 구현한다.
  • payment : 결제 도메인을 구현한다.
  • policy : 정책 도메인을 구현한다.
  • promotion : 행사 도메인을 구현한다.
  • webtoon : 웹툰 도메인을 구현한다.

test

  • 도메인별로 테스트가 정의되어 있다.
    • integration : 데이터베이스와 연동된 통합 테스트 작성.
    • domain : 도메인별 핵심 비즈니스 로직 단위 테스트 작성.



3. 개발 환경 구축

  • back-end 와 front-end 서버를 로컬환경에서 실행시키고 테스트할 수 있습니다.
  • 아래의 단계에 따라 로컬환경에서 순차적으로 실행하면 됩니다.
  • docker를 컨테이너로 애플리케이션을 실행시키기 때문에 docker가 설치되어 있어야 합니다.

1. 프로젝트 클론

git clone https://github.com/FreakPeople/freak-devtoon-back.git

2. 도커 컴포즈 명령어 실행

  • 터미널의 프로젝트 최상위 디렉토리에서 아래의 명령어를 실행합니다.
docker-compose up -d

3. 테스트 실행

  • mac os 환경
./gradlew clean test
  • window 환경
gradlew clean test



4. ERD 다이어그램

erd



5. 시퀀스 다이어그램



6. API 명세서

인증 API

로그인

POST /v1/auth/authenticate

Request
{
  "email" : "string",
  "password" : "string"
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

회원 API

웹툰 구독자 회원 등록

POST /v1/members

Request
{
  "name" : "string",
  "email" : "string",
  "password" : "string"
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

웹툰 구독자 회원 조회

GET /v1/members/{id}

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

웹툰 구독자 회원 등급 변경

PATCH /v1/members/{id}

Request
{
  "membershipStatus" : "string"
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

내 정보 조회

GET /v1/members/my

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

웹툰 API

웹툰 등록

POST /v1/webtoons

Request
{
  "request": {
    "title": "string",
    "writerName": "string",
    "genre": "string"
  },
  "image": "string"
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

웹툰 이미지 조회

GET /v1/webtoons/{id}/images/{fileName}

Response / 200 OK
{
  string
}

웹툰 조회

GET /v1/webtoons/{id}

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

웹툰 전체 조회

GET /v1/webtoons

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

인증한 회원이 게시한 웹툰 전체 조회

GET /v1/webtoons/my

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

댓글 API

댓글 등록

POST /v1/comments

Request
{
  "webtoonId": 0,
  "content": "string"
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

댓글 조회

GET /v1/comments/{id}

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

특정 웹툰의 모든 댓글 조회

GET /v1/comments

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

쿠키 지갑 API

쿠키 지갑 조회

GET /v1/cookie-wallets

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

내 쿠키 지갑 조회

GET /v1/cookie-wallets/my

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

쿠키 증가

PUT /v1/cookie-wallets/increase

Request
{
  "quantity": 0
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

쿠키 감소

PUT /v1/cookie-wallets/decrease

Request
{
   "quantity": 0
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

비속어 경고 API

비속어 카운트 조회

GET /v1/bad-words-warning-count

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

비속어 카운트 증가

PUT /v1/bad-words-warning-count/increase

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

내 비속어 카운트 조회

GET /v1/bad-words-warning-count/my

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

웹툰 결제 API

웹툰 미리보기 결제

POST /v1/webtoon-payments

Request
{
  "memberId": 0,
  "webtoonId": 0,
  "webtoonDetailId": 0
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

특정 회원 웹툰 결제 내역 단건 조회

GET /v1/webtoon-payments/{memberId}

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

쿠키 결제 API

쿠키 결제

POST /v1/cookie-payments

Request
{
  "getMemberId": 0,
  "quantity": 2147483647
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

특정 회원 쿠키 결제 내역 단건 조회

GET /v1/cookie-payments/{memberId}

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

프로모션 API

프로모션 등록

POST /v1/promotions

Request
{
  "description": "string",
  "discountType": "CASH_DISCOUNT",
  "discountRate": 0,
  "discountQuantity": 0,
  "isDiscountDuplicatable": true,
  "startDate": "2024-07-14T07:10:18.145Z",
  "endDate": "2024-07-14T07:10:18.145Z",
  "promotionAttributes": [
    {
      "attributeName": "string",
      "attributeValue": "string"
    }
  ]
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

프로모션 삭제(종료)

DELETE /v1/promotions/{id}

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

현재 적용 가능한 모든 프로모션 조회

GET /v1/promotions/now

Response / 200 OK
{
  "statusMessage": "string",
  "data": [
    {
      "promotionId": 0,
      "description": "string",
      "discountType": "CASH_DISCOUNT",
      "discountRate": 0,
      "discountQuantity": 0,
      "isDiscountDuplicatable": true,
      "startDate": "2024-07-14T07:39:29.607Z",
      "endDate": "2024-07-14T07:39:29.607Z"
    }
  ]
}

현재 적용 가능한 프로모션에 포함된 모든 프로모션 속성 조회

GET /v1/promotions/now/{id}

Response / 200 OK
{
  "statusMessage": "string",
  "data": [
    {
      "attributeId": 0,
      "promotionId": 0,
      "attributeName": "string",
      "attributeValue": "string"
    }
  ]
}

종료된 모든 프로모션 조회

GET /v1/promotions/ended

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

정책 API

정책 등록

POST /v1/policies

Request
{
  "policyName": "string",
  "startDate": "2024-07-14T07:44:07.802Z",
  "endDate": "2024-07-14T07:44:07.802Z",
  "cookiePrice": 0,
  "cookieQuantityPerEpisode": 0,
  "warningThreshold": 0
}
Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

쿠키 정책 조회

GET /v1/policies/cookie-policy

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}

비속어 정책 조회

GET /v1/policies/bad-words-policy

Response / 200 OK
{
  "statusMessage" : "string",
  "data" : {}
}



7. 화면 구성

회원가입 웹툰조회
회원가입 웹툰조회
웹툰등록 웹툰등록완료
웹툰등록 웹툰등록완료
댓글조회 댓글등록
댓글조회 댓글등록
정책 및 프로모션 조회 내정보조회
정책 및 프로모션 조회 내정보조회



8. 스터디

✏️ 프로젝트 기획부터 설계까지
✏️ Git 활용하여 자신있게 프로젝트 협업하기
✏️ 다양한 정책을 쉽게 등록하고 삭제하기
✏️ 이제 너만 믿는다, 테스트 코드 작성하기
✏️ 리팩토링 모음.zip
✏️ 리팩토링: 프로모션 조회 설계 개선 및 성능 최적화 도전하기 - 설계 편
✏️ 리팩토링: 프로모션 조회 설계 개선 및 성능 최적화 도전하기 - 성능 최적화 편
✏️ 리팩토링: 쿠키 결제 로직 4단계로 개선하기 (feat. 원시값 포장)
✏️ 스프링 환경에서 비동기 프로그래밍 적용해보기
✏️ CI 적용하기



9. 팀원

BackEnd BackEnd
황유정 정지훈

About

개발자 유머짤 공유 플랫폼 구축 프로젝트(백엔드)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages