@@ -294,4 +294,267 @@ ResponseEntity<RsData<PageResponse<PostListResponse>>> getPosts(
294294 ResponseEntity <RsData <PostDetailResponse >> getPost (
295295 @ PathVariable Long postId
296296 );
297+
298+ @ Operation (
299+ summary = "게시글 수정" ,
300+ description = "로그인한 사용자가 자신의 게시글을 수정합니다."
301+ )
302+ @ ApiResponses ({
303+ @ ApiResponse (
304+ responseCode = "200" ,
305+ description = "게시글 수정 성공" ,
306+ content = @ Content (
307+ mediaType = "application/json" ,
308+ examples = @ ExampleObject (value = """
309+ {
310+ "success": true,
311+ "code": "SUCCESS_200",
312+ "message": "게시글이 수정되었습니다.",
313+ "data": {
314+ "postId": 101,
315+ "author": {
316+ "id": 5,
317+ "nickname": "홍길동"
318+ },
319+ "title": "수정된 게시글",
320+ "content": "안녕하세요, 수정했습니다!",
321+ "categories": [
322+ { "id": 1, "name": "공지사항" },
323+ { "id": 2, "name": "자유게시판" }
324+ ],
325+ "createdAt": "2025-09-22T10:30:00",
326+ "updatedAt": "2025-09-22T10:30:00"
327+ }
328+ }
329+ """ )
330+ )
331+ ),
332+ @ ApiResponse (
333+ responseCode = "400" ,
334+ description = "잘못된 요청 (필드 누락 등)" ,
335+ content = @ Content (
336+ mediaType = "application/json" ,
337+ examples = @ ExampleObject (value = """
338+ {
339+ "success": false,
340+ "code": "COMMON_400",
341+ "message": "잘못된 요청입니다.",
342+ "data": null
343+ }
344+ """ )
345+ )
346+ ),
347+ @ ApiResponse (
348+ responseCode = "401" ,
349+ description = "인증 실패 (토큰 없음/만료/잘못됨)" ,
350+ content = @ Content (
351+ mediaType = "application/json" ,
352+ examples = {
353+ @ ExampleObject (name = "토큰 없음" , value = """
354+ {
355+ "success": false,
356+ "code": "AUTH_001",
357+ "message": "인증이 필요합니다.",
358+ "data": null
359+ }
360+ """ ),
361+ @ ExampleObject (name = "잘못된 토큰" , value = """
362+ {
363+ "success": false,
364+ "code": "AUTH_002",
365+ "message": "유효하지 않은 액세스 토큰입니다.",
366+ "data": null
367+ }
368+ """ ),
369+ @ ExampleObject (name = "만료된 토큰" , value = """
370+ {
371+ "success": false,
372+ "code": "AUTH_004",
373+ "message": "만료된 액세스 토큰입니다.",
374+ "data": null
375+ }
376+ """ )
377+ }
378+ )
379+ ),
380+ @ ApiResponse (
381+ responseCode = "403" ,
382+ description = "권한 없음 (작성자 아님)" ,
383+ content = @ Content (
384+ mediaType = "application/json" ,
385+ examples = @ ExampleObject (value = """
386+ {
387+ "success": false,
388+ "code": "POST_002",
389+ "message": "게시글 작성자만 수정/삭제할 수 있습니다.",
390+ "data": null
391+ }
392+ """ )
393+ )
394+ ),
395+ @ ApiResponse (
396+ responseCode = "404" ,
397+ description = "존재하지 않는 게시글 또는 카테고리" ,
398+ content = @ Content (
399+ mediaType = "application/json" ,
400+ examples = {
401+ @ ExampleObject (name = "존재하지 않는 게시글" , value = """
402+ {
403+ "success": false,
404+ "code": "POST_001",
405+ "message": "존재하지 않는 게시글입니다.",
406+ "data": null
407+ }
408+ """ ),
409+ @ ExampleObject (name = "존재하지 않는 카테고리" , value = """
410+ {
411+ "success": false,
412+ "code": "POST_003",
413+ "message": "존재하지 않는 카테고리입니다.",
414+ "data": null
415+ }
416+ """ )
417+ }
418+ )
419+ ),
420+ @ ApiResponse (
421+ responseCode = "500" ,
422+ description = "서버 내부 오류" ,
423+ content = @ Content (
424+ mediaType = "application/json" ,
425+ examples = @ ExampleObject (value = """
426+ {
427+ "success": false,
428+ "code": "COMMON_500",
429+ "message": "서버 오류가 발생했습니다.",
430+ "data": null
431+ }
432+ """ )
433+ )
434+ )
435+ })
436+ ResponseEntity <RsData <PostResponse >> updatePost (
437+ @ PathVariable Long postId ,
438+ @ RequestBody PostRequest request ,
439+ @ AuthenticationPrincipal CustomUserDetails user
440+ );
441+
442+ @ Operation (
443+ summary = "게시글 삭제" ,
444+ description = "로그인한 사용자가 자신의 게시글을 삭제합니다."
445+ )
446+ @ ApiResponses ({
447+ @ ApiResponse (
448+ responseCode = "200" ,
449+ description = "게시글 삭제 성공" ,
450+ content = @ Content (
451+ mediaType = "application/json" ,
452+ examples = @ ExampleObject (value = """
453+ {
454+ "success": true,
455+ "code": "SUCCESS_200",
456+ "message": "게시글이 삭제되었습니다.",
457+ "data": null
458+ }
459+ """ )
460+ )
461+ ),
462+ @ ApiResponse (
463+ responseCode = "400" ,
464+ description = "잘못된 요청 (필드 누락 등)" ,
465+ content = @ Content (
466+ mediaType = "application/json" ,
467+ examples = @ ExampleObject (value = """
468+ {
469+ "success": false,
470+ "code": "COMMON_400",
471+ "message": "잘못된 요청입니다.",
472+ "data": null
473+ }
474+ """ )
475+ )
476+ ),
477+ @ ApiResponse (
478+ responseCode = "401" ,
479+ description = "인증 실패 (토큰 없음/만료/잘못됨)" ,
480+ content = @ Content (
481+ mediaType = "application/json" ,
482+ examples = {
483+ @ ExampleObject (name = "토큰 없음" , value = """
484+ {
485+ "success": false,
486+ "code": "AUTH_001",
487+ "message": "인증이 필요합니다.",
488+ "data": null
489+ }
490+ """ ),
491+ @ ExampleObject (name = "잘못된 토큰" , value = """
492+ {
493+ "success": false,
494+ "code": "AUTH_002",
495+ "message": "유효하지 않은 액세스 토큰입니다.",
496+ "data": null
497+ }
498+ """ ),
499+ @ ExampleObject (name = "만료된 토큰" , value = """
500+ {
501+ "success": false,
502+ "code": "AUTH_004",
503+ "message": "만료된 액세스 토큰입니다.",
504+ "data": null
505+ }
506+ """ )
507+ }
508+ )
509+ ),
510+ @ ApiResponse (
511+ responseCode = "403" ,
512+ description = "권한 없음 (작성자 아님)" ,
513+ content = @ Content (
514+ mediaType = "application/json" ,
515+ examples = @ ExampleObject (value = """
516+ {
517+ "success": false,
518+ "code": "POST_002",
519+ "message": "게시글 작성자만 수정/삭제할 수 있습니다.",
520+ "data": null
521+ }
522+ """ )
523+ )
524+ ),
525+ @ ApiResponse (
526+ responseCode = "404" ,
527+ description = "존재하지 않는 게시글" ,
528+ content = @ Content (
529+ mediaType = "application/json" ,
530+ examples = @ ExampleObject (value = """
531+ {
532+ "success": false,
533+ "code": "POST_001",
534+ "message": "존재하지 않는 게시글입니다.",
535+ "data": null
536+ }
537+ """ )
538+ )
539+ ),
540+ @ ApiResponse (
541+ responseCode = "500" ,
542+ description = "서버 내부 오류" ,
543+ content = @ Content (
544+ mediaType = "application/json" ,
545+ examples = @ ExampleObject (value = """
546+ {
547+ "success": false,
548+ "code": "COMMON_500",
549+ "message": "서버 오류가 발생했습니다.",
550+ "data": null
551+ }
552+ """ )
553+ )
554+ )
555+ })
556+ ResponseEntity <RsData <Void >> deletePost (
557+ @ PathVariable Long postId ,
558+ @ AuthenticationPrincipal CustomUserDetails user
559+ );
297560}
0 commit comments