상황은 아래와 같다. 글 등록을 하려 하는데 아래와 같은 에러가 발생했다.
WARN : org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors<EOL>Field error in object 'boardVO' on field 'uploadFile': rejected value [C:\Users\19431\Pictures\Camera Roll\포메라니1안.jpeg]; codes [typeMismatch.boardVO.uploadFile,typeMismatch.uploadFile,typeMismatch.org.springframework.web.multipart.MultipartFile,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [boardVO.uploadFile,uploadFile]; arguments []; default message [uploadFile]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.web.multipart.MultipartFile' for property 'uploadFile'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'org.springframework.web.multipart.MultipartFile' for property 'uploadFile': no matching editors or conversion strategy found]]
에러 내용을 보면 typeMismatch라고 하는 데 무엇이 문제인 걸까??
어디를 살펴봐도 문제가 없다.
문제는 form 태그 안에 있었다.
<form action="insertHealthBoard.do" method="post" enctype="multipart/form-data">
</form>
파일,이미지 업로드 할 시에 enctype = "multipart/form-data"라는 코드를 적어줘야한다.
그렇다면 multipart란 무엇일까??
multipart가 무엇인 지 알아보기 전에, 클라이언트로부터 서버까지 데이터가 전성되는 과정을 살펴보도록 하겠다.
클라이언트는 파일등을 서버로 전송할 때 HTTP Request 형태로 서버에 전송한다.
HTTP 의 구조는 아래와 같다.
- Request Line
- HTTP Header
- Empty LIne
- Message Body
여기서 Message Body에 들어가는 데이터 타입을 HTTP Header에 명시해줄 수 있다.
이 때 명시할 수 있도록 해주는 필드가 Content-type인데, 이 타입 중 하나가 multipart이다.
정리!
Http Request는 Http Body에 클라이언트가 전송하려고하는 데이터를 넣을 수 있는 데 이때 Body에 들어가는 데이터 타입을 HTTP Header에 명시해 줌으로써 서버가 타입에 따라 알맞게 처리하게 한다.
이 Body의 타입을 명시하는 Header가 Content-type이다.
여기서 중요한 점은 Http Request의 Body는 한 종류가 대부분이고, Content-type도 타입을 하나만 명시할 수 있다.
하지만, 파일 업로드할 시에 사진을 올리는 경우 사진의 설명, 사진의 파일 2가지가 들어가고 각각의 Content-type은 서로 다르다. 이때 사용하는 것이 multipart 타입이다!!
form 태그의 enctype은 3가지가 있다.
- application/x-www-form-urlencedes
default 값으로, 모든 문자들을 서버로 보내기 전에 인코딩됨을 명시한다.
- text/plain
공백 문자는 "+" 기호로 변환하지만, 나머지 문자는 모두 인코딩되지 않음을 명시한다.
- multipart/from-data
모든 문자를 인코딩하지 않음을 명시한다. 이 방식은 파일이나 이미지를 서버로 전송할 때 주로 사용한다.
'Spring' 카테고리의 다른 글
[김영한님 - 스프링의 핵심원리] Spring - 스프링이 필요한 이유(2) (0) | 2022.09.19 |
---|---|
[김영한님 - 스프링의 핵심원리] Spring - 스프링이 필요한 이유(1) (0) | 2022.09.18 |
@ModelAttribute의 특징 (0) | 2022.08.25 |
EmptyResultDataAccessException 해결, jdbcTemplate.queryForObject에 관하여 (0) | 2022.08.21 |
BeanCreationException, NoSuchBeanDefinitionException 에러 해결 (0) | 2022.08.19 |