1. Auth

1.1. 로그인

1.1.1. 성공

HTTP request
POST /auth/login HTTP/1.1
Authorization: Bearer validIdToken
Accept: application/json
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c; Path=/; Domain=bootme.co.kr; Max-Age=3600; Expires=Fri, 18 Jul 2025 06:02:43 GMT; Secure; HttpOnly; SameSite=Lax
Set-Cookie: refreshToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c; Path=/; Domain=bootme.co.kr; Max-Age=2592000; Expires=Sun, 17 Aug 2025 05:02:43 GMT; Secure; HttpOnly; SameSite=Lax
Content-Type: application/json
Content-Length: 135

{
  "memberId" : 1,
  "email" : "john@gmail.com",
  "nickname" : "John",
  "profileImage" : "imageUrl",
  "job" : "Backend Developer"
}

1.1.2. 실패

JWT 파싱에 실패한 경우
HTTP request
POST /auth/login HTTP/1.1
Authorization: Bearer InvalidBase64PayloadString.eyJhdWQiOiJkMGMwZmEzMWU1ZDQ4YmMzZjQ5MDIwZTExNjY4NDgwOSIsInN1YiI6IjI2NDY1ODY0NTYiLCJhdXRoX3RpbWUiOjE2ODQ1ODE2MzUsImlzcyI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tIiwibmlja25hbWUiOiLsp4TsmrEiLCJleHAiOjE2ODQ2MDMyMzUsImlhdCI6MTY4NDU4MTYzNSwicGljdHVyZSI6Imh0dHA6Ly9rLmtha2FvY2RuLm5ldC9kbi9kcGs5bDEvYnRxbUdoQTJsS0wvT3owd0R1Sm4xWVYyREluOTJmNkRWSy9pbWdfMTEweDExMC5qcGciLCJlbWFpbCI6ImdvZGZhdGhlcjk0QGtha2FvLmNvbSJ9.UjCa91vPFHFD7K58QFYvT1JJNcXNlCJ1tdVuhW3L4Yzt1klLEypYz-OwDLq_Ggviaf30ImWK5CWzCtOx19UnTmlipwfnGaPA7xhVdTaexsQsa4_tST25weUfrtbii0g6joFzivdYiycbAXKF_dHjjabZLWRZDow8z7t5zcOl1fZRJTfuWWrr-NzmQFcuWn0caFlWybp1s2wcOY9Y6AvyzHgvANyORL6KgkPby_U_tLsXRMtxe-K4-xw7AGkfk3WWV4DKHlotPBIa5zb6xKUXlO-5r4Or70qt13PM6KgHJ0bWUA_HPrt4hflSyemxZlAkFYtZd5IcIQ9btE-EcwbanA
Accept: application/json
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 1004,
  "message" : "토큰 파싱에 실패했습니다."
}
토큰 발행자가 유효하지 않은 경우
HTTP request
POST /auth/login HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJpbnZhbGlkSXNzdWVyIiwiaWF0IjoxNjg0NTgyMTA5LCJleHAiOjE3MTYxMTgxMDksImF1ZCI6Imh0dHBzOi8va2F1dGgua2FrYW8uY29tLyIsInN1YiI6IjI2NDY1ODY0NTYiLCJhdXRoX3RpbWUiOiIxNjg0NTgxNjM1Iiwibmlja25hbWUiOiLsp4TsmrEiLCJwaWN0dXJlIjoiaHR0cDovL2sua2FrYW9jZG4ubmV0L2RuL2RwazlsMS9idHFtR2hBMmxLTC9PejB3RHVKbjFZVjJESW45MmY2RFZLL2ltZ18xMTB4MTEwLmpwZyIsImVtYWlsIjoiZ29kZmF0aGVyOTRAa2FrYW8uY29tIn0.bNW6GWrscwfSA2oey_D_DniCvH2Dpr8rJVKuIckZVcM
Accept: application/json
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 88

{
  "errorCode" : 1005,
  "message" : "유효하지 않은 토큰 발급자입니다."
}
토큰 Audience 가 유효하지 않은 경우
HTTP request
POST /auth/login HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2Jvb3RtZS5mcm9udC5jb20iLCJpYXQiOjE2ODQ1ODIxMDksImV4cCI6MTcxNjExODEwOSwiYXVkIjoiaW52YWxpZEF1ZGllbmNlIiwic3ViIjoiMjY0NjU4NjQ1NiIsImF1dGhfdGltZSI6IjE2ODQ1ODE2MzUiLCJuaWNrbmFtZSI6IuynhOyasSIsInBpY3R1cmUiOiJodHRwOi8vay5rYWthb2Nkbi5uZXQvZG4vZHBrOWwxL2J0cW1HaEEybEtML096MHdEdUpuMVlWMkRJbjkyZjZEVksvaW1nXzExMHgxMTAuanBnIiwiZW1haWwiOiJnb2RmYXRoZXI5NEBrYWthby5jb20ifQ.bbzTjATw7WaD285BDqKJpWsAXa7JYbsNTGuFRWTc8R0
Accept: application/json
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 94

{
  "errorCode" : 1006,
  "message" : "토큰의 Audience 값이 유효하지 않습니다."
}
토큰 발행 시간이 유효하지 않은 경우
HTTP request
POST /auth/login HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJodHRwczovL2Jvb3RtZS5mcm9udC5jb20iLCJhdWQiOiJib290bWUuY29tIiwiaWF0IjoxNzUyODE1NTYzLCJleHAiOjE3NTI5MDEzNjN9.bK_yLz72GLyUZzMQLTZPkB3P6_RzfKOCWDiLnL6NXHbauwCW9NhvLE88jiedAm7OF9vFWRBgxClC4fEcGhRoSg
Accept: application/json
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 94

{
  "errorCode" : 1007,
  "message" : "토큰의 발행시간이 올바르지 않습니다."
}
토큰이 만료된 경우
HTTP request
POST /auth/login HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJodHRwczovL2Jvb3RtZS5mcm9udC5jb20iLCJhdWQiOiJib290bWUuY29tIiwiaWF0IjoxNzUyODE0OTYzLCJleHAiOjE3NTI4MTQzNjN9.BJRXHVEl4kU3Mi5_j1oLvwkWTVqlJYRFNqSS7CA0WsCtibjhUXzHKhWMc793NnKzJBtb18dYJlL4kRPHkgWpqw
Accept: application/json
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 401 Unauthorized
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Content-Length: 74

