파파비의 블로그

플러터, flutter) Future 제대로 이해하기 & 에러 처리 & async await 본문

개발/flutter

플러터, flutter) Future 제대로 이해하기 & 에러 처리 & async await

N. Dave 2020. 6. 10. 16:53
반응형

어떤 메소드를 실행했을 때, 그것의 값이 딜레이가 생긴다면, 어떨까?

예를 들어 네트워크 요청을 했는데, 인터넷이 너무 느려서 응답속도가 느린 것 같은 것을 말한다.

 

기존 프로그래밍 방식대로라면 그 요청을 받기 위해 기다려야 한다.

반응이 올때까지 말이다.

 

반응이 매우 늦게 오게 된다면 프로그램은 일정수준동안 멈춰있게 되는데,

그것은 바람직하지 않다.

 

그래서 우리는 Future라는 개념이 있다.

 

Future는 일단 실행해놓고, 결과는 나중에 다 되면 확인할게! 라고 생각하며

다음 줄의 코드들이 실행된다.

실행해야할 코드들이 다 실행된 뒤,

결과값을 확인한다. 만약 완료가 되었으면 실행되고, 그렇지 않으면 대기하다가 완료가 되면 알아서 실행하게 된다.

 

'알아서 실행된다'는데 무엇이 실행되는것인가? then에 들어가는 부분을 의미한다.

Future 오브젝트는 기본적으로 생성될 때 메소드를 입력 받는다. 그리고 그 메소드의 결과값이 then의 result값이 된다.

 

아래 코드를 살펴보자

1. future 객체를 만들었고, future객체는 메소드를 인자로 받는다. 이 메소드는 미래에 값을 도출할 것이라는 의미이다.

 

2. 실행 순서를 보면 print사이에 futureObj를 실행시킨 것이 보인다. 그리고 then을 설정한 것이 보인다.

 

3. 결과 값을 보라, print값들이 다 완료 된 후에 futureObj의 then이 실행된 것이 보인다.

 - Future의 then코드는 나머지 코드들이 다 실행된 뒤에 완료여부를 체크하기 시작한다.

 

But, 보통 Future 객체를 따로 만드는 경우는 많지 않다. 보통 미리 만들어진 future메소드를 많이 사용한다. 

 

4. 재밌는 점은 Future가 실제로 아무런 return 값이 없더라도, 그것을 알아도 우리는 then 메소드에 인자값을 넣어두어야 한다. 위의 식에서 result가 들어간 인자부분에서 아무것도 안들어가면 무조건 에러가 뜬다.

 

5. then메소드는 future메소드이다. 따라서, then메소드 뒤에 또 then을 달고 그 뒤에 또 then을 달 수 있다.

 

 

6. future뒤에는 then만 붙는게 아니다. catchError라는 메소드도 있는데, 이것은 에러가 발생하면 잡히게 된다.

근데 이 catchError는 바로 앞의 메소드를 의미하는건지, 맨 처음의 future를 의미하는건지 정확히 파악은 되지 않았다.

더 공부해보아야하겠다.

 

> catchError는 앞에 있는 모든 메소드들을 대상으로 한다.(원래 메소드 + then 메소드 전부 다 포함)

> 만약 3개 연속 then이 있고 마지막에 catch가 있다고 해보자,  첫번째 then에서 에러가 뜨면 2,3번째 then은 생략되고 바로 catch가 실행된다.

 

> 또한 catchError 역시 future이기 때문에 뒤에 then을 넣을 수 있는데, catchError 후의 처리를 도울 수 있다.

특히 catchError 에서 dialog를 통해 알리면 그의 응답에 따라 then으로 처리를 많이 한다.

 

> 또한 catchError에서 그냥 에러를 throw해서 필요한 곳까지 올리는 것도 가능하다.

실제로 처리가 필요한 곳까지 올리기 위해 throw도 많이 사용한다.

 

예시를 확인해보자

addproduct라는 메소드이다. 여기서 firebase와 통신을 하는데, 여기서 에러가 걸릴 수 있다.

우리는 에러 처리를 좀 더 높은 곳, 호출한 곳에서 하기 위해서 throw error로 에러처리를 마무리했다.

addproduct를 호출한 곳에서 catcherror을 하고 있다. 여기서는 dialoge를 보여주며 에러를 핸들링하고 있으며

그 catcherror뒤에 then을 넣고 거기에선 기존 화면을 pop하는 후처리까지 하고 있다.

 

 

 

async await에 대해서 알아보자

then 대신 async await을 쓸 수도 있다.

약간 다르다. 메소드와 인수사이에 async키워드를 입력하면

 

await을 쓸 수 있다.

await은 future를 return하는 메소드 앞에 쓸 수 있는데, 그 메소드를 실행하고 넘어가는게 아니라

결과가 나올 때까지 해당 메소드는 기다려준다.

 

위에서는 then & catcherror 조합을 사용했는데

 

await을 쓰기 위해선

Try-catch를 함게 써주어야 한다.

 

반응형
Comments