본문 바로가기
Back-end/SpringBoot

Kotlin으로 OpenApi(Swagger)에서 multipart와 dto(vo) 같이 받는 법

by backend 개발자 지망생 2025. 2. 10.

https://aahc912.tistory.com/66

 

Swagger(스웨거) multipart/form-data에서 try out이 불가능한 문제 "Content-Type 'application/octet-stream' is not supp

개요 평소 API 문서 자동화 프레임워크로 `Swagger`를 많이 써왔는데 `multipart/form-data`를 Body로 받는 API의 경우 `Swagger` 문서에서 try out(실행)할 시에 예외(HttpMediaTypeNotSupportedException)가 발생하는 문제

aahc912.tistory.com

일단 아이디어 출처는 이거다.

@requestPart는 속성이 지정이 되지 않아서 같이 보내면 application/octet-stream이 나온다.

RequestPart

 

반면 requestBody는 타입을 지정해줄 수 있다.(swagger에 encoding 해줄 수 있다.)

RequestBody

 

어노테이션 생성

@Target(
    AnnotationTarget.FUNCTION,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER,
    AnnotationTarget.VALUE_PARAMETER,
    AnnotationTarget.ANNOTATION_CLASS
)
@Retention(
    AnnotationRetention.RUNTIME
)
@RequestBody
@Inherited
annotation class OpenApiBody(
    @get:AliasFor(annotation = RequestBody::class) val description: String = "",
    @get:AliasFor(annotation = RequestBody::class) val content: Array<Content> = [],
    @get:AliasFor(annotation = RequestBody::class) val required: Boolean = false,
    @get:AliasFor(annotation = RequestBody::class) val extensions: Array<Extension> = [],
    @get:AliasFor(annotation = RequestBody::class) val ref: String = "",
    @get:AliasFor(annotation = RequestBody::class) val useParameterTypeSchema: Boolean = false
)

 

(사용예)

@OpenApiBody(
    description = "프로필 이미지와 추가 데이터를 업로드합니다.",
    content = [
        Content(
            encoding = [Encoding(name = "commandFileRequestVO", contentType = MediaType.APPLICATION_JSON_VALUE)]
        )
    ],
    required = true
)

 

이제는 당당하게 openApi에서 requestPart 씁시다..!

'Back-end > SpringBoot' 카테고리의 다른 글

[SpringBoot] security 간단 이론  (0) 2025.01.15
[SpringBoot] webflux  (1) 2024.12.18
[SpringBoot] WebSocket ver.Spring  (0) 2024.12.18