{
  "errorCode" : 1008,
  "message" : "토큰이 만료되었습니다."
}

1.2. 네이버 로그인

1.2.1. 성공

HTTP request
POST /auth/login/naver HTTP/1.1
Content-Type: application/json
Accept: application/json
Content-Length: 162
Host: api.bootMe.app

{
  "url" : "https://api.bootMe.app/oauth2.0/token?grant_type=authorization_code&client_id=ABCDEFG&client_secret=abcdefg&code=secretcode&state=secrretstate  \n"
}
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: accessToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c; Path=/; Domain=bootme.co.kr; Max-Age=3600; Expires=Fri, 18 Jul 2025 06:02:43 GMT; Secure; HttpOnly; SameSite=Lax
Set-Cookie: refreshToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c; Path=/; Domain=bootme.co.kr; Max-Age=2592000; Expires=Sun, 17 Aug 2025 05:02:43 GMT; Secure; HttpOnly; SameSite=Lax
Content-Type: application/json
Content-Length: 135

{
  "memberId" : 1,
  "email" : "john@gmail.com",
  "nickname" : "John",
  "profileImage" : "imageUrl",
  "job" : "Backend Developer"
}

1.3. 로그아웃

1.3.1. 성공

HTTP request
POST /auth/logout HTTP/1.1
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: accessToken=; Path=/; Domain=localhost; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; HttpOnly; SameSite=Lax
Set-Cookie: refreshToken=; Path=/; Domain=localhost; Max-Age=0; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Secure; HttpOnly; SameSite=Lax

1.4. 시크릿 요청

1.4.1. 성공

HTTP request
GET /auth/secrets HTTP/1.1
Bootme_Secret: validSecret
Origin: https://api.bootMe.app
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: https://bootme.co.kr
Access-Control-Expose-Headers: Access-Control-Allow-Credentials
Access-Control-Expose-Headers: Login
Access-Control-Allow-Credentials: true
Login: false
Content-Type: application/json
Content-Length: 384

{
  "apiUrl" : null,
  "googleClientId" : null,
  "googleAudience" : null,
  "naverClientId" : null,
  "naverClientSecret" : null,
  "naverAudience" : null,
  "naverSigningKey" : null,
  "kakaoRestApiKey" : null,
  "kakaoClientSecret" : null,
  "kakaoAudience" : null,
  "kakaoJavascriptKey" : null,
  "bootmeAudience" : null,
  "bootmeSigningKey" : null,
  "gaMeasurementId" : null
}

2. Member

2.1. 회원 프로필 조회

2.1.1. 성공

HTTP request
GET /member/1/profile HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 529

{
  "profileImage" : "https://lh3.googleusercontent.com/a/AGNmyxZgJo-m0_NrDgTZi2vJFtc4hC7c6xhDcTPcMg6S=s96-c",
  "email" : "john@gmail.com",
  "nickname" : "michael_jordan_63",
  "job" : "웹 백엔드 개발자",
  "stacks" : [ {
    "name" : "Java",
    "type" : "language",
    "icon" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/java.png"
  }, {
    "name" : "JavaScript",
    "type" : "language",
    "icon" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/javascript.png"
  } ]
}

2.2. 회원 자신의 프로필 조회

2.2.1. 성공

HTTP request
GET /member/me HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 253

{
  "profileImage" : "https://lh3.googleusercontent.com/a/AGNmyxZgJo-m0_NrDgTZi2vJFtc4hC7c6xhDcTPcMg6S=s96-c",
  "email" : "john@gmail.com",
  "nickname" : "michael_jordan_63",
  "job" : "웹 백엔드 개발자",
  "stacks" : [ "Java", "JavaScript" ]
}

2.3. 회원 프로필 수정

2.3.1. 성공

HTTP request
PUT /member/1 HTTP/1.1
Content-Type: application/json
Content-Length: 167
Host: api.bootMe.app

{
  "email" : "john@gmail.com",
  "nickname" : "michael_jordan_63",
  "job" : "웹 백엔드 개발자",
  "stackNames" : [ "Java", "JavaScript", "Spring", "React" ]
}
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

2.4. 회원 프로필 이미지 수정

2.4.1. 성공

HTTP request
PATCH /member/1/profile_image HTTP/1.1
Content-Type: application/json
Content-Length: 100
Host: api.bootMe.app

{
  "profileImage" : "https://api.bootMe.app/a/AGNmyxZgJo-m0_NrDgTZi2vJFtc4hC7c6xhDcTPcMg6S=s96-c"
}
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

2.5. 닉네임 중복 검사

2.5.1. 성공

HTTP request
GET /member/nickname/%EC%B2%A0%EC%88%98/exists HTTP/1.1
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 5

false

3. Stack

3.1. 기술 스택 전체 조회

3.1.1. 성공

HTTP request
GET /stacks HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 562

[ {
  "name" : "Java",
  "type" : "language",
  "icon" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/java.png"
}, {
  "name" : "JavaScript",
  "type" : "language",
  "icon" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/javascript.png"
}, {
  "name" : "Spring",
  "type" : "framework",
  "icon" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/spring.png"
}, {
  "name" : "React",
  "type" : "framework",
  "icon" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/react.png"
} ]

3.2. 기술 스택 추가

3.2.1. 성공

HTTP request
POST /stacks HTTP/1.1
Content-Type: application/json
Content-Length: 438
Host: api.bootMe.app

[ {
  "name" : "Java",
  "type" : "language",
  "icon" : "https://api.bootMe.app/logos/stack/java.png"
}, {
  "name" : "JavaScript",
  "type" : "language",
  "icon" : "https://api.bootMe.app/logos/stack/javascript.png"
}, {
  "name" : "Spring",
  "type" : "framework",
  "icon" : "https://api.bootMe.app/logos/stack/spring.png"
}, {
  "name" : "React",
  "type" : "framework",
  "icon" : "https://api.bootMe.app/logos/stack/react.png"
} ]
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

4. Company

4.1. 회사 추가

4.1.1. 성공

