7장 오류 처리

Seunghee Ryu·2023년 12월 11일
0

클린 코드

목록 보기
7/18

  • 예외 처리에 관한 가이드를 제공해준다

1. 오류 코드보다 예외를 사용하라

  • 오류를 코드로 처리하게 되면 코드의 가독성은 낮아지고 계층의 깊이는 심하게 높아진다
  • 오류 코드로 처리하는 경우 개발자가 작성하는 것이기 때문에 실수하는 경우 프로그램이 멈출 수 있다
  • 예외 처리를 통해 코드를 분리하고 각 개념을 읽기 쉽게 처리할 수 있다

2. Try-Catch-Finally 문부터 작성하라

  • try 블록은 무슨 일이 생기든지 catch 블록으로 넘어가기 때문에 일관된 상태를 유지할 수 있다
  • try 블록에서 무슨 일이 생기든지 호출자가 기대하는 상태를 정의하기 쉬워진다

TDD 작성 권장 방법

  • 강제로 예외를 일으키는 테스트 케이스를 작성 후 테스트를 통과하게 코드를 작성하는 방법
  • 자연스럽게 try 블록의 트랜잭션 번위부터 구현하게 되기에 범위 내에서 트랜잭션 본질을 유지하기 쉬워진다

3. 미확인(Unchecked) 예외를 사용하라

checked와 unchecked

  • checked
    - 꼭 처리를 해줘야하는 예외
    - 컴파일 타임에 확인 가능
    - 예외 발생시 트랜잭션 처리 : 롤백O
    - 예시 : IOException, SQLException

  • unchecked
    - 꼭 처리를 하지 않아도 되는 예외(개발자 부주의)
    - 런타임 시에 확인 가능
    - 예외 발생 트랜잭션 처리 : 롤백X
    - 예시 : RuntimeException, NullPointerException

  • 확인된 예외는 OCP를 위반한다
    - 메소드에서 예외를 던졌는데 catch 블록이 세 단계 위에 있다면 그 사이 메소드 모드가 예외를 정의해야 한다
    - 모든 함수에서 최하위 함수에서 던지는 예외를 알아서 캡슐화가 깨진다
    - 예외를 처리하는 비용 소모가 크다

4. 예외에 의미를 제공하라

  • 자바는 모든 예외에 호출 스택을 제공하지만 그것만으로는 부족하다
  • 오류 메세지에 정보를 담아 예외와 함께 던진다

5. 호출자를 고려해 예외 클래스를 정의하라

  • Third party library를 사용하고 여기서 던지는 에러를 처리해야 한다면 wrapping하여 관리하는 것이 좋다
    - 라이브러리 교체 등의 변경에 대응하기 쉽다
    - 라이브러리 쓰는 곳을 테스트하는 경우, 해당 라이브러리를 가짜로 만들어 테스트하기 쉬워진다
    - 라이브러리의 API 디자인에 관계없이 내 프로그램에 맞도록 정제하여 사용할 수 있다

6. 정상 흐름을 정의하라

  • 예외가 발생하는 특수상황 자체가 없도록 구현을 한다
  • 클라이언트 코드가 예외적인 상황을 처리할 필요가 없어지는 것을 특수 사례 패턴이라고 부른다

7. null을 반환하지 마라

  • 메소드가 null을 반환한다면 메소드를 호출하는 모든 로직에서 null 검사를 해줘야 하는데 이를 놓칠 수 있다
  • null 대신 예외를 던지거나 특수 사례 객체를 반환한다
  • Optional 객체를 통해 구현할 수 있다

8. null을 전달하지 마라

  • null을 인수값으로 전달하는 방식도 피해야 한다
  • 인수값으로 null을 전달하면 결국 메소드 위치에서 null을 검사하는 로직을 넣어야 한다

개인적인 감상

  • 현재 프로젝트에서 null에 관한 처리를 고민 중이었기 때문에 null을 반환, 전달하지 말라는 부분이 인상적이었다
  • null 체크를 하는 부분을 완전히 리팩토링 하는 것은 어렵기 때문에 이에 관한 고민이 깊어졌다
  • null 값을 넘기지 않도록 만들어놨는데 if문이나 for문 안쪽에서 null 값을 체크하는 경우에 대해 생각해봐야겠다

0개의 댓글