TL;DR
예제: 로그인 요청을 전달하는 서비스 흐름에서 에러 처리하기아래와 같은 서비스 호출 흐름이 있다고 가정해보겠습니다. Show Server A 입장에서는 Server B에서 발생하는 에러 처리를 해야하는 고민에 빠집니다. API를 호출하는 코드에서 API의 에러 응답에 따른 비즈니스 로직을 다르게 가져가고 싶은 경우가 있습니다. 예를 들어 위 사례에서 비밀번호가 틀리거나 이메일 주소가 틀린 경우 이 에러를 캐치해서 다른 메세지를 던지고 싶을 수 있고, 어떤 코드에서는 그 에러를 무시하고 다른 로직을 수행하고 싶을 수 있습니다. 에러 처리를 API Client 단에서 하지 않고 다른 클래스에 위임을 하고 싶은 이런 경우에는 어떤 방법을 사용할 수 있을지 아래 코드 예시로 알아보겠습니다.
이 경우에 아래와 같은 두 케이스를 해결하고 싶어집니다.
위 고민을 해결할 방법이 있습니다. 바로
코틀린의 runCatching
위 코드를 이해하기에 앞서서 예제아래 요구사항이 있다고 가정합시다.
try … catch를 사용했을때
Java에서 위와 같이 작성하는 코드를 runCatching을 사용하면 아래처럼 표현할 수 있습니다. runCatching을 사용했을 때
kotlin.runCatching
Result가 뭔가요?Result가 무엇인지 알아보기 위해서 Kotlin 1.3 표준 라이브러리의 코드를 살펴봅시다.
즉,
Result 사용 예시
에러를 무시하고 null 반환
기본값 반환
에러 발생 시 다른 동작 수행
에러가 발생한 경우에만 해당 에러 객체 반환
에러가 발생하는지 아닌지만 확인하고 싶을 때에도 유용할 수 있습니다.
성공/에러 시 각각 특정 동작 수행 후 에러 던지기
runCatching으로 try .. finally 구현하기
Result를 사용해서 예외 처리를 다른 클래스에 위임하기
LoginApiClient
Result를 반환하여 다른 클래스가 에러 핸들링을 하도록 위임합니다. LoginService
에러가 발생한 경우 에러를 무시하고 기본값으로 null을 반환합니다. 하지만 아래처럼 다른 컴포넌트에서는 에러를 핸들링하고 싶을 수도 있습니다. PasswordChangeService
[1] 에러가 발생한 경우 에러를 기록합니다. [2] 성공한 경우 해당 값을 받아서 다른 컴포넌트를 호출합니다. → [1], [2]번 두 케이스는 배타적이고 동시에 일어날 수 없습니다. [3] 그리고 에러인 경우 예외를 발생시킵니다. 결론정리하자면
|