통상적으로 멀티파트 파일을 처리하기 위해서는 스프링의 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가 이쁘게 잘 들어오는 것을 확인할 수 있다.
'Programming > Spring' 카테고리의 다른 글
[Spring Boot] Maven 프로젝트 Heroku 에 배포하기 (0) | 2022.07.01 |
---|---|
ResponseBodyAdvice - Swagger 2 with Security 해결!!!! (0) | 2022.04.29 |