HTTP request
POST /companies HTTP/1.1
Content-Type: application/json
Content-Length: 191
Host: api.bootMe.app

{
  "name" : "네이버",
  "serviceName" : "네이버앱",
  "url" : "www.naver.com",
  "serviceUrl" : "www.app.naver.com",
  "logoUrl" : "https://api.bootMe.app/img/img_story_renewal.png"
}
HTTP response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Location: /companies/1
Content-Type: application/json
Content-Length: 378

{
  "id" : 1,
  "name" : "네이버",
  "serviceName" : "네이버앱",
  "url" : "www.naver.com",
  "serviceUrl" : "www.app.naver.com",
  "logoUrl" : "https://logoproject.naver.com/img/img_story_renewal.png",
  "courses" : [ "네이버 서버 개발자 부트캠프 1기", "카카오 프론트엔드 개발자 부트캠프 2기", "라인 서버 개발자 부트캠프 3기" ]
}

4.2. 회사 조회

4.2.1. 성공

HTTP request
GET /companies/1 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 378

{
  "id" : 1,
  "name" : "네이버",
  "serviceName" : "네이버앱",
  "url" : "www.naver.com",
  "serviceUrl" : "www.app.naver.com",
  "logoUrl" : "https://logoproject.naver.com/img/img_story_renewal.png",
  "courses" : [ "네이버 서버 개발자 부트캠프 1기", "카카오 프론트엔드 개발자 부트캠프 2기", "라인 서버 개발자 부트캠프 3기" ]
}

4.2.2. 실패

해당 id의 회사가 존재하지 않는 경우
HTTP request
GET /companies/2 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3002,
  "message" : "존재하지 않는 회사입니다."
}

4.3. 회사 전체 조회

4.3.1. 성공

HTTP request
GET /companies HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Access-Control-Expose-Headers: X-Total-Count
X-Total-Count: 2
Content-Range: companies 0-2/2
Content-Type: application/json
Content-Length: 785

[ {
  "id" : 1,
  "name" : "네이버",
  "serviceName" : "네이버앱",
  "url" : "www.naver.com",
  "serviceUrl" : "www.app.naver.com",
  "logoUrl" : "https://logoproject.naver.com/img/img_story_renewal.png",
  "courses" : [ "네이버 서버 개발자 부트캠프 1기", "카카오 프론트엔드 개발자 부트캠프 2기", "라인 서버 개발자 부트캠프 3기" ]
}, {
  "id" : 2,
  "name" : "카카오",
  "serviceName" : "카카오톡",
  "url" : "www.kakao.com",
  "serviceUrl" : "www.talk.kakao.com",
  "logoUrl" : "https://t1.kakaocdn.net/kakaocorp/kakaocorp/admin/1b904e28017800001.png",
  "courses" : [ "쿠팡 서버 개발자 부트캠프 4기", "우아한형제들 프론트엔드 개발자 부트캠프 5기", "구글 서버 개발자 부트캠프 6기" ]
} ]

4.4. 회사 수정

4.4.1. 성공

HTTP request
PUT /companies/1 HTTP/1.1
Content-Type: application/json
Content-Length: 191
Host: api.bootMe.app

{
  "name" : "네이버",
  "serviceName" : "네이버앱",
  "url" : "www.naver.com",
  "serviceUrl" : "www.app.naver.com",
  "logoUrl" : "https://api.bootMe.app/img/img_story_renewal.png"
}
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

4.4.2. 실패

해당 id의 회사가 존재하지 않는 경우
HTTP request
PUT /companies/2 HTTP/1.1
Content-Type: application/json
Content-Length: 214
Host: api.bootMe.app

{
  "name" : "카카오",
  "serviceName" : "카카오톡",
  "url" : "www.kakao.com",
  "serviceUrl" : "www.talk.kakao.com",
  "logoUrl" : "https://api.bootMe.app/kakaocorp/kakaocorp/admin/1b904e28017800001.png"
}
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3002,
  "message" : "존재하지 않는 회사입니다."
}

4.5. 회사 삭제

4.5.1. 성공

HTTP request
DELETE /companies/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

4.5.2. 실패

해당 id의 회사가 존재하지 않는 경우
HTTP request
DELETE /companies/2 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3002,
  "message" : "존재하지 않는 회사입니다."
}

5. Course

5.1. 코스 추가

5.1.1. 성공

HTTP request
POST /courses HTTP/1.1
Content-Type: application/json
Content-Length: 762
Host: api.bootMe.app

{
  "title" : "네이버 서버 개발자 부트캠프 1기",
  "name" : "네이버 서버 개발자 부트캠프",
  "generation" : 1,
  "url" : "www.boot.naver.com",
  "companyName" : "네이버",
  "location" : "서울시 강남구",
  "superCategories" : [ "웹", "모바일 앱" ],
  "subCategories" : [ "백엔드", "안드로이드" ],
  "languages" : [ "JavaScript", "Java" ],
  "frameworks" : [ "React", "Spring" ],
  "cost" : 0,
  "period" : 90,
  "dates" : {
    "registrationStartDate" : "2023-01-01",
    "registrationEndDate" : "2024-01-31",
    "courseStartDate" : "2024-02-01",
    "courseEndDate" : "2024-04-30"
  },
  "recommended" : true,
  "free" : true,
  "kdt" : true,
  "online" : true,
  "tested" : true,
  "prerequisiteRequired" : true
}
HTTP response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Location: /courses/1
Content-Type: application/json
Content-Length: 1315

