1 분 소요

 인프런 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술편을 학습하고 정리한 내용 입니다.

파일 업로드 소개

일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 다음 두 가지 방식의 차이를 이해해야 한다.

HTML 폼 전송 방식

  • application/x-www-form-urlencoded
  • multipart/form-data

application/x-www-form-urlencoded 방식은 HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법.

Form 태그에 별도의 encType옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 헤더에 다음 내용을 추가한다.

Content-Type: application/x-www-form-urlencoded

그리고 폼에 입력한 전송할 항목을 HTTP Body에 문자로 username=kim&age=20과 같이 &로 구분해서 전송한다.

파일을 업로드 하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야 한다.

문자를 전송하는 이 방식으로 파일을 전송하기는 어렵다. 또 폼을 전송할 때 파일만 전송하는 것이 아니기 때문에 문제가 있다.

다음 예를 보자.

1
2
3
- 이름 
- 나이 
- 첨부파일

여기에서 이름과 나이도 전송해야 하고, 첨부파일도 함께 전송해야 한다.

문제는 이름과 나이는 문자로 전송하고, 첨부파일은 바이너리로 전송해야 한다는 것이다.

여기서 문제가 발생한다. 문자와 바이너리르 동시에 전송해야 하는 상황이다.

이 문제를 해결하기 위해 HTTP는 multipart/form-data라는 방식을 제공한다.

이 방식을 사용하려면 Form 태그에 별도의 enctype="multipart/form-data"를 지정해야 한다.

multipart/form-data방식은 다른 종류의 여러 파일과 폼의 내용을 함께 전달할 수 있다.

폼의 입력 결과로 생성된 HTTP 메시지를 보면 각각의 전송 항목이 구분 되어 있다.

Content-Disposition이라는 항목 별 헤더가 추가되어 있고 여기에 부가 정보가 있다.

사진에서는 username, age, file1이 구분되어 있고, 폼의 일반 데이터는 각 항목 별로 문자가 전송되고,

파일의 경우 파일 이름과 Content-Type이 추가되고 바이너리 데이터가 전송된다.

multipart/form-data는 이렇게 각각의 항목을 구분해서, 한번에 전송하는 것이다.

프로젝트 생성

스프링 부트 스타터 에서 스프링 프로젝트 생성

  • 프로젝트 선택
    • Project : Gradle Project
    • Language : Java
    • Spring Boot : 3.3.1
  • Project Metadata
    • Group : hello
    • Artifact : upload
    • Name : upload
    • Package name : hello.upload
    • Packaging: Jar
    • Java : 21
  • Dependencies : Spring Web, Lombok, Thymeleaf

이 두 개 언어가 Java 21인지 확인하고 gradle 돌리면 된다.

세팅이 다 됐다.

이제 간단하게 index.html하나만 추가해 놓자.

resources/static/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="UTF-8">  
    <title>Title</title>  
</head>  
<body>  
<ul>  
    <li>상품 관리  
        <ul>  
            <li><a href="/servlet/v1/upload">서블릿 파일 업로드1</a></li>  
            <li><a href="/servlet/v2/upload">서블릿 파일 업로드2</a></li>  
            <li><a href="/spring/upload">스프링 파일 업로드</a></li>  
            <li><a href="/items/new">상품 - 파일, 이미지 업로드</a></li>  
        </ul>  
    </li>  
</ul>  
</body>  
</html>

초기 세팅은 끝났다.

댓글남기기