Supabase를 사용하여 관계형 데이터를 조회할 때 종종 중첩된 데이터 구조를 마주하게 됩니다.
이런 데이터를 React 컴포넌트에서 효과적으로 처리하는 방법을 알아보겠습니다.
Supabase 조인 쿼리의 응답 구조
Supabase에서 외래 키 관계가 있는 테이블을 조인하여 조회할 때(예: `select("cases(*)")`), 응답 데이터는 다음과 같은 중첩 구조로 반환됩니다
[
{ cases: { id: 1, title: "사례 1", ... } },
{ cases: { id: 2, title: "사례 2", ... } },
...
]
이 데이터를 단순히 `map`으로 변환하면:
const formattedData = response.data?.map((item) => item.cases);
// 결과:
[
{ id: 1, title: "사례 1", ... },
{ id: 2, title: "사례 2", ... },
...
]
중첩 배열 문제
그러나 실제로는 Supabase가 때로 중첩 배열 형태로 데이터를 반환할 수 있습니다:
[
[{ id: 1, title: "사례 1", ... }],
[{ id: 2, title: "사례 2", ... }],
...
]
이런 경우 TypeScript에서 타입 오류가 발생합니다:
Argument of type 'any[][]' is not assignable to parameter of type 'SetStateAction<Case[]>'.
Array.flat() 메서드로 해결하기
`Array.prototype.flat()` 메서드는 중첩된 배열 구조를 평탄화하는 기능을 제공합니다:
const bookmarksData = await getUserBookmarks();
if (bookmarksData) {
setBookmarks(bookmarksData.flat());
}
이렇게 하면 중첩 배열이 평탄화되어 다음과 같은 구조가 됩니다:
[
{ id: 1, title: "사례 1", ... },
{ id: 2, title: "사례 2", ... },
...
]
flat() 메서드의 활용
`flat()` 메서드는 다음과 같은 특징이 있습니다:
1. **깊이 지정**: `flat(깊이)` 형태로 평탄화할 깊이를 지정할 수 있습니다. 기본값은 1입니다.
2. **무한 깊이**: `flat(Infinity)`로 모든 중첩 수준을 평탄화할 수 있습니다.
3. **빈 요소 제거**: 평탄화 과정에서 빈 슬롯을 자동으로 제거합니다.
실제 코드 예시
// 북마크 데이터 가져오기
export async function getUserBookmarks() {
const userResponse = await supabase.auth.getUser();
const response = await supabase
.from("bookmarks")
.select("cases(*)")
.eq("user_id", userResponse.data.user?.id);
if (response.error) {
return response;
} else {
// 북마크 데이터 형식 변환
const formattedData = response.data?.map((item) => item.cases);
return { data: formattedData, error: response.error };
}
}
// 컴포넌트에서 사용
const fetchUserData = async () => {
try {
// 북마크 가져오기
const { data: bookmarksData } = await getUserBookmarks();
if (bookmarksData) {
// flat()으로 중첩 배열 평탄화
setBookmarks(bookmarksData.flat());
}
} catch (error) {
console.error("데이터 로딩 중 오류:", error);
}
};
이렇게 `flat()` 메서드를 활용하면 Supabase의 중첩된 응답 데이터를 효과적으로 처리하여 React 컴포넌트에서 사용할 수 있습니다.
'백엔드 > Supabase' 카테고리의 다른 글
[Supabase] 프로젝트 생성 방법 (0) | 2025.04.03 |
---|---|
[Supabase + Next.js] DB에 저장된 문자열 데이터를 불러올 때 \n 줄바꿈 문제와 해결 방법 (0) | 2025.03.29 |
[Supabase] Next_Start_Template 사용을 위한 Supabase 프로젝트 세팅 방법 (0) | 2025.03.14 |
Supabase bulk insert 1회 최대 삽입 행 개수 | 400 에러 (0) | 2025.03.04 |
[GPT Q&A] supabase를 사용하면 next15 백엔드를 구축하지 않아도 될까? (0) | 2025.03.03 |