{
  "id" : 1,
  "title" : "네이버 서버 개발자 부트캠프 1기",
  "name" : "네이버 서버 개발자 부트캠프",
  "generation" : 1,
  "url" : "www.boot.naver.com",
  "location" : "서울시 강남구",
  "superCategories" : [ "웹", "모바일 앱" ],
  "subCategories" : [ "백엔드", "안드로이드" ],
  "languages" : [ "JavaScript", "Java" ],
  "frameworks" : [ "React", "Spring" ],
  "cost" : 0,
  "period" : 90,
  "dates" : {
    "registrationStartDate" : "2023-01-01",
    "registrationEndDate" : "2024-01-31",
    "courseStartDate" : "2024-02-01",
    "courseEndDate" : "2024-04-30"
  },
  "detail" : "<p> Course Detail <p>",
  "company" : {
    "id" : 1,
    "name" : "네이버",
    "serviceName" : "네이버앱",
    "url" : "www.naver.com",
    "serviceUrl" : "www.app.naver.com",
    "logoUrl" : "https://logoproject.naver.com/img/img_story_renewal.png",
    "courses" : [ "네이버 서버 개발자 부트캠프 1기", "카카오 프론트엔드 개발자 부트캠프 2기", "라인 서버 개발자 부트캠프 3기" ]
  },
  "clicks" : 1,
  "bookmarks" : 4,
  "createdAt" : 0,
  "modifiedAt" : 0,
  "prerequisiteRequired" : true,
  "registerOpen" : false,
  "tested" : true,
  "online" : true,
  "recommended" : true,
  "bookmarked" : false,
  "free" : true,
  "kdt" : true
}

5.1.2. 실패

등록되지 않은 회사의 코스인 경우
HTTP request
POST /courses HTTP/1.1
Content-Type: application/json
Content-Length: 796
Host: api.bootMe.app

{
  "title" : "카카오 프론트엔드 개발자 부트캠프 2기",
  "name" : "카카오 프론트엔드 개발자 부트캠프",
  "generation" : 2,
  "url" : "www.boot.kakao.com",
  "companyName" : "카카오",
  "location" : "서울시 관악구",
  "superCategories" : [ "게임", "AI" ],
  "subCategories" : [ "프론트엔드", "안드로이드", "iOS" ],
  "languages" : [ "TypeScript", "Kotlin" ],
  "frameworks" : [ "Django", "Spring" ],
  "cost" : 500,
  "period" : 28,
  "dates" : {
    "registrationStartDate" : "2022-01-01",
    "registrationEndDate" : "2022-01-31",
    "courseStartDate" : "2022-02-01",
    "courseEndDate" : "2022-02-28"
  },
  "recommended" : false,
  "free" : false,
  "kdt" : false,
  "online" : false,
  "tested" : false,
  "prerequisiteRequired" : false
}
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3002,
  "message" : "존재하지 않는 회사입니다."
}

5.2. 코스 조회

5.2.1. 성공

HTTP request
GET /courses/1 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 1315

{
  "id" : 1,
  "title" : "네이버 서버 개발자 부트캠프 1기",
  "name" : "네이버 서버 개발자 부트캠프",
  "generation" : 1,
  "url" : "www.boot.naver.com",
  "location" : "서울시 강남구",
  "superCategories" : [ "웹", "모바일 앱" ],
  "subCategories" : [ "백엔드", "안드로이드" ],
  "languages" : [ "JavaScript", "Java" ],
  "frameworks" : [ "React", "Spring" ],
  "cost" : 0,
  "period" : 90,
  "dates" : {
    "registrationStartDate" : "2023-01-01",
    "registrationEndDate" : "2024-01-31",
    "courseStartDate" : "2024-02-01",
    "courseEndDate" : "2024-04-30"
  },
  "detail" : "<p> Course Detail <p>",
  "company" : {
    "id" : 1,
    "name" : "네이버",
    "serviceName" : "네이버앱",
    "url" : "www.naver.com",
    "serviceUrl" : "www.app.naver.com",
    "logoUrl" : "https://logoproject.naver.com/img/img_story_renewal.png",
    "courses" : [ "네이버 서버 개발자 부트캠프 1기", "카카오 프론트엔드 개발자 부트캠프 2기", "라인 서버 개발자 부트캠프 3기" ]
  },
  "clicks" : 1,
  "bookmarks" : 4,
  "createdAt" : 0,
  "modifiedAt" : 0,
  "prerequisiteRequired" : true,
  "registerOpen" : false,
  "tested" : true,
  "online" : true,
  "recommended" : true,
  "bookmarked" : false,
  "free" : true,
  "kdt" : true
}

5.2.2. 실패

해당 id의 코스가 존재하지 않는 경우
HTTP request
GET /courses/2 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3001,
  "message" : "존재하지 않는 코스입니다."
}

5.3. 코스 전체 조회

5.3.1. 성공

HTTP request
GET /courses HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 4439

