Skip to content

2024-pre-onboarding-backend-F/social-media

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Social-Network-Service

✨ Backend TechStack ✨

Java Spring SpringBoot SpringDataJPA MySQL QueryDSL

🍀 서비스 개요 🍀

본 서비스는 유저 계정의 해시태그(”#dani”) 를 기반으로 인스타그램, 스레드, 페이스북, 트위터(X)
복수의 SNS에 게시된 게시물 중 유저의 해시태그가 포함된 게시물들을 하나의 서비스에서 확인할 수 있는
통합 Feed 어플리케이션 입니다.


[목차]

디렉토리 구조

구조도
src
├───main
│   │   
│   │                       
│   ├───java
│   │   └───wanted
│   │       └───media
│   │           │   MediaApplication.java
│   │           │   
│   │           ├───exception
│   │           │   │   BadRequestException.java
│   │           │   │   BaseException.java
│   │           │   │   CustomException.java
│   │           │   │   ErrorCode.java
│   │           │   │   ErrorResponse.java
│   │           │   │   InvalidPasswordException.java
│   │           │   │   NotFoundException.java
│   │           │   │   PostListCustomException.java
│   │           │   │   UserNotFoundException.java
│   │           │   │   VerificationCodeExpiredException.java
│   │           │   │   VerificationCodeMismatchException.java
│   │           │   │   
│   │           │   └───handler
│   │           │           CustomException.java
│   │           │           GlobalExceptionHandler.java
│   │           │           
│   │           ├───global
│   │           │   ├───config
│   │           │   │       QueryDslConfig.java
│   │           │   │       WebConfig.java
│   │           │   │       
│   │           │   └───converter
│   │           │           StringToLocalDateTimeConverter.java
│   │           │           
│   │           ├───post
│   │           │   ├───controller
│   │           │   │       PostController.java
│   │           │   │       StatController.java
│   │           │   │       
│   │           │   ├───domain
│   │           │   │       CountValueType.java
│   │           │   │       Post.java
│   │           │   │       StatDateType.java
│   │           │   │       Type.java
│   │           │   │       
│   │           │   ├───dto
│   │           │   │       PostDetailResponse.java
│   │           │   │       PostDto.java
│   │           │   │       PostIdResponse.java
│   │           │   │       StatParam.java
│   │           │   │       StatResponse.java
│   │           │   │       
│   │           │   ├───repository
│   │           │   │       PostRepository.java
│   │           │   │       StatRepository.java
│   │           │   │       
│   │           │   └───service
│   │           │           PostService.java
│   │           │           StatService.java
│   │           │           
│   │           └───user
│   │               ├───config
│   │               │       SecurityConfig.java
│   │               │       TokenAuthenticationFilter.java
│   │               │       TokenProvider.java
│   │               │       
│   │               ├───controller
│   │               │       TokenController.java
│   │               │       UserController.java
│   │               │       
│   │               ├───domain
│   │               │       Code.java
│   │               │       Grade.java
│   │               │       Token.java
│   │               │       User.java
│   │               │       UserDetail.java
│   │               │       
│   │               ├───dto
│   │               │       ReissueCodeRequest.java
│   │               │       ReissueCodeResponse.java
│   │               │       SignUpRequest.java
│   │               │       SignUpResponse.java
│   │               │       TokenRequestDto.java
│   │               │       TokenResponseDto.java
│   │               │       UserCreateDto.java
│   │               │       UserInfoDto.java
│   │               │       UserLoginRequestDto.java
│   │               │       UserLoginResponseDto.java
│   │               │       VerifyRequest.java
│   │               │       VerifyResponse.java
│   │               │       
│   │               ├───repository
│   │               │       CodeRepository.java
│   │               │       TokenRepository.java
│   │               │       UserRepository.java
│   │               │       
│   │               └───service
│   │                       GenerateCode.java
│   │                       TokenService.java
│   │                       UserDetailService.java
│   │                       UserService.java
│   │                       UserValidator.java
│   │                       
│   └───resources
│           application-dev.yml
│           application-secret.yml
│           application-test.yml
│           application.yml
│           
└───test
    └───java
        └───wanted
            └───media
                │   MediaApplicationTests.java
                │   
                └───post
                    └───service
                            PostServiceTest.java

ERD


API 명세서

기능 Method URL
회원가입 POST /api/users/sign-up
로그인 POST /api/users/login
JWT 재발급 POST /api/token
회원 가입 승인 POST /api/users/approve
인증코드 재발급 POST /api/users/reissue-code
게시물 목록 GET /api/posts?hashtag={account}&type={type}
&orderBy={createdAt}&sortDirection={ASC}
&search_by={title}&search={search_keyword}
&page={page_number}&page_count={count_number}
게시물 상세 GET /api/posts/:postId
게시물 좋아요 POST /api/posts/likes/:postId
게시물 공유 POST /api/posts/share/:postId
통계 GET /api/statistics

사용자

A. 사용자 🤸‍♀️

☁️ 회원가입

1. 설명

  • 계정, 이메일, 비밀번호을 입력해 회원가입합니다.
  • 회원가입에 성공하면 인증코드가 발급됩니다.

2. 처리 과정

a. 계정,이메일,비밀번호 입력

b. 비밀번호 유효성 검사 (2가지 이상 만족)

비밀번호 유효성 검사 조건

      • 계정, 이메일 아이디와 유사한 비밀번호는 사용할 수 없습니다.
      • 비밀번호는 최소 10자 이상이어야 합니다.
      • 숫자로만 이루어진 비밀번호는 사용할 수 없습니다.
      • 숫자, 문자, 특수문자 중 2가지 이상을 포함해야 합니다.
      • 3회 이상 연속되는 문자 사용이 불가합니다.

c. 유효성 검사에 통과한 비밀번호는 암호화되어 DB에 저장

d. 가입 인증코드 발급

e. 인증코드, 사용자 정보 DB에 저장

3. 입력

{
  "account": "계정",
  "email": "이메일",
  "password": "비밀번호"
}

4. 출력

- Response : 성공시

{
    "message": "회원가입이 성공적으로 완료됐습니다.",
    "user": {
        "account": "계정",
        "email": "이메일"
    },
    "authCode": "회원가입 인증 코드"
}

- Response : 실패시

  • 400 Bad Request

    • 이메일 형식 오류
    • 비밀번호 제약 조건 오류
  • 409 Conflict

    • 계정이나 이메일 주소가 이미 사용 중인 경우
  • 500 Internal Server Error

☁️ 가입승인

1. 설명

  • 회원가입 시, 생성된 6자리 랜덤 인증코드를 입력합니다.
  • 계정, 비밀번호, 인증코드가 올바르게 입력되면 가입승인됩니다.
  • 가입승인 되면 회원등급이 변경됩니다.

2. 처리 과정

a. 계정,비밀번호,인증코드 입력

b. 계정, 비밀번호 회원정보 일치 조회

c. 사용자의 모든 인증코드 DB 조회 (최신순 정렬)

d. 입력된 인증코드와 가장 최근 발급된 인증코드 일치 조회

e. 인증코드 유효성 검증 (유효시간 15분)

f. 회원등급 변경 NORMAL_USERPREMIUM_USER

g. 인증 완료 회원의 인증코드 DB 삭제

3. 입력

{
    "account" : "사용자 계정",
    "password" : "비밀번호",
    "inputCode" : "인증코드"
}

4. 출력

- Response : 성공시

{
    "message": "인증이 성공적으로 완료되었습니다!",
    "userInfo": {
        "account": "사용자 계정",
        "email": "이메일",
        "grade": "회원등급"
    }
}

- Response : 실패시

  • 400 Bad Request

    • 계정 오류
    • 비밀번호 오류
    • 인증코드 오류
    • 인증코드 만료
  • 500 Internal Server Error

☁️ 인증코드 재발급

1. 설명

  • 인증코드 재발급을 요청합니다.

2. 처리 과정

a. 계정,비밀번호 입력

b. 계정, 비밀번호 회원정보 일치 조회

c. 새로운 인증코드 발급

d. 인증코드 저장

e. 회원등급 변경 NORMAL_USERPREMIUM_USER

3. 입력

{
    "account" : "사용자 계정",
    "password" : "비밀번호"
}

4. 출력

- Response : 성공시

{
    "message": "인증코드가 성공적으로 재발급되었습니다",
    "newAuthCode": "재발급 받은 인증코드"
}

- Response : 실패시

  • 400 Bad Request
    • 계정 오류
    • 비밀번호 오류
  • 500 Internal Server Error
로그인 & JWT 재발급

기능 요구사항

  1. 로그인
    • 설명
      • 회원가입한 회원은 로그인할 수 있다.
      • 로그인에 성공하면 JWT가 발급된다.
      • 이후 모든 서비스 이용 시 JWT를 사용자 인증에 사용한다.
    • 입력
      • 계정, 비밀번호
    • 출력
      • 성공 : 회원 고유 식별값(id), 액세스 토큰
      • 실패 : 오류 메시지
    • 처리 과정
      • 계정비밀번호로 회원이 존재하는지 확인한다.
      • 존재하는 경우 액세스 토큰은 발급받아 출력하고 리프레시 토큰은 발급받아 DB에 저장한다.
  2. JWT 재발급
    • 설명
      • 액세스 토큰리프레시 토큰을 재발급할 수 있다.
    • 입력
      • 액세스 토큰, 리프레시 토큰
    • 출력
      • 성공 : 재발급받은 액세스 토큰, 재발급받은 리프레시 토큰
      • 실패 : 오류 메시지
    • 처리 과정
      • 리프레시 토큰유효성을 검증한다.
      • 유효한 경우 액세스 토큰리프레시 토큰을 재발급한다.
      • 리프레시 토큰은 재발급 받은 것으로 업데이트한다.
게시물 조회
  • 게시물 조회
    • 본인의 계정의 해쉬 태그로 조회하는 기능
    • 선택 시 해당 type의 필드를 보여주는 기능
    • 목록을 정렬해주는 기능
    • 생성날짜순, 업데이트된날짜순, 좋아요순, 공유순, 조회수순 으로 오름차순과 내림차순으로 정렬할 수 있다.
    • 일반 검색을 할 수 있는 기능
    • 기본으로 10개의 게시물을 한 번에 보여주는 기능
    • 조회하려는 페이지 선택 시 해당 페이지만 보여주는 기능
게시물 상세
  • 게시물 상세(API)
    • 유저가 게시물을 클릭 시 사용되는 API
    • 모든 필드 값을 확인
    • API 호출 시, 해당 게시물 view_count 가 1 증가
게시물 좋아요 & 공유하기

게시물 좋아요

기능 요구사항

게시물 목록 또는 상세 에서 게시물 좋아요 클릭 시 사용되는 API

  • 좋아요 클릭 시 각 SNS 별 명시된 API 를 호출합니다.
  • 해당 호출이 성공할 시 response status 200 해당 게시물의 like_count가 1 증가합니다.
  • 횟수 제한이 없습니다. 한 유저가 몇 번의 좋아요를 누르던 좋아요 수는 계속 상승합니다.

API 처리 과정

  1. postId를 통해 게시물의 SNS 유형을 조회한다. ex) FACEBOOK, TWITTER, INSTAGRAM, THREADS
  2. SNS 유형별로 엔드 포인트를 만들고, 외부 SNS API 호출을 한다. (기능 개발을 위한 요소로, 실제 동작하지 않음)
  3. 외부 SNS API를 호출한다고 가정하고, 성공하면 좋아요 수를 증가시키고, 200을 보낸다.
