스프링은 HTML Form을 이용해 서버로 데이터를 전송하게 된다.
HTML Form 전송방식에는 2가지가 있는데, 다음과 같다.
- application/x-www-form-urlencoded
- multipart/form-data
1번은 서버로 데이터를 전송하는 가장 기본적인 방법이다. Form으로 데이터를 전송할 때(post요청) 별도의 enctype 옵션이 없으면 웹 브라우저는 요청 HTTP 메시지의 Header에 [ Content-Type: application/x-www-form-urlencoded ] 를 추가한다. 그 다음, Body에 폼에 입력한 전송 데이터를 문자로 username=kim&age=20 와 같이 &로 구분하여 전송하게 된다.
2번은 파일을 업로드 할 때 사용하는 방식이다. 파일은, 문자가 아니라 "바이너리 데이터"를 전송해야 한다. 또한, 파일을 전송할 때 다른 문자 정보도 같이 전송하는 경우가 많기 때문에, 문자와 바이너리 데이터를 한번에 전송할 수 있는 방식이 필요하다. 그것 multipart/form-data 방식이다.
multipart라는 말 그대로, 데이터를 여러 part로 나눠서 전송하는 방식이다.
각 part는 boundary로 구분되어 있으며, part마다 Content-Disposition 이라는 헤더가 추가된다. 파일의 경우, Content-Type이 추가된다.
실제로 request.getParts()를 출력해보면, 아래와 같이 나온다.
각 part는 boundary (여기서는 ------WebKitFormBoundarykarOaaTmhcFv8KXK) 로 구분되어 있으며, part마다 Content-Disposition 이라는 헤더가 추가된 모습을 확인할 수 있다. 두번째 part는 파일 데이터이므로, Content-Type 헤더가 추가된 것을 볼 수 있다.