Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] fix: 학생 인증 코드가 유효하지 않을 시 500이 아닌 400 에러를 반환 (#447) #622

Merged
merged 2 commits into from
Dec 21, 2023

Conversation

seokjin8678
Copy link
Collaborator

📌 관련 이슈

✨ PR 세부 내용

#482 에서 처리해야 했을 기능입니다.

- 사용자 입력에 영향을 받는 생성자 이므로 400 예외를 던지기 위함
@seokjin8678 seokjin8678 added BE 백엔드에 관련된 작업 🛠 수정 수정에 관련된 작업 labels Nov 16, 2023
@seokjin8678 seokjin8678 self-assigned this Nov 16, 2023
@github-actions github-actions bot requested review from BGuga, carsago and xxeol2 November 16, 2023 12:26
Copy link

github-actions bot commented Nov 16, 2023

Unit Test Results

  89 files    89 suites   10s ⏱️
318 tests 318 ✔️ 0 💤 0
332 runs  332 ✔️ 0 💤 0

Results for commit fc5b13f.

♻️ This comment has been updated with latest results.

Comment on lines -39 to +43
throw new UnexpectedException("VerificationCode의 길이는 %d 이어야 합니다.".formatted(LENGTH));
throw new ValidException("VerificationCode의 길이는 %d 이어야 합니다.".formatted(LENGTH));
}
}

private void validatePositive(String value) {
if (!POSITIVE_REGEX.matcher(value).matches()) {
throw new UnexpectedException("VerificationCode는 0~9의 양수 형식이어야 합니다.");
throw new ValidException("VerificationCode는 0~9의 양수 형식이어야 합니다.");
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 예외는 ValidException으로 할 지, BadRequest로 할 지 헷갈리네요.
아마 값에 대한 기본적인 예외가 아닌, 도메인 요구 사항에 대한 예외니까 BadRequest가 더 맞아 보이긴 하는데..
의견이 필요합니다.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 BadRequest가 맞다고 느낍니다.
이용자의 입력값에 의한 예외니까 닉네임 4자리 미만인데 3자리 입력 이런 느낌?

Copy link
Collaborator

@carsago carsago left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분에서 고민인게 저희가 가진 VerificationCode가 우리가 생성하는데 검증(잘못되면 5xx), 이용자가 입력한 값일때도 검증(현재 5xx이지만 4xx를 던져야겠죠?)을 같은 방식으로 하다보니 생기는 문제 같아요.

처음에 500으로 한 것도 우리가 code 잘못 만들어서 생기는 문제 때문에 500으로 했던 걸로 기억하고요.

그래서 이를 이분화해서 validate 메소드를 boolean을 반환해주는 public method로 활용하고 (혹은 validator class에서) 결과에 따라 적절한 예외를 service layer에서 던져주는 것도 고민해봤는데, 에러 메시지 처리도 복잡해지고, 코드가 과하게 복잡하게 된다고 여겨져요.

그렇다보니 전 issue 및 PR 코드처럼 그냥 우리가 만든 code가 만들어지는 방식은 테스트코드를 믿고, 4xx를 던져주는게 좋다고 여겨지네요.

Comment on lines -39 to +43
throw new UnexpectedException("VerificationCode의 길이는 %d 이어야 합니다.".formatted(LENGTH));
throw new ValidException("VerificationCode의 길이는 %d 이어야 합니다.".formatted(LENGTH));
}
}

