공통 사항

HTTP 공통 응답

HTTP Response Fields

  • 정상 응답 필드

Path Type Optional Description

resultType

String

응답 결과

data

Object

O

응답 데이터

HTTP Exception Response Fields

  • 예외 응답 필드

Path Type Optional Description

resultType

String

응답 결과

message

String

에러 메시지

errorCode

Number

에러 코드

HTTP Pagination Response Fields

  • 페이지네이션에 사용되는 공통 응답 필드

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

픽픽픽 메인 페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

  • 쿠키의 name에 해당하는 value가 빈값인 경우

    • name: DEVDEVDEV_REFRESH_TOKEN, DEVDEVDEV_ACCESS_TOKEN

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "이름과 일치하는 쿠키의 값이 없습니다.",
  "errorCode" : 400
}

JWT 예외

  • 엑세스 토큰 인증에 문제가 있는 경우

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "잘못된 서명을 가진 JWT 입니다.",
  "errorCode" : 401
}
{
  "resultType" : "FAIL",
  "message" : "만료된 JWT 입니다.",
  "errorCode" : 401
}
{
  "resultType" : "FAIL",
  "message" : "유효하지 않은 회원 입니다.",
  "errorCode" : 401
}

익명 회원 예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "익명 회원 아이디를 확인해주세요.",
  "errorCode" : 400
}

처리율 제한 예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "너무 많은 요청을 했습니다. 잠시 후 다시 시도해 주세요.",
  "errorCode" : 429
}

토큰

토큰 재발급 API(POST: /devdevdev/api/v1/token/refresh)

  • 엑세스 토큰 만료시 토큰을 재발급하는 API

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/token/refresh HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: localhost:8080
Cookie: DEVDEVDEV_REFRESH_TOKEN=eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMzLCJleHAiOjE3NDczMjEzMzN9.awdtfUDrau3kHjcWVnNFQGTuoY014PeYkXzNFadhgZA
Name Optional Description

DEVDEVDEV_REFRESH_TOKEN

리프레시 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: DEVDEVDEV_ACCESS_TOKEN=eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMzLCJleHAiOjE3NDY3MTgzMzN9.i9waKTX75xyr_JR8Y6aYQG4KLrxwbkTum4Nvrs7fqmo; Path=/; Domain=devdevdev.co.kr; Max-Age=180; Expires=Thu, 08 May 2025 15:05:13 GMT; Secure
Set-Cookie: DEVDEVDEV_REFRESH_TOKEN=eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMzLCJleHAiOjE3NDczMjEzMzN9.awdtfUDrau3kHjcWVnNFQGTuoY014PeYkXzNFadhgZA; Path=/; Domain=devdevdev.co.kr; Max-Age=604800; Expires=Thu, 15 May 2025 15:02:13 GMT; Secure; HttpOnly
Set-Cookie: DEVDEVDEV_LOGIN_STATUS=active; Path=/; Domain=devdevdev.co.kr; Max-Age=180; Expires=Thu, 08 May 2025 15:05:13 GMT; Secure
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}
Name Optional Description

DEVDEVDEV_REFRESH_TOKEN

리프레시 토큰

DEVDEVDEV_ACCESS_TOKEN

엑세스 토큰

DEVDEVDEV_LOGIN_STATUS

로그인 활성 유무(active | inactive)

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

ADMIN 테스트 토큰 생성 API(GET: /devdevdev/api/v1/token/test/admin)

  • ADMIN 권한 테스트 계정의 토큰을 생성하는 API

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/token/test/admin HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: localhost:8080

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 522

