From 7a8c27e1929518fedf8994e91db9fe8ed8aed724 Mon Sep 17 00:00:00 2001 From: Junhyeok Lee Date: Mon, 27 Oct 2025 16:55:26 +0900 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20api=20=EB=AC=B8=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/apis/auth-api.adoc | 66 ---------------------- src/docs/asciidoc/apis/member-api.adoc | 78 ++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/src/docs/asciidoc/apis/auth-api.adoc b/src/docs/asciidoc/apis/auth-api.adoc index 0c37c6de..fc5e482f 100644 --- a/src/docs/asciidoc/apis/auth-api.adoc +++ b/src/docs/asciidoc/apis/auth-api.adoc @@ -65,69 +65,3 @@ operation::auth-update-refresh-token[snippets='http-response,response-fields'] // operation::auth-update-refresh-token-error[snippets='http-response,response-fields'] ''' - -=== 이메일 인증 코드 발송 (회원 가입) - -`POST /members/emails/codes/signup` - -회원가입에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. - -==== 요청 헤더 - -operation::member-email-auth-code-create[snippets='request-headers'] - -==== 요청 본문 (JSON) - -operation::member-email-auth-code-create[snippets='http-request,request-fields'] - -==== 성공 응답 - -성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. - -==== 에러 응답 (이미 가입된 이메일) - -operation::member-email-auth-code-create-error[snippets='http-response,response-fields'] - -''' - -=== 이메일 인증 코드 발송 (비밀번호 변경 시) - -`POST /members/passwords/reset` - -비밀번호 찾기에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. - -==== 요청 헤더 - -operation::member-password-auth-code-create[snippets='request-headers'] - -==== 요청 본문 (JSON) - -operation::member-password-auth-code-create[snippets='http-request,request-fields'] - -==== 성공 응답 - -성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. - -==== 에러 응답 (이미 가입된 이메일) - -operation::member-password-auth-code-create-error[snippets='http-response,response-fields'] - -''' - -=== 이메일 인증 코드 검증 - -`GET /members/emails/codes/verify` - -이메일로 발송된 인증 코드가 올바른지 검증합니다. - -==== 쿼리 파라미터 - -operation::member-email-auth-code-verify[snippets='query-parameters'] - -==== 성공 응답 - -인증 성공 시, `200 OK` 상태 코드와 함께 빈 응답 본문을 반환합니다. - -==== 에러 응답 (잘못된 인증 코드) - -operation::member-email-auth-code-verify-error[snippets='http-response,response-fields'] diff --git a/src/docs/asciidoc/apis/member-api.adoc b/src/docs/asciidoc/apis/member-api.adoc index 77c6b3c4..6fe67a39 100644 --- a/src/docs/asciidoc/apis/member-api.adoc +++ b/src/docs/asciidoc/apis/member-api.adoc @@ -183,9 +183,9 @@ operation::member-quest-property-read[snippets='request-headers'] operation::member-quest-property-read[snippets='http-response,response-fields'] -==== 에러 응답 - -operation::member-quest-property-read-error[snippets='http-response,response-fields'] +// ==== 에러 응답 +// +// operation::member-quest-property-read-error[snippets='http-response,response-fields'] ''' @@ -207,9 +207,9 @@ operation::member-password-reset[snippets='http-request,request-fields'] 성공 시 `204 No Content` 상태 코드와 함께 빈 응답 본문을 반환합니다. -==== 에러 응답 - -operation::member-password-reset-error[snippets='http-response,response-fields'] +// ==== 에러 응답 +// +// operation::member-password-reset-error[snippets='http-response,response-fields'] ''' @@ -328,3 +328,69 @@ operation::member-widget-update[snippets='http-request,request-fields'] // ==== 에러 응답 // // operation::member-quest-property-update-error[snippets='http-response,response-fields'] + +=== 이메일 인증 코드 발송 (회원 가입) + +`POST /members/emails/codes/signup` + +회원가입에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. + +==== 요청 헤더 + +operation::member-email-auth-code-create[snippets='request-headers'] + +==== 요청 본문 (JSON) + +operation::member-email-auth-code-create[snippets='http-request,request-fields'] + +==== 성공 응답 + +성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. + +==== 에러 응답 (이미 가입된 이메일) + +operation::member-email-auth-code-create-error[snippets='http-response,response-fields'] + +''' + +=== 이메일 인증 코드 발송 (비밀번호 변경 시) + +`POST /members/emails/codes/passwords/reset` + +비밀번호 찾기에 사용할 이메일 인증 코드를 요청한 이메일 주소로 발송합니다. + +==== 요청 헤더 + +operation::member-password-auth-code-create[snippets='request-headers'] + +==== 요청 본문 (JSON) + +operation::member-password-auth-code-create[snippets='http-request,request-fields'] + +==== 성공 응답 + +성공 시 `201 Created` 상태 코드와 함께 빈 응답 본문을 반환합니다. + +==== 에러 응답 (이미 가입된 이메일) + +operation::member-password-auth-code-create-error[snippets='http-response,response-fields'] + +''' + +=== 이메일 인증 코드 검증 + +`GET /members/emails/codes/verify` + +이메일로 발송된 인증 코드가 올바른지 검증합니다. + +==== 쿼리 파라미터 + +operation::member-email-auth-code-verify[snippets='query-parameters'] + +==== 성공 응답 + +operation::member-email-auth-code-verify[snippets='http-response,response-fields'] + +==== 에러 응답 (잘못된 인증 코드) + +operation::member-email-auth-code-verify-error[snippets='http-response,response-fields'] From 762c21f5cb45274350e51f43ad8a8b06e97b4cdb Mon Sep 17 00:00:00 2001 From: Junhyeok Lee Date: Mon, 27 Oct 2025 17:57:43 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20final=20=ED=82=A4=EC=9B=8C=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/presentation/request/ResetPasswordRequest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java b/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java index c565638f..7b8a069f 100644 --- a/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java +++ b/src/main/java/com/gomo/app/core/member/presentation/request/ResetPasswordRequest.java @@ -5,9 +5,9 @@ @Getter public class ResetPasswordRequest { - private String email; - private String newPassword; - private String temporaryToken; + private final String email; + private final String newPassword; + private final String temporaryToken; private ResetPasswordRequest(String email, String newPassword, String temporaryToken) { this.email = email; From 49c6c8a556a48ba2672fd227f5f7f5c6be11255c Mon Sep 17 00:00:00 2001 From: Junhyeok Lee Date: Mon, 27 Oct 2025 17:58:02 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/adapter/RabbitMQClientTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java b/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java index 73d5377d..ba3f97c7 100644 --- a/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java +++ b/src/test/java/com/gomo/app/support/messagebroker/infrastructure/adapter/RabbitMQClientTest.java @@ -13,7 +13,7 @@ import com.gomo.app.test.WithRabbitMQ; import com.rabbitmq.client.ShutdownSignalException; -@DisplayName("[Infrastructure Integration]: RabbitMQ 접근 테스트") +@DisplayName("[Infrastructure Integration]: RabbitMQ 접근 테스트 (Flaky Test)") @IntegrationTest @WithRabbitMQ class RabbitMQClientTest { From 833f265f03cdc881a8e6fa1ee1ef7064b58d7298 Mon Sep 17 00:00:00 2001 From: Junhyeok Lee Date: Mon, 27 Oct 2025 17:58:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20http=20method=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/core/member/presentation/EmailCodeApi.java | 6 ++---- .../VerifyEmailAuthCodeDocumentationTest.java | 11 +++++------ .../snippet/VerifyEmailAuthCodeSnippet.java | 11 +++++------ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java b/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java index a2339140..859ff50f 100644 --- a/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java +++ b/src/main/java/com/gomo/app/core/member/presentation/EmailCodeApi.java @@ -2,8 +2,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -38,8 +36,8 @@ public ResponseEntity createForPassword(@RequestBody Cr return ResponseEntity.status(HttpStatus.CREATED).body(CreateEmailCodeResponse.of(emailCode)); } - @GetMapping("/verify") - public ResponseEntity verify(@ModelAttribute VerifyEmailCodeRequest request) { + @PostMapping("/verify") + public ResponseEntity verify(@RequestBody VerifyEmailCodeRequest request) { String temporaryToken = verifyEmailCodeUseCase.verify(request.getEmail(), request.getCode()); return ResponseEntity.status(HttpStatus.OK).body(VerifyEmailCodeResponse.of(temporaryToken)); } diff --git a/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java b/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java index 697aaf69..63b9d056 100644 --- a/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java +++ b/src/test/java/com/gomo/app/core/member/documentation/VerifyEmailAuthCodeDocumentationTest.java @@ -13,6 +13,7 @@ import org.springframework.restdocs.restassured.RestDocumentationFilter; import com.gomo.app.core.member.documentation.snippet.VerifyEmailAuthCodeSnippet; +import com.gomo.app.core.member.presentation.request.VerifyEmailCodeRequest; import com.gomo.app.support.auth.application.port.CreateAuthCodePortIn; import com.gomo.app.support.auth.domain.repository.AuthCodeRepository; import com.gomo.app.support.auth.exception.AuthErrorCode; @@ -44,10 +45,9 @@ void verify_email_auth_code_with_correct_code() { String authCode = authCodeRepository.findByEmail(sessionEmail).get(); given(this.specification).filter(filter) .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) - .param("email", sessionEmail) - .param("code", authCode) + .body(VerifyEmailCodeRequest.of(sessionEmail, authCode)) .when() - .get(URL) + .post(URL) .then() .statusCode(OK.value()); } @@ -57,10 +57,9 @@ void verify_email_auth_code_with_correct_code() { void verify_email_auth_code_with_incorrect_code() { given(this.specification).filter(errorFilter) .header(CONTENT_TYPE, APPLICATION_JSON_VALUE) - .param("email", sessionEmail) - .param("code", "00000") + .body(VerifyEmailCodeRequest.of(sessionEmail, "000000")) .when() - .get(URL) + .post(URL) .then() .statusCode(AuthErrorCode.INVALID_AUTH_CODE.getHttpStatus()) .body("timestamp", instanceOf(String.class)) diff --git a/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java b/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java index 543cb9d9..40f25e77 100644 --- a/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java +++ b/src/test/java/com/gomo/app/core/member/documentation/snippet/VerifyEmailAuthCodeSnippet.java @@ -2,7 +2,6 @@ import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.restdocs.request.RequestDocumentation.*; import static org.springframework.restdocs.restassured.RestAssuredRestDocumentation.*; import org.springframework.restdocs.payload.JsonFieldType; @@ -14,9 +13,9 @@ public class VerifyEmailAuthCodeSnippet { private static final String IDENTIFIER = "member-email-auth-code-verify"; - private static final Snippet QUERY_PARAMETERS = queryParameters( - parameterWithName("email").description("인증 코드를 받은 이메일 주소"), - parameterWithName("code").description("이메일로 발송된 인증 코드") + private static final Snippet REQUEST_FIELDS = requestFields( + fieldWithPath("email").description("인증 코드를 받은 이메일 주소"), + fieldWithPath("code").description("이메일로 발송된 인증 코드") ); private static final Snippet RESPONSE_FIELDS = responseFields( @@ -28,7 +27,7 @@ public static RestDocumentationFilter create() { IDENTIFIER, preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), - QUERY_PARAMETERS, + REQUEST_FIELDS, RESPONSE_FIELDS ); } @@ -38,7 +37,7 @@ public static RestDocumentationFilter createError() { IDENTIFIER + "-error", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), - QUERY_PARAMETERS, + REQUEST_FIELDS, ErrorResponseFields.RESPONSE_FIELDS ); }