API 테스트

Request

HTTP : POST
URL: /api/posts/likes/:postId

Response : 성공시

{
    "postId": "게시물아이디",
    "messgae": "좋아요 수 증가 완료"
}

Response : 실패시

  • 500 Internal Server Error

    • 잘못된 postId를 입력했을 때
      {
          "postId": "게시물아이디",
          "messgae": {
              "좋아요 수 증가 실패": "존재하지 않는 엔티티입니다."
          }
      }

게시물 공유

기능 요구사항

게시물 목록 또는 상세 에서 공유하기 클릭 시 사용되는 API

  • 좋아요 클릭 시 각 SNS 별 명시된 API 를 호출합니다.
  • 해당 호출이 성공할 시 response status 200 해당 게시물의 share_count가 1 증가합니다.
  • 횟수 제한이 없습니다. 한 유저가 몇 번의 공유를 누르던 공유 수는 계속 상승합니다.

API 처리 과정

  1. postId를 통해 게시물의 SNS 유형을 조회한다. ex) FACEBOOK, TWITTER, INSTAGRAM, THREADS
  2. SNS 유형별로 엔드 포인트를 만들고, 외부 SNS API 호출을 한다. (기능 개발을 위한 요소로, 실제 동작하지 않음)
  3. 외부 SNS API를 호출한다고 가정하고, 성공하면 공유 수를 증가시키고, 200을 보낸다.
