나만의 개발노트

[Flutter] API, HTTP, Future, async/await 본문

[Flutter]/[Flutter]

[Flutter] API, HTTP, Future, async/await

노트포미 2024. 7. 25. 02:48

[API]

: Application Programming Interface - 소프트웨어 응용 프로그램들이 서로 상호작용할 수 있게 해주는 인터페이스

 

<API의 주요 기능>

1. 데이터 교환 : 두 시스템 간에 데이터 주고 받기

   ex) 날씨 앱 - 날씨 데이터를 제공하는 서버로부터 데이터를 가져오는 경우

 

2. 기능 호출 : 다른 시스템의 기능을 호출

   ex) 결제시스템 API를 사용하여 결제 처리

 

3. 추상화 : 복잡한 구현 세부 사항을 숨기고, 단순화된 인터페이스를 제공

 

<API의 종류>

1. REST API :

HTTP를 기반으로 하는 API, 자원을 URL로 표현하고, HTTP 메서드(GET, POST, PUT, DELETE)를 사용하여 자원에 대한 작업을 수행 * REST API는 주로 JSON 형식으로 데이터 주고 받음

2. SOAP API:

XML을 기반으로 메시지를 교환하는 프로토콜로, 웹 서비스 간의 통신에 사용. REST에 비해 더 복잡하지만, 강력한 보안 및 트랜잭션 관리를 제공

3. GraphQL: 클라이언트가 필요한 데이터를 정확하게 요청할 수 있는 쿼리 언어로, 복잡한 데이터 요청을 최적화하고 여러 리소스를 한 번에 가져올 수 있음

 

<http 다운 방법>

https://pub.dev/packages/http/install

 

<REST API 사용코드>

import 'package:http/http.dart' as http;

class ApiService {
  	final String baseUrl = 'https://webtoon-crawler.nomadcoders.workers.dev';
	final url = Uri.parse('$baseUrl/$today');
    var response = await http.get(url);
    if (response.statusCode == 200) {
      //불러오기 성공 시
    } else {
      throw Error();
    }
  }
}

 


[ 동기(synchronous) / 비동기(asynchronous) 작업]

- 동기 작업 : 작업이 순차적으로 실행되는 방식 -> 하나의 작업이 끝날 때까지 다음 작업이 시작되지 않는다

- 비동기 작업 : 작업이 시작된 후 바로 다음 작업을 시작할 수 있게 한다. -> 비동기 작업의 결과는 나중에 처리된다.

따라서 비동기 작업은 주로 파일 읽기/쓰기, 네트워크 요청, 데이터베이스 쿼리 등 시간이 오래 걸리는 작업에 사용된다


[Future 타입]

: 현재는 값을 가지고 있지 않지만, 미래에 완료될 작업의 결과를 나타냅니다. 

  • 비동기 작업을 표현하기 위해 사용되는 클래스 
import 'dart:async';

void main() {
  print('작업 시작');
  
  // 2초 후에 완료되는 Future
  Future.delayed(Duration(seconds: 2), () {
    return '작업 완료';
  }).then((result) {
    print(result);
  });
  
  print('다른 작업 수행 중');
}

//output : 작업시작 / 다른 작업 수행 중 / 작업 완료

 

  • then, async/await 키워드를 사용하여 더 직관적으로 코드 작성 가능

<then 사용 코드>

: Future가 완료되었을 때 호출되는 콜백 함수 -> Future의 결과값을 인수로 받는다

fetchData().then((data) {
  print(data); // 'Hello, World!' 출력
}).catchError((error) {
  print(error);
}).whenComplete(() {
  print('완료됨');
});

 


 

[async/await 키워드]

- async : 함수나 메서드가 비동기 작업을 수행할 것임을 나타냄 (= async 키워드가 붙은 함수는 항상 Future을 반환함)

- await : Future의 완료를 기다린 후, 완료된 Future의 결과를 반환 (await는 반드시 async 함수 내에서만 사용 가능)

Future<String> someAsyncFunction() async {
  return Future.delayed(Duration(seconds: 2), () => 'Hello, World!');
}

Future<void> fetchData() async {
  // await 키워드를 사용하여 Future의 완료를 기다림
  String data = await someAsyncFunction();
  print(data); // 'Hello, World!' 출력
}