다차원 데이터의 표현 및 접근 방식
기본적인 Table은 행과 열의 교차점에 데이터를 저장하는 이차원 구조로, 일반적인 표 형식의 정보 처리에 적합합니다. 그러나 실제 비즈니스 시나리오에서는 시간, 지역, 제품군 등의 여러 기준으로 데이터를 그룹화하고 검색해야 하는 경우가 많습니다. 이러한 요구를 충족하기 위해 Guava Table을 기반으로 하여 다차원 데이터 구조를 모델링할 수 있습니다.
1. 중첩된 테이블로 3차원 이상 구조 구현
Table의 각 셀에 또 다른 Table을 넣는 방식으로, 3차원 이상의 데이터 계층을 구축할 수 있습니다. 예를 들어, 날짜-지역-지표라는 세 가지 축을 가진 분석 데이터를 저장하려면 다음과 같이 구성할 수 있습니다.
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.util.Map;
public class MultiDimensionalDataExample {
public void buildThreeDimensionalTable() {
// 3차원 구조: 날짜 → 지도 → 지표
Table<String, String, Table<String, Integer>> dataStore = HashBasedTable.create();
// 북부 지역의 지표 데이터 생성
Table<String, Integer> northMetrics = HashBasedTable.create();
northMetrics.put("매출", 1200);
northMetrics.put("이익", 300);
// 남부 지역의 지표 데이터 생성
Table<String, Integer> southMetrics = HashBasedTable.create();
southMetrics.put("매출", 1500);
southMetrics.put("이익", 400);
// 데이터 삽입
dataStore.put("2024-12-01", "북부", northMetrics);
dataStore.put("2024-12-01", "남부", southMetrics);
// 특정 조건 조회
Table<String, Integer> northData = dataStore.get("2024-12-01", "북부");
Integer sales = northData.get("매출");
System.out.println("2024-12-01 북부 매출: " + sales); // 출력: 1200
}
}
2. 다차원 데이터 탐색 및 반복 처리
중첩 구조를 사용하면, 모든 차원을 순회하며 데이터를 검색하거나 집계할 수 있습니다. rowKeySet()와 columnKeySet()를 활용해 외부 레벨부터 내부 레벨까지 깊이 탐색이 가능합니다.
public void traverseAllDimensions() {
Table<String, String, Table<String, Integer>> store = HashBasedTable.create();
// 데이터 채우기 (예시)
Table<String, Integer> regionA = HashBasedTable.create();
regionA.put("매출", 800);
regionA.put("이익", 200);
store.put("2024-12-01", "지역A", regionA);
// 전체 탐색
for (String date : store.rowKeySet()) {
System.out.println("날짜: " + date);
for (String region : store.columnKeySet()) {
Table<String, Integer> metrics = store.get(date, region);
if (metrics != null) {
for (Map.Entry<String, Integer> entry : metrics.entrySet()) {
System.out.printf("%s: %d%n", entry.getKey(), entry.getValue());
}
}
}
}
}
3. Map과 결합하여 고차원 구조 확장
4차원 이상의 데이터를 관리해야 한다면, Map을 사용해 중첩 구조를 더 깊게 만들 수 있습니다. 예를 들어 연도별 월별 지역별 지표 데이터를 저장하려면, 맵의 값으로 Table을 두고 계층적으로 접근할 수 있습니다.
import java.util.HashMap;
import java.util.Map;
public class HighDimensionalStorage {
public void createFourDimensionalStructure() {
// 4차원: 연도 → 월 → 지역 → 지표
Map<String, Table<String, String, Table<String, Integer>>> yearContainer = new HashMap<>();
// 특정 월의 지역 데이터 생성
Table<String, Integer> regionData = HashBasedTable.create();
regionData.put("매출", 1800);
regionData.put("이익", 450);
// 월별 테이블 생성 및 연도에 저장
Table<String, String, Table<String, Integer>> monthlyTable = HashBasedTable.create();
monthlyTable.put("2024", "1월", regionData);
yearContainer.put("2024", monthlyTable);
// 데이터 조회
Table<String, String, Table<String, Integer>> yearlyData = yearContainer.get("2024");
Table<String, Integer> januaryData = yearlyData.get("2024", "1월");
Integer profit = januaryData.get("이익");
System.out.println("2024년 1월 이익: " + profit); // 출력: 450
}
}
결론
Guava Table은 기본적으로 이차원 구조지만, 중첩된 Table, Map, 그리고 컬렉션의 유연한 조합을 통해 다차원 데이터 모델을 효과적으로 구현할 수 있습니다. 이 접근법은 시간 시리즈 분석, 지역 기반 리포트, 복잡한 지표 계층 구조 등 다양한 분야에서 활용 가능하며, 코드의 명확성과 유지보수성을 높이는 데 기여합니다.