{
  "content" : [ {
    "id" : 1,
    "title" : "네이버 서버 개발자 부트캠프 1기",
    "name" : "네이버 서버 개발자 부트캠프",
    "generation" : 1,
    "url" : "www.boot.naver.com",
    "location" : "서울시 강남구",
    "superCategories" : [ "웹", "모바일 앱" ],
    "subCategories" : [ "백엔드", "안드로이드" ],
    "languages" : [ "JavaScript", "Java" ],
    "frameworks" : [ "React", "Spring" ],
    "cost" : 0,
    "period" : 90,
    "dates" : {
      "registrationStartDate" : "2023-01-01",
      "registrationEndDate" : "2024-01-31",
      "courseStartDate" : "2024-02-01",
      "courseEndDate" : "2024-04-30"
    },
    "company" : {
      "id" : 1,
      "name" : "네이버",
      "serviceName" : "네이버앱",
      "url" : "www.naver.com",
      "serviceUrl" : "www.app.naver.com",
      "logoUrl" : "https://logoproject.naver.com/img/img_story_renewal.png",
      "courses" : [ "네이버 서버 개발자 부트캠프 1기", "카카오 프론트엔드 개발자 부트캠프 2기", "라인 서버 개발자 부트캠프 3기" ]
    },
    "clicks" : 1,
    "bookmarks" : 4,
    "createdAt" : 0,
    "modifiedAt" : 0,
    "prerequisiteRequired" : true,
    "registerOpen" : false,
    "tested" : true,
    "online" : true,
    "recommended" : true,
    "bookmarked" : false,
    "free" : true,
    "kdt" : true
  }, {
    "id" : 2,
    "title" : "카카오 프론트엔드 개발자 부트캠프 2기",
    "name" : "카카오 프론트엔드 개발자 부트캠프",
    "generation" : 2,
    "url" : "www.boot.kakao.com",
    "location" : "서울시 관악구",
    "superCategories" : [ "게임", "AI" ],
    "subCategories" : [ "프론트엔드", "안드로이드", "iOS" ],
    "languages" : [ "TypeScript", "Kotlin" ],
    "frameworks" : [ "Django", "Spring" ],
    "cost" : 500,
    "period" : 28,
    "dates" : {
      "registrationStartDate" : "2022-01-01",
      "registrationEndDate" : "2022-01-31",
      "courseStartDate" : "2022-02-01",
      "courseEndDate" : "2022-02-28"
    },
    "company" : {
      "id" : 2,
      "name" : "카카오",
      "serviceName" : "카카오톡",
      "url" : "www.kakao.com",
      "serviceUrl" : "www.talk.kakao.com",
      "logoUrl" : "https://t1.kakaocdn.net/kakaocorp/kakaocorp/admin/1b904e28017800001.png",
      "courses" : [ "쿠팡 서버 개발자 부트캠프 4기", "우아한형제들 프론트엔드 개발자 부트캠프 5기", "구글 서버 개발자 부트캠프 6기" ]
    },
    "clicks" : 2,
    "bookmarks" : 5,
    "createdAt" : 0,
    "modifiedAt" : 0,
    "prerequisiteRequired" : false,
    "registerOpen" : false,
    "tested" : false,
    "online" : false,
    "recommended" : false,
    "bookmarked" : false,
    "free" : false,
    "kdt" : false
  }, {
    "id" : 3,
    "title" : "라인 서버 개발자 부트캠프 3기",
    "name" : "라인 서버 개발자 부트캠프 부트캠프",
    "generation" : 3,
    "url" : "www.boot.line.com",
    "location" : "서울시 중구",
    "superCategories" : [ "AI", "데브옵스" ],
    "subCategories" : [ "풀스택" ],
    "languages" : [ "Kotlin", "Swift" ],
    "frameworks" : [ "Node.js", "Vue.js" ],
    "cost" : 700,
    "period" : 210,
    "dates" : {
      "registrationStartDate" : "2023-02-23",
      "registrationEndDate" : "2024-01-01",
      "courseStartDate" : "2024-02-01",
      "courseEndDate" : "2024-07-31"
    },
    "company" : {
      "id" : 3,
      "name" : "라인",
      "serviceName" : "라인앱",
      "url" : "www.line.com",
      "serviceUrl" : "www.app.line.com",
      "logoUrl" : "https://vos.line-scdn.net/strapi-cluster-instance-bucket-84/brand_02_8089c34e51.jpeg",
      "courses" : [ "페이스북 서버 개발자 부트캠프 7기", "마이크로소프트 프론트엔드 개발자 부트캠프 8기", "아마존 서버 개발자 부트캠프 9기" ]
    },
    "clicks" : 3,
    "bookmarks" : 6,
    "createdAt" : 0,
    "modifiedAt" : 0,
    "prerequisiteRequired" : true,
    "registerOpen" : false,
    "tested" : true,
    "online" : true,
    "recommended" : true,
    "bookmarked" : false,
    "free" : true,
    "kdt" : true
  } ],
  "pageable" : "INSTANCE",
  "totalElements" : 3,
  "totalPages" : 1,
  "last" : true,
  "size" : 3,
  "number" : 0,
  "sort" : {
    "empty" : true,
    "unsorted" : true,
    "sorted" : false
  },
  "numberOfElements" : 3,
  "first" : true,
  "empty" : false
}

5.4. 코스 수정

5.4.1. 성공

HTTP request
PUT /courses/1 HTTP/1.1
Content-Type: application/json
Content-Length: 762
Host: api.bootMe.app

{
  "title" : "네이버 서버 개발자 부트캠프 1기",
  "name" : "네이버 서버 개발자 부트캠프",
  "generation" : 1,
  "url" : "www.boot.naver.com",
  "companyName" : "네이버",
  "location" : "서울시 강남구",
  "superCategories" : [ "웹", "모바일 앱" ],
  "subCategories" : [ "백엔드", "안드로이드" ],
  "languages" : [ "JavaScript", "Java" ],
  "frameworks" : [ "React", "Spring" ],
  "cost" : 0,
  "period" : 90,
  "dates" : {
    "registrationStartDate" : "2023-01-01",
    "registrationEndDate" : "2024-01-31",
    "courseStartDate" : "2024-02-01",
    "courseEndDate" : "2024-04-30"
  },
  "recommended" : true,
  "free" : true,
  "kdt" : true,
  "online" : true,
  "tested" : true,
  "prerequisiteRequired" : true
}
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

5.4.2. 실패

해당 id의 코스가 존재하지 않는 경우
HTTP request
PUT /courses/2 HTTP/1.1
Content-Type: application/json
Content-Length: 796
Host: api.bootMe.app

{
  "title" : "카카오 프론트엔드 개발자 부트캠프 2기",
  "name" : "카카오 프론트엔드 개발자 부트캠프",
  "generation" : 2,
  "url" : "www.boot.kakao.com",
  "companyName" : "카카오",
  "location" : "서울시 관악구",
  "superCategories" : [ "게임", "AI" ],
  "subCategories" : [ "프론트엔드", "안드로이드", "iOS" ],
  "languages" : [ "TypeScript", "Kotlin" ],
  "frameworks" : [ "Django", "Spring" ],
  "cost" : 500,
  "period" : 28,
  "dates" : {
    "registrationStartDate" : "2022-01-01",
    "registrationEndDate" : "2022-01-31",
    "courseStartDate" : "2022-02-01",
    "courseEndDate" : "2022-02-28"
  },
  "recommended" : false,
  "free" : false,
  "kdt" : false,
  "online" : false,
  "tested" : false,
  "prerequisiteRequired" : false
}
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3001,
  "message" : "존재하지 않는 코스입니다."
}

5.5. 코스 상세 수정

5.5.1. 성공

HTTP request
PATCH /courses/1/detail HTTP/1.1
Content-Type: application/json
Content-Length: 59
Host: api.bootMe.app

{
  "detail" : "<p> 수정된 코스 상세 정보 1 <p>"
}
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

5.5.2. 실패

해당 id의 코스가 존재하지 않는 경우
HTTP request
PATCH /courses/2/detail HTTP/1.1
Content-Type: application/json
Content-Length: 59
Host: api.bootMe.app

{
  "detail" : "<p> 수정된 코스 상세 정보 2 <p>"
}
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3001,
  "message" : "존재하지 않는 코스입니다."
}