private void validatePositive(String value) {
if (!POSITIVE_REGEX.matcher(value).matches()) {
throw new UnexpectedException("VerificationCode는 0~9의 양수 형식이어야 합니다.");
throw new ValidException("VerificationCode는 0~9의 양수 형식이어야 합니다.");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저는 BadRequest가 맞다고 느낍니다.
이용자의 입력값에 의한 예외니까 닉네임 4자리 미만인데 3자리 입력 이런 느낌?

@seokjin8678
Copy link
Collaborator Author

이 부분에서 고민인게 저희가 가진 VerificationCode가 우리가 생성하는데 검증(잘못되면 5xx), 이용자가 입력한 값일때도 검증(현재 5xx이지만 4xx를 던져야겠죠?)을 같은 방식으로 하다보니 생기는 문제 같아요.

처음에 500으로 한 것도 우리가 code 잘못 만들어서 생기는 문제 때문에 500으로 했던 걸로 기억하고요.

그래서 이를 이분화해서 validate 메소드를 boolean을 반환해주는 public method로 활용하고 (혹은 validator class에서) 결과에 따라 적절한 예외를 service layer에서 던져주는 것도 고민해봤는데, 에러 메시지 처리도 복잡해지고, 코드가 과하게 복잡하게 된다고 여겨져요.

그렇다보니 전 issue 및 PR 코드처럼 그냥 우리가 만든 code가 만들어지는 방식은 테스트코드를 믿고, 4xx를 던져주는게 좋다고 여겨지네요.

BadRequestException으로 처리하려니, 인자를 ErrorCode Enum으로 관리하기 때문에, 동적인 메시지를 적는 것이 불가능하네요. 😂

ValidExceptionBadRequestException의 공통점은 둘 다 BadRequestException을 발생시키는데, 차이점은 로그를 남기냐, 안 남기냐에 있더군요.

따라서 BadRequestException의 생성자를 추가하는게 아니라면 처리가 힘들어 보입니다.
그리고 BadRequestException이 발생했을 때 무조건 info 로그를 기록하는 것이 맞는가? 라는 생각이 드네요.

@seokjin8678
Copy link
Collaborator Author

추가로 #625 이슈 처리하면서 생각해보니, ValidException이 맞다고 생각이 드네요.
사용자 요청으로 인한 생성이나, 개발자의 코드로 인한 생성이나 검증에 실패했기 때문에 VaildException이 발생하는게 정상이라고 생각됩니다.
(결국 Exception은 발생하는거고, Valid라는 이름을 만족하므로)
그리고 사용자의 Request로 생성된 VerificationCode가 검증 조건을 만족하더라도, findByCodeAndMember에서 찾을 수 없다면 BadRequestException(INVALID_STUDENT_VERIFICATION_CODE) 예외가 발생하기 때문에 결과적으로 큰 문제는 없어 보입니다..!

@carsago
Copy link
Collaborator

carsago commented Nov 19, 2023

제가 확인 제대로 못한게 있었네요 !! 글렌 의견 듣고보니 ValidException이 적절하다 느껴집니다.

@SeongHoonC SeongHoonC closed this Dec 11, 2023
@SeongHoonC SeongHoonC deleted the feat/#447 branch December 11, 2023 05:28
@SeongHoonC SeongHoonC restored the feat/#447 branch December 11, 2023 05:31
@SeongHoonC
Copy link
Member

불필요 브랜치를 삭제하다가 삭제해버렸네요. 죄송합니다!

@SeongHoonC SeongHoonC reopened this Dec 11, 2023
Copy link
Member

@BGuga BGuga left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 4xx 로 던지는 것에 동의합니다.
예전에 5xx Vs 4xx 로 누가 잘못했냐로 길게 이야기했던 결과가 결국 우리의 잘못은 테스트로 잡아내고 사용자 잘못이라 생각할 수 있도록 테스트를 구성하자 였던 것 같네요 ㅎㅎ

@seokjin8678 seokjin8678 merged commit 6d48b30 into dev Dec 21, 2023
7 checks passed
@seokjin8678 seokjin8678 deleted the feat/#447 branch December 21, 2023 05:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 백엔드에 관련된 작업 🛠 수정 수정에 관련된 작업
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[BE] 학생 인증 코드가 유효하지 않을 시 500이 아닌 400 에러를 반환한다.
4 participants