피드로 돌아가기
Why I stopped using exceptions for control flow in my .NET 8 APIs
Dev.toDev.to
Backend

Exception 기반 제어 흐름 제거를 통한 .NET 8 API 설계 최적화 및 타입 안정성 확보

Why I stopped using exceptions for control flow in my .NET 8 APIs

fenixkit2026년 5월 9일9intermediate

Context

비즈니스 로직 예외 처리를 위한 과도한 try/catch 사용으로 인한 코드 복잡도 증가 및 응답성 저하 발생. 런타임에 결정되는 예외 발생 지점으로 인해 메서드 시그니처만으로는 에러 케이스를 예측할 수 없는 Hidden Contract 문제 직면.

Technical Solution

  • ErrorOr 라이브러리를 활용하여 에러를 Exception이 아닌 반환 타입(Discriminated Union)으로 정의하는 구조적 전환
  • Result<T, E> 패턴 도입을 통한 컴파일 타임의 에러 처리 강제 및 메서드 시그니처의 명시성 확보
  • Repository 계층 내 Hook Chain 구조를 설계하여 유효성 검사, 매핑, 영속성 단계별 실패 시 즉시 중단 및 에러 반환
  • 중앙 집중식 Middleware 및 ToResponse() 매핑 로직 구축을 통한 개별 엔드포인트의 try/catch 제거
  • 비즈니스 예외와 시스템 예외(Genuine Bugs)를 분리하여 전역 Exception Handler는 오직 시스템 장애 처리 전용으로 제한

- 비즈니스 도메인 에러를 타입으로 정의하여 반환 값에 포함시키고 있는지 검토 - 메서드 시그니처를 통해 발생 가능한 모든 에러 케이스를 명시적으로 드러내어 호출부의 처리 강제 - 유효성 검사부터 DB 저장까지의 파이프라인을 단계별 반환 값 체크 구조로 설계하여 불필요한 DB I/O 최소화 - API 응답 매핑 로직을 중앙화하여 에러 코드와 HTTP 상태 코드 간의 일관성 유지

원문 읽기