API 테스트

Request

HTTP : POST
URL: /api/posts/share/:postId

Response : 성공시

{
    "postId": "게시물아이디",
    "messgae": "공유 수 증가 완료"
}

Response : 실패시

  • 500 Internal Server Error

    • 잘못된 postId를 입력했을 때
      {
          "postId": "게시물아이디",
          "messgae": {
              "공유 수 증가 실패": "존재하지 않는 엔티티입니다."
          }
      }
통계
queryParam 속성 default(미입력 시 값) 설명
hashtag string 본인계정
type string (열거형) 필수 값 date, hour
start date 오늘로 부터 7일전 2023-10-01 과 같이 데이트 형식이며 조회 기준 시작일을 의미합니다.
end date 오늘 2023-10-25 과 같이 데이트 형식이며 조회 기준 시작일을 의미합니다.
value string (열거형) count (게시물 개수) count , view_count, like_count, share_count 가 사용 가능합니다.
  • value
    • count 일 시, 게시물 개수
    • view_count 일 시, 해시 태그에 해당하는 게시물 들의 view_count 의 합(like_count,share_count 도 동일)
  • ?value=count&type=date 일시, start ~ end 기간내 (시작일, 종료일 포함) 해당 hashtag 가 포함된 게시물 수를 일자별로 제공합니다.
    • ex) api/statistics?type=DATE&hashtag=user1
    • D-7일전부터 D-day까지 user1이라는 해시태그가 포함된 게시글의 개수를 반환합니다.
  • ?value=count&type=hour 일시, start ~ end 기간내 (시작일, 종료일 포함) 해당 hashtag 가 포함된 게시물 수를 시간별로 제공합니다.
    • start 일자의 00시 부터 1시간 간격으로.
    • ex) api/statistics?type=HOUR&hashtag=고양이
    • D-7일전 00:00:00부터 D-day23:59:59까지 고양이이라는 해시태그가 포함된 게시글의 개수를 반환합니다.