5.6. 코스 삭제

5.6.1. 성공

HTTP request
DELETE /courses/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

5.6.2. 실패

해당 id의 코스가 존재하지 않는 경우
HTTP request
DELETE /courses/2 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 78

{
  "errorCode" : 3001,
  "message" : "존재하지 않는 코스입니다."
}

6. Post

6.1. 게시물 추가

6.1.1. 성공

HTTP request
POST /posts HTTP/1.1
Content-Type: application/json
Content-Length: 232
Host: api.bootMe.app

{
  "topic" : "자유",
  "title" : "안녕하세요",
  "content" : "국가는 균형있는 국민경제의 성장 및 안정과 적정한 소득의 분배를 유지하고, 시장의 지배와 경제력의 남용을 방지하며"
}
HTTP response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Access-Control-Expose-Headers: Location
Location: /posts/1

6.2. 게시물 조회

6.2.1. 성공

HTTP request
GET /posts/1 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 580

{
  "id" : 1,
  "writerId" : 1,
  "writerNickname" : "철수",
  "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/java.png",
  "topic" : "자유",
  "title" : "안녕하세요",
  "content" : "국가는 균형있는 국민경제의 성장 및 안정과 적정한 소득의 분배를 유지하고, 시장의 지배와 경제력의 남용을 방지하며",
  "likes" : 10,
  "clicks" : 20,
  "bookmarks" : 30,
  "status" : "DISPLAY",
  "createdAt" : 1,
  "modifiedAt" : 1,
  "commentCount" : 3,
  "voted" : "UPVOTE",
  "bookmarked" : false
}

6.3. 게시물 전체 조회

6.3.1. 성공

HTTP request
GET /posts HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 2160

{
  "content" : [ {
    "id" : 1,
    "writerId" : 1,
    "writerNickname" : "철수",
    "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/java.png",
    "topic" : "자유",
    "title" : "안녕하세요",
    "contentExcerpt" : "국가는 균형있는 국민경제의 성장 및 안정과 적정한 소득의 분배를 유지하고, 시장의 지배와 경제력의 남용을 방지하며",
    "likes" : 10,
    "clicks" : 20,
    "bookmarks" : 30,
    "status" : "DISPLAY",
    "createdAt" : 1,
    "modifiedAt" : 1,
    "commentCount" : 1,
    "voted" : "UPVOTE",
    "bookmarked" : false,
    "viewed" : false
  }, {
    "id" : 2,
    "writerId" : 2,
    "writerNickname" : "영희",
    "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/javascript.png",
    "topic" : "부트캠프 질문",
    "title" : "반가워요",
    "contentExcerpt" : "경제주체간의 조화를 통한 경제의 민주화를 위하여 경제에 관한 규제와 조정을 할 수 있다.",
    "likes" : 11,
    "clicks" : 21,
    "bookmarks" : 31,
    "status" : "DELETED",
    "createdAt" : 1,
    "modifiedAt" : 1,
    "commentCount" : 2,
    "voted" : "DOWNVOTE",
    "bookmarked" : false,
    "viewed" : false
  }, {
    "id" : 3,
    "writerId" : 3,
    "writerNickname" : "지수",
    "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/kotlin.png",
    "topic" : "개발 질문",
    "title" : "좋은 하루",
    "contentExcerpt" : "국가는 평생교육을 진흥하여야 한다. 제안된 헌법개정안은 대통령이 20일 이상의 기간 이를 공고하여야 한다.",
    "likes" : 12,
    "clicks" : 22,
    "bookmarks" : 32,
    "status" : "HIDDEN",
    "createdAt" : 1,
    "modifiedAt" : 1,
    "commentCount" : 3,
    "voted" : "NONE",
    "bookmarked" : false,
    "viewed" : false
  } ],
  "number" : 0,
  "size" : 3,
  "totalElements" : 3,
  "totalPages" : 1,
  "last" : true,
  "sort" : {
    "empty" : true,
    "unsorted" : true,
    "sorted" : false
  },
  "numberOfElements" : 3,
  "first" : true,
  "empty" : false
}

6.4. 게시물 수정

6.4.1. 성공

HTTP request
PUT /posts/1 HTTP/1.1
Content-Type: application/json
Content-Length: 232
Host: api.bootMe.app

{
  "topic" : "자유",
  "title" : "안녕하세요",
  "content" : "국가는 균형있는 국민경제의 성장 및 안정과 적정한 소득의 분배를 유지하고, 시장의 지배와 경제력의 남용을 방지하며"
}
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

6.5. 게시물 삭제

6.5.1. 성공

HTTP request
DELETE /posts/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

7. Comment

7.1. 댓글 추가

7.1.1. 성공

HTTP request
POST /posts/1/comments HTTP/1.1
Content-Type: application/json
Content-Length: 93
Host: api.bootMe.app

{
  "parentId" : 1,
  "content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
}
HTTP response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Location: /comments/1

7.2. 댓글 조회

7.2.1. 성공

HTTP request
GET /comments/1 HTTP/1.1
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 428

{
  "id" : 1,
  "postId" : 1,
  "writerId" : 1,
  "writerNickname" : "철수",
  "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/java.png",
  "parentId" : 1,
  "content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
  "groupNum" : 1,
  "levelNum" : 1,
  "orderNum" : 1,
  "likes" : 10,
  "voted" : "UPVOTE",
  "status" : "DISPLAY",
  "createdAt" : 1,
  "modifiedAt" : 1
}

7.3. 댓글 수정

7.3.1. 성공

HTTP request
PUT /comments/1 HTTP/1.1
Content-Type: application/json
Content-Length: 93
Host: api.bootMe.app

{
  "parentId" : 1,
  "content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
}
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

7.4. 댓글 삭제

7.4.1. 성공

HTTP request
DELETE /comments/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

8. Vote

8.1. 투표 (Upvote / Downvote)

8.1.1. 성공

HTTP request
POST /vote HTTP/1.1
Content-Type: application/json
Content-Length: 96
Host: api.bootMe.app

{
  "votableType" : "POST_COMMENT",
  "votableId" : 1,
  "voteType" : "POST",
  "memberId" : 1
}
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 428

