데이터 통신 기초와 JSON

Eungae's avatar
Jan 05, 2026
데이터 통신 기초와 JSON

1. 데이터 통신이란 무엇인가

앱과 서버의 관계는 아주 단순하게 말하면 이렇다.
“한쪽이 요청(request)을 보내고,
다른 쪽이 응답(response)을 돌려준다.”
이때 오가는 것은 화면도, 객체도, 위젯도 아니다.
오직 데이터다.
Flutter App ── 요청 ──▶ Server Flutter App ◀─ 응답 ── Server
이 데이터는 반드시 서로 합의된 형식으로 주고받아야 한다.
그 형식 중 현재 가장 널리 쓰이는 것이 JSON이다.

2. JSON은 무엇인가 (그리고 무엇이 아닌가)

JSON은 JavaScript Object Notation의 약자다.
이름 때문에 오해를 많이 낳지만, 중요한 사실은 이거다.
JSON은 언어가 아니다.
JSON은 데이터 표현 규칙이다.

JSON의 핵심 규칙

  • 키-값 쌍 구조
  • 문자열, 숫자, 불리언, null
  • 배열(Array), 객체(Object)
  • 함수, 메서드, 타입 정보는 없음
예시를 보자.
{ "id":3, "title":"PinPlace", "isPublic":true, "tags":["travel","map"] }
이건 객체처럼 보이지만, 객체가 아니다.
  • 메서드 없음
  • 타입 선언 없음
  • 행동 없음
  • 상태만 있음
JSON은 순수한 데이터 덩어리다.

3. Dart에서 JSON을 다룰 때 벌어지는 일

여기서 많은 초보자가 헷갈리는 지점이 나온다.
final data = jsonDecode(response.body);
이 순간 무슨 일이 일어날까?

단계별로 분해해보자

  1. response.body
      • 타입: String
      • 내용: JSON 규칙을 따르는 텍스트
  1. jsonDecode()
      • 역할: 문자열을 Dart 객체로 변환
      • 결과 타입:
        • Map<String, dynamic> 또는
        • List<dynamic>
즉,
// JSON 문자열 String jsonText = '{"id":1,"name":"은우"}'; // Dart 객체 Map<String, dynamic> map = jsonDecode(jsonText);
여기서 아주 중요한 포인트:
Dart는 JSON을 Map과 List로만 표현한다.

4. 왜 바로 클래스로 안 쓰는가?

이 질문을 한 번쯤 하게 된다.
“어차피 Place 클래스 쓸 건데
JSON을 바로 Place로 받으면 안 돼?”
안 된다. 이유는 구조 때문이다.

JSON의 한계

JSON에는:
  • 타입 정보 없음
  • 생성자 없음
  • 클래스 개념 없음
그래서 Dart는 이렇게 단계적으로 처리한다.
JSON StringMap<String, dynamic> ↓ 내가 정의한 Class
코드로 보면 이렇다.
class Place { final int id; final String name; Place({ required this.id, required this.name, }); factory Place.fromJson(Map<String, dynamic> json) { return Place( id: json['id'], name: json['name'], ); } }
여기서 fromJsonJSON이 아니라 Map을 받는다.
JSON → Map 변환은
언어 런타임의 일이고,
Map → Class 변환은
개발자의 책임이다.

5. Flutter 앱 구조에서 JSON의 위치

플러터 앱에서 데이터 흐름을 구조적으로 보면 보통 이렇다.
notion image
notion image
notion image
[HTTP 요청][JSON 문자열][Map / List][Model Class][UI(State, Widget)]
이 중 JSON은 아주 초반에 잠깐 등장한다.
  • UI는 JSON을 몰라야 한다
  • 위젯은 Map을 몰라야 한다
  • 오직 Model만 JSON 구조를 안다
이 경계를 지키지 않으면:
  • 위젯에서 json['title']가 튀어나오고
  • 나중에 API 구조가 바뀌면
  • 앱 전체가 같이 깨진다

6. 초보자가 가장 많이 하는 오해 3가지

오해 1. JSON = 객체

아니다.
JSON은 객체처럼 생긴 문자열이다.

오해 2. jsonDecode 하면 타입이 생긴다

아니다.
타입은 dynamic이다.
그래서 항상 불안정하다.

오해 3. Model 클래스는 귀찮은 중간 단계다

아니다.
Model은 앱의 데이터 계약서다.
  • 서버 변경을 흡수하고
  • UI를 보호하고
  • 구조를 고정시킨다

7. 이걸 이해하면 뭐가 달라지나

이 지점이 중요하다.
이 구조를 이해하면:
  • API 문서를 볼 때
    • “아, 이건 Map 구조구나”
  • 에러가 날 때
    • “JSON 문제인지, 파싱 문제인지” 구분 가능
  • 상태관리 배울 때
    • 데이터 흐름이 선명해짐
  • 코드 생성 툴(json_serializable 등)을 써도
    • 왜 필요한지 이해한 상태로 쓰게 된다

마무리

Flutter에서 데이터 통신은
http, dio, future, provider 같은 도구의 문제가 아니다.
핵심은 이거다.
우리는
문자열(JSON)을 받아서 구조(Map)로 바꾸고 의미(Class)를 부여한 뒤 화면으로 표현한다.
Share article

나새끼메이커