seong

블로그 만들기 기능 - 백엔드에서 유효성 검사 Validation 라이브러리 사용 본문

Spring/블로그 만들기

블로그 만들기 기능 - 백엔드에서 유효성 검사 Validation 라이브러리 사용

hyeonseong 2022. 9. 21. 17:34

백엔드 Validation 처리하기 

백엔드에서 처리할 때는 각자의 Dto마다 Validation을 모두 만들어줘야한다.

Dto를 회원가입 하나만 생성한다고 가정해보자 

회원가입은 username,password,email 세개가 필요하다.

회원정보 수정은 password, email이 필요하다.

회원 정보 수정할 때 회원가입 Dto를 사용하게 되면 username이 없으니 당연히 에러가 날 것이다. 

라이브러리 사용해 확인

주소

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation/2.7.3

자신의 spring 버전에 맞게 다운로드 해준다

1. JoinDto - 회원가입 Dto에 Validation 적용

package site.metacoding.red.web.dto.request.users;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import lombok.Getter;

import lombok.Setter;
import site.metacoding.red.domain.users.Users;

// size -> 길이 체크
//NotBlank -> null과 공백 검사
@Getter
@Setter
public class JoinDto {
	@Size(min = 2, max = 20,message = "길이가 부적합") 
	@NotBlank(message = "username이 null이거나 공백일 수 없습니다.") 
	private String username;
	@Size(min = 2, max = 20,message = "길이가 부적합")
	@NotBlank(message = "username이 null이거나 공백일 수 없습니다.")
	private String password;
	@Size(min = 4, max = 20,message = "길이가 부적합")
	@NotBlank(message = "username이 null이거나 공백일 수 없습니다.")
	private String email;

	public Users toEntity() {
		Users users = new Users(this.username, this.password, this.email);
		return users;
	}
}

2. Controller 부분

@Valid가 붙으면 해당 객체의 어노테이션(@Size..등등)을 보고 잘 들어왔는지 Validation검사한다.

BindingResult는 에러가 발생할 경우 에러의 정보를 담아주는 역할을 한다.

사용시 주의사항!

Valid 바로 옆에 BindingResult가 붙어있어야 한다.

만약 @Valid JoinDto joinDto, Model model, BindingResult bindResult 처럼 작성되면 제대로 작동하지 않는다

꼭 두개를 붙여서 작성

 

여기까지 POSTMAN으로 결과 확인 해보기 

1. Controller 부분  - 에러 하나만 출력 코드

	@PostMapping("/api/join")
	public @ResponseBody CMRespDto<?> join(@RequestBody @Valid JoinDto joinDto,BindingResult bindingResult) {// @RequestBody : Dto를 JSON으로 받기 위함 
		
		if(bindingResult.hasErrors()) {
			System.out.println("에러가 있습니다.");
			FieldError fe = bindingResult.getFieldError();
			throw new MyApiException(fe.getDefaultMessage());
		}
		else {
			System.out.println("에러가 없습니다.");
		}
		usersService.회원가입(joinDto);
		return new CMRespDto<>(1,"회원가입 성공",null);// 회원가입이 되면 로그인 폼으로 이동
	}

 

2. 모든 에러 담아 주기 코드

bindresult안에 에러가 저장되어 있다.

에러가 한개가 아닐 수 있기 때문에 For문으로 확인 해준다. 

	@PostMapping("/api/join")
	public @ResponseBody CMRespDto<?> join(@RequestBody @Valid JoinDto joinDto,BindingResult bindingResult) {// @RequestBody : Dto를 JSON으로 받기 위함 
		
		if(bindingResult.hasErrors()) {
			System.out.println("에러가 있습니다.");
			List<FieldError> feList = bindingResult.getFieldErrors();
			Map<String,String> map = new HashMap<>();
			for(FieldError fe : feList) {
				System.out.println(fe.getDefaultMessage());
				map.put(fe.getField(), fe.getDefaultMessage());
			}
			throw new MyApiException(map.toString());
		}
		else {
			System.out.println("에러가 없습니다.");
		}
		usersService.회원가입(joinDto);
		return new CMRespDto<>(1,"회원가입 성공",null);// 회원가입이 되면 로그인 폼으로 이동
	}

결과

username의 길이가 2~20이었다 

길이를 1로 주고 실행 해보면 에러가 잘 실행 되었다.