강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

김민우님의 프로필 이미지
김민우

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

13강. 도메인 계층을 Kotlin으로 변경하기 - UserLoanHistory.java, User.java

표준 예외와 커스텀 예외 사용 전략 질문

작성

·

16

0

안녕하세요. 수업 내용과는 크게 관계가 없지만... 예외처리 관련 내용에 대한 질문을 드립니다.

스프링이 제공하는 표준 예외(IllegalArgumentException, IllegalStateException)와 비즈니스 로직을 표현하는 커스텀 예외(NotFoundUserException) 사이에서 표준 예외를 사용하는 경우와 커스텀 예외를 사용하는 경우에 대한 기준을 알 수 있을까요?

 

감사합니다.

답변 2

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 민우님! 🙂 좋은 질문 감사합니다. AI 인턴이 남겨준 링크도 한 번 읽어보시면 좋을 것 같고요!

남겨주신 질문에 대해서도 직접적인 답변을 드려보면...

스프링이 제공하는 표준 예외(IllegalArgumentException, IllegalStateException)와 비즈니스 로직을 표현하는 커스텀 예외(NotFoundUserException) 사이에서 표준 예외를 사용하는 경우와 커스텀 예외를 사용하는 경우에 대한 기준을 알 수 있을까요?

 

우선 IllegalArgumentException, IllegalStateException 와 같은 Exception class는 스프링이 제공하는 것이 아니라 자바 (JDK) 에서 제공하고 있습니다. 둘을 구분해주시면 조금 더 좋을 것 같아요!

또한, 저는 다음과 같은 기준을 갖고 커스텀 예외를 사용하는 편입니다.

 

  1. 매개변수에 대한 검증이 실패한 경우

    1. 이 경우는 매개변수, 즉 Argument가 잘못되었다는 의미이기에 표준 예외 IllegalArgumentException 를 사용합니다.

    2. 또한 들어온 매개변수로 인해 특정 Entity를 찾지 못하는데 예외를 던져야 하는 경우도 매개변수가 잘못되어 Entity를 찾지 못했을 확률이 높기에 IllegalArgumentException 를 사용하는 편입니다.

  2. 특정 로직을 수행하다 객체의 pre state가 잘못되었을 경우

    1. 비즈니스 로직을 구현하다보면 특정 로직에는 precondition 이라 불리는 가정이 들어갑니다. 예를 들어 신호등이 초록색으로 바뀌기 위해서는 빨간색이거나 노란색이어야 한다는 가정이죠. 이런 경우 색을 초록색으로 하려고 했는데 진작 초록색이라면, 로직 실행전의 객체 필드 (= 상태) 가 잘못 되었다는 의미이기에 IllegalStateException 을 사용합니다.

  3. 클라이언트에서 예외를 분기 처리 해야 하는 경우

    1. 단순히 HTTP status로 내용을 전달하기에 충분하지 않고, 상황별로 적절한 문구를 사용자에게 노출해야 한다거나 FE 로직에 대한 분기를 태워야하는 경우는 custom JSON을 내려줘야만 하고, (보통 @ControllerAdvice 같은 친구를 사용하죠 ) 이런 경우는 커스텀 예외를 사용합니다.

    2. 다만, 매번 커스텀 예외 클래스를 만드는 것은 매우 번거롭고 클래스 수가 늘어나 관리가 어렵기에 Exception class는 1개를 만들고, 상황에 따른 enum을 구성하는 것을 매우 선호합니다.

    3. https://velog.io/@jds7979/Spring-%EC%A0%84%EC%97%AD%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-with-EnumGlobal-Exception-Handler 와 같은 글을 참고해보시면 좋을 것 같아요! (이 글에 100% 동의한다기 보다 예시로 봐주시면 되어요!)

감사합니다. 🙇

 

0

안녕하세요, 인프런 AI 인턴입니다. 김민우님.

예외 처리에 대해 궁금증을 가져주셔서 감사합니다. 스프링 애플리케이션에서 표준 예외와 커스텀 예외를 사용할 때의 기준은 애플리케이션의 요구사항과 유지보수성에 따라 결정되는 경우가 많습니다. 다음은 그 기준에 대한 설명입니다:

  1. 표준 예외 사용:

    • 표준 예외란? 자바와 스프링이 제공하는 예외로, 이미 여러 개발자들에게 익숙한 예외입니다. 예를 들면 IllegalArgumentException은 잘못된 인자가 메서드에 전달될 때 사용하는 것이 일반적입니다.
    • 사용 상황: 일반적이고 간단한 상황에서 발생할 수 있는 예외를 다룰 때 유용합니다. 특별한 설명이 필요 없는 명백한 예외 상황에 적합합니다.
  2. 커스텀 예외 사용:

    • 커스텀 예외란? 특정 비즈니스 요건을 표현하기 위해 개발자가 정의한 예외로, 애플리케이션의 도메인 논리를 그대로 드러냅니다.
    • 사용 상황: 특정 비즈니스 로직과 관련된 예외 상황을 설명할 때 사용합니다. 예를 들어 사용자를 찾지 못했을 때 NotFoundUserException 같은 예외는 로직의 흐름 및 사용자에게 구체적인 피드백을 제공할 수 있게 도와줍니다.
    • 장점: 명확한 도메인 컨텍스트 제공, 예외에 의미를 부여하여 코드의 이해도를 높이는 데 기여합니다.

관련된 깊이 있는 설명과 예제는 아래 답변을 참고하실 수 있습니다:
- “예외 처리 리팩토링 질문”

질문에 대한 답변이 도움 되었기를 바라며, 더 궁금한 점이 있다면 언제든지 질문해 주세요. 곧 지식공유자께서 추가로 상세한 답변을 드릴 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김민우님의 프로필 이미지
김민우

작성한 질문수

질문하기