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

[feature] 소셜 로그인 (애플 로그인 기능 추가) 및 에러 코드 리팩토링 #98

Merged
merged 11 commits into from
Jan 5, 2025

Conversation

yyypearl
Copy link
Member

@yyypearl yyypearl commented Jan 4, 2025

연관 이슈

close #96


개요

소셜 로그인 (애플 로그인 기능 추가) 및 에러 코드 리팩토링

✅ 작업 내용

  • 카카오 로그인을 소셜 로그인으로 확장 (애플로그인 추가)

    • KakaoController 대신 UserController로 수정
      4
  • User 및 Email 관련 응답 ErrorStatus 처리
    (*토큰 유효성 검사 관련해서는 앞에서 작업 중인 게 있는 것 같아 제외하고 작업했어요)
    2

  • 생년월일 유효성 검증 추가 (기존 형식만 검증 → 유효한 년도인지 검증)

  • 이메일 검증 구체화 및 정규식 상수 분리


📝 논의사항

  • 유효성 검사할 때 response 형식이 왜 이렇게 나오는지 아는 분 있을까요? email 컨트롤러 API는 저렇게 예쁘게 나오는데, user 컨트롤러 API는 message랑 result가 중복돼서 나오더라구요. ExceptionAdvice 이거는 바꿔야 할 거 같은데 뭘 어떻게 바꿔야 할지 모르겠네요.

image
image

  • 생년월일 검증이 보통 c7feda8 에 있는 BIRTH 관련 정규식처럼 사용되는데, 이건 미래 날짜에 대한 검증은 안 이루어지더라구요. 프론트에서 한번 거르긴 하겠지만, 좀 더 정확하게 유효성 검사를 진행하고자 미래 날짜를 걸러내는 FutureDateValidator을 추가했습니다. 잘 동작하는데, 다만 위에처럼 응답값이 message랑 result가 중복되서 나오는게 좀 보기 싫어서...☹ 주석처리해두었어요. 근데 보다보니 validator의 문제라기보다는 exception 처리 시의 문제같긴 하더라구요?! 내용 공유차 말씀드립니다!

@yyypearl yyypearl added 🛠 feature 기능 구현 ♻️ refactor 코드 리팩토링 labels Jan 4, 2025
@yyypearl yyypearl self-assigned this Jan 4, 2025
@oyatplum oyatplum self-requested a review January 5, 2025 11:53
Comment on lines +57 to +66
try {
User user = userService.login(request);

// 로그인 성공 시 토큰 생성
String accessToken = jwtUtil.createAccessToken(request.getEmail());
String refreshToken = user.getRefreshToken();
return ApiResponse.onSuccess(UserConverter.toLoginResultDto(user, accessToken, refreshToken));
} catch (UserHandler e) {
return ApiResponse.onFailure(e.getCode().getReason().getCode(), e.getMessage(), null);
}
Copy link
Member

Choose a reason for hiding this comment

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

수고하셨습니다 :)
토큰 유효성 검사는 마저 수정한 뒤 pr 올리겠습니다 !

논의 사항에 적어주신 email controller와 user controller api에서 각각 반환값이 동일하게 나오지 않는 이슈를 확인해보니, /email/send 와 같은 경우에는 에러가 전역적으로 처리되는 반면, /user/login은 개별적으로 처리되는 것 같아요!

/email/sendExceptionAdvice에 있는 handleMethodArgumentNotValid에 의해 처리되고 /user/loginUserController에 있는

@ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ApiResponse<Map<String, String>>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });

        String combinedMessage = String.join(", ", errors.values());

        return new ResponseEntity<>(ApiResponse.onFailure("400", combinedMessage, errors), HttpStatus.BAD_REQUEST);
    }

해당 코드가 실행되어 개별적으로 처리되는 것 같습니다! 따라서 위의 @ExceptionHandler(MethodArgumentNotValidException.class) 로직을 주석처리 한 뒤 실행하면
image
전역적으로 처리되는 것 같습니다.

따라서
해당 코드 부분에 try catch문은 없어져도 될 것 같아요! 마찬가지로 /email/send에서도

catch (UserHandler e) {
            throw e;
}

위와 같은 UserHandler는 아마 적용되고 있지 않는 것 같습니다!

Copy link
Member Author

Choose a reason for hiding this comment

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

헉 원인이 그거였군요! 덕분에 금방 해결했습니다. 리뷰 감사합니다:)

@yyypearl yyypearl merged commit 95c1457 into develop Jan 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🛠 feature 기능 구현 ♻️ refactor 코드 리팩토링
Projects
None yet
Development

Successfully merging this pull request may close these issues.

애플 로그인
2 participants