Multipart 오류

Kim jisu·2025년 7월 28일
0

 Debugging Note

목록 보기
36/37

📌 문제 개요

  • 이슈명: 이미지 업로드 포함 Store 등록 시 multipart 파싱 오류

  • 에러 유형: org.springframework.web.multipart.MultipartException

  • 주요 로그:

    런타임 오류 발생: Failed to parse multipart servlet request
    Securing POST /stores/register
    GlobalExceptionHandler#handleRuntimeException(RuntimeException)
  • 원인 의심 초기 단계: 설정 누락 또는 multipart 처리 미지원


🔍 디버깅 과정

Phase 1. 설정 기반 해결 시도

시도 항목내용결과
Spring 설정 강화application.properties에 multipart 관련 속성 최대한 명시❌ 여전히 서블릿 단계에서 실패
MultipartResolver 명시StandardServletMultipartResolverMultipartConfigElement Bean 등록❌ 효과 없음
필터를 통한 파일 크기 선제 검사multipart 요청 유형 감지 후 직접 필터링❌ 필터 도달 전 오류 발생
MultipartException 전용 핸들러 작성사용자에게 의미 있는 에러 메시지 반환✅ UX 개선, ❌ 근본 해결 아님

Phase 2. 테스트 환경 구성 및 비교

항목결과
MultipartDebugTest 작성 (SpringBootTest 기반 통합 테스트)✅ multipart 업로드 정상 작동
curl로 서버 직접 테스트✅ 정상 동작 확인
H2 DB 및 단일 테스트 환경 구성✅ 모든 테스트 통과

📌 결론: 설정 및 코드 문제가 아니라 환경 또는 흐름에 기인한 문제


Phase 3. 루트 원인 추적

  • 기존 등록 방식:

    1. 사용자가 form에서 store 정보와 이미지를 한 번에 제출
    2. 서버는 이미지 업로드를 처리하려 하지만 store는 아직 생성되지 않은 상태
    3. 업로드 API는 store 존재 여부를 전제로 동작 → NullPointer 또는 Validation 실패
    4. 그 시점에서 multipart 파싱 자체가 실패 → 서블릿 레벨에서 예외 발생

🔎 핵심 원인: "store 생성 전 이미지 업로드 시도"라는 흐름 상의 문제


✅ 최종 해결: 3단계 등록 흐름 도입

1단계: 기본 정보 등록

@PostMapping("/stores/register")
public String registerStore(@ModelAttribute StoreForm form) {
    storeService.registerStore(form, user);
    return "redirect:/stores/setup-images";
}
  • ✅ DB에 Store 먼저 생성
  • ✅ UUID 또는 ID 기반으로 이후 단계에서 식별 가능

2단계: 이미지 업로드 화면 제공

@GetMapping("/stores/setup-images")
public String showUploadPage(...) {
    return "store/setup-images"; // 이미지 전용 폼
}
  • ✅ 등록된 Store를 기반으로 이미지 업로드 가능
  • ✅ 기존 edit API 재사용

3단계: 등록 완료 안내

  • ✅ 이미지 업로드 후 최종 완료 화면 또는 내 가게로 리디렉션
  • ✅ 이미지 없이도 등록 가능 (사용자 선택 제공)

🎯 디버깅 결과 요약

항목내용
❌ 실패한 접근설정 변경, multipartResolver 수동 등록, 필터 적용
✅ 작동한 해결등록 프로세스 구조 재설계
🌟 핵심 통찰문제의 본질은 multipart 설정이 아닌 엔티티 생명주기 순서

📈 개선 효과

  • 🛠 multipart 오류 완전 제거
  • 🔁 기존 edit 이미지 업로드 API 재활용
  • 📦 등록 흐름의 모듈화 및 유지보수성 향상
  • 💡 UX 개선: 단계별 등록 → 더 직관적인 사용자 경험

profile
Dreamer

0개의 댓글