개발/Spring

Spring DTO + 파일 전송

뽀글뽀글 개발자 2024. 5. 21. 13:03

DTO + FILE 

파일과 DTO를 같이 전송하는 경우 @RequestParam을 사용해서 받을 수 있다.

Content Type은 multipart/form-data를 사용하며, Form 전송 시에는 자동으로 적용되고 Ajax 사용 시에는 ContentType을 false로 주면 Ajax에서 전송할 때 알아서 multipart/form-data 방식으로 보내준다.

 

DTO로 바로 받는 경우에는 @ModelAttribute를 사용할 수도 있고, 어노테이션을 생략하더라도 스프링에서 자동으로 바인딩 전략을 지정해준다. 다만 바인딩 전략을 명시적으로 보여주는 것도 나쁘지 않다.

 

아래와 같이 @RequestParam으로 파일과 객체를 따로 받을 수도 있고, 하나의 객체에 파일과 데이터를 같이 받을 수도 있다.

주의할 점은 필드 이름과 form에서 전송한 name 또는 ajax에서 전송한 formData의 key 값이 일치해야한다.

public void submit(@RequestParam DTO dto, @RequestParam MultipartFile file){
	//....
}

public void submit(@RequestParam DTO dto){
	//....
}

class DTO {
    int a;
    String b;
    MultipartFile file;
}

 

 

DTO1  >  List<DTO2>

DTO 안에 DTO 리스트를 넣는 구조를 만들면 다음과 같이 formData를 추가하면 된다.

DTO 내부에 File을 넣을 때도 아래와 같이 추가하면 된다.

formData.append('DTO1.필드명', 값);
formData.append('DTO1.DTO2[' + i + '].필드명', 값);

 

 

 

 

+ 파일 전송 시 빈 파일이 넘어가는 문제

파일을 전송하다 보니 빈 파일이 같이 넘어가는 문제를 확인했다.

이유는 fake path를 넘기기 때문이며 링크의 블로그를 참고하여 해결했다.