목차
SpringBoot 유효성 검증 😄
클라이언트에서 넘어온 값들에 대한 유효성 검증이 필요한데 if(id != null || id != ""...) 이렇게 if문으로 유효성 체크를 하기 싫어서 자바나 스프링에서 지원하는 좋은게 어디 없나 보다가 구글링을 하고 @Valid와 @Validated를 알게되어서 적용을 해봤고 이를 기록한다.
난 "", " ", null 이렇게 3개만 체크하면 되는 부분이었다.
결론은 스프링부트에선 @Valid와 @Validated 2개를 사용해서 간단한 유효성 체크를 할 수 있음
@Valid 🥰
@Valid는 JSR-303 Bean Validator를 이용해서 유효성을 체크하는 어노테이션임(자바 표준 스펙)
사용법
스프링부트 버전에 따른 의존성 추가
사용하는 스프링 부트 버전이 2.3이전버전이라면 spring-boot-starter-web 의존성에 포함되어 있어서 굳이 필요없음, 나는 현재 업무 시 2.0버전을 사용하고 있어서 의존성은 따로 추가하지 않았다.
컨트롤러에서 유효성 체크를 할 것이기에 parameter값으로 받는 객체에 @Valid 어노테이션 추가
@Valid는 컨트롤러에서만 검증 가능(ArgumentResolver에서 처리), 만일 다른 서비스단 같은 곳에서 사용하려면 @Validated 사용
Controller(RestController)
@PostMapping("")
public ResponseEntity<?> insertUser(@RequestBody @Valid MemberVO memberVO) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
userService.insertUser(memberVO);
resultMap.put("result", "success");
return new ResponseEntity<>(resultMap, HttpStatus.OK);
} catch (Exception e) {
resultMap.put("result", "fail");
return new ResponseEntity<>(resultMap, HttpStatus.BAD_REQUEST);
}
}
MemberVO
유효성 체크할 필드에 @NotNull, NotEmppty 등의 JSR 표준 스펙에서 제공하는 어노테이션을 적용한다.
package com.lsy.test;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Getter
@ToString
public class MemberVO {
// 번호
// default message 설정 가능
@NotNull(message = "일련번호는 필수값입니다.") // null만 불가("", " " 가능)
private Long no;
// 아이디
@NotBlank(message = "아이디는 필수값입니다.") // null, "", " " 불가
private String id;
// 이름
@NotBlank(message = "이름은 필수값입니다.")
private String name;
}
테스트
화면에서는 JSON 형식으로 데이터를 전송한다. 아래처럼 일부러 아이디를 빈값으로 서버로 보내보겠다.
{
"no": 10,
"id": "",
"name": "bbbb"
}
서버에서는 아래처럼 Exception(MethodArgumentNotValidException)이 발생했다.
default message에는 VO객체에 내가 아까 입력한 기본 메시지가 표시되었다.
@Validated 🥰
@Validated는 스프링에서 제공하는 기능이다.
만일 컨트롤러에서 사용 시 아래처럼 검증할 객체앞에 @Validated를 붙이면 된다.
@PostMapping("")
public ResponseEntity<?> insertUser(@RequestBody @Validated MemberVO memberVO) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
나머지 생략...
}
@Valid는 객체 전체에 대해 유효성을 검증하고 @Validated는 그룹을 만들어서 원하는 요소만 검증할 수 있고
컨트롤러가 아닌 곳에서도 유효성 검증을 할 수 있고 예외도 ConstraintViolationException이 발생한다.
참조한 블로그에 가면 동작원리와 더 자세한 내용이 나와있다.
참조 : 망나니개발자님 블로그, 2021.7.19, https://mangkyu.tistory.com/174
'IT > development' 카테고리의 다른 글
[mybatis] mybatis 동적 쿼리 작성 시 "," 관련 (0) | 2022.11.22 |
---|---|
[Spring] spring REST API 공부(feat. @RestController) (0) | 2022.11.22 |
[mybatis] mybatis parameter 여러개 전달 (0) | 2022.11.22 |
[mybatis] 상세 조회 시 복수값 추가 조회(feat. vo & map) (0) | 2022.11.22 |
[JavaScript] Ajax 결과값 변수 저장 (0) | 2022.11.22 |