본문 바로가기

개발일지

20231207 - Spring으로 MultipartFile 받기

게시글 CRUD 기능을 구현하면서 텍스트만 받는게 아니라 이미지파일도 같이 받을 수 있는 기능을 생각해야 했다.

일단 이미지파일을 저장할 DB는 팀원분이 S3를 이용한 방법으로 기능을 구현해 주셨다.

 

우선 컨트롤러를 살펴보자면

// PostController.java

@PostMapping("")
public ResponseEntity<PostResponseDto> createPost(
        @ModelAttribute PostRequestDto postRequestDto, // @RequestBody -> @ModelAttribute
        @AuthenticationPrincipal UserDetailsImpl userDetails
){
	...
}

 

원래는 @RequestBody 어노테이션으로 json형태로 데이터를 받았지만 MultipartFile을 받기 위해 form-data 형식으로 데이터를 받기로 했고, 그에 따라 @RequestBody 가아니라 @ModelAttirbute 어노테이션으로 바꿔주었다.

 

@Getter
@Setter
public class PostRequestDto {

    private String title;
    private String content;
    private MultipartFile imageFile;
    private String filename;
}

 

데이터가 담겨있는 PostRequstDto를 살펴보면 처음 받아올때 filename 은 null로 비어있다. 그리고 MultipartFile 형태로 이지파일을 받아온다. 여기서 받아온 MultipartFile을 S3에 저장하는 과정에서 변환된 파일이름이 filename에 담긴 후 메서드가 실행된다.

String filename = s3Util.uploadImage(S3_DIR_POST,postRequestDto.getImageFile());
postRequestDto.setFilename(filename);
PostResponseDto postResponseDto = postService.createPost(postRequestDto, userDetails.getUser());
return ResponseEntity.ok(postResponseDto);