[Spring] File Upload 1 - 개념정리 (MultipartResolver)
클라이언트에서 서버로 이미지 파일을 업로드해보면서 공부한
Content-Type, Multipart, Spring파일 업로드 등 내용을 정리한다.
+ SpringBoot를 사용하지는 않았다.
1. Content-Type
HTTP에서 request를 보낼 때
HTTP통신에 필요한 정보(url, Header, Body 등)을 세팅했었다.
//Apache의 HTTPComponent를 이용해 HTTPRequest를 만들어 보내고, Response받아보는 Test
public static void getUserTest_Codehaus() throws Exception{
// HttpClient : Http Protocol 의 client 추상화
HttpClient httpClient = new DefaultHttpClient();
String url= "http://localhost:8080/user/json/getUser/admin";
// HttpGet : Http Protocol 의 GET 방식 Request
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Content-Type", "application/json");
// HttpResponse : Http Protocol 응답 Message 추상화
HttpResponse httpResponse = httpClient.execute(httpGet);
//==> Response 확인
System.out.println(httpResponse);
System.out.println();
//==> Response 중 entity(DATA) 확인
HttpEntity httpEntity = httpResponse.getEntity();
//==> InputStream 생성
InputStream is = httpEntity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
//==> API 확인 : Stream 객체를 직접 전달
JSONObject jsonobj = (JSONObject)JSONValue.parse(br);
System.out.println(jsonobj);
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(jsonobj.toString(), User.class);
System.out.println(user);
}
위 코드에서 httpGet.setHeader()를 통해 Header를 만들어 보냈는데
Content-Type을 Application타입의 JSON 으로 지정해준 경험이 있다.
서버는 Content-Type을 통해 Request의 콘텐츠의 타입을 이해하고, 파싱하여 사용하는 것이다.
가령, 서버쪽에서 @RequestBody 등을 사용하여 JSON데이터를 받겠다고 했다면
클라이언트에서는 Content-Type을 application/json타입으로 해야하는 것이다.
(그렇지 않으면 Unsupported Media Type 에러인 415 Http Status Code가 뜬다.)
2. Multipart Type
Content-Type 은 Text타입, Application타입, Audio타입, MultiPart타입 등 여러 종류가 있다.
그 중 Multipart타입은 하나의 Body에 서로 다른 종류의 여러 데이터를 결합해 보낸다고한다.
그 중 multipart/form-data는 File, ASCII가 아닌 Data, Binary Data 등을 Form submit으로 보내기 좋다고 한다.
Default encoding인 application/x-www-form-urlencoded타입은 Large quantities of binary data나 Text containing non-ASCII characters를 보내는데 적합하지 않기 때문이다.
3-1 . Spring MultipartResolver
- What is MultipartResolver
Multipart타입의 파일을 업로드 하기위한 strategy interface이다.
+ RFC1867규격(Form-based File Upload in HTML)을 따른다고 한다.
이 인터페이스의 구현체들은 application context(WAS개념을 말하는 듯 하다)에서 사용 될 수도 있고
standalone하게 사용 될 수도 있다고 한다.
- How to use
DispatcherServlet에서는 default resolver가 없기 때문에
Multipart타입의 requests를 파싱할 MultipartResolver 구현체 Bean을
DispatcherServlet의 application context에 등록해줘야 한다.
그러면 DispatcherServlet(단일인입점)을 통해 request되는 모든 request들에 이 Resolver를 적용할 수 있게 되는 것이다.
+ Spring에서는 구현체로 StandardServletMultipartResolver 를 제공하고있다. CommonsMultipartResolver는 사라졌다고 한다.
- How it works
MultipartResolver가 적용된 Request들은 HttpServletRequest로 Wrapping된다고 한다.
그러면 컨트롤러들은 받은 Request를 비로소 MultipartFiles로서 cast하여 처리할 수 있다.
+ DispatcherServlet에 MultipartResolver를 쓰고싶지 않다면, 대안으로 MultipartFilter를 쓸 수도 있다.
이는 Spring의 web MVC Framework를 사용하지 않는 application에서 주로 사용된다고 한다.
3-2 . Spring MultipartFile
Multipart타입 Request로부터 받은 uploaded file을 추상화, 캡슐화한 인터페이스이다.
즉, Name이나 Size 등 파일 정보를 가지고 있으므로
이 타입으로 Request Data를 받아주면 메서드들을 통해, 파일 활용이 가능한 것이다.
다음 글에서 계속...(구현)