1. 시작하게 된 계기 및 다짐 😮
  • 이번 코드스테이츠의 백엔드 엔지니어링 개발자 부트캠프에 참여하게 되면서 현직개발자 분들의 빠른 성장을 위한 조언 중 자신만의 블로그를 이용하여 배운 것 들을 정리하는게 많은 도움이 된다 하여 시작하게 되었다.

    • 그 날 배웠던 것을 길지 않아도 좋으니 정리하며 복습하는 습관 기르기
    • 주말에 다음주에 배울 내용들을 예습
    • 코딩 문제와 java코드들은 꾸준히 학습
    • 자료구조를 이용한 알고리즘 문제 해결 학습
  1. 학습 목표 😮
목표결과
서비스 계층에서 의도적으로 예외를 던지는 방법과 상황을 이해O
사용자 정의 예외(Custom Exception) 생성O
@RestControllerAdvice 애너테이션을 사용해서 예외O
서비스 계층에서 던져진 예외를 API 계층에서 처리O
  1. 정리😮

비지니스 로직에 대한 예외처리

0. 에러 메세지로 부터 특정 정보를 받는 메서드들

  1. e.getMessage() : 에러 메시지의 정보를 받음
  2. e.getExceptionCode() : 에러 메시지 발생 코드를 받음
  3. e.getStatus() : 에러 메시지의 발생 상태를 받음
  4. ★HttpStatus(enum 클래스)를 받아 해당 value(Code) 와 getReasonPhrase(message)를 얻을 수 있음

1. 체크 예외(Checked Exception)과 언체크 예외(Unchecked Exception)

  1. 체크 예외
    • 발생한 예외를 잡아서(catch) 체크후 예외를 복구 or 회피 하는 구체적인 처리를 필요하는 예외
  2. 언체크 예외
    • 예외를 잡아서 해당 예외에 대한 처리가 필요 없는 예외 RuntimeException을 상속한 예외들
      [ex. ClassNotFoundException, NullPointerException, ArrayIndexOutOfBoundsException]

2. 개발자가 의도적으로 던지는(throw) 예외

  1. 백엔드 서버와 외부 시스템과의 연동에서 발생하는 에러처리
    • [ex. 계좌에서 돈을 뺴려하는데 잔고가 부족한 경우 클라이언트쪽에 알리는 경우]
  2. 시스템 내부에서 조회하려는 리소스(자원)이 없는 경우
    • [ex. 커피 회원 조회시 회원이 없는 경우]

3. 의도적인 예외 던지기/받기(throw/catch)

  • 서비스계층의 예외는 API계층의 Controller에서 잡아서 처리할 수 있음
  • 서비스 계층에서 예외를 던지고 이를, @RestControolerAdvice에서 받아서 처리
 [예제 Code]
 @Service
 public class MemberService {
    public Member findMember(long memberId) {
        // TODO should business logic			
				// (1)
        //throw new RuntimeException("Not found member");
        throw new BusinessLogicException(ExceptionCode.MEMBER_NOT_FOUND);
    }
 }


 @RestControllerAdvice
 public class GlobalExceptionAdvice {
 		// (1)
    @ExceptionHandler
    //@ResponseStatus(HttpStatus.NOT_FOUND) ==> status가 에러에 따라 바뀌기 때문에 ResponseEnitity를 사용
    //public ErrorResponse handleResourceNotFoundException(RuntimeException e) {
    //    System.out.println(e.getMessage());
    public ErrorResponse handlerBusinessLogicException(BusinessLogicException e){
           System.out.println(e.getExceptionCode().getStatus());
           System.out.println(e.getMessage());

        //return null;
        return new ResponseEntity<>(HttpStatus.valueOf(e.getExceptionCode());
    }
 }

4. 사용자 정의 예외(Custom Exception) 사용

  • 사용자가 직접 처리하는 예외
  • enum 클래스를 이용하여 커스텀 exception을 정의해서 사용
  • 이 enum클래스를 받아 처리할 BusinessLogicException 정의
 [예제 Code] 
 public enum ExceptionCode {
    MEMBER_NOT_FOUND(404, "Member Not Found");

    @Getter
    private int status;

    @Getter
    private String message;

    ExceptionCode(int status, String message) {
        this.status = status;
        this.message = message;
    }
 }

 public class BusinessLogicException extends RuntimeException {
    @Getter
    private ExceptionCode exceptionCode;

    public BusinessLogicException(ExceptionCode exceptionCode) {
        super(exceptionCode.getMessage());
        this.exceptionCode = exceptionCode;
    }
 }

Extra

  1. throw와 throws 차이점

    • throw : 메서드 내에서 예외를 처리 ( try~catch)
    • throws : 메서드 외(호출 한 지점)로 예외를 던져 거기서 처리하도록(ex. public void func throws exception)
  2. MethodArgumentNotValidException

    • 요청의 Body에서 유효성 에러 문제 발생시
  3. ConstraintViolationException

    • startline의 요청에 대한 문제가 발생할 때
  4. @Slf4j

    • lombok의 애너테이션으로, 테스트할 떄 사용하는 애너테이션
    • log.xxx()를 사용 가능하도록 해주는 애너테이션
    • log.info("message") 사용가능



  1. 피드백 😮
  • 비지니스 로직을 처리하는 와중 발생하는 에러들은 체크/언체크 예외가 있는데 '체크 예외'의 경우 발생한 에러를 처리해주는 예외고 '언체크 예외'의 경우 딱히 처리할 필요가 없는 에러들이다.

  • 개발자가 원하는 결과값이 나오지 않을시 의도적으로 예외를 던져서 이를 처리할 수 있음

  • 사용자가 직접 enum클래스를 이용하여 특정 예외(ex. Exception)를 커스텀해서 처리할 수 있음

  1. 앞으로 해야 될 것 😮
  • 매일 꾸준히 할 것
    • 꾸준히 velog 작성
    • Java 언어 및 Algorithm 공부(Coding-Test)
    • 틈틈히 운동 하기

  • 내일 해야 할 것
    • JDBC기반 데이터베이스 엑세스 계층 공부
profile
Will be great Backend-developer

0개의 댓글