-
Notifications
You must be signed in to change notification settings - Fork 2
예외처리 가이드
JinuCheon(깻묵) edited this page Jul 8, 2022
·
2 revisions
기존 코드처럼, 컨트롤러까지 올려서 ResponseEntity 작성할 필요 없음.
- 코드 매우 깔끔해짐
- 서비스 계층에서 exception 내고, 응답 주면서 종료.
- 아래에 나오는 Optional 체크 간단하게 가능
- 해당 패키지에, [ExampleException.java](http://ExampleException.java) 를 생성
- 다음과 같이, BreakingException 생성
/**
* oauth2.0 에서 발급된 username이 데이터베이스에 없을 때 발생하는 예외입니다.
*/
public class InvalidAccessTokenException extends BreakingException {
private static final String MESSAGE = "유저 인증에 실패하였습니다." ;
public InvalidAccessTokenException() {
super(MESSAGE, HttpStatus.UNAUTHORIZED); //적절한 에러 코드 사용 강조
}
}
- 다음과 같이 사용
// Optional 의 경우 이렇게 사용 가능.
// Optional.ispresent 생략하고,
User user = userRepository.findById(userId).**orElseThrow(NoSuchUserException::new);**
// 그 외 경우 사용
if (members.existsByEmail(email)) {
throw new DuplicateEmailException();
}
잘못된 예시.
try {
postid = postService.create(principal.getName(), postCreateRequestDto, files);
} catch (Exception e) {
log.info("게시글 등록에 실패함");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new MessageResponseDto(PostResType.POST_FAILED.getMessage()));
}
- try catch 의 무분별한 남용
- 에러가 났을 때, 디버깅 힘듦
- 더티코드
- 클라이언트에서의 요청이 어떤 부분에서 문제가 있는지 알 수 없음.
-
try catch : DB나 다른 서버 연결 등, 핸들링이 불가능한 영역(매서드)에만 사용.
- try catch 에서 걸린 에러는, 디버깅을 해야하니까 catch 에 log.info로 exception 코드 직어주기
-
예외처리는, 서비스 레이어에서 끝내기.
- 컨트롤러로 올려서 ResponseEntity로 처리하려고 하지 말기.
- 컨트롤러를 깔끔하게 유지.
-
에러 코드, 메시지를 명확하게 구분하고, 클라이언트에게 알려주자.
회원가입이 있다면, 회원가입에 실패하는 경우가 다음이 있을 것이다.
- 입력값이 누락됨(4xx)
- 전화번호 중복(4xx)
- 이메일 중복(4xx)
- 유저 식별 불가(4xx)
- 서버측 문제 (5xx) - 상세 정보를 응답으로 알려주지 않는다. 단, catch(Exception e)에서 서버에 로그를 찍어야, 디버깅 가능.