메소드의 파라미터로 VO(Value Object)를 넘겨줄 때, 해당 VO의 **특정 필드(속성)**를 Swagger (Springfox 2.x 기준)에서 **필수 입력(Required)**으로 표시하는 방법

메소드의 파라미터로 VO(Value Object)를 넘겨줄 때, 해당 VO의 **특정 필드(속성)**를 Swagger (Springfox 2.x 기준)에서 **필수 입력(Required)**으로 표시하는 방법은 주로 두 가지가 있습니다.

VO가 요청 본문(Request Body)으로 사용되는 경우와 쿼리 파라미터(Query Parameter)로 사용되는 경우에 따라 적용 방법이 다릅니다.


 

1. VO가 Request Body로 사용될 경우 (가장 일반적인 경우)

 

VO가 @RequestBody 어노테이션을 통해 JSON 형태의 요청 본문으로 전달될 때, 특정 필드를 필수로 설정하는 가장 표준적인 방법입니다.

 

💡 핵심 어노테이션: @ApiModelProperty

 

VO 클래스의 필드에 @ApiModelProperty를 사용하고, required 속성을 true로 설정합니다.

Java

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel(value = "사용자 정보 VO", description = "사용자의 필수 및 선택 정보를 포함")
public class UserRequestVO {

    // 1. 필수 입력 필드 (Required = true)
    @ApiModelProperty(
        value = "사용자 ID",
        example = "user123",
        required = true // ⭐️ 이 속성이 필수 입력을 설정합니다.
    )
    private String userId;

    // 2. 선택 입력 필드 (기본값: required = false)
    @ApiModelProperty(
        value = "사용자 이름",
        example = "홍길동",
        notes = "미입력 시 '익명'으로 처리됨"
    )
    private String userName;

    // Getter and Setter...
}

 

📝 Controller 적용

 

컨트롤러 메소드에서는 해당 VO를 @RequestBody로 받습니다.

Java

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @PostMapping("/api/users")
    @ApiOperation(value = "새 사용자 등록", notes = "필수 항목(userId)을 포함하여 사용자를 등록한다.")
    public String registerUser(@RequestBody UserRequestVO vo) {
        // ... 로직 처리
        return "Success";
    }
}

 

2. VO가 Query Parameter 또는 Form Data로 사용될 경우

메소드의 파라미터로 VO(Value Object)를 넘겨줄 때, 해당 VO의 **특정 필드(속성)**를 Swagger (Springfox 2.x 기준)에서 **필수 입력(Required)**으로 표시하는 방법

VO가 GET 요청의 쿼리 파라미터나 Form Data 형태로 사용될 경우 (각 필드가 개별 파라미터로 처리됨), @ApiModelProperty(required = true)는 일반적으로 작동하지 않습니다. 이 경우 메소드 파라미터 레벨에서 직접 설정해야 합니다.

 

💡 핵심 어노테이션: @ApiParam

 

메소드의 파라미터에 직접 @ApiParam을 사용하거나, VO를 @ModelAttribute와 함께 사용하여 각 필드에 @ApiParam을 적용하는 방법이 있으나, Springfox 2.x에서는 VO 필드에 @ApiParam을 직접 사용하는 것이 표준적입니다.

 

A. VO 필드에 적용 (Springfox 2.x에서 일반적으로 작동하는 방식)

 

@ApiModelProperty와 함께 사용하며, required 속성은 @ApiModelProperty를 따릅니다.

Java

import io.swagger.annotations.ApiModelProperty;

public class SearchRequestVO {

    // required = true를 설정해도 query parameter에서는 Swagger UI에서 기본적으로 required로 표시되지 않을 수 있습니다.
    @ApiModelProperty(
        value = "검색 키워드",
        required = true // Request Body와 동일하게 설정
    )
    private String keyword;

    @ApiModelProperty(value = "페이지 번호")
    private Integer page;

    // Getter and Setter...
}

 

B. Controller 파라미터에 개별적으로 명시 (더 확실한 방법)

 

VO 대신 각 필드를 파라미터로 분리하여 @ApiParam을 적용하는 것이 쿼리 파라미터의 필수 여부를 명확히 하는 가장 확실한 방법입니다.

Java

import io.swagger.annotations.ApiParam;

@RestController
public class SearchController {

    @GetMapping("/api/search")
    public String search(
        // ⭐️ 필수 파라미터
        @ApiParam(value = "검색 키워드", required = true) 
        @RequestParam String keyword,
        
        // 선택 파라미터
        @ApiParam(value = "페이지 번호", required = false) 
        @RequestParam(required = false) Integer page) {
        
        // ... 로직 처리
        return "Search results";
    }
}

참고: @ApiParam은 VO 파라미터에 직접 적용할 수도 있지만, VO 내부의 개별 필드를 필수/선택으로 제어할 때는 @ApiModelProperty(required = true)를 사용하는 것이 Springfox의 공식적인 DTO/VO 모델링 방법입니다.