본문 바로가기
  • 아하하
개발/Java

Spring MultipartFile → File → JAXB VO 파싱 완벽 가이드

by 쥬쥬파파 2025. 5. 13.

 

📁 Spring에서 대용량 XML 파일 처리하기

MultipartFile → File 변환 + JAXB 파싱 (Namespace 문제 해결 포함)

1. MultipartFile → File 변환 (스트림 방식)

// 대용량 파일 처리에 최적화
public File convertToFile(MultipartFile multipartFile) throws IOException {
    File tempFile = File.createTempFile("upload_", ".xml");
    try (InputStream is = multipartFile.getInputStream();
         FileOutputStream fos = new FileOutputStream(tempFile)) {
        
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = is.read(buffer)) != -1) {
            fos.write(buffer, 0, bytesRead);
        }
    }
    return tempFile;
}

2. JAXB를 이용한 XML → VO 파싱

⚠️ 핵심: Namespace 설정

XML 구조 VO 클래스 설정
<TaxInvoice xmlns="urn:kr:or:kec:...">
  <ExchangedDocument>...</ExchangedDocument>
</TaxInvoice>
// package-info.java
@XmlSchema(
    namespace = "urn:kr:or:kec:...",
    elementFormDefault = XmlNsForm.QUALIFIED
)
package com.example.vo;

파싱 코드 예시

public TaxInvoiceVo parseXml(File xmlFile) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(TaxInvoiceVo.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    return (TaxInvoiceVo) unmarshaller.unmarshal(xmlFile);
}

3. 전체 처리 흐름

  1. MultipartFile 수신
  2. 임시 File 생성 (스트림 방식)
  3. JAXB로 XML 파싱
  4. 임시 파일 삭제

4. 필수 의존성 (build.gradle)

implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0'
implementation 'com.sun.xml.bind:jaxb-impl:4.0.0'

🚨 주의사항

  • XML 네임스페이스와 VO 설정 반드시 일치시킬 것
  • 대용량 파일은 transferTo() 대신 스트림 방식 사용
  • 파일 사용 후 반드시 삭제 처리 권장

#Spring #JAXB #XML파싱 #대용량파일 #Namespace #[Spring/JAXB] XML 파싱 시 Namespace 충돌 문제 1분 해결

반응형