목록으로
'언젠가 읽기' 컨텐츠는 논문이나 영문 컨텐츠 등 언젠가 읽으려고 즐겨찾기 하고선 읽지 않고 계속 미룰만한 컨텐츠를 읽고 요약하거나 소개합니다.

클로저의 관용구 오류

언젠가 읽기
2025. 3. 13. PM 5:30:12

에러 처리와 Clojure의 유연성

스레딩에서의 에러 처리

Clojure에서 스레딩을 사용할 때, nil 대신 :failure 키를 포함하는 맵이 있을 경우 에러를 처리합니다. 결과를 관리하기 위해 if-let과 유사한 구조를 사용하는 것이 유용합니다. 중급 수준의 Clojure 개발자가 직접 구현하기 어렵지 않으며, 구현 세부사항은 선호도에 따라 다를 수 있습니다. 간단한 버전은 gist 링크에 있으며, 더 복잡한 접근 방식은 thread-until을 참고하세요.

파이프라인에서의 활용

이 접근 방식은 대량의 항목을 처리하는 파이프라인을 구축할 때 유용합니다. 예를 들어, 30,000개의 항목 중 22,051번 항목에 오류가 발생해도 전체 처리를 중단하지 않고, 에러 맵을 통해 오류를 전달할 수 있습니다. 이는 nil을 반환하는 것보다 더 유용한 방법입니다.

Sean Corfield의 에러 처리 방법

Sean Corfield는 다음과 같은 방법으로 에러를 처리합니다:

  • 예상치 못한 오류가 발생했을 때는 예외를 던집니다.
  • 예상 가능한 오류는 nil 또는 {:ok false :message "..."} 값을 반환합니다. 성공 시에는 {:ok true :value ...} 값을 반환합니다.

Clojure의 유형 시스템과 에러 처리

Clojure는 Java의 엄격한 유형 시스템에 얽매이지 않기 때문에 다양한 형태로 값을 반환할 수 있습니다. Java에서는 단일 유형의 결과만 반환할 수 있어 예외를 통해 다른 결과를 전달하지만, Clojure에서는 데이터 맵을 사용하여 유연하게 오류를 처리할 수 있습니다.

에러 맵의 구조화

에러 맵을 무분별하게 사용하는 대신 표준화된 구조로 만드는 것이 좋습니다. Cognitect의 anomalies::anom/category 키를 사용하여 오류를 분류하는 최소한의 접근 방식입니다. Exoscale의 ex는 멀티메서드와 유사한 계층 구조를 통해 예외를 관리합니다. 이러한 표준화는 동적 언어를 사용할 때 자연스럽고 효율적입니다.

흐르는 에러 처리 라이브러리

에러 맵을 더 구체적으로 다루기 위해 다양한 라이브러리가 존재합니다. 예를 들어, Ivan Grishaev의 pact, fmnoise의 flow, Adam Bard의 failjure 등이 있습니다. 이러한 라이브러리들은 "Either Monad-ness" 스펙트럼을 따라 다양한 에러 처리 방식을 제공합니다.

커뮤니티와 커스텀 에러 처리

Clojure 커뮤니티는 사용자 정의 에러 처리를 쉽게 할 수 있도록 다양한 도구와 라이브러리를 공유합니다. 이는 동적 언어의 특성과 잘 맞으며, 개발자가 자신의 필요에 맞게 에러 처리를 확장할 수 있게 합니다.

참고 자료

  • thread-until by Reefersleep
  • Cognitect’s anomalies
  • pact by Ivan Grishaev

[출처] Idiomatic Errors in Clojure