[Start Spring Boot] Valid 추가하기

·2024년 3월 19일
0

Start Spring Boot!

목록 보기
21/53
post-thumbnail

Valid란?

  • 사용자가 입력한 객체를 바인딩하는 과정에서 검증을 진행한다.

dependencies 추가하기

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-validation'
}

Controller 수정하기

    @PostMapping("")
    public ResponseEntity<TeamDTO> createTeams(@Valid @RequestBody TeamDTO teamDTO) {
        TeamDTO savedTeam = teamService.createTeam(teamDTO);

        URI location = ServletUriComponentsBuilder
                .fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(savedTeam.getId())
                .toUri();

        return ResponseEntity.created(location).build();

    }
    
  • @Valid: 다음을 붙이면 검증을 할 수 있다.

DTO 수정하기

package com.chan.ssb.team;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;

public class TeamDTO {
    private long id;
    @Size(min = 3, max = 50)
    private String name;
    @NotEmpty
    private String city;
    @Min(0)
    private int championships;

}
  • @Size: 문자의 길이를 제한
  • @NotNull: Null을 허용하지 않음
  • @NotEmpty: Null 또는 빈 문자열을 허용하지 않음
  • @Past: 과거 날짜만 입력 가능
  • @Future: 미래 날짜만 입력 가능
  • @FutureOrPresent: 미래 또는 오늘 날짜만 입력 가능
  • @Max: 최댓값 이하의 값만 입력 가능
  • @Min: 최솟값 이상의 값만 입력 가능
  • @Pattern: 정규식 패턴으로 검증

Exception 추가하기

  • 다음을 실행하면 우리가 설정한 ErrorDetail을 출력하지 않는다.
  • CustomizedResponseEntityExceptionHandler.java
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
        ErrorDetails errorDetails = new ErrorDetails(LocalDate.now(), ex.getFieldError().getDefaultMessage(), request.getDescription(false));
        // ex.getMessage()는 모든 오류를 출력
        return new ResponseEntity(errorDetails, HttpStatus.BAD_REQUEST);
    }
  • NotVaild를 오버라이딩해서 오류 메시지를 수정하였다.
  • ex.getMessage()를 사용하면 오류메시지가 길어진다.

message 설정하기

  • Entity에서
@NotEmpty(message = "City must not be empty")
  • 다음과 같이 설정하면 정상적으로 출력한다.

DTOList를 검증하기

  • DTOList의 경우 바로 검증을 할 수없다.

Wrapper 만들기

  • 입력을 받기위한 wrapper를 만들어야 한다.
  • TeamDTOListWrapper.java
package com.chan.ssb.team;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Size;

import java.util.List;

public class TeamDTOListWrapper {
    @Valid
    private List<TeamDTO> teamDTOList;

    // 생성자등 생략
}

Controller

	@PostMapping("/")
    public ResponseEntity<List<TeamDTO>> createTeams(@Valid @RequestBody TeamDTOListWrapper teamDTOList) {
        teamService.createTeams(teamDTOList.getTeamDTOList());

        URI location = ServletUriComponentsBuilder
                .fromCurrentRequest()
                .path("")
                .build()
                .toUri();

        return ResponseEntity.created(location).build();

    }
  • 다음과 같은 방법으로 데이터를 받아올 수 있다.
profile
백엔드 개발자가 꿈인 컴공과

0개의 댓글

관련 채용 정보