-
Notifications
You must be signed in to change notification settings - Fork 28
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
커스텀 예외처리 리팩터링 #1365
Comments
현재 진행 방향현재의 문제: 커스텀 예외 처리가 알 수 없는 흐름으로 동작함(커스텀 예외로 등록을 안한다면 NotFoundErrorCodeException 발생 → 최대한, 현재 방식과 유사하면서 깔끔하게 수정하기로함.. BadRequestException변경 전 @Getter
public class BadRequestException extends RuntimeException {
private BadRequestCode codeAndMessage = BadRequestCode.findByClass(this.getClass());
private String message;
private int code;
public BadRequestException() {
this.message = codeAndMessage.getMessage();
this.code = codeAndMessage.getCode();
}
} 변경 후 @Getter
public class BadRequestException extends RuntimeException {
private String message;
private int code;
public BadRequestException(BadRequestCode badRequestCode) {
this.message = badRequestCode.getMessage();
this.code = badRequestCode.getCode();
}
}
BadRequestCode변경 전 @AllArgsConstructor
@Getter
public enum BadRequestCode {
NOT_FOUND_ERROR_CODE(0000, "해당 에러의 에러코드를 찾을 수 없습니다.", NotFoundErrorCodeException.class),
...
CURRICULUM_NOT_FOUND_EXCEPTION(8007, "해당하는 커리큘럼을 찾을 수 없습니다", CurriculumNotFoundException.class);
private int code;
private String message;
private Class<? extends BadRequestException> type;
public static BadRequestCode findByClass(Class<?> type) {
return Arrays.stream(BadRequestCode.values())
.filter(code -> code.type.equals(type))
.findAny()
.orElseThrow(NotFoundErrorCodeException::new);
}
} public class NotFoundErrorCodeException extends BadRequestException {
} public class CurriculumNotFoundException extends BadRequestException {
} … 변경 후 @AllArgsConstructor
@Getter
public enum BadRequestCode {
NOT_FOUND_ERROR_CODE(0000, "해당 에러의 에러코드를 찾을 수 없습니다."),
...
ROADMAP_KEYWORD_SEQUENCE_EXCEPTION(8007, "키워드 시퀀스가 유효하지 않습니다.");
private int code;
private String message;
}
실제 코드 작성에서 바뀐 부분변경 전 public MemberTags(List<MemberTag> values) {
final int originalSize = values.size();
final long count = values.stream().distinct().count();
if(originalSize != count) throw new DuplicateMemberTagException();
this.values = values;
} 변경 후 public MemberTags(List<MemberTag> values) {
final int originalSize = values.size();
final long count = values.stream().distinct().count();
if (originalSize != count) {
throw new BadRequestException(DUPLICATE_MEMBER_TAG);
}
this.values = values;
}
하면서 느낀점
구구의 피드백
|
커스텀 예외 처리가 알 수 없는 흐름으로 동작하는 현상이 꽤나 자주 일어납니다. (특히 테스트 코드 작성할 때 등록 안된 커스텀 예외들이 자주 보임) 다들 아시다시피, 이는 BadRequestCode(Enum)에 해당 예외를 커스텀 예외로 등록을 하지 않는다면 NotFoundErrorCodeException 발생하기 때문입니다.
이를 해결하기 위해서 생각해본 여러가지 방법이 있는데, 다음과 같습니다.
BadRequestCode에 등록되지 않은 예외들을 등록한다.
BadRequestCode를 Optional로 조회하지 않고 등록되어 있는 예외를 발생시킨다.
커스텀 예외를 사용할 때 status, code, type을 입력하도록 강제한다.
호이와 조금 더 상의해보고 결정하는 방향으로 하겠습니다.
++ 위 의견들은 어디까지나 제 의견과 해결방안이기 때문에 더 좋은 방안이 있다면, 많은 의견 코멘트 해주시면 감사하겠습니다.
The text was updated successfully, but these errors were encountered: