메소드의 파라미터로 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로 설정합니다.
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로 받습니다.
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가 GET 요청의 쿼리 파라미터나 Form Data 형태로 사용될 경우 (각 필드가 개별 파라미터로 처리됨), @ApiModelProperty(required = true)는 일반적으로 작동하지 않습니다. 이 경우 메소드 파라미터 레벨에서 직접 설정해야 합니다.
💡 핵심 어노테이션: @ApiParam
메소드의 파라미터에 직접 @ApiParam을 사용하거나, VO를 @ModelAttribute와 함께 사용하여 각 필드에 @ApiParam을 적용하는 방법이 있으나, Springfox 2.x에서는 VO 필드에 @ApiParam을 직접 사용하는 것이 표준적입니다.
A. VO 필드에 적용 (Springfox 2.x에서 일반적으로 작동하는 방식)
@ApiModelProperty와 함께 사용하며, required 속성은 @ApiModelProperty를 따릅니다.
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을 적용하는 것이 쿼리 파라미터의 필수 여부를 명확히 하는 가장 확실한 방법입니다.
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 모델링 방법입니다.