✉ Git Commit Message Convention

커밋 유형

커밋 유형 의미
feat 새로운 기능 추가
fix 버그 수정
docs 문서 수정
style 코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
refactor 코드 리팩토링
test 테스트 코드, 리팩토링 테스트 코드 추가
chore 패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore

커밋 메세지 세부 내용

 • 글로 작성하여 내용이 잘 전달될 수 있도록 할 것

 • 본문에는 변경한 내용과 이유 설명 (어떻게보다는 무엇 & 왜를 설명)
 ex )
 refactor : 로그인 기능 변경 (title)
 ( 공 백 )
 기존 로그인 방식에서 ~~한 문제로 ~~한 방식으로 변경하였습니다. (content)

 feat : 로그인 기능 구현

🌿 Git Branch 전략

브렌치 명명 규칙

feat/기능명

  • ex) feat/users_apply
브랜치 작성 방법

  • 브랜치는 기능 단위로 나눈다.
  • feat 브랜치는 dev 브랜치에서 파생해서 만든다.
  • PR을 통해 dev 브랜치에서 기능이 완성되면 main 브랜치로 merge 한다.

이름 텍스트
main 제품으로 출시될 수 있는 브랜치
dev 다음 출시 버전을 개발하는 브랜치
feat 기능을 개발하는 브랜치

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages