본문 바로가기
관리자

Programming-[Backend]/SpringBoot

스프링 데이터, 파일 동시에 전달 시 Swagger Schema 표시

728x90
반응형

 

개요

정확한 내용은 아니다. 그런데 찾아봐도 답이 없는 것 같아서 기록해둔다.

 

 

상황

스프링 부트 및 Swagger를 사용하여 컨트롤러에서 입력 객체(po)와 파일 업로드 리스트를 동시에 받아야하는 상황이 생겼다.

@PostMapping(value = "send/mms/{type}", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE})
    public ResponseEntity<?> sendMms(
            @Parameter(
                    ...
            )
            @PathVariable("type") @ValidType(prefix = "mms") String type,
            @RequestPart MmsPo po,
            @Parameter(
                    description = """
                    ...
                            """,
                    content = @Content(
                            mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
                            schema = @Schema(
                                    type = "array"
                            )
                    )
            )
            @Size(max = 3, message = "첨부 이미지는 최대 3개까지 가능")
            @RequestPart List<MultipartFile> files) {
        ... 로직 진행
    }

 

 

이 때 파일들을 인코딩하여 po에 String 형태로 담아줄 것이 아니라면(인코딩, 디코딩이 필요하고 Base64로 인코딩하면 용량이 33% 정도 증가하므로 권장하지 않음) List<MultipartFile>로 파일들을 받아야한다. 이렇게 하면 po도 파일 형태로 처리되어 전송된다. @RequestPart를 적용해야한다.

 

이 때 consumes에 MediaType.MULTIPART_FORM_DATA_VALUE만 지정하면 Swagger에서 Schema를 볼 수 없다. po 타입 안에 @Schema를 사용하여 설명들을 적어놨는데, 이런 스펙에 대한 설명이 모두 사라지게 되면 Swagger를 사용하는 의미가 없게 된다.

 

 

해결책(미봉책..?)

consumes에 APPLICATION/JSON 타입도 추가해주고 Swagger에서 요청을 보낼때는 multipart/form-data, 스키마를 확인할 때는 application/json으로 한다.

 

 

728x90
반응형