ITN Dev 07-22
fix: SeedParser 숫자 셀 절삭 및 수식 셀 공백 처리 버그 수정
- 연번1 등 NUMERIC 셀을 (long) 캐스팅해 절삭하던 것을 Math.round로 교체.
  부동소수점 오차(예: 6.999999999999998)가 실제 값보다 한 자리 작은
  기관번호("006")로 읽혀 채널명이 잘못 생성되는 문제를 막는다.
- FORMULA 셀은 default 분기로 빠져 항상 빈 문자열로 읽히던 것을 고쳐,
  캐시된 수식 결과 타입(getCachedFormulaResultType)에 따라 STRING/NUMERIC
  처리 로직을 재사용하도록 cellValue(Cell, CellType) 재귀 구조로 정리.
- 두 결함을 각각 재현하는 테스트 추가(부동소수점 절삭, 수식 셀 캐시값 읽기).

Co-Authored-By: Claude Opus 4.8 (1M context) 
@ce307c115a5fcdbc64ac507342ed55ae2bf6ae7d
src/main/java/kr/itn/itnhub/seed/SeedParser.java
--- src/main/java/kr/itn/itnhub/seed/SeedParser.java
+++ src/main/java/kr/itn/itnhub/seed/SeedParser.java
@@ -2,6 +2,7 @@
 
 import kr.itn.itnhub.provision.ChannelNaming;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -108,10 +109,22 @@
         if (cell == null) {
             return "";
         }
-        return switch (cell.getCellType()) {
+        return cellValue(cell, cell.getCellType());
+    }
+
+    /**
+     * cellType으로 셀 값을 문자열로 변환한다. FORMULA는 수식을 평가하지 않고
+     * 파일에 저장된 캐시 결과 타입({@link Cell#getCachedFormulaResultType()})으로 재귀 위임해
+     * STRING/NUMERIC/BOOLEAN 처리 로직을 그대로 재사용한다.
+     */
+    private String cellValue(Cell cell, CellType cellType) {
+        return switch (cellType) {
             case STRING -> cell.getStringCellValue().trim();
-            case NUMERIC -> String.valueOf((long) cell.getNumericCellValue());
+            // 반올림: 부동소수점 오차로 6.999999999999998처럼 저장된 값이 절삭되어
+            // 한 자리 작은 값("006")으로 읽히는 것을 방지한다.
+            case NUMERIC -> String.valueOf(Math.round(cell.getNumericCellValue()));
             case BOOLEAN -> String.valueOf(cell.getBooleanCellValue());
+            case FORMULA -> cellValue(cell, cell.getCachedFormulaResultType());
             default -> "";
         };
     }
src/test/java/kr/itn/itnhub/seed/SeedParserTest.java
--- src/test/java/kr/itn/itnhub/seed/SeedParserTest.java
+++ src/test/java/kr/itn/itnhub/seed/SeedParserTest.java
@@ -149,6 +149,51 @@
     }
 
     @Test
+    void 연번1이_부동소수점_오차로_정수보다_살짝_작아도_반올림한다() throws Exception {
+        try (XSSFWorkbook wb = new XSSFWorkbook();
+             ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+
+            Sheet sheet = wb.createSheet(SeedParser.SHEET_NAME);
+            sheet.createRow(0);
+            sheet.createRow(1);
+            Row row = sheet.createRow(2);
+            // 부동소수점 연산 결과로 흔히 나타나는 오차: 7이 아니라 6.999999999999998로 저장됨
+            row.createCell(1).setCellValue(6.999999999999998);
+            row.createCell(2).setCellValue(0);
+            row.createCell(5).setCellValue("기후에너지환경부");
+            wb.write(out);
+
+            List<SeedRow> rows = parser.parse(new ByteArrayInputStream(out.toByteArray()));
+
+            assertThat(rows.get(0).orgNo()).isEqualTo("007");
+        }
+    }
+
+    @Test
+    void 기관명이_수식_셀이어도_캐시된_문자열_결과를_읽는다() throws Exception {
+        try (XSSFWorkbook wb = new XSSFWorkbook();
+             ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+
+            Sheet sheet = wb.createSheet(SeedParser.SHEET_NAME);
+            sheet.createRow(0);
+            sheet.createRow(1);
+            Row row = sheet.createRow(2);
+            row.createCell(1).setCellValue("001");
+            row.createCell(2).setCellValue("00");
+            Cell orgNameCell = row.createCell(5);
+            orgNameCell.setCellFormula("\"국제방송교류재단\"");
+            // 수식을 평가하지 않고 캐시된 결과 문자열을 직접 심어 둔다(파일에 저장된 캐시값 재현).
+            orgNameCell.setCellValue("국제방송교류재단");
+            wb.write(out);
+
+            List<SeedRow> rows = parser.parse(new ByteArrayInputStream(out.toByteArray()));
+
+            assertThat(rows).hasSize(1);
+            assertThat(rows.get(0).orgName()).isEqualTo("국제방송교류재단");
+        }
+    }
+
+    @Test
     void 시트가_없으면_설명이_있는_예외를_던진다() throws Exception {
         try (XSSFWorkbook wb = new XSSFWorkbook();
              ByteArrayOutputStream out = new ByteArrayOutputStream()) {
Add a comment
List