📌 개요
Flutter에서 Firebase Realtime Database를 사용할 때, 빈 리스트([])를 저장하는 것과 필드를 아예 저장하지 않는 것의 차이를 경험한 적 있나요?
같은 데이터를 저장하는데도 teams 필드가 배열처럼 저장되거나, 원하는 형태의 Map이 유지되지 않는 경우가 있습니다.
이 문제는 Firebase의 데이터 구조와 Flutter의 toJson() 변환 방식 차이에서 발생합니다.
이번 글에서는 Firebase Realtime Database에서 빈 리스트([])와 Map을 저장하는 방식의 차이점과 해결 방법을 설명하겠습니다.
🔥 Firebase에서 빈 리스트([])와 Map의 차이점
✅ 1. teams 필드를 []로 직접 초기화한 경우 (teams: [])
class Player {
List<Team> teams = []; // 명시적으로 빈 리스트로 초기화
}
이렇게 하면 toJson() 변환 시 다음과 같이 저장됩니다.
"teams": []
📌 이때, Firebase는 teams를 배열(List)로 인식하는 경향이 있습니다.
즉, 이후 set()이나 update()를 통해 teams 필드에 데이터를 추가하면, Firebase가 이를 배열로 간주하여 자동으로 숫자 키(0, 1, 2...)를 부여할 수 있습니다.
❌ 문제 발생 예시 (teams가 배열로 저장된 경우)
"teams": {
"0": {
"id": "1738824785279",
"name": "Google",
"joinedAt": 1738824785279
},
"1": {
"id": "1738824785280",
"name": "Amazon",
"joinedAt": 1738824785280
}
}
🔥 Firebase가 teams를 리스트로 인식하여 자동으로 숫자 인덱스(0, 1, 2...)를 추가했습니다.
이렇게 되면 이후 데이터를 추가할 때도 리스트로 계속 동작하며, teamId를 키로 사용하는 Map 형태로 저장하기 어려워집니다.
✅ 2. teams 필드를 null로 두고 내부에서 초기화한 경우
class Player {
List<Team>? teams; // null 허용
Player({this.teams}) {
this.teams ??= []; // 내부에서만 초기화
}
}
➡ teams가 null인 경우, JSON 변환 시 teams 필드 자체가 저장되지 않습니다.
{}
이제 이후 set()을 통해 데이터를 추가하면, Firebase는 teams 필드를 새로운 Map 필드로 해석하여 저장합니다.
✅ 올바른 결과 (teams가 Map으로 저장된 경우)
"teams": {
"1738824785279": {
"id": "1738824785279",
"name": "Google",
"joinedAt": 1738824785279
},
"1738824785280": {
"id": "1738824785280",
"name": "Amazon",
"joinedAt": 1738824785280
}
}
📌 이제 teams 필드가 Map 형태로 유지되며, teamId를 키로 사용할 수 있습니다!
🛠 해결 방법
✅ teams 필드를 명시적으로 null로 두기
빈 리스트로 초기화하지 않고 null로 두고, 내부에서만 초기화하는 방식이 Firebase에서 Map을 유지하는 가장 간단한 방법입니다.
class Player {
List<Team>? teams; // null 허용
Player({
this.teams, // 초기화하지 않음
}) {
this.teams ??= []; // 내부에서만 초기화
}
}
✅ toJson()에서 빈 리스트를 저장하지 않도록 변경
Firebase에서 teams: []가 저장되지 않도록 toJson()을 수정합니다.
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
if (teams != null && teams!.isNotEmpty) // 🚨 빈 리스트 저장 방지
'teams': teams!.map((team) => team.toJson()).toList(),
};
}
🎯 결론
✅ 빈 리스트([])를 저장하면, Firebase는 이를 배열로 인식하여 숫자 키(0, 1, 2...)를 자동으로 부여할 수 있음.
✅ 필드를 아예 저장하지 않으면, Firebase는 이후 데이터를 Map으로 저장함.
✅ teams를 null로 설정하고, toJson()에서 빈 리스트를 제외하는 방식으로 해결 가능.
📌 Flutter 앱에서 Firebase Realtime Database를 사용할 때, 데이터를 Map으로 유지하려면 빈 리스트를 저장하지 않는 것이 중요합니다!