{
  "id" : 1,
  "postId" : 1,
  "writerId" : 1,
  "writerNickname" : "철수",
  "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/java.png",
  "parentId" : 1,
  "content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
  "groupNum" : 1,
  "levelNum" : 1,
  "orderNum" : 1,
  "likes" : 10,
  "voted" : "UPVOTE",
  "status" : "DISPLAY",
  "createdAt" : 1,
  "modifiedAt" : 1
}

9. Image

9.1. 이미지 업로드

9.1.1. 성공

HTTP request
POST /images HTTP/1.1
Content-Type: multipart/form-data; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Host: api.bootMe.app

--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=image; filename=filename.jpg
Content-Type: image/jpeg

some-image
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: text/plain;charset=UTF-8
Content-Length: 72

https://bootme-images.s3.ap-northeast-2.amazonaws.com/etc/smile_face.png

10. Prompt

10.1. 프롬프트 생성

10.1.1. 성공

HTTP request
POST /prompts/generation/feature HTTP/1.1
Content-Type: application/json
Content-Length: 438
Host: api.bootMe.app

{
  "promptType" : "feature",
  "question" : null,
  "example" : null,
  "featureDescription" : "스프링 부트 프로젝트에서 알림 기능 구현하기 위한 Entity 클래스 작성",
  "exampleCode" : "예시 엔티티 클래스 코드",
  "apiDescription" : null,
  "erd" : null,
  "entity" : null,
  "techStack" : [ "Java", "Spring" ],
  "principles" : [ "OOP" ],
  "responseFormat" : "Basic",
  "promptLanguage" : "English"
}
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

10.2. 프롬프트 입력

10.2.1. 성공

HTTP request
POST /prompts/submission HTTP/1.1
Content-Type: application/json
Content-Length: 41
Host: api.bootMe.app

{
  "prompt" : "입력된 프롬프트"
}
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

11. Course Bookmark

11.1. 북마크 코스 추가

11.1.1. 성공

HTTP request
POST /bookmarks/1/courses/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Location: /bookmarks/1/courses1

11.2. 북마크 코스 삭제

11.2.1. 성공

HTTP request
DELETE /bookmarks/1/courses/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

11.3. 북마크 코스 전체 조회

11.3.1. 성공

HTTP request
GET /bookmarks/1/courses?page=1&size=10 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 3057

{
  "content" : [ {
    "id" : 1,
    "title" : "네이버 서버 개발자 부트캠프 1기",
    "name" : "네이버 서버 개발자 부트캠프",
    "generation" : 1,
    "url" : "www.boot.naver.com",
    "location" : "서울시 강남구",
    "superCategories" : [ "웹", "모바일 앱" ],
    "subCategories" : [ "백엔드", "안드로이드" ],
    "languages" : [ "JavaScript", "Java" ],
    "frameworks" : [ "React", "Spring" ],
    "cost" : 0,
    "period" : 90,
    "dates" : {
      "registrationStartDate" : "2023-01-01",
      "registrationEndDate" : "2024-01-31",
      "courseStartDate" : "2024-02-01",
      "courseEndDate" : "2024-04-30"
    },
    "company" : {
      "id" : 1,
      "name" : "네이버",
      "serviceName" : "네이버앱",
      "url" : "www.naver.com",
      "serviceUrl" : "www.app.naver.com",
      "logoUrl" : "https://logoproject.naver.com/img/img_story_renewal.png",
      "courses" : [ "네이버 서버 개발자 부트캠프 1기", "카카오 프론트엔드 개발자 부트캠프 2기", "라인 서버 개발자 부트캠프 3기" ]
    },
    "clicks" : 1,
    "bookmarks" : 4,
    "createdAt" : 0,
    "modifiedAt" : 0,
    "prerequisiteRequired" : true,
    "registerOpen" : false,
    "tested" : true,
    "online" : true,
    "recommended" : true,
    "bookmarked" : false,
    "free" : true,
    "kdt" : true
  }, {
    "id" : 2,
    "title" : "카카오 프론트엔드 개발자 부트캠프 2기",
    "name" : "카카오 프론트엔드 개발자 부트캠프",
    "generation" : 2,
    "url" : "www.boot.kakao.com",
    "location" : "서울시 관악구",
    "superCategories" : [ "게임", "AI" ],
    "subCategories" : [ "프론트엔드", "안드로이드", "iOS" ],
    "languages" : [ "TypeScript", "Kotlin" ],
    "frameworks" : [ "Django", "Spring" ],
    "cost" : 500,
    "period" : 28,
    "dates" : {
      "registrationStartDate" : "2022-01-01",
      "registrationEndDate" : "2022-01-31",
      "courseStartDate" : "2022-02-01",
      "courseEndDate" : "2022-02-28"
    },
    "company" : {
      "id" : 2,
      "name" : "카카오",
      "serviceName" : "카카오톡",
      "url" : "www.kakao.com",
      "serviceUrl" : "www.talk.kakao.com",
      "logoUrl" : "https://t1.kakaocdn.net/kakaocorp/kakaocorp/admin/1b904e28017800001.png",
      "courses" : [ "쿠팡 서버 개발자 부트캠프 4기", "우아한형제들 프론트엔드 개발자 부트캠프 5기", "구글 서버 개발자 부트캠프 6기" ]
    },
    "clicks" : 2,
    "bookmarks" : 5,
    "createdAt" : 0,
    "modifiedAt" : 0,
    "prerequisiteRequired" : false,
    "registerOpen" : false,
    "tested" : false,
    "online" : false,
    "recommended" : false,
    "bookmarked" : false,
    "free" : false,
    "kdt" : false
  } ],
  "pageable" : "INSTANCE",
  "totalElements" : 2,
  "totalPages" : 1,
  "last" : true,
  "size" : 2,
  "number" : 0,
  "sort" : {
    "empty" : true,
    "unsorted" : true,
    "sorted" : false
  },
  "numberOfElements" : 2,
  "first" : true,
  "empty" : false
}

12. Post Bookmark

12.1. 북마크 포스트 추가

12.1.1. 성공

HTTP request
POST /bookmarks/1/posts/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Location: /member/1/bookmarks1

12.2. 북마크 포스트 삭제

12.2.1. 성공

HTTP request
DELETE /bookmarks/1/posts/1 HTTP/1.1
Content-Type: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

