Data
@Getter @Setter public class Data { private String date; private String id; private String report; private Double sum; private Double avg; }
PivotData
@ToString @Getter @Setter @JsonNaming(value = PropertyNamingStrategies.UpperSnakeCaseStrategy.class) @SuppressWarnings({"squid:S116"}) public class PivotData { @JsonProperty("date") private String date; @JsonProperty("id") private String id; private Double POWER; private Double ENERGY; private Double TEMP; private Double HERTZ; }
PivotDataConverter
@UtilityClass public class PivotDataConverter { private static final ObjectMapper MAPPER = new ObjectMapper(); private static final Map<String, String> AVG_REPORTS = Set.of("POWER", "TEMP", "HERTZ").stream() .collect(Collectors.toUnmodifiableMap(s -> s, s -> s)); public static List<PivotData> from(List<Data> list) { return MAPPER.convertValue(list.stream() .collect(Collectors.groupingByConcurrent(data -> Pair.of(data.getDate(), data.getId()))) .entrySet() .parallelStream() .map(entry -> { Map<String, Object> row = entry.getValue() .stream() .collect(Collectors.toMap(Data::getReport, data -> AVG_REPORTS.containsKey(data.getReport()) ? data.getAvg() : data.getSum())); row.put("date", entry.getKey().getLeft()); row.put("id", entry.getKey().getRight()); return row; }).toList(), new TypeReference<>() { }); } }

λ‚ μ§œμ™€ 리포트 ν•­λͺ©μœΌλ‘œ 이루어진 μ‹œκ³„μ—΄ λ°μ΄ν„°μ˜ 톡계 정보λ₯Ό λ‚ μ§œμ™€ 리포트 ν•­λͺ©λ³„ κ°’ ν˜•νƒœλ‘œ μ΄λ£¨μ–΄μ§€λŠ” 피봇 ν…Œμ΄λΈ” 리슀트둜 λ°”κΏ”λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ‚ μ§œλ₯Ό ν¬ν•¨ν•œ ν•˜λ‚˜ μ΄μƒμ˜ ν•„λ“œλ‘œ κ·Έλ£Ήν•‘ λ˜λ©΄μ„œ 리포트 ν•­λͺ©μ— 따라 합계 λ˜λŠ” 평균값을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. Collectors.groupingBy λ₯Ό μ‚¬μš©ν•΄μ„œ 데이터 리슀트λ₯Ό λ‚ μ§œ κΈ°μ€€μœΌλ‘œ κ·Έλ£Ήν•‘ν•˜κ³  각 리포트 ν•­λͺ©μ„ ν•˜λ‚˜μ˜ Map 으둜 μƒμ„±ν•˜κ³ λ‚˜μ„œ ObjectMapperλ₯Ό μ‚¬μš©ν•΄ ν”Όλ΄‡λœ ν˜•νƒœμ˜ 클래슀λ₯Ό 가진 리슀트둜 λ³€ν™˜ν–ˆμŠ΅λ‹ˆλ‹€. μœ„ μ˜ˆμ‹œμ—μ„œ μ „λ ₯λŸ‰μ— λŒ€ν•΄μ„œλ§Œ 합계λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” λŒ€λΆ€λΆ„μ˜ 리포트 ν•­λͺ©μ— λŒ€ν•΄ 합계값을 μ‚¬μš©ν•˜κ²Œ λ˜λ―€λ‘œ 평균값을 μ‚¬μš©ν•΄μ•Όν•˜λŠ” 리포트 ν•­λͺ©λ§Œμ„ λ³„λ„λ‘œ κ΄€λ¦¬ν•˜λ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.