Jun's note

[에러] MultipartFile에서 java.lang.NullPointerException: null, 사진업로드 과정 구현 본문

My record/etc

[에러] MultipartFile에서 java.lang.NullPointerException: null, 사진업로드 과정 구현

junning 2022. 11. 1. 18:12
728x90

- 문제상황

MultipartFile 타입 데이터를 request할때, 서버에서 java.lang.NullPointerException: null 에러 발생

 

 

- 원인

MultipartFile이 null이라는 것은  MultipartFile 값을 찾을 수 없다, 즉 '해당 타입의 값이 존재하지 않음'을 의미

쉽게 말해 값을 request했을때 body에 해당 값이 담겨있지 않다는 거다.

 

왜냐하면 null이라는 사전적 의미를 보면 더 자세히 이해할 수 있다.

'값이 없음'을 나타내는 영어 단어. 값이 존재하지 않는다는 뜻에 가까우며, 값이 0조차 아니라는 뜻이다.

 

- 해결방법

request body값에 해당 값이 포함되어있는지 확인

 


추가로 MultipartFile타입에 대해 정리해보자.

 

MultipartFile 이란?

  • 스프링에서는 클라이언트가 업로드한 File을 핸들러에서 손쉽게 다룰 수 있도록 MultipartFile 인터페이스를 제공한다.
  • 주로 파일을 전송, 업로드할때 사용
  • 웹 클라이언트가 요청을 보낼 때, HTTP 프로토콜 바디 부분에 데이터를 여러 부분으로 나눠서 보낸다.
  • 스프링에서 MultipartResolver를 통해 'Controller에서 매개변수로 쓰이는 MultipartFile'와 '클라이언트가 업로드한 파일'을 연결시켜준다.
  • content type:  multipart/form-data

 

스프링에서 MultipartFile를 사용하여 사진업로드 기능 구현방법

  • HTTP 헤더의 content-type은 무조건 한개여야한다.
  • 평소에는 클라이언트와 json형식인 key:value 쌍으로 문자데이터를 보내지만, 사진파일은 바이너리 형태의 파일데이터로 전송된다. 그러니 multipart/form-data와 application/x-www-form-urlencoded를 같이 사용할 수 없다.
  • 스프링에서 사진파일과 json형태의 글을 같이 업로드 하고 싶을때, @RequestPart로 구현하자.
    • @RequestPart는 multipart/form-data 형태로 요청이 올 때 사용하는 어노테이션 (http body)
    • 클라이언트로부터 사진파일과 글을 함께 받아올때 그때의 content-type은 multipart/form-data이다. 물론 사진파일은 body(@RequestPart), 글은 URL 쿼리 파라미터(@RequestParam)로 분리해서 받을 수도 있다. 나는 분리하지않고 @RequestPart로 한번에 받는 방법을 생각했다.
      • @RequestBody는 json형태 요청이 올 때 사용하는 어노테이션이다.
    • 사진파일과 문자형태의 데이터를 한꺼번에 받기위해서는 @RequestPart를 사용한다.
    • multipart/form-data는 데이터를 요청할때마다 boundary값이 자동으로 계산돼 content-type에 포함된다. 
    • 서버는 boundary를 확인하여 , boundary 마다 구간을 나눠 데이터를 읽는다.

 

참고로 MultipartFile의 값이 담겨있는지 확인하고싶으면 null말고 isEmpty() 함수를 사용하자

 

 


스프링으로 사진업로드 기능을 구현하는 방법을 구글링했을때, 많은 사람들이 다양한 방법으로 구현한 것을 보고 놀랐었다. 원래 구글링하면 거의 다 비슷한 방법으로 구현돼있는데, '스프링 사진 등록'하는 부분은 이슈도 많아서인지 다들 구현한 방법들이 다양해서 '나는 어떻게 더 좋은 방법으로 구현해볼까' 깊이있게 생각해보는 계기가 됐다.

데이터를 보낼때 HTTP 구조를 생각하여, 생각한 방법을 어떻게 프레임워크로 구현할 것인지 폭 넓게 생각해봤다. 단순히 프레임워크에 맞는 방법을 생각한 것이 아니라, 먼저 데이터 형태를 생각하여 어떤 프레임워크를 사용하더라도 구현할 수 있도록 생각해봄으로써 앞으로 개발공부를 어떻게 해야할지 알게되는 계기였다.

무엇보다 나와 비슷한 생각을 가진 사람이 별로 없어서 더욱더 뿌듯하다!

앞으로도 더 열심히 개발공부하고싶다!!

Comments