diff --git a/src/main/java/com/sb/web/account/controller/OcrController.java b/src/main/java/com/sb/web/account/controller/OcrController.java index 8ba9642..a093b68 100644 --- a/src/main/java/com/sb/web/account/controller/OcrController.java +++ b/src/main/java/com/sb/web/account/controller/OcrController.java @@ -17,6 +17,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -44,18 +45,33 @@ public class OcrController { return Map.of("text", text); } - /** 영수증 이미지 → AI 구조화. AI 미설정/실패/미인식이면 recognized=false 로 반환(프론트가 /receipt 폴백). */ + /** + * 영수증 이미지 → AI 구조화. AI 미설정/실패/미인식이면 recognized=false 로 반환(프론트가 /receipt 폴백). + * 분류·계좌 후보는 멀티파트 파트 수 제한(Tomcat 기본 10개)을 피하려 '줄바꿈'으로 합친 단일 필드로 받는다. + */ @PostMapping("/receipt-ai") public ParsedEntryResponse receiptAi( @RequestParam("image") MultipartFile image, - @RequestParam(value = "categoryHints", required = false) List categoryHints, - @RequestParam(value = "walletHints", required = false) List walletHints, + @RequestParam(value = "categoryHints", required = false) String categoryHints, + @RequestParam(value = "walletHints", required = false) String walletHints, @RequestAttribute(AuthInterceptor.CURRENT_MEMBER) SessionUser current) throws IOException { if (image == null || image.isEmpty()) { throw new ApiException(HttpStatus.BAD_REQUEST, "영수증 이미지를 첨부하세요."); } return aiEntryParser - .parseReceipt(image.getBytes(), image.getContentType(), LocalDate.now(), categoryHints, walletHints) + .parseReceipt(image.getBytes(), image.getContentType(), LocalDate.now(), + splitLines(categoryHints), splitLines(walletHints)) .orElseGet(() -> ParsedEntryResponse.builder().recognized(false).build()); } + + /** 줄바꿈으로 합쳐 온 후보 문자열 → 리스트(공백 항목 제거). null/빈 값이면 빈 리스트. */ + private static List splitLines(String joined) { + if (joined == null || joined.isBlank()) return List.of(); + List out = new ArrayList<>(); + for (String s : joined.split("\n")) { + String t = s.trim(); + if (!t.isEmpty()) out.add(t); + } + return out; + } }