위 코드와 다른 점은, suspend라는 키워드를 사용하여 이 인터페이스는 코루틴 내부에서만 동작이 가능하다는 것을 알려준다.
또한 Coroutine을 사용하기 위해 Interface에서 반환값을 Response<> 형식으로 지정해주었다.
**
그런데, 레트로핏 2.6.0 이상부터는코틀린 전용 확장 함수를 지원함으로써Call또는Response를 해줄 필요가 없다고 한다. 그 이유를 추측해보자면 코루틴을 사용하기 전에는 스레드에서 데이터를 UI로 보낼 때에는 콜백함수를 이용해서 메인 스레드에 전달 해주어야 하기 때문에Call로 랩핑을 해주어야 하지만, 코루틴은 콜백함수 없이도suspend키워드가 있다면Dispatchers.Main에서도 UI에서 실행할 수 있기 때문인 것 같다.
Coroutine을 사용하게 되면, enqueue() 비동기 코드를 "실행"하는 코드(onResponse/ onFailure)가 없어도 스스로 값을 가져오게 된다.
코루틴에서는 try/catch를 사용하여 try블록에서 예외를 던질 수 있는 코드를 작성하고, 예외가 발생하면catch블록에서 잡히도록 하였다.
** 추가로finally에서는 예외와 상관없이 해야 하는 코드를 작성한다.
아직 코루틴의 에러 핸들링에는 능숙하지 않다.
위에서는 try/catch문을 사용하였지만 코드가 많아질수록boiler plate코드가 늘어날 수 있고, 관리하기 힘들어 질 수 있다.또한, 범위 내에서 자식 중 예외가 발생하면 다음 자식이 실행되지 않고 실행이 종료되게 되어 개별 예외 처리를 다시 한번 해줘야 하는 필요가 생길 수 있다.