API
Flutter 앱에서 API 연동 후 배포했을 때 확인할 것
Flutter 앱의 API 문제는 에러 메시지부터 확인해서, 인증 상태와 요청/응답을 체계적으로 검토하면 대부분의 문제를 빠르게 해결할 수 있다.
Flutter 앱에서 API 연동을 한 후 배포했다면, 앱이 서버와 제대로 통신하는지 확인해야 한다. 웹과 달리 앱의 경우 버전 관리와 업데이트가 복잡하기 때문에 더 주의 깊게 확인해야 한다.
앱의 에러 메시지를 먼저 확인한다
앱 사용자들이 보는 에러 메시지나 화면을 정확히 기록한다.
- 네트워크 에러인가
- 인증 관련 에러인가
- 타임아웃인가
- 응답 파싱 에러인가
에러 메시지가 명확하다면 그것이 직접적인 원인을 가리킨다.
인증 상태를 확인한다
Flutter 앱에서 서버로 보내는 인증 토큰이나 세션이 올바른지 확인한다.
// 앱에서 로그 추가
print('Token: $token');
print('Headers: $headers');
토큰이 누락되었거나 만료되었다면 401 Unauthorized 응답이 올 것이다.
API 요청을 curl로 직접 테스트한다
Flutter 앱에서 하는 것과 같은 요청을 curl로 해본다. 서버 쪽에는 문제가 없는데 앱에서만 문제가 난다면, 앱의 요청 형식에 문제가 있을 가능성이 높다.
curl -i -X POST https://example.com/api/endpoint \
-H "Authorization: Bearer $token" \
-H "Content-Type: application/json" \
-d '{"key": "value"}'
응답 body를 확인한다
서버로부터 받는 응답이 앱이 예상하는 형식과 일치하는지 확인한다.
// 앱에서 응답 로깅
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
JSON 구조가 앱의 모델과 맞지 않으면 파싱 에러가 발생한다.
상태 코드를 확인한다
서버의 HTTP 상태 코드를 확인한다.
- 200: 성공
- 400: 요청 형식 에러
- 401: 인증 실패
- 403: 권한 부족
- 500: 서버 에러
상태 코드별로 처리 방식이 달라야 한다.
CORS 설정을 확인한다
Flutter 웹 버전을 사용한다면 CORS 설정도 확인해야 한다.
curl -I -H "Origin: http://localhost:3000" https://example.com/api/endpoint
응답에 Access-Control-Allow-Origin 헤더가 있는지 확인한다.
환경변수와 기본 URL을 확인한다
앱이 사용하는 API 엔드포인트 주소가 배포 환경에 맞게 설정되어 있는지 확인한다.
// 앱의 환경 설정
const String apiUrl = 'https://example.com/api';
로컬에서는 localhost를 사용했는데 배포 후 실제 서버 주소로 바뀌었는지 확인한다.
타임아웃 설정을 확인한다
네트워크가 느린 환경에서 타임아웃이 발생할 수 있다.
http.Client client = http.Client();
client.get(
Uri.parse('https://example.com/api/data'),
headers: headers,
).timeout(Duration(seconds: 30));
타임아웃 시간이 적절한지 확인한다.
앱의 버전과 API 버전을 확인한다
앱이 최신 버전인지, 서버 API가 앱의 버전을 지원하는지 확인한다.
// 앱에서 버전 정보 전송
headers['X-App-Version'] = '1.0.0';
// 서버에서 버전 확인
if (appVersion < '1.0.0') {
return error('앱을 업데이트해주세요');
}
네트워크 디버깅을 활성화한다
Flutter 앱에서 네트워크 요청을 상세히 로깅한다.
http.Request request = http.Request('GET', uri);
request.followRedirects = false;
print('Request: ${request.method} ${request.url}');
print('Headers: ${request.headers}');
http.StreamedResponse response = await request.send();
print('Response status: ${response.statusCode}');
실제 사용자 환경에서 테스트한다
WiFi와 모바일 네트워크 모두에서 테스트해본다. 네트워크 환경에 따라 다르게 동작할 수 있다.
서버 로그를 확인한다
앱이 보낸 요청이 서버에 도달했는지, 어떤 응답을 했는지 서버 로그에서 확인한다.
tail -100 /var/log/app.log | grep -i flutter
발견한 문제와 해결 과정을 기록한다
Flutter 앱의 API 연동 과정에서 발견한 문제들과 해결 방법을 기록해둔다. 다음 배포나 유지보수에서 유용하게 활용할 수 있다.