본문 바로가기
TIL : Today I learned (or Week)

TIL 230818 : AWS S3 (Simple Storage Service) 2 - multipart, requestDto와 첨부파일 동시에 받기

by 우인입니다 2023. 8. 24.

https://thiswooin.tistory.com/81

 

TIL 230817 : AWS S3 (Simple Storage Service) 1 - 세팅, 객체업로드

AWS에서 제공하는 여러가지 서비스가 있다라는 걸 이제야 파악이 된다. 그 중에서 Simple Storage Service. 줄여서 S3서비스를 해보려한다. 기본 세팅부터 파일 업로드 하는 용량 설정 까지 해본다. 1. 버

thiswooin.tistory.com

 

지난 시간 AWS S3 서비스를 기본적으로 세팅하고 백엔드 서버에서 파일업로드하는 것 까지 구현했다.

이번에는 조금만 더 이어가서 컨트롤러단에서 첨부파일과 requestDto를 동시에 받는 것부터 구현해보고 기타 추가사항들을 정리해본다.

 


Multipart

우선, 멀티파트에 대해 간략히 짚고 넘어간다.

 

Postman의 Request 항목 중 일부

Postman이나 Http 메시지를 좀 봤었더라면 한번쯤 봤었을 Content type이다.

말그대로 요청에 담긴 데이터의 타입을 명시해주는 것이다.

 

그런데, 한번의 요청에 여러가지의 타입이 있게 된다면?

이를 위해 요청 바디의 메시지를 나누어 여러 타입을 명시해줄 수 있게 탄생한 것이 multipart이다.

 

실제 요청 로그를 보면 아래와 같다.

 

 

바운더리 문자열이 랜덤으로 생성됐고, 그 바운더리를 기준으로 각각의 데이터가 각 헤더를 포함하여 전달하고 있다.

요청의 끝에는 <바운더리 문자열>-- 의 형태로 요청의 끝을 명시하고 있다.

 

 

 

 

 

+이 multipart를 스프링에서 편리하게 다룰 수 있게 도와주는 인터페이스가 MultipartFile이다.

 

 

Dto와 File을 동시에 받는 Controller 설정

그럼 이제 dto와 file을 동시에 받는 설정을 해보자.

여기서는 페스티벌의 객체를 생성하는 POST메소드라고 가정하고,

객체에 담길 requestDto와 첨부파일들 두가지로 받는 걸로 한다.

 

Postman 세팅

우선, Postman에서는 아래처럼 세팅해준다.

키, 값, 콘텐트 타입 이다.

Json형태로 직접 넣어주는 것이고, 이는 form-data에서 행해졌다.

기존 처럼 바디에 직접 넣어주면 인식이 달라진다.

 

키 - 백엔드에서 컨트롤러가 인식해야하는 값으로, 이는 명확하게 지어줘야한다.

값 - 타입에 맞는 데이터.

콘텐트 타입 - auto기능이 있기도 하지만, 명시해주자.

 

Controller 설정

기존에 바디에 직접 JSON형태의 데이터를 보냈을 때 사용했던,

@RequestBody는 사용하지 않는다.

데이터를 Json데이터로 받았을 때 자동으로 객체로 변환해주던 기능이 있었지만,

이번에는 멀티파트/폼데이터를 통해 들어왔기에 위와 같이 value에 키를 명시해주며 확실하게 받아온다.

 

 

트러블 : 첨부파일 없이 비어있는 multipart/form-data를 전송했을 시 임시 객체가 전송.

첨부파일이 없을 수도 있다. 이때 위처럼 체크박스를 끄지 않게 되면 아래처럼 비어있는 파일이름을 보내게 된다.

 

 

이때 파일을 받아오는 파라미터에 들어온 데이터를 확인해 보면,

 

톰캣에서 생성된 임시 파일처럼 보이는 게 들어온 걸로 보인다.

 

우선은 프론트엔드 쪽에서 첨부파일이 없는 경우에 대해 요청 보낼시 유의사항으로 공유를 해두긴 했지만,

백엔드 측에서도 예외 처리가 필요해보이긴하다.

 

이부분은 프론트엔드에서의 처리와 스프링에 대한 지식이 부족해 좀 더 공부해야할 과제로 남긴다.