Exception

Exception이란?

Exception이란?

Error

시스템 레벨에서 사용하고 발생하는 것으로 어플리케이션 개발자가 관여하지 않음

Exception

어플리케이션 레벨에서 로직을 구현하면서 개발자가 예외사항 처리를 위해 사용

Exception이란?

Checked Exception

  • 반드시 처리해야 함
  • Compile Time에 처리

Unchecked Exception

  • 명시적 처리를 강요하지 않음
  • Run Time에 처리

장점

  • 코드상에서 비즈니스 명확성이 높아짐
  • 다양한 예외 표현 가능
  • 기능요구사항정의와 연결이 가능

단점

  • Trace를 생성하는 비용이 비쌈

요구사항분석

요구사항분석

  • 필요한 기능에 대해 분석
  • 스펙에 대한 정의

할일을 관리할 수 있는 기능을 추가한다.
Todo Item을 등록/수정/삭제 할 수 있다.
Todo/Doing/Done 로 상태를 변경할 수 있다.
Todo -> Doing, Doing -> Done, Done -> Doing, Doing -> Todo 로의 상태 변화가 가능하다.
Todo Item을 등록할 때 Todo 상태로 시작한다.
Archive할 수 있어야 하고 Archive는 Todo/Doing/Done 모든 상태에서 가능하다.
검색/상세조회 기능을 포함한다.

기능 요구사항 명세

FR-TD-1. 할 일 상태 변경
기능정의:
할 일의 상태를 변경하는 기능을 지원한다.
상태 변경은 아래와 같이 가능하다.
Todo -> Doing, Doing -> Done, Done -> Doing, Doing -> Todo

예외사항:
정의된 상태 변경 외의 상태 변경은 불가능하다.

Implementation

public TodoItem changeState(@NonNull TodoItem todo, @NonNull TodoState state) 
    throws IllegalStateChangeException {
  TodoItem savedItem = todoItemRepository.findById(todo.getIdx())
      .orElseThrow(ResourceNotFoundException::new);

  final boolean possibleToChangeState = TodoState
                            .isPossibleToChangeState(savedItem.getState(), state);
  
  if (!possibleToChangeState) {
    throw new IllegalStateChangeException();
  }

  savedItem.setState(state);

  return todoItemRepository.save(savedItem);
}

ControllerAdvice

@ExceptionHandler(FlexibleException.class)
@ResponseBody
public Object handleFlexibleException(HttpServletRequest request, HttpServletResponse response, FlexibleException e) {
  return handleDeducibleData(request, response, e);
}

@ExceptionHandler(StrictException.class)
@ResponseBody
public Object handleStrictException(HttpServletRequest request, HttpServletResponse response, StrictException e) {
  return handleDeducibleData(request, response, e);
}

private Object handleDeducibleData(HttpServletRequest request, HttpServletResponse response, DeducibleData data) {
  response.setCharacterEncoding(Constants.CHARSET_UTF8);
  response.setContentType(Constants.CONTENT_TYPE_APPLICATION_JSON_UTF8);

  return data.get();
}

Exception

By Hyeonil Jeong

Exception

  • 490