12.3. 북마크 포스트 전체 조회

12.3.1. 성공

HTTP request
GET /bookmarks/1/posts?page=1&size=10 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 1552

{
  "content" : [ {
    "id" : 1,
    "writerId" : 1,
    "writerNickname" : "철수",
    "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/java.png",
    "topic" : "자유",
    "title" : "안녕하세요",
    "contentExcerpt" : "국가는 균형있는 국민경제의 성장 및 안정과 적정한 소득의 분배를 유지하고, 시장의 지배와 경제력의 남용을 방지하며",
    "likes" : 10,
    "clicks" : 20,
    "bookmarks" : 30,
    "status" : "DISPLAY",
    "createdAt" : 1,
    "modifiedAt" : 1,
    "commentCount" : 1,
    "voted" : "UPVOTE",
    "bookmarked" : false,
    "viewed" : false
  }, {
    "id" : 2,
    "writerId" : 2,
    "writerNickname" : "영희",
    "writerProfileImage" : "https://bootme-images.s3.ap-northeast-2.amazonaws.com/logos/stack/javascript.png",
    "topic" : "부트캠프 질문",
    "title" : "반가워요",
    "contentExcerpt" : "경제주체간의 조화를 통한 경제의 민주화를 위하여 경제에 관한 규제와 조정을 할 수 있다.",
    "likes" : 11,
    "clicks" : 21,
    "bookmarks" : 31,
    "status" : "DELETED",
    "createdAt" : 1,
    "modifiedAt" : 1,
    "commentCount" : 2,
    "voted" : "DOWNVOTE",
    "bookmarked" : false,
    "viewed" : false
  } ],
  "pageable" : "INSTANCE",
  "totalElements" : 2,
  "totalPages" : 1,
  "last" : true,
  "size" : 2,
  "number" : 0,
  "sort" : {
    "empty" : true,
    "unsorted" : true,
    "sorted" : false
  },
  "numberOfElements" : 2,
  "first" : true,
  "empty" : false
}

13. SSE

13.1. SSE 연결

13.1.1. 성공

HTTP request
GET /connect HTTP/1.1
Accept: text/event-stream
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

14. Notification

14.1. 알림 조회

14.1.1. 성공

HTTP request
GET /notifications/1 HTTP/1.1
Accept: application/json
Host: api.bootMe.app
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 905

[ {
  "notificationId" : 1,
  "memberId" : 1,
  "event" : "signUp",
  "message" : "환영합니다! 다양한 소프트웨어 커리큘럼들을 비교하고 선택할 수 있도록 도와드릴게요 :) \uD83D\uDE0A \uD83D\uDE00 \uD83D\uDE04 ☺️",
  "createdAt" : 1684335600,
  "checked" : false
}, {
  "notificationId" : 2,
  "memberId" : 2,
  "event" : "signUp",
  "message" : "환영합니다! 다양한 소프트웨어 커리큘럼들을 비교하고 선택할 수 있도록 도와드릴게요 :) \uD83D\uDE0A \uD83D\uDE00 \uD83D\uDE04 ☺️",
  "createdAt" : 1684422000,
  "checked" : false
}, {
  "notificationId" : 3,
  "memberId" : 3,
  "event" : "signUp",
  "message" : "환영합니다! 다양한 소프트웨어 커리큘럼들을 비교하고 선택할 수 있도록 도와드릴게요 :) \uD83D\uDE0A \uD83D\uDE00 \uD83D\uDE04 ☺️",
  "createdAt" : 1684508400,
  "checked" : false
} ]

14.2. 알림 전체 확인

14.2.1. 성공

HTTP request
PUT /notifications/1/checked HTTP/1.1
Accept: application/json
Host: api.bootMe.app
Content-Type: application/x-www-form-urlencoded
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 905

[ {
  "notificationId" : 1,
  "memberId" : 1,
  "event" : "signUp",
  "message" : "환영합니다! 다양한 소프트웨어 커리큘럼들을 비교하고 선택할 수 있도록 도와드릴게요 :) \uD83D\uDE0A \uD83D\uDE00 \uD83D\uDE04 ☺️",
  "createdAt" : 1684335600,
  "checked" : false
}, {
  "notificationId" : 2,
  "memberId" : 2,
  "event" : "signUp",
  "message" : "환영합니다! 다양한 소프트웨어 커리큘럼들을 비교하고 선택할 수 있도록 도와드릴게요 :) \uD83D\uDE0A \uD83D\uDE00 \uD83D\uDE04 ☺️",
  "createdAt" : 1684422000,
  "checked" : false
}, {
  "notificationId" : 3,
  "memberId" : 3,
  "event" : "signUp",
  "message" : "환영합니다! 다양한 소프트웨어 커리큘럼들을 비교하고 선택할 수 있도록 도와드릴게요 :) \uD83D\uDE0A \uD83D\uDE00 \uD83D\uDE04 ☺️",
  "createdAt" : 1684508400,
  "checked" : false
} ]

15. Webhook

15.1. 웹훅 처리

15.1.1. 성공

HTTP request
POST /webhook HTTP/1.1
Content-Type: application/json
Bootme_Secret: secret
Content-Length: 179
Host: api.bootMe.app

{
  "sessionId" : 1,
  "memberId" : 1,
  "event" : "courseClicked",
  "data" : {
    "courseId" : "1"
  },
  "currentUrl" : "https://api.bootMe.app/",
  "createdAt" : 1684335600
}
HTTP response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login

15.1.2. 실패

유효한 웹훅 이벤트가 아닌 경우
HTTP request
POST /webhook HTTP/1.1
Content-Type: application/json
Bootme_Secret: secret
Content-Length: 180
Host: api.bootMe.app

{
  "sessionId" : 1,
  "memberId" : 1,
  "event" : "login",
  "data" : {
    "oAuthProvider" : "naver"
  },
  "currentUrl" : "https://api.bootMe.app/",
  "createdAt" : 1684335600
}
HTTP response
HTTP/1.1 400 Bad Request
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Login: false
Access-Control-Expose-Headers: Login
Content-Type: application/json
Content-Length: 89

{
  "errorCode" : 5002,
  "message" : "유효하지 않은 webhook 이벤트입니다."
}