{
  "resultType" : "SUCCESS",
  "data" : {
    "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfYWRtaW5AZGV2ZGV2ZGV2LmNvbSIsInNvY2lhbFR5cGUiOiJLQUtBTyIsInJvbGUiOiJST0xFX0FETUlOIiwiaWF0IjoxNzQ2NzE2NTMzLCJleHAiOjE3NDY3MTgzMzN9.GrGUoEdOnbF5Bq8FsofOcP0TOmOBa11mbABuIUqDEjI",
    "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfYWRtaW5AZGV2ZGV2ZGV2LmNvbSIsInNvY2lhbFR5cGUiOiJLQUtBTyIsInJvbGUiOiJST0xFX0FETUlOIiwiaWF0IjoxNzQ2NzE2NTMzLCJleHAiOjE3NDczMjEzMzN9.zNcEnP81zdEQBQcEQ6yA1C5NnDClUdbRL9ay5VFkmwI"
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.accessToken

String

엑세스 토큰

data.refreshToken

String

리프레시 토큰

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

USER 테스트 토큰 생성 API(GET: /devdevdev/api/v1/token/test/user)

  • USER 권한 테스트 계정의 토큰을 생성하는 API

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/token/test/user HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: localhost:8080

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 518

{
  "resultType" : "SUCCESS",
  "data" : {
    "accessToken" : "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfdXNlckBkZXZkZXZkZXYuY29tIiwic29jaWFsVHlwZSI6IktBS0FPIiwicm9sZSI6IlJPTEVfVVNFUiIsImlhdCI6MTc0NjcxNjUzMywiZXhwIjoxNzQ2NzE4MzMzfQ.oonwXFxtOKxdvx6k_zDbJ_qA-gUK2Ln_PvmSrMVX6rI",
    "refreshToken" : "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfdXNlckBkZXZkZXZkZXYuY29tIiwic29jaWFsVHlwZSI6IktBS0FPIiwicm9sZSI6IlJPTEVfVVNFUiIsImlhdCI6MTc0NjcxNjUzMywiZXhwIjoxNzQ3MzIxMzMzfQ.EKZaRfixUJZQvZ8htUBYdfChHZEgoTq-QYPXtL6gyx8"
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.accessToken

String

엑세스 토큰

data.refreshToken

String

리프레시 토큰

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

회원

로그아웃 API(POST: /devdevdev/api/v1/logout)

  • 리프레시 토큰을 쿠키로 요청받아 회원의 리프레시 토큰을 비활성화 한다.

  • 리프레시 토큰 쿠키를 초기화 한다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/logout HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTA5LCJleHAiOjE3NDY3MTgzMDl9.I5XkKmWsvTIaBe2-E9SrzpR_PBbn7ImrqVZsRTFLStg
Host: localhost:8080
Cookie: DEVDEVDEV_REFRESH_TOKEN=

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

Name Optional Description

DEVDEVDEV_REFRESH_TOKEN

리프레시 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: DEVDEVDEV_REFRESH_TOKEN=; Path=/; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: DEVDEVDEV_LOGIN_STATUS=inactive; Path=/; Domain=devdevdev.co.kr; Max-Age=180; Expires=Thu, 08 May 2025 15:04:49 GMT; Secure
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}
Name Optional Description

DEVDEVDEV_REFRESH_TOKEN

리프레시 토큰

DEVDEVDEV_LOGIN_STATUS

로그인 활성화 유뮤(active | inactive)

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

마이 페이지

기술블로그 북마크 목록 API(GET: /devdevdev/api/v1/mypage/bookmarks)

  • 회원은 기술블로그 북마크 목록을 조회할 수 있다.

  • 비회원은 기술블로그 북마크 목록을 조회할 수 없다.

  • 다음 페이지 요청 시 정렬 조건과 커서(마지막 데이터의 id)를 요청에 담아야 한다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/mypage/bookmarks?size=2&bookmarkSort=BOOKMARKED&techArticleId= HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTEwLCJleHAiOjE3NDY3MTgzMTB9.L_YUpluJ27UcFn7xn1qo3hFLKRMi3yxRyHSHmVXd7hM
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters Fields

Parameter Optional Description Format

size

O

조회되는 데이터 수

bookmarkSort

O

정렬 조건

BOOKMARKED(등록순), LATEST(최신순), MOST_COMMENTED(댓글순)

techArticleId

O

마지막 데이터의 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 1869

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "id" : 21,
      "elasticId" : "elasticId_20",
      "thumbnailUrl" : "http://example.com/",
      "isLogoImage" : false,
      "techArticleUrl" : "http://example.com/20",
      "title" : "타이틀_20",
      "contents" : "내용",
      "company" : {
        "id" : 2,
        "name" : "꿈빛 파티시엘",
        "careerUrl" : "https://example.com",
        "officialImageUrl" : "https://example.com/company.png"
      },
      "regDate" : "2024-08-10",
      "author" : "작성자",
      "viewTotalCount" : 0,
      "recommendTotalCount" : 0,
      "commentTotalCount" : 0,
      "popularScore" : 0,
      "isBookmarked" : true,
      "score" : null
    }, {
      "id" : 20,
      "elasticId" : "elasticId_19",
      "thumbnailUrl" : "http://example.com/",
      "isLogoImage" : false,
      "techArticleUrl" : "http://example.com/19",
      "title" : "타이틀_19",
      "contents" : "내용",
      "company" : {
        "id" : 2,
        "name" : "꿈빛 파티시엘",
        "careerUrl" : "https://example.com",
        "officialImageUrl" : "https://example.com/company.png"
      },
      "regDate" : "2024-08-11",
      "author" : "작성자",
      "viewTotalCount" : 1,
      "recommendTotalCount" : 1,
      "commentTotalCount" : 1,
      "popularScore" : 10,
      "isBookmarked" : true,
      "score" : null
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 2,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "size" : 2,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : false,
    "numberOfElements" : 2,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

기술블로그 메인 배열

data.content.[].id

Number

기술블로그 아이디

data.content.[].elasticId

String

기술블로그 엘라스틱서치 아이디

data.content.[].techArticleUrl

String

기술블로그 Url

data.content.[].thumbnailUrl

String

기술블로그 썸네일 이미지

data.content.[].isLogoImage

Boolean

썸네일 이미지의 회사 로고 여부

data.content.[].title

String

기술블로그 제목

data.content.[].contents

String

기술블로그 내용

data.content.[].company

Object

기술블로그 회사

data.content.[].company.id

Number

기술블로그 회사 id

data.content.[].company.name

String

기술블로그 회사 이름

data.content.[].company.careerUrl

String

기술블로그 회사 채용페이지

data.content.[].company.officialImageUrl

String

기술블로그 회사 로고 이미지

data.content.[].regDate

String

기술블로그 작성일

data.content.[].author

String

기술블로그 작성자

data.content.[].viewTotalCount

Number

기술블로그 조회수

data.content.[].recommendTotalCount

Number

기술블로그 추천수

data.content.[].commentTotalCount

Number

기술블로그 댓글수

data.content.[].popularScore

Number

기술블로그 인기점수

data.content.[].isBookmarked

Boolean

O

회원의 북마크 여부

data.content.[].score

Null

정확도 점수(북마크 목록에서는 사용X)

data.pageable

Object

페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

내가 작성한 픽픽픽 메인 API(GET: /devdevdev/api/v1/mypage/picks)

  • 회원 자신이 작성한 픽픽픽 메인 데이터를 조회한다.

  • 익명 회원은 사용할 수 없습니다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/mypage/picks?size=10&pickId=9223372036854775807 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTEwLCJleHAiOjE3NDY3MTgzMTB9.L_YUpluJ27UcFn7xn1qo3hFLKRMi3yxRyHSHmVXd7hM
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters Fields

Parameter Optional Description Format

pickId

O

픽픽픽 아이디

size

O

조회되는 데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 1015

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "id" : 3,
      "title" : "쏘영이의 주류 픽픽픽!",
      "voteTotalCount" : 1,
      "commentTotalCount" : 3,
      "viewTotalCount" : 2,
      "isVoted" : true,
      "contentStatus" : "APPROVAL",
      "pickOptions" : [ {
        "id" : 1,
        "title" : "쏘주가 최고다!",
        "percent" : 100,
        "isPicked" : true
      }, {
        "id" : 2,
        "title" : "와인이 최고다!",
        "percent" : 0,
        "isPicked" : false
      } ]
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 10,
      "sort" : {
        "empty" : false,
        "sorted" : true,
        "unsorted" : false
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "size" : 10,
    "number" : 0,
    "sort" : {
      "empty" : false,
      "sorted" : true,
      "unsorted" : false
    },
    "first" : true,
    "last" : true,
    "numberOfElements" : 1,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

픽픽픽 메인 배열

data.content[].id

Number

픽픽픽 아이디

data.content[].title

String

픽픽픽 제목

data.content[].voteTotalCount

Number

픽픽픽 전체 투표 수

data.content[].commentTotalCount

Number

픽픽픽 전체 댓글 수

data.content[].viewTotalCount

Number

픽픽픽 조회 수

data.content[].contentStatus

String

픽픽픽 게시글 상태

REJECT(거절), READY(대기), APPROVAL(승인)

data.content[].isVoted

Boolean

픽픽픽 투표 여부

data.content[].pickOptions

Array

픽픽픽 옵션 배열

data.content[].pickOptions[].id

Number

픽픽픽 옵션 아이디

data.content[].pickOptions[].title

String

픽픽픽 옵션 제목

data.content[].pickOptions[].percent

Number

픽픽픽 옵션 투표율(%)

data.content[].pickOptions[].isPicked

Boolean

픽픽픽 옵션 투표 여부

data.content[].pickOptions[].id

Number

픽픽픽 옵션 아이디

data.content[].pickOptions[].title

String

픽픽픽 옵션 제목

data.content[].pickOptions[].percent

Number

픽픽픽 옵션 투표율(%)

data.content[].pickOptions[].isPicked

Boolean

픽픽픽 옵션 투표 여부

data.pageable

Object

픽픽픽 메인 페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

회원탈퇴 API(DELETE: /devdevdev/api/v1/mypage/profile)

  • 회원은 회원탈퇴를 진행할 수 있다.

  • 회원탈퇴 완료시 더이상 회원을 조회할 수 없다.

    • 현재 soft-delete 정책을 사용한다.

  • 회원탈퇴 완료시 리프레시 쿠키가 초기화되고, 로그인 활성화 여부 쿠키가 비활성화(inactive)로 변경된다.

정상 요청/응답

HTTP Request

DELETE /devdevdev/api/v1/mypage/profile HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTEwLCJleHAiOjE3NDY3MTgzMTB9.L_YUpluJ27UcFn7xn1qo3hFLKRMi3yxRyHSHmVXd7hM
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: DEVDEVDEV_REFRESH_TOKEN=; Path=/; Domain=devdevdev.co.kr; Max-Age=180; Expires=Thu, 08 May 2025 15:04:50 GMT; Secure
Set-Cookie: DEVDEVDEV_LOGIN_STATUS=inactive; Path=/; Domain=devdevdev.co.kr; Max-Age=180; Expires=Thu, 08 May 2025 15:04:50 GMT; Secure
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

Name Optional Description

DEVDEVDEV_REFRESH_TOKEN

리프레시 토큰

DEVDEVDEV_LOGIN_STATUS

로그인 활성화 유뮤(active | inactive)

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "탈퇴 설문조사를 완료하지 않은 회원입니다.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

회원탈퇴 서베이 목록 API(GET: /devdevdev/api/v1/mypage/exit-survey)

  • 회원은 회원탈퇴 서베이 목록을 조회할 수 있다.

  • 비회원은 회원탈퇴 서베이 목록을 조회할 수 없다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/mypage/exit-survey HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTEwLCJleHAiOjE3NDY3MTgzMTB9.L_YUpluJ27UcFn7xn1qo3hFLKRMi3yxRyHSHmVXd7hM
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 499

{
  "resultType" : "SUCCESS",
  "data" : {
    "surveyVersionId" : 5,
    "surveyQuestions" : [ {
      "id" : 4,
      "title" : "꿈빛파티시엘님 회원 탈퇴하는 이유를 알려주세요.",
      "content" : "회원 탈퇴하는 이유를 상세하게 알려주세요.",
      "sortOrder" : 0,
      "surveyQuestionOptions" : [ {
        "id" : 8,
        "title" : "기타",
        "content" : "직접 입력해주세요.(10자 이상)",
        "sortOrder" : 0
      } ]
    } ]
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.surveyVersionId

Number

회원탈퇴 서베이 버전 아이디

data.surveyQuestions

Array

회원탈퇴 서베이 질문 배열

data.surveyQuestions.[].id

Number

회원탈퇴 서베이 질문 아이디

data.surveyQuestions.[].title

String

회원탈퇴 서베이 제목

data.surveyQuestions.[].content

String

회원탈퇴 서베이 내용

data.surveyQuestions.[].sortOrder

Number

회원탈퇴 서베이 질문 정렬순서

data.surveyQuestions.[].surveyQuestionOptions

Array

회원탈퇴 서베이 질문 답변 배열

data.surveyQuestions.[].surveyQuestionOptions.[].id

Number

회원탈퇴 서베이 질문 답변 아이디

data.surveyQuestions.[].surveyQuestionOptions.[].title

String

회원탈퇴 서베이 질문 답변 제목

data.surveyQuestions.[].surveyQuestionOptions.[].content

String

회원탈퇴 서베이 질문 답변 내용

data.surveyQuestions.[].surveyQuestionOptions.[].sortOrder

Number

회원탈퇴 서베이 질문 답변 정렬순서

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

회원탈퇴 서베이 이력 저장 API(POST: /devdevdev/api/v1/mypage/exit-survey)

  • 회원탈퇴 서베이 이력을 저장한다.

  • 비회원은 이용할 수 없다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/mypage/exit-survey HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTEwLCJleHAiOjE3NDY3MTgzMTB9.L_YUpluJ27UcFn7xn1qo3hFLKRMi3yxRyHSHmVXd7hM
Content-Length: 135
Host: localhost:8080

{
  "questionId" : 3,
  "memberExitSurveyQuestionOptions" : [ {
    "id" : 7,
    "message" : "i think so.. this service is..."
  } ]
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Fields

Path Type Optional Description Format

questionId

Number

서베이 질문 아이디

memberExitSurveyQuestionOptions

Array

서베이 질문 아이디

memberExitSurveyQuestionOptions.[].id

Number

서베이 질문 답변 아이디

memberExitSurveyQuestionOptions.[].message

String

O

서베이 질문 답변 커스텀 메시지

String | null

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "아이디는 필수 입니다.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "아이디는 필수 입니다.",
  "errorCode" : 400
}

내가 썼어요 댓글/답글 조회 API(GET: /devdevdev/api/v1/mypage/comments)

  • 회원이 작성한 댓글/답글을 조회한다.

  • 최초 요청시 pickCommentId, techCommentId 는 가장 큰 숫자 값을 요청해야 합니다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/mypage/comments?size=6&pickCommentId=1000&techCommentId=1000 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE1LCJleHAiOjE3NDY3MTgzMTV9.olsUz7zekNI-5vF13zN-ASwOOzicuD5TALtCsA7aJBE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters Fields

Parameter Optional Description Format

size

O

조회되는 데이터 수

pickCommentId

O

가장 작은 픽픽픽 아이디

techCommentId

O

가장 작은 기술블로그 아이디

commentFilter

O

댓글 정렬 기준

ALL, PICK, TECH_ARTICLE

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 1322

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "uniqueCommentId" : "PICK_1_1",
      "postId" : 1,
      "postTitle" : "픽픽픽 제목",
      "commentId" : 1,
      "commentType" : "PICK",
      "commentContents" : "픽픽픽 댓글입니다.",
      "commentRecommendTotalCount" : 111,
      "commentCreatedAt" : "2025-01-01 00:00:00",
      "pickOptionTitle" : "픽픽픽 A",
      "pickOptionType" : "firstPickOption"
    }, {
      "uniqueCommentId" : "TECH_1_1",
      "postId" : 1,
      "postTitle" : "기술블로그 제목",
      "commentId" : 1,
      "commentType" : "TECH",
      "commentContents" : "기술블로그 댓글입니다.",
      "commentRecommendTotalCount" : 54321,
      "commentCreatedAt" : "2025-01-01 00:00:00",
      "pickOptionTitle" : null,
      "pickOptionType" : null
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 6,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "totalElements" : 2,
    "size" : 6,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : true,
    "numberOfElements" : 2,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

기술블로그 메인 배열

data.content.[].uniqueCommentId

String

O

댓글 유니크 아이디

${commentType}_${postId}_${commentId}

data.content.[].postId

Number

O

픽픽픽 | 기술블로그 아이디

data.content.[].postTitle

String

O

픽픽픽 | 기술블로그 제목

data.content.[].commentId

Number

O

픽픽픽 | 기술블로그 댓글 아이디

data.content.[].commentType

String

O

픽픽픽 | 기술블로그 댓글 타입

PICK | TECH

data.content.[].commentContents

String

O

픽픽픽 | 기술블로그 댓글 내용

data.content.[].commentRecommendTotalCount

Number

O

픽픽픽 | 기술블로그 댓글 추천 갯수

data.content.[].commentCreatedAt

String

O

픽픽픽 | 기술블로그 댓글 생성일

data.content.[].pickOptionTitle

String

O

픽픽픽 옵션 제목

String | null

data.content.[].pickOptionType

String

O

픽픽픽 옵션 타입

String | null

data.pageable

Object

O

페이지네이션 정보

data.pageable.pageNumber

Number

O

페이지 번호

data.pageable.pageSize

Number

O

페이지 사이즈

data.pageable.sort

Object

O

정렬 정보

data.pageable.sort.empty

Boolean

O

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

O

정렬 여부

data.pageable.sort.unsorted

Boolean

O

비정렬 여부

data.pageable.offset

Number

O

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

O

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

O

페이지 정보 비포함 여부

data.totalElements

Number

O

데이터 전체 갯수

data.first

Boolean

O

현재 페이지가 첫 페이지 여부

data.last

Boolean

O

현재 페이지가 마지막 페이지 여부

data.size

Number

O

페이지 크기

data.number

Number

O

현재 페이지

data.sort

Object

O

정렬 정보

data.sort.empty

Boolean

O

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

O

정렬 상태 여부

data.sort.unsorted

Boolean

O

비정렬 상태 여부

data.numberOfElements

Number

O

현재 페이지 데이터 수

data.empty

Boolean

O

현재 빈 페이지 여부

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

  • 유효하지 않은 회원 입니다.: 회원이 유효하지 않은 경우

{
  "resultType" : "FAIL",
  "message" : "유효하지 않은 회원 입니다.",
  "errorCode" : 401
}

회원이 구독한 기업 목록 조회 API(GET: /devdevdev/api/v1/mypage/subscriptions/companies)

  • 모든 회원은 자신이 구독한 기업 목록을 조회할 수 있다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/mypage/subscriptions/companies?size=1&companyId=999 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTExLCJleHAiOjE3NDY3MTgzMTF9.H9aAzDN-Q4pm2ovFGh8fEP8XOqOEGkVKHI8Opn0hmEQ
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters Fields

Parameter Optional Description Format

size

O

조회되는 데이터 수

companyId

O

커서(마지막 기업 아이디)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 694

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "companyId" : 1,
      "companyName" : "Toss",
      "companyImageUrl" : "https://image.net/image.png",
      "isSubscribed" : true
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 1,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "totalElements" : 1,
    "size" : 1,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : false,
    "numberOfElements" : 1,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

구독한 기업 목록 메인 배열

data.content[].companyId

Number

기업 아이디

data.content[].companyName

String

기업 이름

data.content[].companyImageUrl

String

기업 로고 이미지 url

data.content[].isSubscribed

Boolean

회원의 구독 여부

data.pageable

Object

픽픽픽 메인 페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.totalElements

Number

전체 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

예외

HTTP Response

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

댑댑댑 공통

신고 사유 목록 조회 API(GET: /devdevdev/api/v1/blames)

  • 회원이 신고 사유를 조회한다.

  • 익명 사용자는 이용할 수 없다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/blames HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTA3LCJleHAiOjE3NDY3MTgzMDd9.SLnF-WGqy3yWNOu2fnW0c0gB5SecL0pkBJCrURP7ZHI
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 113

{
  "resultType" : "SUCCESS",
  "datas" : [ {
    "id" : 2,
    "reason" : "욕설1",
    "sortOrder" : 0
  } ]
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

datas

Array

응답 데이터

datas.[].id

Number

신고 종류 아이디

datas.[].reason

String

신고 사유

datas.[].sortOrder

Number

정렬 순서

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "유효하지 않은 회원 입니다.",
  "errorCode" : 401
}

신고 API(POST: /devdevdev/api/v1/blames/{blamePahtType})

  • 회원이 신고 사유를 이용해서 신고하고 싶은 댑댑댑 서비스에 신고 한다.

    • 신고 가능한 댑댑댑 서비스

      • 픽픽픽, 픽픽픽 댓글, 기술블로그 댓글

  • 익명 사용자는 이용할 수 없다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/blames/PICK HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTA3LCJleHAiOjE3NDY3MTgzMDd9.SLnF-WGqy3yWNOu2fnW0c0gB5SecL0pkBJCrURP7ZHI
Content-Length: 149
Host: localhost:8080

{
  "pickId" : 2,
  "pickCommentId" : null,
  "techArticleId" : null,
  "techArticleCommentId" : null,
  "blameTypeId" : 3,
  "customReason" : null
}
{
  "pickId" : 1,
  "pickCommentId" : 1,
  "techArticleId" : null,
  "techArticleCommentId" : null,
  "blameTypeId" : 1,
  "customReason" : null
}
{
  "pickId" : null,
  "pickCommentId" : null,
  "techArticleId" : 1,
  "techArticleCommentId" : 1,
  "blameTypeId" : 5,
  "customReason" : null
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

blamePathType

댑댑댑 신고 경로 타입

PICK(픽픽픽), TECH_ARTICLE(기술 블로그)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 66

{
  "resultType" : "SUCCESS",
  "data" : {
    "blameId" : 2
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data.blameId

Number

신고 아이디

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

  • 존재하지 않는 신고 종류 입니다.: 신고 종류가 존재하지 않는 경우

  • 신고 사유 종류 아이디는 필수 입니다.: 신고 사유 종류 아이디를 요청 값으로 보내지 않은 경우

  • 이미 신고 했습니다.: 이미 신고한 이력이 있는 경우

  • 유효하지 않은 신고 경로입니다.: 잘못된 URL 접근인 경우

  • 픽픽픽 게시글이 없습니다.: 픽픽픽이 존재하지 않는 경우

  • 픽픽픽 댓글이 없습니다.: 픽픽픽 댓글이 존재하지 않는 경우

  • 승인 상태가 아닌 픽픽픽에는 댓글을 삭제할 수 없습니다.: 픽픽픽이 승인 상태가 아닌 경우

  • 잘못된 형식의 픽픽픽 서비스 접근 입니다.: 픽픽픽 신고인데, 픽픽픽 댓글 신고를 호출한 경우

  • 삭제된 픽픽픽 댓글에는 신고할 수 없습니다.: 픽픽픽 댓글이 삭제 상태인 경우

  • 존재하지 않는 기술블로그 댓글입니다.: 기술 블로그가 존재하지 않은 경우

  • 삭제된 기술 블로그 댓글에는 신고할 수 없습니다.: 기술 블로그 댓글이 삭제 된 경우

{
  "resultType" : "FAIL",
  "message" : "신고 사유 종류 아이디는 필수 입니다.",
  "errorCode" : 400
}

픽픽픽

픽픽픽 메인 API(GET: /devdevdev/api/v1/picks)

  • 픽픽픽 메인 화면을 조회할 수 있다.

  • 회원/익명 사용자에 따라 API 응답값이 상이하다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/picks?size=10&pickId=9223372036854775807&pickSort=LATEST HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

Anonymous-Member-Id

O

익명 회원 아이디

HTTP Request Query Parameters Fields

Parameter Optional Description Format

pickId

O

픽픽픽 아이디

pickSort

O

픽픽픽 정렬 조건

LATEST(최신순), POPULAR(인기순), MOST_VIEWED(조회수), MOST_COMMENTED(댓글순)

size

O

조회되는 데이터 수

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 974

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "id" : 48,
      "title" : "픽1타이틀",
      "voteTotalCount" : 2,
      "commentTotalCount" : 2,
      "viewTotalCount" : 2,
      "popularScore" : 20,
      "isVoted" : false,
      "pickOptions" : [ {
        "id" : 37,
        "title" : "픽옵션1",
        "percent" : 50,
        "isPicked" : false
      }, {
        "id" : 38,
        "title" : "픽옵션2",
        "percent" : 50,
        "isPicked" : false
      } ]
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 10,
      "sort" : {
        "empty" : false,
        "sorted" : true,
        "unsorted" : false
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "size" : 10,
    "number" : 0,
    "sort" : {
      "empty" : false,
      "sorted" : true,
      "unsorted" : false
    },
    "first" : true,
    "last" : true,
    "numberOfElements" : 1,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

픽픽픽 메인 배열

data.content[].id

Number

픽픽픽 아이디

data.content[].title

String

픽픽픽 제목

data.content[].voteTotalCount

Number

픽픽픽 전체 투표 수

data.content[].commentTotalCount

Number

픽픽픽 전체 댓글 수

data.content[].viewTotalCount

Number

픽픽픽 조회 수

data.content[].popularScore

Number

픽픽픽 인기점수

data.content[].isVoted

Boolean

O

픽픽픽 투표 여부(익명 사용자는 필드가 없다.)

data.content[].pickOptions

Array

픽픽픽 옵션 배열

data.content[].pickOptions[].id

Number

픽픽픽 옵션 아이디

data.content[].pickOptions[].title

String

픽픽픽 옵션 제목

data.content[].pickOptions[].percent

Number

픽픽픽 옵션 투표율(%)

data.content[].pickOptions[].isPicked

Boolean

O

픽픽픽 옵션 투표 여부(익명 사용자는 필드가 없다.)

data.content[].pickOptions[].id

Number

픽픽픽 옵션 아이디

data.content[].pickOptions[].title

String

픽픽픽 옵션 제목

data.content[].pickOptions[].percent

Number

픽픽픽 옵션 투표율(%)

data.content[].pickOptions[].isPicked

Boolean

O

픽픽픽 옵션 투표 여부(익명 사용자는 필드가 없다.)

data.pageable

Object

픽픽픽 메인 페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

픽픽픽 상세 API(GET: /devdevdev/api/v1/picks/{pickId})

  • 픽픽픽 아이디로 상세 화면을 조회할 수 있다.

  • 픽픽픽 게시글의 상태가 승인 상태(APPROVAL)가 아니면 조회할 수 없다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/picks/38 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

Anonymous-Member-Id

O

익명 회원 아이디

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 956

{
  "resultType" : "SUCCESS",
  "data" : {
    "userId" : "dre************",
    "nickname" : "꿈빛파티시엘",
    "pickCreatedAt" : "2025-05-08 15:02:05",
    "pickTitle" : "픽픽픽 제목",
    "isAuthor" : true,
    "isVoted" : false,
    "pickOptions" : {
      "secondPickOption" : {
        "id" : 30,
        "title" : "픽픽픽 옵션2",
        "isPicked" : false,
        "percent" : 0,
        "content" : "픽픽픽 옵션2 내용",
        "voteTotalCount" : 0,
        "pickDetailOptionImages" : [ {
          "id" : 35,
          "imageUrl" : "http://iamge2.png"
        } ]
      },
      "firstPickOption" : {
        "id" : 29,
        "title" : "픽픽픽 옵션1",
        "isPicked" : false,
        "percent" : 0,
        "content" : "픽픽픽 옵션1 내용",
        "voteTotalCount" : 1,
        "pickDetailOptionImages" : [ {
          "id" : 34,
          "imageUrl" : "http://iamge1.png"
        } ]
      }
    }
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.nickname

String

픽픽픽 작성자 닉네임

data.userId

String

픽픽픽 작성자 아이디

data.pickCreatedAt

String

픽픽픽 생성 일시

yyyy-MM-dd HH:mm:ss

data.pickTitle

String

픽픽픽 제목

data.isAuthor

Boolean

현재 로그인한 회원이 픽픽픽 작성자 여부

data.isVoted

Boolean

픽픽픽 투표 여부

data.pickOptions

Object

픽픽픽 옵션 객체

data.pickOptions.firstPickOption

Object

픽픽픽 첫번째 옵션 객체

data.pickOptions.firstPickOption.id

Number

첫 번째 픽픽픽 옵션 아이디

data.pickOptions.firstPickOption.title

String

첫 번째 픽픽픽 옵션 제목

data.pickOptions.firstPickOption.isPicked

Boolean

첫 번째 픽픽픽 옵션 투표 여부

data.pickOptions.firstPickOption.percent

Number

첫 번째 픽픽픽 옵션 득표율(%)

data.pickOptions.firstPickOption.content

String

첫 번째 픽픽픽 옵션 내용

data.pickOptions.firstPickOption.voteTotalCount

Number

첫 번째 픽픽픽 옵션 득표수

data.pickOptions.firstPickOption.pickDetailOptionImages

Array

첫 번째 픽픽픽 옵션 이미지 배열

data.pickOptions.firstPickOption.pickDetailOptionImages.[].id

Number

첫 번째 픽픽픽 옵션 이미지 아이디

data.pickOptions.firstPickOption.pickDetailOptionImages.[].imageUrl

String

첫 번째 픽픽픽 옵션 이미지 url

data.pickOptions.secondPickOption

Object

픽픽픽 첫번째 옵션 객체

data.pickOptions.secondPickOption.id

Number

두 번째 픽픽픽 옵션 아이디

data.pickOptions.secondPickOption.title

String

두 번째 픽픽픽 옵션 제목

data.pickOptions.secondPickOption.isPicked

Boolean

두 번째 픽픽픽 옵션 투표 여부

data.pickOptions.secondPickOption.percent

Number

두 번째 픽픽픽 옵션 득표율(%)

data.pickOptions.secondPickOption.content

String

두 번째 픽픽픽 옵션 내용

data.pickOptions.secondPickOption.voteTotalCount

Number

두 번째 픽픽픽 옵션 득표수

data.pickOptions.secondPickOption.pickDetailOptionImages

Array

두 번째 픽픽픽 옵션 이미지 배열

data.pickOptions.secondPickOption.pickDetailOptionImages.[].id

Number

두 번째 픽픽픽 옵션 이미지 아이디

data.pickOptions.secondPickOption.pickDetailOptionImages.[].imageUrl

String

두 번째 픽픽픽 옵션 이미지 url

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "픽픽픽 게시글이 없습니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "픽픽픽 게시글 상태가 승인 상태가 아닙니다. 관리자에게 문의하세요.",
  "errorCode" : 400
}

픽픽픽 작성 API(POST: /devdevdev/api/v1/picks)

  • 픽픽픽을 작성한다.

  • 회원만 픽픽픽 작성을 할 수 있다.

    • 작성시 픽픽픽 게시글 상태는(READY) 이다.

  • 픽픽픽 작성시 이미지는 있을 수도 없을 수도 있다.

    • 픽픽픽 이미지가 없을 경우 pickOptionImageIds 를 빈 배열로 요청해야 한다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/picks HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Content-Length: 467
Host: localhost:8080

{
  "pickTitle" : "Svelte VS React",
  "pickOptions" : {
    "secondPickOption" : {
      "pickOptionTitle" : "React가 짱이다!",
      "pickOptionContent" : "대형 커뮤니티, 대기업에서 라이브러리 관리!",
      "pickOptionImageIds" : [ 19 ]
    },
    "firstPickOption" : {
      "pickOptionTitle" : "Svelte가 짱이다!",
      "pickOptionContent" : "낮은 러닝커브 그리고 빠른 속도!",
      "pickOptionImageIds" : [ 18 ]
    }
  }
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Fields

Path Type Optional Description Format

pickTitle

String

픽픽픽 타이틀

pickOptions

Object

픽픽픽 옵션

pickOptions.firstPickOption

Object

픽픽픽 첫 번째 옵션 선택지

pickOptions.firstPickOption.pickOptionTitle

String

픽픽픽 첫 번째 옵션 선택지 제목

pickOptions.firstPickOption.pickOptionContent

String

픽픽픽 첫 번째 옵션 선택지 내용

pickOptions.firstPickOption.pickOptionImageIds

Array

픽픽픽 첫 번째 옵션 이미지 아이디 배열

pickOptions.secondPickOption

Object

픽픽픽 두 번째 옵션 선택지

pickOptions.secondPickOption.pickOptionTitle

String

픽픽픽 두 번째 옵션 선택지 제목

pickOptions.secondPickOption.pickOptionContent

String

픽픽픽 두 번째 옵션 선택지 내용

pickOptions.secondPickOption.pickOptionImageIds

Array

픽픽픽 두 번째 옵션 이미지 아이디 배열

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 66

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickId" : 20
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

O

응답 결과

data

Object

O

응답 데이터

data.pickId

Number

O

픽픽픽 아이디

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "비회원은 현재 해당 기능을 이용할 수 없습니다.",
  "errorCode" : 403
}

픽픽픽 수정 API(PATCH: /devdevdev/api/v1/picks/{pickId})

  • 픽픽픽을 수정한다.

  • 회원만 픽픽픽 수정 할 수 있다.

  • 회원 본인이 작성한 픽픽픽만 수정할 수 있다.

  • 픽픽픽 수정시 이미지는 있을 수도 없을 수도 있다.

정상 요청/응답

HTTP Request

PATCH /devdevdev/api/v1/picks/41 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Content-Length: 475
Host: localhost:8080

{
  "pickTitle" : "픽타이틀수정",
  "pickOptions" : {
    "secondPickOption" : {
      "pickOptionId" : 36,
      "pickOptionTitle" : "픽옵션2제목수정",
      "pickOptionContent" : "픽옵션2콘텐츠수정",
      "pickOptionImageIds" : [ 50 ]
    },
    "firstPickOption" : {
      "pickOptionId" : 35,
      "pickOptionTitle" : "픽옵션1제목수정",
      "pickOptionContent" : "픽옵션1콘텐츠수정",
      "pickOptionImageIds" : [ 49 ]
    }
  }
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

HTTP Request Fields

Path Type Optional Description Format

pickTitle

String

픽픽픽 타이틀

pickOptions

Object

픽픽픽 옵션

pickOptions.firstPickOption

Object

픽픽픽 첫 번째 옵션 선택지

pickOptions.firstPickOption.pickOptionId

Number

픽픽픽 첫 번째 옵션 선택지 아이디

pickOptions.firstPickOption.pickOptionTitle

String

픽픽픽 첫 번째 옵션 선택지 제목

pickOptions.firstPickOption.pickOptionContent

String

픽픽픽 첫 번째 옵션 선택지 내용

pickOptions.firstPickOption.pickOptionImageIds

Array

픽픽픽 첫 번째 옵션 이미지 아이디 배열

pickOptions.secondPickOption

Object

픽픽픽 두 번째 옵션 선택지

pickOptions.secondPickOption.pickOptionId

Number

픽픽픽 두 번째 옵션 선택지 아이디

pickOptions.secondPickOption.pickOptionTitle

String

픽픽픽 두 번째 옵션 선택지 제목

pickOptions.secondPickOption.pickOptionContent

String

픽픽픽 두 번째 옵션 선택지 내용

pickOptions.secondPickOption.pickOptionImageIds

Array

픽픽픽 두 번째 옵션 이미지 아이디 배열

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 66

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickId" : 41
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

O

응답 결과

data

Object

O

응답 데이터

data.pickId

Number

O

픽픽픽 아이디

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원 본인이 작성한 게시글만 수정할 수 있습니다.",
  "errorCode" : 403
}
{
  "resultType" : "FAIL",
  "message" : "픽픽픽 제목을 작성해주세요.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "픽픽픽 선택지 제목을 작성해주세요.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "픽픽픽 선택지가 없습니다.",
  "errorCode" : 400
}

픽픽픽 삭제 API(DELETE: /devdevdev/api/v1/picks/{pickId})

  • 회원이 자신이 작성한 픽픽픽 아이디로 픽픽픽을 삭제한다.

  • 회원 자신이 작성한 글이 아니면 삭제할 수 없다.

정상 요청/응답

HTTP Request

DELETE /devdevdev/api/v1/picks/49 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "픽픽픽 게시글이 없습니다.",
  "errorCode" : 404
}

픽픽픽 옵션(선택지) 투표 API(POST: /devdevdev/api/v1/picks/vote)

  • 픽픽픽 옵션(선택지)에 투표한다.

  • 투표를 하지 않은 pickVoteIdnull 로 응답한다.

  • 한번 투표를 하면 투표 취소는 불가하고, 다른 선택지에만 투표가 가능하다.

    • 이미 투표한 선택지에 투표할 경우 예외가 발생한다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/picks/vote HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Content-Length: 42
Host: localhost:8080

{
  "pickId" : 21,
  "pickOptionId" : 21
}

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

Anonymous-Member-Id

O

익명 회원 아이디

HTTP Request Fields

Path Type Optional Description Format

pickId

Number

픽픽픽 아이디

pickOptionId

Number

픽픽픽 옵션 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 367

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickId" : 21,
    "votePickOptions" : [ {
      "pickOptionId" : 21,
      "pickVoteId" : 20,
      "voteTotalCount" : 1,
      "percent" : 100,
      "isPicked" : true
    }, {
      "pickOptionId" : 22,
      "pickVoteId" : null,
      "voteTotalCount" : 0,
      "percent" : 0,
      "isPicked" : false
    } ]
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.pickId

Number

픽픽픽 아이디

data.votePickOptions

Array

픽픽픽 옵션 배열

data.votePickOptions.[0].pickOptionId

Number

픽픽픽 옵션 아이디

data.votePickOptions.[0].pickVoteId

Number

픽픽픽 투표 아이디

Number | null

data.votePickOptions.[0].voteTotalCount

Number

픽픽픽 옵션 총 득표수

data.votePickOptions.[0].percent

Number

픽픽픽 옵션 득표율(%)

data.votePickOptions.[0].isPicked

Boolean

회원의 픽픽픽 옵션 선택 여부

data.votePickOptions.[1].pickOptionId

Number

픽픽픽 옵션 아이디

data.votePickOptions.[1].pickVoteId

Number

픽픽픽 투표 아이디

Number | null

data.votePickOptions.[1].voteTotalCount

Number

픽픽픽 옵션 총 득표수

data.votePickOptions.[1].percent

Number

픽픽픽 옵션 득표율(%)

data.votePickOptions.[1].isPicked

Boolean

회원의 픽픽픽 옵션 선택 여부

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "픽픽픽 게시글이 없습니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "픽픽픽 선택지 아이디는 필수 입니다.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "동일한 픽픽픽 선택지에 투표할 수 없습니다.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "익명 회원 아이디를 확인해주세요.",
  "errorCode" : 400
}

픽픽픽 이미지 업로드API(POST: /devdevdev/api/v1/picks/image)

  • 픽픽픽 이미지를 업로드 한다.

  • 비회원은 이미지를 업로드할 수 없다.

  • 이미지 여러개를 업로드할 수 있다.

    • 갯수 제한(3개), 용량 제한(10MB)이 있다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/picks/image?name=firstPickOptionImage HTTP/1.1
Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI0LCJleHAiOjE3NDY3MTgzMjR9.GU28z1uA2B7OunH7HDOtJdZVOgbzD3i9ivgdzf_s0aE
Host: localhost:8080

--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=pickOptionImages; filename=tesImage.png
Content-Type: image/png

pickOptionImages
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters Fields

Parameter Optional Description Format

name

픽픽픽 옵션 이미지 이름

firstPickOptionImage | secondPickOptionImage

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 296

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickOptionImages" : [ {
      "name" : "firstPickOptionImage",
      "pickOptionImageId" : 5,
      "imageUrl" : "http://localhost:8080/xxx.png",
      "imageKey" : "test/pickpickpick/7c75d410-3e95-4b84-acd8-edb15dcaa42c-tesImage.png"
    } ]
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

O

응답 결과

data

Object

O

응답 데이터

data.pickOptionImages

Array

O

픽픽픽 옵션 이미지 배열

data.pickOptionImages[].name

String

O

픽픽픽 옵션 이미지 이름

firstPickOptionImage | secondPickOptionImage

data.pickOptionImages[].pickOptionImageId

Number

O

픽픽픽 옵션 이미지 아이디

data.pickOptionImages[].imageUrl

String

O

픽픽픽 옵션 이미지 URL

data.pickOptionImages[].imageKey

String

O

픽픽픽 옵션 이미지 KEY(경로)

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "비회원은 현재 해당 기능을 이용할 수 없습니다.",
  "errorCode" : 403
}
{
  "resultType" : "FAIL",
  "message" : "image/gif는 지원하지 않은 파일 형식 입니다. 현재 [image/jpeg, image/png] 파일 형식만 지원합니다.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "이미지 파일은 최대 3개 까지 업로드 할 수 있습니다.",
  "errorCode" : 400
}

픽픽픽 이미지 삭제 API(DELETE: /devdevdev/api/v1/picks/image/{pickOptionImageId})

  • 픽픽픽 옵션 이미지 1개를 삭제 한다.

  • 비회원은 이미지를 삭제 할 수 없다.

정상 요청/응답

HTTP Request

DELETE /devdevdev/api/v1/picks/image/27 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickOptionImageId

픽픽픽 옵션 이미지 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

O

응답 결과

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "비회원은 현재 해당 기능을 이용할 수 없습니다.",
  "errorCode" : 403
}
{
  "resultType" : "FAIL",
  "message" : "픽픽픽 선택지 이미지가 존재하지 않습니다.",
  "errorCode" : 400
}

나도 고민 했는데 픽픽픽 API(GET: /devdevdev/api/v1/picks/{pickId}/similarties)

  • 픽픽픽 상세와 유사도가 가장 높은 픽픽픽 3개를 조회한다.

  • 유사도가 가장 높은 픽픽픽이 존재하지 않으면 빈 배열로 응답된다.

  • 유사도 계산에 사용되는 embeddings 값이 없을 경우 503 예외를 발생한다.

    • 외부 API(Open AI API) 를 사용하기 때문에 embeddings 값을 저장하지 못할 수 있다.

  • 회원/익명 사용자 모두 조회할 수 있다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/picks/42/similarties HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI1LCJleHAiOjE3NDY3MTgzMjV9.PYUwhgp90sM89HwBTyvuLU3Adi0jU_VQkPuafAQTVZE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

타겟 픽픽픽 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 554

{
  "resultType" : "SUCCESS",
  "datas" : [ {
    "id" : 45,
    "title" : "소영님 일본 부럽다.",
    "voteTotalCount" : 4,
    "commentTotalCount" : 3,
    "similarity" : 0.9797958971132711
  }, {
    "id" : 44,
    "title" : "쏘영님 일본 진짜 부럽다..",
    "voteTotalCount" : 3,
    "commentTotalCount" : 4,
    "similarity" : 0.9649012813540153
  }, {
    "id" : 43,
    "title" : "쏘영쏘 일본 진짜 대박 짱 부럽다!!!",
    "voteTotalCount" : 2,
    "commentTotalCount" : 5,
    "similarity" : 0.9258200997725515
  } ]
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

datas

Array

응답 데이터

datas.[].id

Number

픽픽픽 아이디

datas.[].title

String

픽픽픽 제목

datas.[].voteTotalCount

Number

픽픽픽 총 투표 수

datas.[].commentTotalCount

Number

픽픽픽 총 댓글 수

datas.[].similarity

Number

타겟 픽픽픽과 유사도 점수

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "픽픽픽 게시글이 없습니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "픽픽픽 게시글 상태가 승인 상태가 아닙니다. 관리자에게 문의하세요.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "일시적으로 오류가 발생했습니다.",
  "errorCode" : 503
}

픽픽픽 댓글/답글

픽픽픽 댓글 작성 API(POST: /devdevdev/api/v1/picks/{pickId}/comments)

  • 픽픽픽 댓글을 작성한다.

  • 회원만 픽픽픽 댓글을 작성 할 수 있다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/picks/15/comments HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI0LCJleHAiOjE3NDY3MTgzMjR9.GU28z1uA2B7OunH7HDOtJdZVOgbzD3i9ivgdzf_s0aE
Content-Length: 65
Host: localhost:8080

{
  "contents" : "안녕하세웅",
  "isPickVotePublic" : true
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

HTTP Request Fields

Path Type Optional Description Format

contents

String

픽픽픽 댓글 내용(최소 1자 이상 최대 1,000자 이하)

isPickVotePublic

Boolean

픽픽픽 공개 여부

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 73

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickCommentId" : 52
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.pickCommentId

Number

픽픽픽 댓글 아이디

예외

HTTP Response

  • 내용을 작성해주세요.: 댓글(contents)을 작성하지 않는 경우(공백 이거나 빈문자열)

  • 픽픽픽 공개 여부는 필수 값 입니다.: 픽픽픽 공개 여부(isPickVotePublic)가 null 인 경우

  • 픽픽픽 게시글이 없습니다.: 픽픽픽 게시글이 존재하지 않는 경우

  • 승인 상태가 아닌 픽픽픽에는 댓글을 작성할 수 없습니다.: 픽픽픽이 승인 상태가 아닌 경우

  • 투표한 픽픽픽 선택지가 존재하지 않습니다.: 투표한 픽픽픽 선택지가 존재하지 않는 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "픽픽픽 공개 여부는 필수 값 입니다.",
  "errorCode" : 400
}

픽픽픽 답글 작성 API(POST: /devdevdev/api/v1/picks/{pickId}/comments/{pickOriginParentCommentId}/{pickParentCommentId})

  • 픽픽픽 답글을 작성한다.

  • 회원만 픽픽픽 답글을 작성 할 수 있다.

  • 픽픽픽 댓글이 삭제 상태 이면 답글을 작성 할 수 없다.

  • 최초 댓글에 대한 답글을 작성할 경우 pickCommentOriginParentId 값과 pickParentCommentId 값이 동일하다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/picks/5/comments/13/14 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI0LCJleHAiOjE3NDY3MTgzMjR9.GU28z1uA2B7OunH7HDOtJdZVOgbzD3i9ivgdzf_s0aE
Content-Length: 49
Host: localhost:8080

{
  "contents" : "댓글1의 답글1의 답글"
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

pickOriginParentCommentId

픽픽픽 최상단 댓글 아이디

pickParentCommentId

픽픽픽 답글 대상의 댓글 아이디

HTTP Request Fields

Path Type Optional Description Format

contents

String

픽픽픽 댓글 내용(최소 1자 이상 최대 1,000자 이하)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 73

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickCommentId" : 15
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.pickCommentId

Number

픽픽픽 답글 아이디

예외

HTTP Response

  • 내용을 작성해주세요.: 댓글(contents)을 작성하지 않는 경우(공백 이거나 빈문자열)

  • 픽픽픽 댓글이 없습니다.: 픽픽픽 댓글이 존재하지 않는 경우

  • 삭제된 픽픽픽 댓글에는 답글을 작성할 수 없습니다.: 픽픽픽 댓글이 삭제된 경우

  • 승인 상태가 아닌 픽픽픽에는 답글을 작성할 수 없습니다.: 픽픽픽이 승인 상태가 아닌 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "내용을 작성해주세요.",
  "errorCode" : 400
}

픽픽픽 댓글/답글 수정 API(PATCH: /devdevdev/api/v1/picks/{pickId}/comments/{pickCommentId})

  • 픽픽픽 댓글/답글을 수정한다.

  • 회원 본인이 작성한 픽픽픽 댓글/답글을 수정 할 수 있다.

  • 픽픽픽 공개 여부는 수정 할 수 없다.

  • 삭제된 댓글/답글을 수정 할 수 없다.

정상 요청/응답

HTTP Request

PATCH /devdevdev/api/v1/picks/4/comments/12 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI0LCJleHAiOjE3NDY3MTgzMjR9.GU28z1uA2B7OunH7HDOtJdZVOgbzD3i9ivgdzf_s0aE
Content-Length: 33
Host: localhost:8080

{
  "contents" : "주무세웅"
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

pickCommentId

픽픽픽 댓글 아이디

HTTP Request Fields

Path Type Optional Description Format

contents

String

픽픽픽 댓글 내용(최소 1자 이상 최대 1,000자 이하)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 73

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickCommentId" : 12
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.pickCommentId

Number

픽픽픽 댓글 아이디

예외

HTTP Response

  • 내용을 작성해주세요.: 댓글(contents)을 작성하지 않는 경우(공백 이거나 빈문자열)

  • 픽픽픽 댓글이 없습니다.: 픽픽픽 댓글이 존재하지 않거나 본인이 작성하지 않았거나 픽픽픽 댓글 삭제된 경우

  • 승인 상태가 아닌 픽픽픽에는 댓글을 수정할 수 없습니다.: 픽픽픽이 승인 상태가 아닌 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "내용을 작성해주세요.",
  "errorCode" : 400
}

픽픽픽 댓글/답글 삭제 API(DELETE: /devdevdev/api/v1/picks/{pickId}/comments/{pickCommentId})

  • 픽픽픽 댓글/답글을 삭제한다.

  • 회원 본인이 작성한 픽픽픽 댓글/답글만 삭제 할 수 있다.

  • 삭제된 댓글/답글을 삭제 할 수 없다.

  • 어드민 권한을 가진 회원은 모든 댓글/답글을 삭제할 수 있다.

정상 요청/응답

HTTP Request

DELETE /devdevdev/api/v1/picks/6/comments/16 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI0LCJleHAiOjE3NDY3MTgzMjR9.GU28z1uA2B7OunH7HDOtJdZVOgbzD3i9ivgdzf_s0aE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

pickCommentId

픽픽픽 댓글 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 73

{
  "resultType" : "SUCCESS",
  "data" : {
    "pickCommentId" : 16
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.pickCommentId

Number

픽픽픽 댓글 아이디

예외

HTTP Response

  • 픽픽픽 댓글이 없습니다.: 픽픽픽 댓글이 존재하지 않거나 본인이 작성하지 않았거나 픽픽픽 댓글 삭제된 경우

  • 승인 상태가 아닌 픽픽픽에는 댓글을 삭제할 수 없습니다.: 픽픽픽이 승인 상태가 아닌 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "픽픽픽 댓글이 없습니다.",
  "errorCode" : 404
}

픽픽픽 댓글/답글 조회 API(GET: /devdevdev/api/v1/picks/{pickId}/comments)

  • 픽픽픽 댓글/답글을 조회한다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/picks/11/comments?pickCommentId=9223372036854775807&size=5&pickCommentSort=MOST_COMMENTED HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI0LCJleHAiOjE3NDY3MTgzMjR9.GU28z1uA2B7OunH7HDOtJdZVOgbzD3i9ivgdzf_s0aE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

HTTP Request Query Parameters Fields

Parameter Optional Description Format

pickCommentId

O

픽픽픽 댓글 아이디

size

O

조회되는 데이터 수

pickCommentSort

O

픽픽픽 댓글 정렬 조건

LATEST(최신순), MOST_LIKED(좋아요순), MOST_COMMENTED(답글 많은순)

pickOptionType

O

픽픽픽 댓글 필터링 옵션 타입(체크박스)

firstPickOption(첫 번째 픽 옵션), secondPickOption(두 번째 픽 옵션)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 5813

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "pickCommentId" : 43,
      "createdAt" : "2025-05-08 15:02:04",
      "memberId" : 30,
      "author" : "미뇽냥녕냥녕",
      "isCommentOfPickAuthor" : true,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "maskedEmail" : "als******",
      "votedPickOption" : "firstPickOption",
      "votedPickOptionTitle" : "휴양지의 근본 제주도!",
      "contents" : "나는 미뇽냥녕뇽이다!",
      "replyTotalCount" : 2,
      "recommendTotalCount" : 2,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ {
        "pickCommentId" : 46,
        "memberId" : 32,
        "pickParentCommentMemberId" : 31,
        "pickParentCommentId" : 47,
        "pickOriginParentCommentId" : 43,
        "createdAt" : "2025-05-08 15:02:04",
        "isCommentOfPickAuthor" : false,
        "isCommentAuthor" : false,
        "isRecommended" : false,
        "pickParentCommentAuthor" : "야임마",
        "author" : "아이러브 손흥민",
        "maskedEmail" : "mmj****",
        "contents" : "손흥민 사랑해~!",
        "recommendTotalCount" : 0,
        "isModified" : false,
        "isDeleted" : false
      }, {
        "pickCommentId" : 47,
        "memberId" : 31,
        "pickParentCommentMemberId" : 30,
        "pickParentCommentId" : 43,
        "pickOriginParentCommentId" : 43,
        "createdAt" : "2025-05-08 15:02:04",
        "isCommentOfPickAuthor" : false,
        "isCommentAuthor" : false,
        "isRecommended" : false,
        "pickParentCommentAuthor" : "미뇽냥녕냥녕",
        "author" : "야임마",
        "maskedEmail" : "wlg*****",
        "contents" : "누가 빨래좀 대신 개주세여...",
        "recommendTotalCount" : 0,
        "isModified" : false,
        "isDeleted" : false
      } ]
    }, {
      "pickCommentId" : 42,
      "createdAt" : "2025-05-08 15:02:04",
      "memberId" : 31,
      "author" : "야임마",
      "isCommentOfPickAuthor" : false,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "maskedEmail" : "wlg*****",
      "votedPickOption" : "firstPickOption",
      "votedPickOptionTitle" : "휴양지의 근본 제주도!",
      "contents" : "임하하하하하",
      "replyTotalCount" : 2,
      "recommendTotalCount" : 1,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ {
        "pickCommentId" : 44,
        "memberId" : 34,
        "pickParentCommentMemberId" : 31,
        "pickParentCommentId" : 42,
        "pickOriginParentCommentId" : 42,
        "createdAt" : "2025-05-08 15:02:04",
        "isCommentOfPickAuthor" : false,
        "isCommentAuthor" : false,
        "isRecommended" : false,
        "pickParentCommentAuthor" : "야임마",
        "author" : "장세웅",
        "maskedEmail" : "how*********",
        "contents" : "댓글 작성자에 의해 삭제된 댓글입니다.",
        "recommendTotalCount" : 0,
        "isModified" : false,
        "isDeleted" : true
      }, {
        "pickCommentId" : 45,
        "memberId" : 33,
        "pickParentCommentMemberId" : 31,
        "pickParentCommentId" : 42,
        "pickOriginParentCommentId" : 42,
        "createdAt" : "2025-05-08 15:02:04",
        "isCommentOfPickAuthor" : false,
        "isCommentAuthor" : false,
        "isRecommended" : false,
        "pickParentCommentAuthor" : "야임마",
        "author" : "소영소",
        "maskedEmail" : "mer******",
        "contents" : "소주 없이는 못살아!!!!",
        "recommendTotalCount" : 0,
        "isModified" : false,
        "isDeleted" : false
      } ]
    }, {
      "pickCommentId" : 41,
      "createdAt" : "2025-05-08 15:02:04",
      "memberId" : 32,
      "author" : "아이러브 손흥민",
      "isCommentOfPickAuthor" : false,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "maskedEmail" : "mmj****",
      "votedPickOption" : "secondPickOption",
      "votedPickOptionTitle" : "한국의 알프스 강원도!",
      "contents" : "손흥민 최고다!",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ ]
    }, {
      "pickCommentId" : 40,
      "createdAt" : "2025-05-08 15:02:04",
      "memberId" : 33,
      "author" : "소영소",
      "isCommentOfPickAuthor" : false,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "maskedEmail" : "mer******",
      "votedPickOption" : null,
      "votedPickOptionTitle" : null,
      "contents" : "나는 소영소",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ ]
    }, {
      "pickCommentId" : 39,
      "createdAt" : "2025-05-08 15:02:04",
      "memberId" : 34,
      "author" : "장세웅",
      "isCommentOfPickAuthor" : false,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "maskedEmail" : "how*********",
      "votedPickOption" : null,
      "votedPickOptionTitle" : null,
      "contents" : "힘들면 힘을내자!",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ ]
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 5,
      "sort" : {
        "empty" : false,
        "sorted" : true,
        "unsorted" : false
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "totalElements" : 6,
    "totalOriginParentComments" : 5,
    "size" : 5,
    "number" : 0,
    "sort" : {
      "empty" : false,
      "sorted" : true,
      "unsorted" : false
    },
    "first" : true,
    "last" : false,
    "numberOfElements" : 5,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

픽픽픽 댓글/답글 메인 배열

data.content[].pickCommentId

Number

픽픽픽 댓글 아이디

data.content[].createdAt

String

픽픽픽 댓글 작성일시

data.content[].memberId

Number

픽픽픽 댓글 작성자 아이디

data.content[].author

String

픽픽픽 댓글 작성자 닉네임

data.content[].isCommentOfPickAuthor

Boolean

댓글 작성자가 픽픽픽 작성자인지 여부

data.content[].isCommentAuthor

Boolean

로그인한 회원이 댓글 작성자인지 여부

data.content[].isRecommended

Boolean

로그인한 회원이 댓글 추천 여부

data.content[].maskedEmail

String

픽픽픽 댓글 작성자 이메일

data.content[].votedPickOption

String

픽픽픽 투표 선택 타입

firstPickOption(첫 번째 픽 옵션), secondPickOption(두 번째 픽 옵션)

data.content[].votedPickOptionTitle

String

픽픽픽 투표 선택 타입 제목

String | null

data.content[].contents

String

픽픽픽 댓글 내용

data.content[].replyTotalCount

Number

픽픽픽 댓글의 답글 총 갯수

data.content[].recommendTotalCount

Number

픽픽픽 댓글 좋아요 총 갯수

data.content[].isDeleted

Boolean

픽픽픽 댓글 삭제 여부

data.content[].isModified

Boolean

픽픽픽 댓글 수정 여부

data.content[].replies

Array

픽픽픽 답글 배열

data.content[].replies[].pickCommentId

Number

픽픽픽 답글 아이디

data.content[].replies[].memberId

Number

픽픽픽 답글 작성자 아이디

data.content[].replies[].pickParentCommentId

Number

픽픽픽 답글의 부모 댓글 아이디

data.content[].replies[].pickOriginParentCommentId

Number

픽픽픽 답글의 최상위 부모 댓글 아이디

data.content[].replies[].createdAt

String

픽픽픽 답글 작성일시

data.content[].replies[].isCommentOfPickAuthor

Boolean

답글 작성자가 픽픽픽 작성자인지 여부

data.content[].replies[].isCommentAuthor

Boolean

로그인한 회원이 답글 작성자인지 여부

data.content[].replies[].isRecommended

Boolean

로그인한 회원이 답글 추천 여부

data.content[].replies[].author

String

픽픽픽 답글 작성자 닉네임

data.content[].replies[].maskedEmail

String

픽픽픽 답글 작성자 이메일

data.content[].replies[].contents

String

픽픽픽 답글 내용

data.content[].replies[].recommendTotalCount

Number

픽픽픽 답글 좋아요 총 갯수

data.content[].replies[].isDeleted

Boolean

픽픽픽 답글 삭제 여부

data.content[].replies[].isModified

Boolean

픽픽픽 답글 수정 여부

data.content[].replies[].pickParentCommentMemberId

Number

픽픽픽 부모 댓글 작성자 아이디

data.content[].replies[].pickParentCommentAuthor

String

픽픽픽 부모 댓글 작성자 닉네임

data.pageable

Object

픽픽픽 메인 페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.totalElements

Number

전체 댓글(답글 포함) 수

data.totalOriginParentComments

Number

삭제 되지 않은 최상위 댓글 수

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

픽픽픽 댓글/답글 추천 API(POST: /picks/{pickId}/comments/{pickCommentId}/recommends)

  • 픽픽픽 댓글/답글을 추천한다.

  • 회원만 픽픽픽 댓글을 추천 할 수 있다.

  • 이미 추천한 경우 추천이 취소 된다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/picks/13/comments/49/recommends HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTI0LCJleHAiOjE3NDY3MTgzMjR9.GU28z1uA2B7OunH7HDOtJdZVOgbzD3i9ivgdzf_s0aE
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

pickCommentId

픽픽픽 댓글/답글 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 106

{
  "resultType" : "SUCCESS",
  "data" : {
    "isRecommended" : true,
    "recommendTotalCount" : 1
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

O

응답 데이터

data.isRecommended

Boolean

O

로그인한 회원의 픽픽픽 댓글/답글 추천 여부

data.recommendTotalCount

Number

O

픽픽픽 댓글/답글 추천 총 갯수

예외

HTTP Response

  • 픽픽픽 댓글이 없습니다.: 픽픽픽 댓글/답글이 존재하지 않는 경우

  • 승인 상태가 아닌 픽픽픽에는 댓글을 추천할 수 없습니다.: 픽픽픽이 승인 상태가 아닌 경우

  • 삭제된 픽픽픽 댓글에는 추천할 수 없습니다.: 픽픽픽 댓글/답글이 삭제된 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "승인 상태가 아닌 픽픽픽에는 댓글을 추천할 수 없습니다.",
  "errorCode" : 400
}

픽픽픽 베스트 댓글/답글 조회 API(GET: /devdevdev/api/v1/picks/{pickId}/comments/best?size=)

  • 픽픽픽 베스트 댓글/답글을 조회한다.

    • 추천 수가 1개 미만이면 베스트 댓글에 포함되지 않는다.

    • 댓글이 존재하지 않으면, 빈 배열을 응답할 수 있다.

  • 최소 3개 최대 10개 까지만 조회가 가능하다.

  • 삭제 상태의 최초 댓글은 베스트 댓글에 포함되지 않는다.

    • 답글은 삭제 상태여도 포함된다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/picks/1/comments/best?size=3 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE5LCJleHAiOjE3NDY3MTgzMTl9.jprdvxIl1BaqAnEyd3GI5LiH_RMGBm12CYsAH_aOyxk
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

pickId

픽픽픽 아이디

HTTP Request Query Parameters Fields

Parameter Optional Description Format

size

O

조회되는 데이터 수(min=3, max=10)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 3313

{
  "resultType" : "SUCCESS",
  "datas" : [ {
    "pickCommentId" : 6,
    "createdAt" : "2025-05-08 15:02:04",
    "memberId" : 1,
    "author" : "김미뇽뇽뇽뇽",
    "isCommentOfPickAuthor" : true,
    "isCommentAuthor" : false,
    "isRecommended" : false,
    "maskedEmail" : "als******",
    "votedPickOption" : "firstPickOption",
    "votedPickOptionTitle" : "꿈파 최고!",
    "contents" : "행복한~",
    "replyTotalCount" : 2,
    "recommendTotalCount" : 3,
    "isModified" : true,
    "isDeleted" : false,
    "replies" : [ {
      "pickCommentId" : 7,
      "memberId" : 1,
      "pickParentCommentMemberId" : 1,
      "pickParentCommentId" : 6,
      "pickOriginParentCommentId" : 6,
      "createdAt" : "2025-05-08 15:02:04",
      "isCommentOfPickAuthor" : true,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "pickParentCommentAuthor" : "김미뇽뇽뇽뇽",
      "author" : "김미뇽뇽뇽뇽",
      "maskedEmail" : "als******",
      "contents" : "진짜 너무 좋아",
      "recommendTotalCount" : 0,
      "isModified" : false,
      "isDeleted" : false
    }, {
      "pickCommentId" : 8,
      "memberId" : 6,
      "pickParentCommentMemberId" : 1,
      "pickParentCommentId" : 7,
      "pickOriginParentCommentId" : 6,
      "createdAt" : "2025-05-08 15:02:04",
      "isCommentOfPickAuthor" : false,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "pickParentCommentAuthor" : "김미뇽뇽뇽뇽",
      "author" : "nickname",
      "maskedEmail" : "use**",
      "contents" : "커뮤니티 정책을 위반하여 삭제된 댓글입니다.",
      "recommendTotalCount" : 0,
      "isModified" : false,
      "isDeleted" : true
    } ]
  }, {
    "pickCommentId" : 5,
    "createdAt" : "2025-05-08 15:02:04",
    "memberId" : 2,
    "author" : "이임하하하하하",
    "isCommentOfPickAuthor" : false,
    "isCommentAuthor" : false,
    "isRecommended" : false,
    "maskedEmail" : "wlg*****",
    "votedPickOption" : "firstPickOption",
    "votedPickOptionTitle" : "꿈파 최고!",
    "contents" : "꿈빛!",
    "replyTotalCount" : 1,
    "recommendTotalCount" : 2,
    "isModified" : false,
    "isDeleted" : false,
    "replies" : [ {
      "pickCommentId" : 9,
      "memberId" : 6,
      "pickParentCommentMemberId" : 2,
      "pickParentCommentId" : 5,
      "pickOriginParentCommentId" : 5,
      "createdAt" : "2025-05-08 15:02:04",
      "isCommentOfPickAuthor" : false,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "pickParentCommentAuthor" : "이임하하하하하",
      "author" : "nickname",
      "maskedEmail" : "use**",
      "contents" : "사랑해요~",
      "recommendTotalCount" : 0,
      "isModified" : false,
      "isDeleted" : false
    } ]
  }, {
    "pickCommentId" : 4,
    "createdAt" : "2025-05-08 15:02:04",
    "memberId" : 3,
    "author" : "문밍주주주주주",
    "isCommentOfPickAuthor" : false,
    "isCommentAuthor" : false,
    "isRecommended" : false,
    "maskedEmail" : "mmj****",
    "votedPickOption" : "secondPickOption",
    "votedPickOptionTitle" : "사랑해 꿈파!",
    "contents" : "파티시엘~!",
    "replyTotalCount" : 0,
    "recommendTotalCount" : 1,
    "isModified" : false,
    "isDeleted" : false,
    "replies" : [ ]
  } ]
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

datas

Array

응답 데이터

datas.[].pickCommentId

Number

픽픽픽 댓글 아이디

datas.[].createdAt

String

픽픽픽 댓글 작성일시

datas.[].memberId

Number

픽픽픽 댓글 작성자 아이디

datas.[].author

String

픽픽픽 댓글 작성자 닉네임

datas.[].isCommentOfPickAuthor

Boolean

댓글 작성자가 픽픽픽 작성자인지 여부

datas.[].isCommentAuthor

Boolean

로그인한 회원이 댓글 작성자인지 여부

datas.[].isRecommended

Boolean

로그인한 회원이 댓글 추천 여부

datas.[].maskedEmail

String

픽픽픽 댓글 작성자 이메일

datas.[].votedPickOption

String

픽픽픽 투표 선택 타입

firstPickOption(첫 번째 픽 옵션), secondPickOption(두 번째 픽 옵션)

datas.[].votedPickOptionTitle

String

픽픽픽 투표 선택 타입 제목

String | null

datas.[].contents

String

픽픽픽 댓글 내용

datas.[].replyTotalCount

Number

픽픽픽 댓글의 답글 총 갯수

datas.[].recommendTotalCount

Number

픽픽픽 댓글 좋아요 총 갯수

datas.[].isDeleted

Boolean

픽픽픽 댓글 삭제 여부

datas.[].isModified

Boolean

픽픽픽 댓글 수정 여부

datas.[].replies

Array

픽픽픽 답글 배열

datas.[].replies[].pickCommentId

Number

픽픽픽 답글 아이디

datas.[].replies[].memberId

Number

픽픽픽 답글 작성자 아이디

datas.[].replies[].pickParentCommentId

Number

픽픽픽 답글의 부모 댓글 아이디

datas.[].replies[].pickOriginParentCommentId

Number

픽픽픽 답글의 최상위 부모 댓글 아이디

datas.[].replies[].createdAt

String

픽픽픽 답글 작성일시

datas.[].replies[].isCommentOfPickAuthor

Boolean

답글 작성자가 픽픽픽 작성자인지 여부

datas.[].replies[].isCommentAuthor

Boolean

로그인한 회원이 답글 작성자인지 여부

datas.[].replies[].isRecommended

Boolean

로그인한 회원이 답글 추천 여부

datas.[].replies[].author

String

픽픽픽 답글 작성자 닉네임

datas.[].replies[].maskedEmail

String

픽픽픽 답글 작성자 이메일

datas.[].replies[].contents

String

픽픽픽 답글 내용

datas.[].replies[].recommendTotalCount

Number

픽픽픽 답글 좋아요 총 갯수

datas.[].replies[].isDeleted

Boolean

픽픽픽 답글 삭제 여부

datas.[].replies[].isModified

Boolean

픽픽픽 답글 수정 여부

datas.[].replies[].pickParentCommentMemberId

Number

픽픽픽 부모 댓글 작성자 아이디

datas.[].replies[].pickParentCommentAuthor

String

픽픽픽 부모 댓글 작성자 닉네임

기술블로그

기술블로그 메인 API(GET: /devdevdev/api/v1/articles)

  • 기술블로그 메인 화면을 조회하거나 검색할 수 있다.

  • 회원/익명 사용자에 따라 API 응답값이 상이하다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/articles?size=1&techArticleSort=HIGHEST_SCORE&keyword=%ED%83%80%EC%9D%B4%ED%8B%80&elasticId=elasticId_1&companyId=17&score=10 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMyLCJleHAiOjE3NDY3MTgzMzJ9.3jqAEmRFG3eJzxUuDA7UfMJdmiAxyayPXw76K6i8vtI
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

HTTP Request Query Parameters Fields

Parameter Optional Description Format

size

O

조회되는 데이터 수

techArticleSort

O

정렬 조건

LATEST(최신순), POPULAR(인기순), MOST_VIEWED(조회순), MOST_COMMENTED(댓글순), HIGHEST_SCORE(정확도순)

keyword

O

검색어

companyId

O

회사 아이디

elasticId

O

마지막 데이터의 엘라스틱서치 아이디

score

O

마지막 데이터의 정확도 점수(정확도순 검색일 때에만 필수)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 1231

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "id" : 21,
      "elasticId" : "elasticId_5",
      "thumbnailUrl" : "http://example.com/",
      "isLogoImage" : false,
      "techArticleUrl" : "http://example.com/5",
      "title" : "타이틀_5",
      "contents" : "내용",
      "company" : {
        "id" : 17,
        "name" : "꿈빛 파티시엘",
        "careerUrl" : "https://example.com",
        "officialImageUrl" : "https://example.com/company.png"
      },
      "regDate" : "2024-08-25",
      "author" : "작성자",
      "viewTotalCount" : 15,
      "recommendTotalCount" : 15,
      "commentTotalCount" : 15,
      "popularScore" : 150,
      "isBookmarked" : false,
      "score" : 0.13787751
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 1,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "totalElements" : 20,
    "size" : 1,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : false,
    "numberOfElements" : 1,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

기술블로그 메인 배열

data.content.[].id

Number

기술블로그 아이디

data.content.[].elasticId

String

기술블로그 엘라스틱서치 아이디

data.content.[].techArticleUrl

String

기술블로그 Url

data.content.[].thumbnailUrl

String

기술블로그 썸네일 이미지

data.content.[].isLogoImage

Boolean

썸네일 이미지의 회사 로고 여부

data.content.[].title

String

기술블로그 제목

data.content.[].contents

String

기술블로그 내용

data.content.[].company

Object

기술블로그 회사

data.content.[].company.id

Number

기술블로그 회사 id

data.content.[].company.name

String

기술블로그 회사 이름

data.content.[].company.careerUrl

String

기술블로그 회사 채용페이지

data.content.[].company.officialImageUrl

String

기술블로그 회사 로고 이미지

data.content.[].regDate

String

기술블로그 작성일

data.content.[].author

String

기술블로그 작성자

data.content.[].viewTotalCount

Number

기술블로그 조회수

data.content.[].recommendTotalCount

Number

기술블로그 추천수

data.content.[].commentTotalCount

Number

기술블로그 댓글수

data.content.[].popularScore

Number

기술블로그 인기점수

data.content.[].isBookmarked

Boolean

O

회원의 북마크 여부(익명 사용자는 필드가 없다)

data.content.[].score

Number

정확도 점수

data.pageable

Object

페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.totalElements

Number

전체 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그입니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "정확도순 페이지네이션을 위한 커서의 score를 입력해주세요.",
  "errorCode" : 400
}
{
  "resultType" : "FAIL",
  "message" : "검색어에 특수문자는 포함할 수 없어요",
  "errorCode" : 400
}

기술블로그 상세 API(GET: /devdevdev/api/v1/articles/{techArticleId})

  • 기술블로그 상세 페이지를 조회한다.

  • 회원/익명 사용자에 따라 API 응답값이 상이하다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/articles/17 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMyLCJleHAiOjE3NDY3MTgzMzJ9.3jqAEmRFG3eJzxUuDA7UfMJdmiAxyayPXw76K6i8vtI
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

Anonymous-Member-Id

O

익명 회원 아이디

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 641

{
  "resultType" : "SUCCESS",
  "data" : {
    "elasticId" : "elasticId_1",
    "thumbnailUrl" : "http://example.com/",
    "techArticleUrl" : "http://example.com/1",
    "title" : "타이틀_1",
    "contents" : "내용",
    "company" : {
      "id" : 17,
      "name" : "꿈빛 파티시엘",
      "careerUrl" : "https://example.com",
      "officialImageUrl" : "https://example.com/company.png"
    },
    "regDate" : "2024-08-29",
    "author" : "작성자",
    "viewTotalCount" : 20,
    "recommendTotalCount" : 19,
    "commentTotalCount" : 19,
    "popularScore" : 192,
    "isBookmarked" : false,
    "isRecommended" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.elasticId

String

기술블로그 엘라스틱서치 아이디

data.techArticleUrl

String

기술블로그 Url

data.thumbnailUrl

String

기술블로그 썸네일 이미지

data.title

String

기술블로그 제목

data.contents

String

기술블로그 내용

data.company

Object

기술블로그 회사

data.company.id

Number

기술블로그 회사 id

data.company.name

String

기술블로그 회사 이름

data.company.careerUrl

String

기술블로그 회사 채용페이지

data.company.officialImageUrl

String

기술블로그 회사 로고 이미지

data.regDate

String

기술블로그 작성일

data.author

String

기술블로그 작성자

data.contents

String

기술블로그 내용

data.viewTotalCount

Number

기술블로그 조회수

data.recommendTotalCount

Number

기술블로그 추천수

data.commentTotalCount

Number

기술블로그 댓글수

data.popularScore

Number

기술블로그 인기점수

data.isBookmarked

Boolean

O

회원의 북마크 여부(익명 사용자는 필드가 없다)

data.isRecommended

Boolean

O

회원의 추천 여부

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그입니다.",
  "errorCode" : 404
}

기술블로그 북마크 API(POST: /devdevdev/api/v1/articles/{techArticleId}/bookmark)

  • 회원은 기술블로그 북마크 여부를 생성/갱신할 수 있다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/articles/17/bookmark HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMxLCJleHAiOjE3NDY3MTgzMzF9.GrdIwnjgXNs3srfFF6PTI5nwcAiInkyZ-IkdlBthATc
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 94

{
  "resultType" : "SUCCESS",
  "data" : {
    "techArticleId" : 17,
    "status" : true
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.techArticleId

Number

기술블로그 아이디

data.status

Boolean

북마크 상태

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그입니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

기술블로그 검색어 자동완성 API(GET: /devdevdev/api/v1/keywords/auto-complete)

  • 회원 또는 익명회원은 기술블로그 키워드를 검색하면 해당 키워드로 시작하는 키워드 후보 리스트를 최대 20개 조회할 수 있다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/keywords/auto-complete?prefix=%EC%9E%90 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Host: localhost:8080

HTTP Request Query Parameters Fields

Parameter Optional Description Format

prefix

검색 키워드

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 101

{
  "resultType" : "SUCCESS",
  "datas" : [ "자바", "자바스크립트", "자바가 최고야" ]
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

datas

Array

응답 데이터

기술블로그 추천 API(POST: /devdevdev/api/v1/articles/{techArticleId}/recommend)

  • 회원과 익명회원은 기술블로그를 추천하거나 추천 취소할 수 있다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/articles/17/recommend HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMxLCJleHAiOjE3NDY3MTgzMzF9.GrdIwnjgXNs3srfFF6PTI5nwcAiInkyZ-IkdlBthATc
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

Anonymous-Member-Id

O

익명 회원 아이디

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 126

{
  "resultType" : "SUCCESS",
  "data" : {
    "techArticleId" : 17,
    "status" : true,
    "recommendTotalCount" : 20
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.techArticleId

Number

기술블로그 아이디

data.status

Boolean

추천 상태

data.recommendTotalCount

Number

기술블로그 총 추천수

예외

HTTP Response

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그입니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

기술블로그 댓글/답글

기술블로그 댓글 작성 API(POST: /devdevdev/api/v1/articles/{techArticleId}/comments)

  • 회원은 기술블로그에 댓글을 작성할 수 있다.

  • 익명회원은 댓글을 작성할 수 없다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/articles/3/comments HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Content-Length: 44
Host: localhost:8080

{
  "contents" : "댓글 내용입니다."
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

HTTP Request Fields

Path Type Optional Description Format

contents

String

기술블로그 댓글 내용(최소 1자 이상 최대 1,000자 이하)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 72

{
  "resultType" : "SUCCESS",
  "data" : {
    "techCommentId" : 5
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.techCommentId

Number

기술블로그 댓글 아이디

예외

HTTP Response

  • 댓글 내용을 작성해주세요.: 댓글(contents)을 작성하지 않는 경우(공백 이거나 빈문자열)

  • 회원을 찾을 수 없습니다.: 회원 정보가 없을 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원이 사용할 수 없는 기능일 경우

  • 존재하지 않는 기술블로그입니다.: 기술블로그가 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "비회원은 현재 해당 기능을 이용할 수 없습니다.",
  "errorCode" : 403
}
{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그입니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "댓글 내용을 작성해주세요.",
  "errorCode" : 400
}

기술블로그 답글 작성 API(POST: /devdevdev/api/v1/articles/{techArticleId}/comments/{originParentTechCommentId}/{parentTechCommentId}

  • 회원은 기술블로그에 댓글에 답글을 작성할 수 있다.

  • 익명회원은 답글을 작성할 수 없다.

  • 삭제된 댓글에는 답글을 작성할 수 없다.

  • 최초 댓글에 대한 답글을 작성할 경우 techCommentOriginParentId 값과 techParentCommentId 값이 동일하다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/articles/2/comments/2/3 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Content-Length: 54
Host: localhost:8080

{
  "contents" : "답글에 대한 답글입니다."
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

originParentTechCommentId

기술블로그 최상단 댓글 아이디

parentTechCommentId

기술블로그 답글 대상의 댓글 아이디

HTTP Request Fields

Path Type Optional Description Format

contents

String

기술블로그 댓글 내용(최소 1자 이상 최대 1,000자 이하)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 72

{
  "resultType" : "SUCCESS",
  "data" : {
    "techCommentId" : 4
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.techCommentId

Number

기술블로그 댓글 아이디

예외

HTTP Response

  • 댓글 내용을 작성해주세요.: 댓글(contents)을 작성하지 않는 경우(공백 이거나 빈문자열)

  • 회원을 찾을 수 없습니다.: 회원 정보가 없을 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원이 사용할 수 없는 기능일 경우

  • 존재하지 않는 기술블로그입니다.: 기술블로그가 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "댓글 내용을 작성해주세요.",
  "errorCode" : 400
}

기술블로그 댓글 수정 API(PATCH: /devdevdev/api/v1/articles/{techArticleId}/comments/{techCommentId})

  • 기술블로그 댓글을 수정한다.

  • 회원 본인이 작성한 기술블로그 댓글을 수정할 수 있다.

  • 삭제된 댓글을 수정할 수 없다.

정상 요청/응답

HTTP Request

PATCH /devdevdev/api/v1/articles/7/comments/6 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Content-Length: 44
Host: localhost:8080

{
  "contents" : "댓글 수정입니다."
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

techCommentId

기술블로그 댓글 아이디

HTTP Request Fields

Path Type Optional Description Format

contents

String

기술블로그 댓글 내용(최소 1자 이상 최대 1,000자 이하)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 72

{
  "resultType" : "SUCCESS",
  "data" : {
    "techCommentId" : 6
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.techCommentId

Number

기술블로그 댓글 아이디

예외

HTTP Response

  • 내용을 작성해주세요.: 댓글(contents)을 작성하지 않는 경우(공백 이거나 빈문자열)

  • 존재하지 않는 기술블로그입니다.: 기술블로그가 존재하지 않는 경우

  • 존재하지 않는 기술블로그 댓글입니다: 기술블로그 댓글이 존재하지 않거나, 삭제된 댓글이거나, 본인이 작성한 댓글이 아닐 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그 댓글입니다.",
  "errorCode" : 404
}
{
  "resultType" : "FAIL",
  "message" : "댓글 내용을 작성해주세요.",
  "errorCode" : 400
}

기술블로그 댓글 삭제 API(DELETE: /devdevdev/api/v1/articles/{techArticleId}/comments/{techCommentId})

  • 기술블로그 댓글을 삭제한다.

  • 회원 본인이 작성한 기술블로그 댓글을 삭제할 수 있다.

  • 어드민 권한을 가진 회원은 모든 댓글을 삭제할 수 있다.

정상 요청/응답

HTTP Request

DELETE /devdevdev/api/v1/articles/8/comments/7 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

techCommentId

기술블로그 댓글 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 72

{
  "resultType" : "SUCCESS",
  "data" : {
    "techCommentId" : 7
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.techCommentId

Number

기술블로그 댓글 아이디

예외

HTTP Response

  • 존재하지 않는 기술블로그입니다.: 기술블로그가 존재하지 않는 경우

  • 존재하지 않는 기술블로그 댓글입니다: 기술블로그 댓글이 존재하지 않거나, 삭제된 댓글이거나, 본인이 작성한 댓글이 아닐 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그 댓글입니다.",
  "errorCode" : 404
}

기술블로그 댓글/답글 조회 API(GET: /devdevdev/api/v1/articles/{techArticleId}/comments)

  • 기술블로그 댓글/답글을 조회한다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/articles/12/comments?techCommentId=12&size=5&techCommentSort=OLDEST HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

HTTP Request Query Parameters Fields

Parameter Optional Description Format

techCommentId

O

기술블로그 댓글 아이디

size

O

조회 데이터 수

techCommentSort

O

기술블로그 댓글 정렬 조건

OLDEST(등록순), LATEST(최신순), MOST_LIKED(좋아요순), MOST_COMMENTED(답글 많은순)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 3879

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "techCommentId" : 13,
      "memberId" : 12,
      "author" : "꿈빛파티시엘",
      "maskedEmail" : "dre************",
      "contents" : "최상위 댓글2",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isCommentAuthor" : true,
      "isRecommended" : true,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ {
        "techCommentId" : 20,
        "memberId" : 12,
        "techParentCommentMemberId" : 12,
        "techParentCommentId" : 13,
        "techOriginParentCommentId" : 13,
        "isCommentAuthor" : true,
        "isRecommended" : true,
        "techParentCommentAuthor" : "꿈빛파티시엘",
        "author" : "꿈빛파티시엘",
        "maskedEmail" : "dre************",
        "contents" : "최상위 댓글2의 답글1",
        "recommendTotalCount" : 0,
        "isDeleted" : false,
        "isModified" : false,
        "createdAt" : "2025-05-08 15:02:10"
      }, {
        "techCommentId" : 21,
        "memberId" : 12,
        "techParentCommentMemberId" : 12,
        "techParentCommentId" : 13,
        "techOriginParentCommentId" : 13,
        "isCommentAuthor" : true,
        "isRecommended" : false,
        "techParentCommentAuthor" : "꿈빛파티시엘",
        "author" : "꿈빛파티시엘",
        "maskedEmail" : "dre************",
        "contents" : "최상위 댓글2의 답글2",
        "recommendTotalCount" : 0,
        "isDeleted" : false,
        "isModified" : false,
        "createdAt" : "2025-05-08 15:02:10"
      } ],
      "createdAt" : "2025-05-08 15:02:10"
    }, {
      "techCommentId" : 14,
      "memberId" : 12,
      "author" : "꿈빛파티시엘",
      "maskedEmail" : "dre************",
      "contents" : "최상위 댓글3",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isCommentAuthor" : true,
      "isRecommended" : false,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ ],
      "createdAt" : "2025-05-08 15:02:10"
    }, {
      "techCommentId" : 15,
      "memberId" : 12,
      "author" : "꿈빛파티시엘",
      "maskedEmail" : "dre************",
      "contents" : "최상위 댓글4",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isCommentAuthor" : true,
      "isRecommended" : false,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ ],
      "createdAt" : "2025-05-08 15:02:10"
    }, {
      "techCommentId" : 16,
      "memberId" : 12,
      "author" : "꿈빛파티시엘",
      "maskedEmail" : "dre************",
      "contents" : "최상위 댓글5",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isCommentAuthor" : true,
      "isRecommended" : false,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ ],
      "createdAt" : "2025-05-08 15:02:10"
    }, {
      "techCommentId" : 17,
      "memberId" : 12,
      "author" : "꿈빛파티시엘",
      "maskedEmail" : "dre************",
      "contents" : "최상위 댓글6",
      "replyTotalCount" : 0,
      "recommendTotalCount" : 0,
      "isCommentAuthor" : true,
      "isRecommended" : false,
      "isModified" : false,
      "isDeleted" : false,
      "replies" : [ ],
      "createdAt" : "2025-05-08 15:02:10"
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 5,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "totalElements" : 12,
    "totalOriginParentComments" : 6,
    "size" : 5,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : false,
    "numberOfElements" : 5,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

기술블로그 댓글/답글 메인 배열

data.content[].techCommentId

Number

기술블로그 댓글 아이디

data.content[].createdAt

String

기술블로그 댓글 작성일시

data.content[].memberId

Number

기술블로그 댓글 작성자 아이디

data.content[].author

String

기술블로그 댓글 작성자 닉네임

data.content[].maskedEmail

String

기술블로그 댓글 작성자 이메일

data.content[].contents

String

기술블로그 댓글 내용

data.content[].isCommentAuthor

Boolean

회원의 기술블로그 댓글 작성자 여부

data.content[].replyTotalCount

Number

기술블로그 댓글의 답글 총 갯수

data.content[].recommendTotalCount

Number

기술블로그 댓글 좋아요 총 갯수

data.content[].isDeleted

Boolean

기술블로그 댓글 삭제 여부

data.content[].isModified

Boolean

기술블로그 댓글 편집 여부

data.content[].isRecommended

Boolean

기술블로그 댓글 좋아요 여부

data.content[].replies

Array

기술블로그 답글 배열

data.content[].replies[].techCommentId

Number

기술블로그 답글 아이디

data.content[].replies[].memberId

Number

기술블로그 답글 작성자 아이디

data.content[].replies[].techParentCommentId

Number

기술블로그 답글의 부모 댓글 아이디

data.content[].replies[].techOriginParentCommentId

Number

기술블로그 답글의 최상위 부모 댓글 아이디

data.content[].replies[].createdAt

String

기술블로그 답글 작성일시

data.content[].replies[].techParentCommentMemberId

Number

기술블로그 답글의 부모 댓글 작성자 아이디

data.content[].replies[].techParentCommentAuthor

String

기술블로그 답글의 부모 댓글 작성자 닉네임

data.content[].replies[].author

String

기술블로그 답글 작성자 닉네임

data.content[].replies[].isCommentAuthor

Boolean

회원의 기술블로그 답글 작성자 여부

data.content[].replies[].maskedEmail

String

기술블로그 답글 작성자 이메일

data.content[].replies[].contents

String

기술블로그 답글 내용

data.content[].replies[].recommendTotalCount

Number

기술블로그 답글 좋아요 총 갯수

data.content[].replies[].isDeleted

Boolean

기술블로그 댓글 삭제 여부

data.content[].replies[].isModified

Boolean

기술블로그 댓글 편집 여부

data.content[].replies[].isRecommended

Boolean

기술블로그 댓글 좋아요 여부

data.pageable

Object

기술블로그 메인 페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.totalElements

Number

전체 댓글 수

data.totalOriginParentComments

Number

삭제 되지 않은 최상위 댓글 수

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

기술블로그 댓글/답글 추천 API(POST: /articles/{techArticleId}/comments/{techCommentId}/recommends)

  • 회원은 기술블로그 댓글/답글을 추천할 수 있다.

  • 이미 추천한 경우 추천이 취소된다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/articles/1/comments/1/recommends HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

techCommentId

기술블로그 댓글/답글 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 106

{
  "resultType" : "SUCCESS",
  "data" : {
    "isRecommended" : true,
    "recommendTotalCount" : 1
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

O

응답 데이터

data.isRecommended

Boolean

O

로그인한 회원의 기술블로그 댓글/답글 추천 여부

data.recommendTotalCount

Number

O

기술블로그 댓글/답글 추천 총 갯수

예외

HTTP Response

  • 존재하지 않는 기술블로그입니다.: 기술블로그가 존재하지 않는 경우

  • 존재하지 않는 기술블로그 댓글입니다: 기술블로그 댓글이 존재하지 않거나, 삭제된 댓글이거나, 본인이 작성한 댓글이 아닐 경우

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기술블로그 댓글입니다.",
  "errorCode" : 404
}

기술블로그 베스트 댓글/답글 조회 API(GET: /devdevdev/api/v1/articles/{techArticleId}/comments/best?size=)

  • 기술블로그 베스트 댓글/답글을 조회한다.

    • 댓글이 존재하지 않으면, 빈 배열을 응답할 수 있다.

  • 최소 3개 최대 10개 까지만 조회가 가능하다.

  • 삭제 상태의 최초 댓글은 베스트 댓글에 포함되지 않는다.

    • 답글은 삭제 상태여도 포함된다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/articles/10/comments/best?size=3 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

O

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

techArticleId

기술블로그 아이디

HTTP Request Query Parameters Fields

Parameter Optional Description Format

size

O

조회되는 데이터 수(min=3, max=10)

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 1719

{
  "resultType" : "SUCCESS",
  "datas" : [ {
    "techCommentId" : 8,
    "memberId" : 8,
    "author" : "김민영",
    "maskedEmail" : "als******",
    "contents" : "최상위 댓글1 수정",
    "replyTotalCount" : 0,
    "recommendTotalCount" : 3,
    "isCommentAuthor" : false,
    "isRecommended" : false,
    "isModified" : true,
    "isDeleted" : false,
    "replies" : [ {
      "techCommentId" : 11,
      "memberId" : 10,
      "techParentCommentMemberId" : 8,
      "techParentCommentId" : 8,
      "techOriginParentCommentId" : 8,
      "isCommentAuthor" : false,
      "isRecommended" : false,
      "techParentCommentAuthor" : "김민영",
      "author" : "문민주",
      "maskedEmail" : "mmj****",
      "contents" : "최상위 댓글1의 답글1",
      "recommendTotalCount" : 0,
      "isDeleted" : false,
      "isModified" : false,
      "createdAt" : "2025-05-08 15:02:10"
    } ],
    "createdAt" : "2025-05-08 15:02:10"
  }, {
    "techCommentId" : 9,
    "memberId" : 9,
    "author" : "이임하",
    "maskedEmail" : "wlg*****",
    "contents" : "최상위 댓글1",
    "replyTotalCount" : 0,
    "recommendTotalCount" : 2,
    "isCommentAuthor" : false,
    "isRecommended" : false,
    "isModified" : false,
    "isDeleted" : false,
    "replies" : [ ],
    "createdAt" : "2025-05-08 15:02:10"
  }, {
    "techCommentId" : 10,
    "memberId" : 10,
    "author" : "문민주",
    "maskedEmail" : "mmj****",
    "contents" : "최상위 댓글1",
    "replyTotalCount" : 0,
    "recommendTotalCount" : 1,
    "isCommentAuthor" : false,
    "isRecommended" : false,
    "isModified" : false,
    "isDeleted" : false,
    "replies" : [ ],
    "createdAt" : "2025-05-08 15:02:10"
  } ]
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

datas

Array

응답 데이터

datas.[].techCommentId

Number

기술블로그 댓글 아이디

datas.[].createdAt

String

기술블로그 댓글 작성일시

datas.[].memberId

Number

기술블로그 댓글 작성자 아이디

datas.[].author

String

기술블로그 댓글 작성자 닉네임

datas.[].isCommentAuthor

Boolean

로그인한 회원이 댓글 작성자인지 여부

datas.[].isRecommended

Boolean

로그인한 회원이 댓글 추천 여부

datas.[].maskedEmail

String

기술블로그 댓글 작성자 이메일

datas.[].contents

String

기술블로그 댓글 내용

datas.[].replyTotalCount

Number

기술블로그 댓글의 답글 총 갯수

datas.[].recommendTotalCount

Number

기술블로그 댓글 좋아요 총 갯수

datas.[].isDeleted

Boolean

기술블로그 댓글 삭제 여부

datas.[].isModified

Boolean

기술블로그 댓글 수정 여부

datas.[].replies

Array

기술블로그 답글 배열

datas.[].replies[].techCommentId

Number

기술블로그 답글 아이디

datas.[].replies[].memberId

Number

기술블로그 답글 작성자 아이디

datas.[].replies[].techParentCommentId

Number

기술블로그 답글의 부모 댓글 아이디

datas.[].replies[].techOriginParentCommentId

Number

기술블로그 답글의 최상위 부모 댓글 아이디

datas.[].replies[].createdAt

String

기술블로그 답글 작성일시

datas.[].replies[].isCommentAuthor

Boolean

로그인한 회원이 답글 작성자인지 여부

datas.[].replies[].isRecommended

Boolean

로그인한 회원이 답글 추천 여부

datas.[].replies[].author

String

기술블로그 답글 작성자 닉네임

datas.[].replies[].maskedEmail

String

기술블로그 답글 작성자 이메일

datas.[].replies[].contents

String

기술블로그 답글 내용

datas.[].replies[].recommendTotalCount

Number

기술블로그 답글 좋아요 총 갯수

datas.[].replies[].isDeleted

Boolean

기술블로그 답글 삭제 여부

datas.[].replies[].isModified

Boolean

기술블로그 답글 수정 여부

datas.[].replies[].techParentCommentMemberId

Number

기술블로그 부모 댓글 작성자 아이디

datas.[].replies[].techParentCommentAuthor

String

기술블로그 부모 댓글 작성자 닉네임

기술 블로그 구독

기업 구독 API(POST: /devdevdev/api/v1/subscriptions)

  • 회원은 구독한 가능한 기업을 구독 할 수 있다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/subscriptions HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Content-Length: 21
Host: localhost:8080

{
  "companyId" : 1
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Fields

Path Type Optional Description Format

companyId

Number

기업 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 61

{
  "resultType" : "SUCCESS",
  "data" : {
    "id" : 1
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.id

Number

구독 아이디

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

  • 이미 구독하고 있는 기업입니다.: 이미 구독하고 있는 기업인 경우

  • 존재하지 않는 기업 입니다.: 존재하지 않는 기업인 경우

  • 기업 아이디는 필수 입니다.: 기업 아이디가 null 인 경우

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기업 입니다.",
  "errorCode" : 404
}

기업 구독 취소 API(DELETE: /devdevdev/api/v1/subscriptions)

  • 회원은 구독한 가능한 기업을 구독 할 수 있다.

정상 요청/응답

HTTP Request

DELETE /devdevdev/api/v1/subscriptions HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Content-Length: 21
Host: localhost:8080

{
  "companyId" : 1
}

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Fields

Path Type Optional Description Format

companyId

Number

기업 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

  • 구독 이력이 없습니다.: 구독 이력이 없는 경우

  • 기업 아이디는 필수 입니다.: 기업 아이디가 null 인 경우

{
  "resultType" : "FAIL",
  "message" : "구독 이력이 없습니다.",
  "errorCode" : 404
}

구독 가능한 기업 목록 조회 API(GET: /devdevdev/api/v1/subscriptions/companies)

  • 회원 또는 익명회원이 구독 가능한 기업 목록을 조회한다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/subscriptions/companies?size=10&companyId=105 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters Fields

Parameter Optional Description Format

size

O

조회되는 데이터 수

companyId

O

기업 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 666

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "companyId" : 1,
      "companyImageUrl" : "https://www.teuida.net/public/src/img/teuida_logo.png",
      "isSubscribed" : true
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 20,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "size" : 20,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : true,
    "numberOfElements" : 1,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

구독 가능한 기업 목록 메인 배열

data.content[].companyId

Number

기업 아이디

data.content[].companyImageUrl

String

기업 로고 이미지 url

data.content[].isSubscribed

Boolean

회원의 구독 여부

data.pageable

Object

픽픽픽 메인 페이지네이션 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 사이즈

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 여부

data.pageable.sort.unsorted

Boolean

비정렬 여부

data.pageable.offset

Number

페이지 오프셋 (페이지 크기 * 페이지 번호)

data.pageable.paged

Boolean

페이지 정보 포함 여부

data.pageable.unpaged

Boolean

페이지 정보 비포함 여부

data.first

Boolean

현재 페이지가 첫 페이지 여부

data.last

Boolean

현재 페이지가 마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 상태 여부

data.sort.unsorted

Boolean

비정렬 상태 여부

data.numberOfElements

Number

현재 페이지 데이터 수

data.empty

Boolean

현재 빈 페이지 여부

구독 가능한 기업 상세 조회 API(GET: /devdevdev/api/v1/subscriptions/companies/{companyId})

  • 모든 회원은 구독 가능한 기업의 상세 정보를 조회할 수 있다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/subscriptions/companies/1?size=10&companyId=105 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTMwLCJleHAiOjE3NDY3MTgzMzB9.Hh0UTH99woLMJ25u6Uf8BiOlVBo9HTSYkO8b9xmknf0
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters Fields

Parameter Optional Description Format

companyId

기업 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 1285

{
  "resultType" : "SUCCESS",
  "data" : {
    "companyId" : 1,
    "companyName" : "Teuida",
    "industry" : "교육",
    "companyDescription" : "“외국인의 한국어가 트이다”\n영어 공부 오래 했지만 영어로 말할 때 주저하게 되죠? 외국인도 마찬가지예요. 한국어 말할 때 주저하게 돼요.\n트이다는 화면 속 한국인과 가상대화를 하는 경험을 통해 외국인이 한국어 회화에 자신감을 가질 수 있도록 도움을 주는 스타트업이에요.\n전 세계 130만 명 이상의 사용자가 웹드라마 속 배우랑 가상대화를 하면서 한국어를 배우고 한국어 말하기에 자신감을 향상하고 있어요.\n우리는 외국어를 학습하기보다 여행을 갔을 때, 외국인 친구를 사귀었을 때 자신이 하고 싶은 말을 할 수 있도록 재미있는 콘텐츠와 서비스를 제공하기 위해 노력하고 있어요. 모든 사람들이 자신의 생각, 의견을 어떤 언어로든 말할 수 있는 용기를 심어주고 싶어요.",
    "companyOfficialImageUrl" : "https://www.teuida.net/public/src/img/teuida_logo.png",
    "companyCareerUrl" : "https://www.wanted.co.kr/company/5908",
    "techArticleTotalCount" : 3980,
    "isSubscribed" : true
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.companyId

Number

기업 아이디

data.companyName

String

기업명

data.industry

String

산업군

data.companyCareerUrl

String

기업 채용 url

data.companyOfficialImageUrl

String

기업 로고 url

data.companyDescription

String

기업 설명

data.techArticleTotalCount

Number

기술 블로그 총 갯수

data.isSubscribed

Boolean

구독 여부

예외

HTTP Response

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

  • 존재하지 않는 기업 입니다.: 존재하지 않는 기업인 경우

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 기업 입니다.",
  "errorCode" : 404
}

알림

실시간 알림 수신 API(GET: /devdevdev/api/v1/notifications)

  • 회원이 알림을 실시간으로 수신한다.

  • 알림 처리 방식은 Server-Sent Events를 사용한다.

    • 5분의 타임아웃, 30초 마다 heartbeat 를 전송한다.

  • 기술블로그 알림 시나리오

    • SSE 구독 상태인 경우

      1. SSE 구독

      2. 읽지 않은 알림이 있는 경우

        1. "읽지 않은 알림이 %d개 있어요!" 전송

        2. 새로운 글 발행

        3. "%s에서 새로운 기슬블로그 %d개가 올라왔어요!" 전송

      3. 읽지 않은 알림이 없는 경우

        1. 새로운 글 발행

        2. "%s에서 새로운 기슬블로그 %d개가 올라왔어요!" 전송

    • SSE 구독 상태가 아닌 경우

      1. 새로운 글 발행

      2. SSE 구독

        1. "읽지 않은 알림이 %d개 있어요!" 전송

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/notifications HTTP/1.1
Content-Type: text/event-stream;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE5LCJleHAiOjE3NDY3MTgzMTl9.jprdvxIl1BaqAnEyd3GI5LiH_RMGBm12CYsAH_aOyxk
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer Token

Content-Type

text/event-stream

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: text/event-stream;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 123

data: {"message" : "트이다에서 새로운 기슬블로그 105개가 올라왔어요!", "createdAt" : "2025-04-06T00:00:00"}

HTTP Response Header Fields

Name Description

Content-Type

text/event-stream

HTTP Response Body

data: {"message" : "트이다에서 새로운 기슬블로그 105개가 올라왔어요!", "createdAt" : "2025-04-06T00:00:00"}
Path Type Optional Description Format

data

Object

알림

message

String

알림 메시지

createdAt

String

알림 발생 일시

'yyyy-MM-dd’T’HH:mm:ss.SSSZ'

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

  • 유효하지 않은 회원 입니다.: 회원이 유효하지 않은 경우

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

알림 생성 API(POST: /devdevdev/api/v1/notifications/{channel})

  • 알림을 생성한다.

    • service-name, api-key 가 일치 하지 않으면 호출 할 수 없다.

정상 요청/응답

HTTP Request

POST /devdevdev/api/v1/notifications/SUBSCRIPTION HTTP/1.1
Content-Type: application/json;charset=UTF-8
service-name: test-service
api-key: test-key
Content-Length: 84
Host: localhost:8080

{
  "companyId" : 1,
  "techArticles" : [ {
    "id" : 1
  }, {
    "id" : 2
  } ]
}

HTTP Request Header Fields

Name Optional Description

service-name

서비스 이름

api-key

api key

HTTP Request Fields

Path Type Optional Description Format

companyId

Number

회사 아이디

techArticles

Array

기술블로그 배열

techArticles.[].id

Number

기술블로그 아이디

HTTP Request Path Parameters Fields

Parameter Optional Description Format

channel

알림 채널

SUBSCRIPTION, COMMENT_AND_REPLY

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}

HTTP Response Body Fields

Path Type Authentication Description Format

resultType

String

응답 결과

SUCCESS, FAIL

예외

HTTP Response

  • 올바른 입력 값이 아닙니다.: 잘못된 알림 채널을 입력한 경우

  • 접근할 수 없는 권한 입니다.: 서비스 이름과 api-key가 일치하지 않는 경우

  • 지원하는 서비스가 아닙니다.: 지원하는 서비스가 아닌 경우

{
  "resultType" : "FAIL",
  "message" : "올바른 입력 값이 아닙니다.",
  "errorCode" : 400
}

단건 알림 읽기 API (PATCH: /devdevdev/api/v1/notifications/{notificationId}/read)

  • 회원이 자신에게 온 단건 알림을 읽기 처리한다.

정상 요청/응답

HTTP Request

PATCH /devdevdev/api/v1/notifications/1/read HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE5LCJleHAiOjE3NDY3MTgzMTl9.jprdvxIl1BaqAnEyd3GI5LiH_RMGBm12CYsAH_aOyxk
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Path Parameters

Parameter Optional Description Format

notificationId

알림 아이디

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 82

{
  "resultType" : "SUCCESS",
  "data" : {
    "id" : 1,
    "isRead" : true
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.id

Number

알림 아이디

data.isRead

Boolean

알림 읽음 여부

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

  • 존재하지 않는 알림입니다.: 알림이 존재하지 않거나 회원의 알림이 아닐 경우

{
  "resultType" : "FAIL",
  "message" : "존재하지 않는 알림입니다.",
  "errorCode" : 404
}

모든 알림 읽기 API (PATCH: /devdevdev/api/v1/notifications/read-all)

  • 회원이 자신에게 온 모든 알림을 읽기 처리한다.

  • 회원이 읽을 알림이 하나도 없어도 예외가 발생하지 않고 성공한다.

정상 요청/응답

HTTP Request

PATCH /devdevdev/api/v1/notifications/read-all HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE5LCJleHAiOjE3NDY3MTgzMTl9.jprdvxIl1BaqAnEyd3GI5LiH_RMGBm12CYsAH_aOyxk
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 30

{
  "resultType" : "SUCCESS"
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

알림 페이지 조회 API (GET: /devdevdev/api/v1/notifications/page)

  • 회원은 알림 페이지에서 자신에게 온 알림을 무한스크롤링으로 조회할 수 있다.

  • (추후 추가) 알림 유형에 따라 필터링하여 조회할 수 있다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/notifications/page?size=1&notificationId=2 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE5LCJleHAiOjE3NDY3MTgzMTl9.jprdvxIl1BaqAnEyd3GI5LiH_RMGBm12CYsAH_aOyxk
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters

Parameter Optional Description Format

notificationId

마지막 알림 ID (커서)

size

페이지 크기

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 1448

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "notificationId" : 1,
      "type" : "SUBSCRIPTION",
      "createdAt" : "2025-05-08T15:01:59.729168211",
      "isRead" : false,
      "techArticle" : {
        "id" : 1,
        "elasticId" : "elasticId",
        "thumbnailUrl" : "http://thumbnailUrl.com",
        "isLogoImage" : false,
        "techArticleUrl" : "http://techArticleUrl.com",
        "title" : "기술블로그 타이틀",
        "contents" : "기술블로그 내용",
        "company" : {
          "id" : 1,
          "name" : "기업명",
          "careerUrl" : "http://careerUrl.com",
          "officialImageUrl" : "http://officialImage.com"
        },
        "regDate" : "2025-05-08",
        "author" : "작성자",
        "viewTotalCount" : 0,
        "recommendTotalCount" : 0,
        "commentTotalCount" : 0,
        "popularScore" : 0,
        "isBookmarked" : false,
        "score" : null
      }
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 1,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "totalElements" : 1,
    "size" : 1,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : false,
    "numberOfElements" : 1,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

알림 목록

data.content[].notificationId

Number

알림 ID

data.content[].type

String

알림 타입

SUBSCRIPTION, COMMENT_AND_REPLY

data.content[].createdAt

String

알림 생성 일시

data.content[].isRead

Boolean

회원의 알림 읽음 여부

data.content[].techArticle

Object

기술블로그 정보

data.content[].techArticle.id

Number

기술블로그 ID

data.content[].techArticle.elasticId

String

엘라스틱서치 ID

data.content[].techArticle.thumbnailUrl

String

썸네일 URL

data.content[].techArticle.isLogoImage

Boolean

로고 이미지 여부

data.content[].techArticle.techArticleUrl

String

기술블로그 URL

data.content[].techArticle.title

String

기술블로그 제목

data.content[].techArticle.contents

String

기술블로그 내용

data.content[].techArticle.regDate

String

작성일

data.content[].techArticle.author

String

작성자

data.content[].techArticle.company

Object

기업 정보

data.content[].techArticle.company.id

Number

기업 ID

data.content[].techArticle.company.name

String

기업명

data.content[].techArticle.company.careerUrl

String

기업 채용공고 URL

data.content[].techArticle.company.officialImageUrl

String

기업 채용공고 URL

data.content[].techArticle.viewTotalCount

Number

조회 수

data.content[].techArticle.recommendTotalCount

Number

추천 수

data.content[].techArticle.commentTotalCount

Number

댓글 수

data.content[].techArticle.popularScore

Number

인기 점수

data.content[].techArticle.isBookmarked

Boolean

북마크 여부

data.content[].techArticle.score

Null

정확도 점수(null)

data.pageable

Object

페이지 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 정보 - 비어있는지

data.pageable.sort.sorted

Boolean

정렬 정보 - 정렬됨

data.pageable.sort.unsorted

Boolean

정렬 정보 - 정렬되지 않음

data.pageable.offset

Number

데이터 시작 위치

data.pageable.paged

Boolean

페이징 적용 여부

data.pageable.unpaged

Boolean

페이징 미적용 여부

data.totalElements

Number

전체 요소 수

data.first

Boolean

첫 페이지 여부

data.last

Boolean

마지막 페이지 여부

data.size

Number

요청한 페이지 크기

data.number

Number

현재 페이지 번호

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보 - 비어있는지

data.sort.sorted

Boolean

정렬 정보 - 정렬됨

data.sort.unsorted

Boolean

정렬 정보 - 정렬되지 않음

data.numberOfElements

Number

현재 페이지 요소 수

data.empty

Boolean

비어있는 페이지인지 여부

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

알림 팝업 조회 API (GET: /devdevdev/api/v1/notifications/popup)

  • 회원이 알림 팝업 리스트를 조회한다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/notifications/popup?size=1 HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE5LCJleHAiOjE3NDY3MTgzMTl9.jprdvxIl1BaqAnEyd3GI5LiH_RMGBm12CYsAH_aOyxk
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Request Query Parameters

Parameter Optional Description Format

size

페이지 크기

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 785

{
  "resultType" : "SUCCESS",
  "data" : {
    "content" : [ {
      "id" : 1,
      "type" : "SUBSCRIPTION",
      "title" : "기술블로그 타이틀",
      "createdAt" : "2025-05-08T15:01:59.699976702",
      "isRead" : false,
      "companyName" : "기업명",
      "techArticleId" : 1
    } ],
    "pageable" : {
      "pageNumber" : 0,
      "pageSize" : 1,
      "sort" : {
        "empty" : true,
        "sorted" : false,
        "unsorted" : true
      },
      "offset" : 0,
      "paged" : true,
      "unpaged" : false
    },
    "totalElements" : 1,
    "size" : 1,
    "number" : 0,
    "sort" : {
      "empty" : true,
      "sorted" : false,
      "unsorted" : true
    },
    "first" : true,
    "last" : true,
    "numberOfElements" : 1,
    "empty" : false
  }
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Object

응답 데이터

data.content

Array

알림 팝업 리스트

data.content[].id

Number

알림 ID

data.content[].type

String

알림 타입

SUBSCRIPTION, COMMENT_AND_REPLY

data.content[].title

String

알림 제목

data.content[].isRead

Boolean

회원의 읽음 여부

data.content[].createdAt

String

알림 생성 일시

data.content[].companyName

String

기업 이름

data.content[].techArticleId

Number

기술블로그 id

data.pageable

Object

페이지 정보

data.pageable.pageNumber

Number

페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 정보

data.pageable.sort.empty

Boolean

정렬 여부 - 비어있는지

data.pageable.sort.sorted

Boolean

정렬 여부 - 정렬됨

data.pageable.sort.unsorted

Boolean

정렬 여부 - 정렬되지 않음

data.pageable.offset

Number

데이터 시작 위치

data.pageable.paged

Boolean

페이징 적용 여부

data.pageable.unpaged

Boolean

페이징 미적용 여부

data.totalElements

Number

회원이 읽지 않은 알림 총 개수

data.first

Boolean

첫 페이지 여부

data.last

Boolean

마지막 페이지 여부

data.size

Number

페이지 크기

data.number

Number

현재 페이지 번호

data.sort

Object

정렬 정보

data.sort.empty

Boolean

정렬 정보 - 비어있는지

data.sort.sorted

Boolean

정렬 정보 - 정렬됨

data.sort.unsorted

Boolean

정렬 정보 - 정렬되지 않음

data.numberOfElements

Number

현재 페이지 요소 수

data.empty

Boolean

비어있는 페이지인지 여부

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}

알림 개수 조회 API (GET: /devdevdev/api/v1/notifications/unread-count)

  • 회원이 읽지 않은 알림의 총 개수를 조회한다.

정상 요청/응답

HTTP Request

GET /devdevdev/api/v1/notifications/unread-count HTTP/1.1
Content-Type: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImRyZWFteTVwYXRpc2llbEBrYWthby5jb20iLCJzb2NpYWxUeXBlIjoiS0FLQU8iLCJyb2xlIjoiUk9MRV9VU0VSIiwiaWF0IjoxNzQ2NzE2NTE5LCJleHAiOjE3NDY3MTgzMTl9.jprdvxIl1BaqAnEyd3GI5LiH_RMGBm12CYsAH_aOyxk
Host: localhost:8080

HTTP Request Header Fields

Name Optional Description

Authorization

Bearer 엑세스 토큰

HTTP Response

HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json;charset=UTF-8
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 45

{
  "resultType" : "SUCCESS",
  "data" : 12
}

HTTP Response Fields

Path Type Authentication Description Format

resultType

String

응답 결과

data

Number

응답 데이터(읽지 않은 알림 개수)

예외

HTTP Response

  • 익명 회원은 사용할 수 없는 기능 입니다.: 익명 회원인 경우

  • 회원을 찾을 수 없습니다.: 회원이 존재하지 않는 경우

{
  "resultType" : "FAIL",
  "message" : "회원을 찾을 수 없습니다.",
  "errorCode" : 404
}