๐Ÿ” OAuth ๋กœ๊ทธ์ธ ์—ฐ๋™ API ๋ช…์„ธ

๊ตฌ๋ถ„ Method Endpoint ์„ค๋ช… ์š”์ฒญ ๋ฐ”๋”” ์˜ˆ์‹œ ์‘๋‹ต ์˜ˆ์‹œ
์นด์นด์˜ค ๋กœ๊ทธ์ธ ์š”์ฒญ GET /oauth2/authorization/kakao ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์š”์ฒญ - -
์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ† ํฐ ๋ฐœ๊ธ‰ GET /oauth2/authorization/kakao/callback ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์นด์นด์˜ค ํ† ํฐ ๋ฐœ๊ธ‰ ์นด์นด์˜ค์—์„œ ๋ฐœ๊ธ‰ํ•œ ์ธ๊ฐ€์ฝ”๋“œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ json { "accesstoken" : "~~~~", "refreshtoken": "~~~", "nickname": "ํ™๊ธธ๋™" }
ํšŒ์› ์ •๋ณด ์‚ญ์ œ DELETE /oauth2/authorization/kakao/users/withdraw ์‚ฌ์šฉ์ž ๊ณ„์ • ์‚ญ์ œ Authentication์—์„œ principle ๊ฐ€์ ธ์™€์„œ userId ๋ฝ‘์•„์„œ ์‚ฌ์šฉ -
OIDC ์œ ์ € ์ •๋ณด ์กฐํšŒ GET /oauth2/authorization/kakao/userinfo Access Token์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ Header: Authorization: Bearer {access_token} json { "nickname": "ํ™๊ธธ๋™" }

๐Ÿง ๋น„ํšŒ์› User API ๋ช…์„ธ

๊ตฌ๋ถ„ Method Endpoint ์„ค๋ช… ์š”์ฒญ ๋ฐ”๋”” ์˜ˆ์‹œ ์‘๋‹ต ์˜ˆ์‹œ

๐Ÿ“‹ Interview Question Set API ๋ช…์„ธ

