Skip to content

๐Ÿ“ฑ ์†Œ์…œ ๋ฏธ๋””์–ด ํ†ตํ•ฉ Feed ์„œ๋น„์Šค

Notifications You must be signed in to change notification settings

jw427/social-media

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

98 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

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_USER โ†’ PREMIUM_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_USER โ†’ PREMIUM_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

๐Ÿ“ฑ ์†Œ์…œ ๋ฏธ๋””์–ด ํ†ตํ•ฉ Feed ์„œ๋น„์Šค

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%