From ccbd81808adcf3b73b427121d708458af86c4b7f Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:09:54 +0900 Subject: [PATCH 1/9] =?UTF-8?q?DABOM-498=20fix:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20API=20=EC=9D=91=EB=8B=B5=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=BD=94=EB=93=9C=20200=20=E2=86=92=20201=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /customers/signup: @ResponseStatus(HttpStatus.CREATED) 추가 - POST /admin/signup: @ResponseStatus(HttpStatus.CREATED) 추가 - 리소스 생성 API는 201 Created를 반환하도록 통일 --- .../com/project/domain/admin/controller/AdminController.java | 3 +++ .../project/domain/customer/controller/CustomerController.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/com/project/domain/admin/controller/AdminController.java b/src/main/java/com/project/domain/admin/controller/AdminController.java index 9d28a9de..a814f028 100644 --- a/src/main/java/com/project/domain/admin/controller/AdminController.java +++ b/src/main/java/com/project/domain/admin/controller/AdminController.java @@ -2,10 +2,12 @@ import jakarta.validation.Valid; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.project.common.api.response.ApiResponse; @@ -47,6 +49,7 @@ public ApiResponse signIn( } @PostMapping("/signup") + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "관리자 회원가입", description = "관리자 이메일/비밀번호로 회원가입합니다.") public ApiResponse signUp( @Valid @RequestBody AdminSignInRequest signInRequest) { diff --git a/src/main/java/com/project/domain/customer/controller/CustomerController.java b/src/main/java/com/project/domain/customer/controller/CustomerController.java index 259c086e..d7596a72 100644 --- a/src/main/java/com/project/domain/customer/controller/CustomerController.java +++ b/src/main/java/com/project/domain/customer/controller/CustomerController.java @@ -2,11 +2,13 @@ import jakarta.validation.Valid; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.project.common.api.response.ApiResponse; @@ -48,6 +50,7 @@ public ApiResponse signIn( } @PostMapping("/signup") + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "사용자 회원가입", description = "사용자 이메일/비밀번호로 회원가입합니다.") public ApiResponse signUp( @Valid @RequestBody CustomerSignUpRequest requestDto) { From c15bdad93e3ab636722282a824784f0afe776a97 Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:10:16 +0900 Subject: [PATCH 2/9] =?UTF-8?q?DABOM-498=20fix:=20=EC=A0=95=EC=B1=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20=EC=9D=91=EB=8B=B5=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=BD=94=EB=93=9C=20200=20=E2=86=92=20201=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /policies: @ResponseStatus(HttpStatus.CREATED) 추가 --- .../com/project/domain/policy/controller/PolicyController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/project/domain/policy/controller/PolicyController.java b/src/main/java/com/project/domain/policy/controller/PolicyController.java index b25fb179..ac286324 100644 --- a/src/main/java/com/project/domain/policy/controller/PolicyController.java +++ b/src/main/java/com/project/domain/policy/controller/PolicyController.java @@ -5,6 +5,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.core.JsonProcessingException; @@ -56,6 +58,7 @@ public ApiResponse getPolicyList( @PostMapping @AdminOnly + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "정책 생성", description = "새로운 정책 템플릿을 생성합니다.") public ApiResponse createPolicy( @Valid @RequestBody PolicyRequest.Create policyRequest) { From 26325aa370149ed266630471960fcbc5768c0381 Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:10:54 +0900 Subject: [PATCH 3/9] =?UTF-8?q?DABOM-498=20fix:=20=EC=9D=B4=EC=9D=98?= =?UTF-8?q?=EC=A0=9C=EA=B8=B0=20=EC=83=9D=EC=84=B1=20API=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20=EC=83=81=ED=83=9C=20=EC=BD=94=EB=93=9C=20200=20?= =?UTF-8?q?=E2=86=92=20201=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /appeals: @ResponseStatus(HttpStatus.CREATED) 추가 - POST /appeals/{appealId}/comments: @ResponseStatus(HttpStatus.CREATED) 추가 - POST /appeals/emergency: @ResponseStatus(HttpStatus.CREATED) 추가 --- .../project/domain/appeal/controller/AppealController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/project/domain/appeal/controller/AppealController.java b/src/main/java/com/project/domain/appeal/controller/AppealController.java index 0a46e2d2..693a3d68 100644 --- a/src/main/java/com/project/domain/appeal/controller/AppealController.java +++ b/src/main/java/com/project/domain/appeal/controller/AppealController.java @@ -4,6 +4,7 @@ import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; +import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.project.common.api.response.ApiResponse; @@ -97,6 +99,7 @@ public ApiResponse getAppealDetail( /** 이의제기 생성 처리 */ @PostMapping + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "이의제기 생성") public ApiResponse createAppeal( @Parameter(hidden = true) @CustomerId Long customerId, @@ -121,6 +124,7 @@ public ApiResponse respondAppeal( /** 이의제기 댓글 작성 처리 */ @PostMapping("/{appealId}/comments") + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "이의제기 댓글 작성") public ApiResponse createComment( @Parameter(hidden = true) @CustomerId Long customerId, @@ -143,6 +147,7 @@ public ApiResponse cancelAppeal( /** 긴급 쿼터 요청 처리 */ @PostMapping("/emergency") + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "긴급 쿼터 요청") public ApiResponse requestEmergencyQuota( @Parameter(hidden = true) @CustomerId Long customerId, From 5a1ff75b309eab20ab642fa5be62ef0bf09675f1 Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:11:20 +0900 Subject: [PATCH 4/9] =?UTF-8?q?DABOM-498=20fix:=20=EB=AF=B8=EC=85=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20=EC=9D=91=EB=8B=B5=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=BD=94=EB=93=9C=20200=20=E2=86=92=20201=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /missions: @ResponseStatus(HttpStatus.CREATED) 추가 - POST /missions/{missionId}/request: @ResponseStatus(HttpStatus.CREATED) 추가 --- .../project/domain/mission/controller/MissionController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/project/domain/mission/controller/MissionController.java b/src/main/java/com/project/domain/mission/controller/MissionController.java index 1546ce5c..58726fb0 100644 --- a/src/main/java/com/project/domain/mission/controller/MissionController.java +++ b/src/main/java/com/project/domain/mission/controller/MissionController.java @@ -4,6 +4,7 @@ import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; +import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.project.common.api.response.ApiResponse; @@ -89,6 +91,7 @@ public ApiResponse getMissionRequestHistory( /** OWNER가 미션을 생성한다. */ @OwnerOnly @PostMapping + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "미션 생성") public ApiResponse createMission( @Parameter(hidden = true) @CustomerId Long customerId, @@ -111,6 +114,7 @@ public ApiResponse cancelMission( /** MEMBER가 본인 미션 완료 요청을 생성한다. */ @PostMapping("/{missionId}/request") + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "미션 완료 요청") public ApiResponse requestMissionApproval( @Parameter(hidden = true) @CustomerId Long customerId, @PathVariable Long missionId) { From 5602548af459581ef789bafcba2a7b31f32b6384 Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:11:38 +0900 Subject: [PATCH 5/9] =?UTF-8?q?DABOM-498=20fix:=20=EB=B3=B4=EC=83=81=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=82=AD=EC=A0=9C=20API=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EC=83=81=ED=83=9C=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?204=20=E2=86=92=20200=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DELETE /admin/rewards/templates/{id}: @ResponseStatus(HttpStatus.NO_CONTENT) 제거 - ApiResponse.success(null) 반환 시 200 OK가 올바른 상태 코드 - 204 No Content와 JSON 래퍼 동시 사용은 계약 모순 --- .../domain/reward/controller/AdminRewardTemplateController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/project/domain/reward/controller/AdminRewardTemplateController.java b/src/main/java/com/project/domain/reward/controller/AdminRewardTemplateController.java index 2cdcaaaa..1b685524 100644 --- a/src/main/java/com/project/domain/reward/controller/AdminRewardTemplateController.java +++ b/src/main/java/com/project/domain/reward/controller/AdminRewardTemplateController.java @@ -78,7 +78,6 @@ public ApiResponse updateTemplate( @DeleteMapping("/{id}") @AdminOnly - @ResponseStatus(HttpStatus.NO_CONTENT) @Operation(summary = "보상 템플릿 삭제", description = "보상 템플릿을 삭제합니다. (Soft Delete)") public ApiResponse deleteTemplate( @Parameter(description = "보상 템플릿 ID", required = true) @PathVariable("id") Long id) { From bbce9cd2ddc11fab121e3866fb9530b2080269be Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:17:37 +0900 Subject: [PATCH 6/9] =?UTF-8?q?DABOM-498=20refactor:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20API=20ApiResponse.created()=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /customers/signup: ApiResponse.success() → ApiResponse.created() - POST /admin/signup: ApiResponse.success() → ApiResponse.created() - 스타일 가이드 Section 5 생성 API 응답 규칙 준수 --- .../com/project/domain/admin/controller/AdminController.java | 2 +- .../project/domain/customer/controller/CustomerController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/project/domain/admin/controller/AdminController.java b/src/main/java/com/project/domain/admin/controller/AdminController.java index a814f028..1b27ed52 100644 --- a/src/main/java/com/project/domain/admin/controller/AdminController.java +++ b/src/main/java/com/project/domain/admin/controller/AdminController.java @@ -53,7 +53,7 @@ public ApiResponse signIn( @Operation(summary = "관리자 회원가입", description = "관리자 이메일/비밀번호로 회원가입합니다.") public ApiResponse signUp( @Valid @RequestBody AdminSignInRequest signInRequest) { - return ApiResponse.success( + return ApiResponse.created( adminService.signUp(signInRequest.email(), signInRequest.password())); } diff --git a/src/main/java/com/project/domain/customer/controller/CustomerController.java b/src/main/java/com/project/domain/customer/controller/CustomerController.java index d7596a72..a6489da8 100644 --- a/src/main/java/com/project/domain/customer/controller/CustomerController.java +++ b/src/main/java/com/project/domain/customer/controller/CustomerController.java @@ -54,7 +54,7 @@ public ApiResponse signIn( @Operation(summary = "사용자 회원가입", description = "사용자 이메일/비밀번호로 회원가입합니다.") public ApiResponse signUp( @Valid @RequestBody CustomerSignUpRequest requestDto) { - return ApiResponse.success(customerService.signUp(requestDto)); + return ApiResponse.created(customerService.signUp(requestDto)); } @PostMapping("/refresh") From 02599474287d55460102a64c3dd0147c7a474418 Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:17:58 +0900 Subject: [PATCH 7/9] =?UTF-8?q?DABOM-498=20refactor:=20=EC=A0=95=EC=B1=85?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20API=20ApiResponse.created()=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /policies: ApiResponse.success() → ApiResponse.created() - 스타일 가이드 Section 5 생성 API 응답 규칙 준수 --- .../com/project/domain/policy/controller/PolicyController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/project/domain/policy/controller/PolicyController.java b/src/main/java/com/project/domain/policy/controller/PolicyController.java index ac286324..e2ead07d 100644 --- a/src/main/java/com/project/domain/policy/controller/PolicyController.java +++ b/src/main/java/com/project/domain/policy/controller/PolicyController.java @@ -63,7 +63,7 @@ public ApiResponse getPolicyList( public ApiResponse createPolicy( @Valid @RequestBody PolicyRequest.Create policyRequest) { Policy policy = policyService.createPolicy(policyRequest); - return ApiResponse.success(PolicyResponse.Create.from(policy)); + return ApiResponse.created(PolicyResponse.Create.from(policy)); } @PutMapping("/{policyId}") From 2821fec5dacafd7db777a5d51d9b9344d2baa085 Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 19:18:13 +0900 Subject: [PATCH 8/9] =?UTF-8?q?DABOM-498=20refactor:=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C=20=EC=9A=94=EC=B2=AD=20API=20ApiResponse.?= =?UTF-8?q?created()=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - POST /missions/{missionId}/request: ApiResponse.success() → ApiResponse.created() - 스타일 가이드 Section 5 생성 API 응답 규칙 준수 --- .../project/domain/mission/controller/MissionController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/project/domain/mission/controller/MissionController.java b/src/main/java/com/project/domain/mission/controller/MissionController.java index 58726fb0..1ce9af5a 100644 --- a/src/main/java/com/project/domain/mission/controller/MissionController.java +++ b/src/main/java/com/project/domain/mission/controller/MissionController.java @@ -120,6 +120,6 @@ public ApiResponse requestMissionApproval( @Parameter(hidden = true) @CustomerId Long customerId, @PathVariable Long missionId) { AuthContext auth = authContextService.resolve(customerId); MissionRequestResult result = missionService.requestMissionApproval(auth, missionId); - return ApiResponse.success(MissionRequestResponse.from(result)); + return ApiResponse.created(MissionRequestResponse.from(result)); } } From 9fbaee215ac21d18b086a259f3a69351c671563c Mon Sep 17 00:00:00 2001 From: swthewhite Date: Wed, 18 Mar 2026 22:13:26 +0900 Subject: [PATCH 9/9] =?UTF-8?q?DABOM-498=20fix:=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=83=81=ED=83=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B8=B0=EB=8C=93=EA=B0=92=20200=20=E2=86=92=20201?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MissionControllerIntegrationTest: POST /missions, POST /missions/{id}/request 기댓값 isCreated()로 변경 - RewardControllerIntegrationTest: POST /missions/{id}/request 기댓값 isCreated()로 변경 - 컨트롤러 @ResponseStatus(HttpStatus.CREATED) 추가에 따른 테스트 동기화 --- .../mission/controller/MissionControllerIntegrationTest.java | 4 ++-- .../reward/controller/RewardControllerIntegrationTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/project/domain/mission/controller/MissionControllerIntegrationTest.java b/src/test/java/com/project/domain/mission/controller/MissionControllerIntegrationTest.java index c00b502b..82388f0d 100644 --- a/src/test/java/com/project/domain/mission/controller/MissionControllerIntegrationTest.java +++ b/src/test/java/com/project/domain/mission/controller/MissionControllerIntegrationTest.java @@ -178,7 +178,7 @@ void missionFlowKeepsRewardShape() throws Exception { .header("Authorization", "Bearer " + OWNER_TOKEN) .contentType(MediaType.APPLICATION_JSON) .content(createBody)) - .andExpect(status().isOk()) + .andExpect(status().isCreated()) .andReturn(); Long createdMissionId = objectMapper @@ -192,7 +192,7 @@ void missionFlowKeepsRewardShape() throws Exception { mockMvc.perform( post("/missions/{missionId}/request", mission.getId()) .header("Authorization", "Bearer " + MEMBER_TOKEN)) - .andExpect(status().isOk()) + .andExpect(status().isCreated()) .andReturn(); JsonNode requestData = objectMapper diff --git a/src/test/java/com/project/domain/reward/controller/RewardControllerIntegrationTest.java b/src/test/java/com/project/domain/reward/controller/RewardControllerIntegrationTest.java index c235503d..5f40507d 100644 --- a/src/test/java/com/project/domain/reward/controller/RewardControllerIntegrationTest.java +++ b/src/test/java/com/project/domain/reward/controller/RewardControllerIntegrationTest.java @@ -162,7 +162,7 @@ void rewardFlowKeepsRewardShape() throws Exception { mockMvc.perform( post("/missions/{missionId}/request", mission.getId()) .header("Authorization", "Bearer " + MEMBER_TOKEN)) - .andExpect(status().isOk()) + .andExpect(status().isCreated()) .andReturn(); Long requestId = objectMapper