๊ตฌ๋ถ„ Method Endpoint ์„ค๋ช… ์š”์ฒญ ๋ฐ”๋”” ์˜ˆ์‹œ ์‘๋‹ต ์˜ˆ์‹œ
์งˆ๋ฌธ ์„ธํŠธ ์ƒ์„ฑ POST /api/question-sets ๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ์ƒ์„ฑ `json { "title": "๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ์ œ๋ชฉ", "description": "๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ์„ค๋ช….", "versionNumber": 1,
"parentVersionId": 1,
"isShared": false, "tags": ["๋ฐฑ์—”๋“œ"], "questionMaps": [ { "id": 5 }, { "id": 6 } ] }` json { "id": 11, "ownerUserId": 1, "title": "๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ์ œ๋ชฉ", "description": "๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ์ž… ์„ค๋ช….", "versionNumber": 1, "parentVersionId": 1, "isShared": false, "tags":[ { "id": 1, "tag": "๋ฐฑ์—”๋“œ" } ], "questionMaps": [ { "id": 5, "content": "์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 2, "expectedAnswer": "์˜ˆ์ƒ ๋‹ต๋ณ€", "answers": [ {"id": 7, "content": "๋‹ต๋ณ€"} ] } ], "createdAt": "2025-01-01T01:00:00Z", "updatedAt": "2025-01-01T01:00:00Z" }
์งˆ๋ฌธ ์„ธํŠธ ๋ชฉ๋ก ์กฐํšŒ GET /api/question-sets ๋ชจ๋“  ๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ๋ชฉ๋ก ์กฐํšŒ json [ { "id": 5, "ownerUserId": 5, "title": "์ˆ˜์ •๋œ ์ œ๋ชฉ", "description": "์ˆ˜์ •๋œ ์„ค๋ช…", "versionNumber": 2, "parentVersionId": 4, "isShared": false, "tags": [ { "id": 1, "tag":๋ฐฑ์—”๋“œ" } ], "questionMaps": [ { "id": 2, "questionId": 102, "displayOrder": 2 }, { "id": 3, "questionId": 103, "displayOrder": 3 } ], "createdAt": "2025-08-01T01:00:00Z", "updatedAt": "2025-08-05T03:00:00Z" }, { "id": 6, "ownerUserId": 6, "title": "์ˆ˜์ •๋œ ์ œ๋ชฉ2", "description": "์ˆ˜์ •๋œ ์„ค๋ช…2", "versionNumber": 2, "parentVersionId": 4, "isShared": false, "tags": [ { "id": 1, "tag":๋ฐฑ์—”๋“œ" } ], "questionMaps": [ { "id": 4, "questionId": 104, "displayOrder": 4 }, { "id": 5, "questionId": 105, "displayOrder": 5 } ], "createdAt": "2025-08-01T01:00:00Z", "updatedAt": "2025-08-05T03:00:00Z" } ]
์งˆ๋ฌธ ์„ธํŠธ ์กฐํšŒ GET /api/question-sets/{id} ๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ์กฐํšŒ json { "id": 5, "ownerUserId": 5, "title": "์ˆ˜์ •๋œ ์ œ๋ชฉ", "description": "์ˆ˜์ •๋œ ์„ค๋ช…", "versionNumber": 2, "parentVersionId": 4, "isShared": false, "tags": [ { "id": 1, "tag":๋ฐฑ์—”๋“œ" } ], "questionMaps": [ { "id": 2, "questionId": 102, "displayOrder": 2 }, { "id": 3, "questionId": 103, "displayOrder": 3 } ], "createdAt": "2025-08-01T01:00:00Z", "updatedAt": "2025-08-05T03:00:00Z" }
์งˆ๋ฌธ ์„ธํŠธ ์ˆ˜์ • PATCH /api/question-sets/{id} ๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ์ˆ˜์ • json { "ownerUserId": 5, โ€œtitleโ€: โ€œ์ˆ˜์ •๋  ์ œ๋ชฉโ€, โ€œdescriptionโ€: โ€œ์ˆ˜์ •๋  ์„ค๋ช…โ€, "tags": ["๋ฐฑ์—”๋“œ"], "questionMaps: [ { "questionId": 103, "displayOrder": 3 } ]", โ€œversionNumberโ€: 2, โ€œparentVersionIdโ€: 4, โ€œisSharedโ€: false } json { "id": 5, "ownerUserId": 5, "title": "์ˆ˜์ •๋œ ์ œ๋ชฉ", "description": "์ˆ˜์ •๋œ ์„ค๋ช…", "versionNumber": 2, "parentVersionId": 4, "isShared": false, "tags": [ { "id": 1, "tag":๋ฐฑ์—”๋“œ" } ], "questionMaps": [ { "id": 2, "questionId": 102, "displayOrder": 2 }, { "id": 3, "questionId": 103, "displayOrder": 3 } ], "createdAt": "2025-08-01T01:00:00Z", "updatedAt": "2025-08-05T03:00:00Z" }
์งˆ๋ฌธ ์„ธํŠธ ์‚ญ์ œ DELETE /api/question-sets/{id} ๋ฉด์ ‘ ์งˆ๋ฌธ ์„ธํŠธ ์‚ญ์ œ json { "deletedAt": "2025-01-01T01:00:00Z", โ€œmessageโ€ : โ€œ์งˆ๋ฌธ ์„ธํŠธ๊ฐ€ ์‚ญ์ œ๋์Šต๋‹ˆ๋‹ค.โ€ }
์งˆ๋ฌธ ์ƒ์„ฑ POST /api/questions ๋ฉด์ ‘ ์งˆ๋ฌธ ์ƒ์„ฑ json { โ€œcontentโ€: โ€œ์ƒˆ ์งˆ๋ฌธ ๋‚ด์šฉโ€, โ€œquestionTypeโ€: 2, โ€œexpectedAnswerโ€: โ€œ์˜ˆ์ƒ ๋‹ต๋ณ€โ€ } json { "id": 20, "content": "์ƒˆ ์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 2, "expectedAnswer": "์˜ˆ์ƒ ๋‹ต๋ณ€", "answers": [], "createdAt": "2025-01-01T01:00:00Z", "updatedAt": "2025-01-02T01:00:00Z" }
์งˆ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ GET /api/questions ๋ฉด์ ‘ ์งˆ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ json [ { "id": 10, "content": "์ˆ˜์ •๋œ ์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 1, โ€œexpectedAnswerโ€: โ€œ์ˆ˜์ •๋œ ์˜ˆ์ƒ ๋‹ต๋ณ€โ€, "answers": [ { "id": 5, "content": "๋‹ต๋ณ€ ๋‚ด์šฉ" } ], "createdAt": "2025-01-01T01:00:00Z", "updatedAt": "2025-01-02T01:00:00Z" }, { "id": 11, "content": "์ˆ˜์ •๋œ ์งˆ๋ฌธ ๋‚ด์šฉ2", "questionType": 1, โ€œexpectedAnswerโ€: โ€œ์ˆ˜์ •๋œ ์˜ˆ์ƒ ๋‹ต๋ณ€2โ€, "answers": [ { "id": 6, "content": "๋‹ต๋ณ€ ๋‚ด์šฉ2" } ], "createdAt": "2025-01-01T01:00:00Z", "updatedAt": "2025-01-02T01:00:00Z" } ]
์งˆ๋ฌธ ์กฐํšŒ GET /api/questions/{id} ๋ฉด์ ‘ ์งˆ๋ฌธ ์กฐํšŒ json { "id": 10, "content": "์ˆ˜์ •๋œ ์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 1, โ€œexpectedAnswerโ€: โ€œ์ˆ˜์ •๋œ ์˜ˆ์ƒ ๋‹ต๋ณ€โ€, "answers": [ { "id": 5, "content": "๋‹ต๋ณ€ ๋‚ด์šฉ" } ], "createdAt": "2025-01-01T01:00:00Z", "updatedAt": "2025-01-02T01:00:00Z" }
์งˆ๋ฌธ ์ˆ˜์ • PATCH /api/questions/{id} ๋ฉด์ ‘ ์งˆ๋ฌธ ์ˆ˜์ • json { โ€œcontentโ€: โ€œ์ˆ˜์ •ํ•  ์งˆ๋ฌธ ๋‚ด์šฉโ€, "questionTypeโ€: 1, โ€œexpectedAnswerโ€: โ€œ์ˆ˜์ •ํ•  ์˜ˆ์ƒ ๋‹ต๋ณ€โ€, "answers": [ { "id": 5 } ] } json { "id": 10, "content": "์ˆ˜์ •๋œ ์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 1, โ€œexpectedAnswerโ€: โ€œ์ˆ˜์ •๋œ ์˜ˆ์ƒ ๋‹ต๋ณ€โ€, "answers": [ { "id": 5, "content": "๋‹ต๋ณ€ ๋‚ด์šฉ" } ], "createdAt": "2025-01-01T01:00:00Z", "updatedAt": "2025-01-02T01:00:00Z" }
์งˆ๋ฌธ ์‚ญ์ œ DELETE /api/questions/{id} ๋ฉด์ ‘ ์งˆ๋ฌธ ์‚ญ์ œ json { "deletedAt": "2025-01-01T01:00:00Z", โ€œmessageโ€ : โ€œ์งˆ๋ฌธ์ด ์‚ญ์ œ๋์Šต๋‹ˆ๋‹ค.โ€ }
๋‹ต๋ณ€ ์ƒ์„ฑ POST /api/answers ๋ฉด์ ‘ ๋‹ต๋ณ€ ์ƒ์„ฑ json { โ€œcontentโ€: โ€œ์ƒˆ ๋‹ต๋ณ€ ๋‚ด์šฉโ€, โ€œquestionโ€: [ { "id": 5 } ] } json { "id": 10, "content": "์ƒˆ ๋‹ต๋ณ€ ๋‚ด์šฉ", "question": [ { "id": 5, "content": "์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 2, "expectedAnswer": "์˜ˆ์ƒ ๋‹ต๋ณ€" } ], "createdAt": "2025-01-01T01:00:00Z", "updateddAt": "2025-01-02T01:00:00Z" }
๋‹ต๋ณ€ ๋ชฉ๋ก ์กฐํšŒ GET /api/answers ๋ฉด์ ‘ ๋‹ต๋ณ€ ๋ชฉ๋ก ์กฐํšŒ json [ { "id": 10, "content": "์ƒˆ ๋‹ต๋ณ€ ๋‚ด์šฉ", "question": [ { "id": 5, "content": "์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 2, "expectedAnswer": "์˜ˆ์ƒ ๋‹ต๋ณ€" } ], "createdAt": "2025-01-01T01:00:00Z", "updateddAt": "2025-01-02T01:00:00Z" }, { "id": 11, "content": "์ƒˆ ๋‹ต๋ณ€ ๋‚ด์šฉ2", "question": [ { "id": 6, "content": "์งˆ๋ฌธ ๋‚ด์šฉ2", "questionType": 2, "expectedAnswer": "์˜ˆ์ƒ ๋‹ต๋ณ€2" } ], "createdAt": "2025-01-01T01:00:00Z", "updateddAt": "2025-01-02T01:00:00Z" } ]
๋‹ต๋ณ€ ์กฐํšŒ GET /api/answers/{id} ๋ฉด์ ‘ ๋‹ต๋ณ€ ์กฐํšŒ { "id" : 10, "content" : "์ˆ˜์ •๋œ ์งˆ๋ฌธ ๋‚ด์šฉ", "questionType" : 1, โ€œexpectedAnswerโ€ : โ€œ์ˆ˜์ •๋œ ์˜ˆ์ƒ ๋‹ต๋ณ€โ€, "answers": [ { "id": 5, "content": "๋‹ต๋ณ€ ๋‚ด์šฉ" } ], "createdAt": "2025-01-01T01:00:00Z", "updatedAt": "2025-01-02T01:00:00Z" }
๋‹ต๋ณ€ ์ˆ˜์ • PATCH /api/answers/{id} ๋ฉด์ ‘ ๋‹ต๋ณ€ ์ˆ˜์ • json { โ€œcontentโ€: โ€œ์ˆ˜์ •ํ•  ๋‹ต๋ณ€ ๋‚ด์šฉโ€ } json { "id": 10, "content" :"์ˆ˜์ •๋œ ๋‹ต๋ณ€ ๋‚ด์šฉ", "question": [ { "id": 5, "content": "์งˆ๋ฌธ ๋‚ด์šฉ", "questionType": 2, "expectedAnswer": "์˜ˆ์ƒ ๋‹ต๋ณ€" } ], "createdAt": "2025-01-01T01:00:00Z", "updateddAt": "2025-01-02T01:00:00Z" }
๋‹ต๋ณ€ ์‚ญ์ œ DELETE /api/answers/{id} ๋ฉด์ ‘ ๋‹ต๋ณ€ ์‚ญ์ œ json { "deletedAt": "2025-01-01T01:00:00Z", โ€œmessageโ€ : โ€œ๋‹ต๋ณ€์ด ์‚ญ์ œ๋์Šต๋‹ˆ๋‹ค.โ€ }

๋ณด๊ธฐ ํŽธํ•˜๋ ค๊ณ  ๋ณต๋ถ™ํ–ˆ์–ด์š”

Kkori WebSocket API ๋ช…์„ธ์„œ

๊ฐœ์š”

Kkori ๋ฉด์ ‘ ์—ฐ์Šต ํ”Œ๋žซํผ์˜ ์‹ค์‹œ๊ฐ„ WebSocket API ๋ช…์„ธ์„œ์ž…๋‹ˆ๋‹ค. STOMP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๋ฉด์ ‘ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ์ •๋ณด

๋ฉ”์‹œ์ง€ ๊ฒฝ๋กœ