Flutter 프로그래밍을 하면서 Swift의 Result 타입과 대응하는 개념이 있을까? 를 찾아보던 도중 우연히 마주친 좋은 세션을 정리해보고자 한다.
if-else 의 문제점
에러를 가장 단순하게 처리한다면 위와 같이 연속적인 if-else문으로 처리할 수 있을 것이다. 하지만 이러한 방식의 문제점은 에러 발생 컨텍스트를 풍부하게 표현하기 어렵다는 것이다. 가장 먼저 오는 조건과 가장 아래 오는 조건이 부분집합 관계이기 때문이다.
Exception - 에러에 풍부한 의미 부여하기
if-else문의 문제를 해결하기 위해 try-catch를 이용해 에러를 처리해줄 수 있다. 위와 같이 try-catch문을 사용하면 정상적인 로직과 에러 처리 로직을 명확히 분리하여 코드를 간결하게 유지 할 수 있다.
하지만 try-catch 는 근본적으로 고투구문이기 때문에 가독성이 떨어진다는 단점이 있다. 만약 특정 코드 블록을 try-catch로 감싸는 것을 깜빡하면, 그 코드에서 예외가 발생했을 때 해당 예외는 상위 호출 스택으로 전파된다. 상위 레벨의 try-catch 블록이 없으면, 예외는 최종적으로 프로그램을 크래쉬시킨다.
Either - 에러와 성공 동시에 처리하기
Either는 iOS의 Result 타입과 대응하는 녀석이다. 제너릭 타입으로 에러에 해당하는 타입과 결과에 해당하는 타입을 넣을 수 있다. 이로써 리턴밸류를 통해 에러와 결과값 모두 처리할 수 있어 앞서 상위 스택을 찾다 크래쉬나는 문제가 사라진다. (가독성도 훨씬 좋아진다)
Either 의 결과를 사용할 때는 위와 같이 fold 메서드를 통해 처리할 수 있다.
Union - 여러 케이스 겹치지 않게 처리하기
앞선 Either는 에러와 성공 데이터 타입 두개가 담겨서 리턴되었다. 여기서 한 발자국 더 나가 Union은 여러개의 타입을 박스에 담아 리턴한다.
답은 Union이다. Freezeed 패키지를 사용해서 에러모델을 정의해준뒤에 위와 같이 여러가지 에러 상황을 타입매칭해줄 수 있다.
출처:
https://www.youtube.com/watch?v=9E6EeIzp2FQ&t=363s
'Flutter' 카테고리의 다른 글
flutter_localization depends on flutter_localizations from sdk which depends on intl 0.18.1 에러 (2) | 2024.05.30 |
---|---|
Sliver 에 대해 알아보자 (0) | 2024.05.30 |
Flutter 프로젝트 디버그용/배포용 분리하기 (0) | 2024.05.24 |
fatal error: module 'cloud firestore' not found 이슈 (0) | 2024.05.24 |
PreferredSize 란? (0) | 2024.05.21 |