Kotlin, Arrow, Spring Boot로 도메인 에러를 잡다!

by DD
11개월 전
조회수 4

Kotlin 기반 결제 시스템에서 도메인 에러 처리를 위해 Sealed Class를 활용했으나, 반복적인 코드 작성이 문제로 대두됨

Railway Oriented Programming(ROP) 개념을 도입, Arrow의 Either를 통해 성공과 실패를 명확히 분리하여 코드 가독성 향상

@Transactional 롤백 문제, 직렬화 문제Either 사용 시 고려사항을 공유하고, 책임 분리 설계를 통해 문제 해결

Sealed Class에서 Arrow.Either로의 전환

구체적으로 Sealed Class를 활용하여 도메인 에러를 처리했지만, 반복적인 코드 작성과 중첩된 구조로 인해 가독성이 저하되었다. 따라서 Railway Oriented Programming(ROP) 개념을 도입하고, Arrow의 Either를 적용하여 성공과 실패를 명확하게 분리했다. 결과적으로 코드 중복 감소유지보수성 향상을 달성했다.

Either 사용 시 발생 가능한 문제점

반면 @TransactionalEither를 함께 사용할 때, 롤백이 제대로 동작하지 않는 문제가 발생했다. 구체적으로 raise() 함수가 예외를 던지지 않고 Either.Left를 반환하여, Spring의 트랜잭션 매니저가 예외를 감지하지 못했다. 따라서 책임 분리를 통해 문제를 해결하고, 데이터 일관성을 확보했다.

Either의 적용 범위와 아키텍처 설계

결과적으로 Either의 무분별한 전파를 막기 위해, 도메인 로직 내에서만 사용하고, I/O 작업(Infrastructure) 계층에서는 전통적인 예외 처리를 유지했다. 구체적으로 Konsist를 활용하여 아키텍처 규칙을 자동화 테스트로 검증하여, 코드 일관성안정성을 확보했다.

도메인 Error를 다루는 고민과 Arrow의 Either