Skip to content

예외처리 가이드

JinuCheon(깻묵) edited this page Jul 8, 2022 · 2 revisions

왜 쓰나요?

기존 코드처럼, 컨트롤러까지 올려서 ResponseEntity 작성할 필요 없음.

  • 코드 매우 깔끔해짐
  • 서비스 계층에서 exception 내고, 응답 주면서 종료.
  • 아래에 나오는 Optional 체크 간단하게 가능

커스텀 예외처리 만들기

  1. 해당 패키지에, [ExampleException.java](http://ExampleException.java) 를 생성

Untitled

  1. 다음과 같이, BreakingException 생성
/**
 * oauth2.0 에서 발급된 username이 데이터베이스에 없을 때 발생하는 예외입니다.
 */
public class InvalidAccessTokenException extends BreakingException {

    private static final String MESSAGE = "유저 인증에 실패하였습니다." ;

    public InvalidAccessTokenException() {
        super(MESSAGE, HttpStatus.UNAUTHORIZED); //적절한 에러 코드 사용 강조
    }

}
  1. 다음과 같이 사용
// 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()));
}
  1. try catch 의 무분별한 남용
  2. 에러가 났을 때, 디버깅 힘듦
  3. 더티코드
  4. 클라이언트에서의 요청이 어떤 부분에서 문제가 있는지 알 수 없음.

가이드

  1. try catch : DB나 다른 서버 연결 등, 핸들링이 불가능한 영역(매서드)에만 사용.

    • try catch 에서 걸린 에러는, 디버깅을 해야하니까 catch 에 log.info로 exception 코드 직어주기
  2. 예외처리는, 서비스 레이어에서 끝내기.

    • 컨트롤러로 올려서 ResponseEntity로 처리하려고 하지 말기.
    • 컨트롤러를 깔끔하게 유지.
  3. 에러 코드, 메시지를 명확하게 구분하고, 클라이언트에게 알려주자.

    회원가입이 있다면, 회원가입에 실패하는 경우가 다음이 있을 것이다.

    • 입력값이 누락됨(4xx)
    • 전화번호 중복(4xx)
    • 이메일 중복(4xx)
    • 유저 식별 불가(4xx)
    • 서버측 문제 (5xx) - 상세 정보를 응답으로 알려주지 않는다. 단, catch(Exception e)에서 서버에 로그를 찍어야, 디버깅 가능.