본문 바로가기
Programming/Spring

스프링 Multipart Form Data JSON 형태로 받기

by dinB 2022. 5. 10.

통상적으로 멀티파트 파일을 처리하기 위해서는 스프링의 Controller 내 Annotation으로

@RequestPart 를 사용한다.

 

이때, 파일 이외의 JSON 데이터를 DTO의 형태로 받는데, JSON 형태로 전달받고 싶다면 DTO의 형태는 기존과 동일하게 작성하고

 

package egovframework.lms.course.dto.request;

import egovframework.lms.course.domain.model.Course;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.springframework.web.multipart.MultipartFile;

import javax.persistence.Column;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CourseSaveRequestDto {

    @ApiModelProperty(value = "과정 이름")
    private String courseName;
    @ApiModelProperty(value = "과정 서브 이름")
    private String courseSubName;
    @ApiModelProperty(value = "과정 수강일")
    private Integer lessonTerm;
    @ApiModelProperty(value = "과정 수료 시간")
    private Integer lessonTime;
    @ApiModelProperty(value = "가격")
    private Long price;
    @ApiModelProperty(hidden = true, value = "썸네일 이미지")
    private String courseFile;
    @ApiModelProperty(hidden = true)
    private String courseFileName;
    @ApiModelProperty(hidden = true, value = "썸네일 영상")
    private String courseThumbLink;
    @ApiModelProperty(hidden = true)
    private String courseThumbLinkName;
    @ApiModelProperty(value = "과정 총 점수 기본 100점")
    private Integer fullScore;
    @ApiModelProperty(value = "최소 수료 점수 기본 100점")
    private Integer limitTotalScore;
    @ApiModelProperty(value = "수강인원제한여부")
    private String limitPeopleYn;
    @ApiModelProperty(value = "수강인원제한 인원수 / 0은 무제한")
    private Integer limitPeople;
    @ApiModelProperty(value = "복습 허용 여부")
    private String restudyYn;
    @ApiModelProperty(value = "복습 기간(day) / 0은 0일")
    private Integer restudyDay;
//    @ApiModelProperty(value = "과정설명1 제목")
//    private String content1Title;
    @ApiModelProperty(value = "과정설명 1 마크다운")
    private String content1;
    @ApiModelProperty(value = "판매여부")
    private String saleYn;
    @ApiModelProperty(value = "노출여부")
    private String displayYn;

    public Course toEntity() {
        return Course.builder()
                .courseName(courseName)
                .courseSubName(courseSubName)
                .lessonTerm(lessonTerm)
                .lessonTime(lessonTime)
                .price(price)
                .courseFile(courseFile)
                .courseFileName(courseFileName)
                .courseThumbLink(courseThumbLink)
                .courseThumbLinkName(courseThumbLinkName)
                .fullScore(fullScore)
                .limitTotalScore(limitTotalScore)
                .limitPeopleYn(limitPeopleYn)
                .limitPeople(limitPeople)
                .restudyYn(restudyYn)
                .restudyDay(restudyDay)
//                .content1Title(content1Title)
                .content1(content1)
                .saleYn(saleYn)
                .displayYn(displayYn)
                .build();
    }

}

컨트롤러에서는

    @PostMapping(value = "/adm")
    @ApiOperation(value = "[관리자] 강의 생성 API - JWT 사용", notes = "관리자의 Access Token 을 통해 강의를 생성한다.", code = 201)
    @ResponseStatus(HttpStatus.CREATED)
    @ApiResponses(
            @ApiResponse(code = 201, message = "생성 성공", response = CourseResponseDto.class)
    )
    public ResponseEntity<?> createCourse(@RequestHeader(HttpHeaders.AUTHORIZATION) String authorization,
                                          @RequestPart(required = false, name = "courseFileOriginal") MultipartFile courseFileOriginal,
//                                          @RequestPart(required = false) MultipartFile courseThumbLinkOriginal,
                                          @RequestPart(required = false, name="data") CourseSaveRequestDto courseSaveRequestDto) throws Exception {
        return new ResponseEntity<>(courseService.createCourse(courseFileOriginal, null, courseSaveRequestDto), HttpStatus.CREATED);
    }

전달받고자하는 DTO의 이름을 지정해주면 된다.

 

이후 Postman 에서 DTO와 파일을 전달해줄 때에는

 

컨트롤러에서 지정한 RequestPart의 이름인 data로, Value 는 JSON 데이터로 전달해주면 된다.

이때 유의할 점은 ContentType은 application/json 으로 지정을 해주어야 한다.

 

그럼 결과는

 

파일과 DTO가 이쁘게 잘 들어오는 것을 확인할 수 있다.