Backend/Spring+Boot

Feign 파일 전송하기

findmypiece 2021. 8. 9. 03:17
728x90

RestApi를 통해 파일을 전송해야 할 일이 있었다. RestClient 로는 Feign을 사용하고 있었기 때문에 그걸 사용하고자 했고 해당 내용으로 구글링을 해보니 많은 자료가 나왔다.

 

개인의 포스팅이 아니라 약간 공식적인 단체? 같은 곳에 기록되어 있는 것을 예로 들면 아래와 같은 것들이다.

https://www.baeldung.com/java-feign-file-upload
https://recordsoflife.tistory.com/206

 

너무 간단하다. 처음에 이걸 보고 구현을 쉽게 생각했는데 결국 성공하지 못하고 일주일을 허비했다. 물론 중간중간 운영업무가 있어서 물밀듯이 들어온 것도 한 몫 했지만 일주일 간 구글링에서 나오는 모든 자료를 뒤져보았지만 모두 다 위와 같은 방식이었다.

 

위에서 안내하고 있는 방법은 일단 서버에서 MultipartFile 타입으로 파일을 받고 있을 때 가능한 방법이고 byte[]로 받고 있다면 위 방법은 사용할 수 없다.

 

이 경우 어찌되었건 byte[]을 body에 넣어서 보내야 하는데 비정형 데이터를 보내기 위해서는 Content-Type 으로 multipart/form-data 를 사용해야 하기 때문에 json 포맷은 사용할 수 없다. value 에 Object 를 담을 수 있는 Map 정도를 사용해야 하는데 반드시 MultiValueMap 를 사용해야 한다. 참고로 RestTemplate 에서도 파일을 전송할때도 이 방법을 사용한다.

 

Service

@Autowired
private FileClient fileClient;

@PostMapping("fileTranfer")
public void fileTranfer(MultipartFile multipartFile)  {

	MultiValueMap<String, Object> fileInfo = new LinkedMultiValueMap<>();
	fileInfo.add("file",  new ByteArrayResource(multipartFile.getBytes()) {
		@Override
		public String getFilename() throws IllegalStateException {
			return multipartFile.getOriginalFilename();
		}
	});

	fileClient.fileUpload(fileInfo);

}

 

FeignClient

@FeignClient(name = "fileClient", url = "...")
public interface FileClient {

	@PostMapping(value = "...", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
	String fileUpload(MultiValueMap<String, Object> fileInfo);

}
728x90