관리 메뉴

Legday

[Spring] Validation 라이브러리 사용하기 본문

Spring&Springboot/Spring(개인공부용)

[Spring] Validation 라이브러리 사용하기

Legday 2022. 9. 21. 17:15
Validation 은 웹개발 시 가장 중요한 유효성 검사이다. Validation 을 잘못 설정하면 나중에 서버가 공격을 당할 때 보안에 문제가 생기면서 골치 아파진다

 

1. 라이브러리 다운받기

- 아래 사이트로 들어간다

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

- 그리고 Spring에 버전에 맞는 것을 클릭 후 CDN 주소를 가져온다.

- spring에 build.gradle 로 들어가서 dependencies부분에 복사후 Refresh Gradle Project 클릭하여 프로젝트에 적용시켜준다.

 

2. 코드작성

- 우선 회원가입시에 공백과 null값을 유효성 검사를 하기 때문에 joinDto에 어노테이션을 걸어줘야한다.

- @Size 어노테이션은 문자열길이의 최대(max),최소(min)를 지정할 수 있고 오류 발생시 message에 담긴 문자열을 전송할 수 있다.

- @NotBlank는 null값과 빈공백 값을 다 체크하는 어노테이션으로 @Size 어노테이션과 똑같이 message를 사용할 수 있다.

@Getter
@Setter
public class JoinDto {
	@Size(min=2, max = 20, message = "username 길이가 부적합 합니다.")
	@NotBlank(message = "username이 null이거나 공백일 수 없습니다.") //null과 empty(공백) 검사
	private String username;
	@Size(min=2, max = 20, message = "길이가 부적합합니다.")
	@NotBlank(message = "password가 null이거나 공백일 수 없습니다.")
	private String password;
	@Size(min=4, max = 50, message = "길이가 부적합합니다.")
	@NotBlank(message = "email이 null이거나 공백일 수 없습니다.")
	private String email;
	
	public Users toEntity() {
		Users users = new Users();
		users.setUsername(this.username);
		users.setPassword(this.password);
		users.setEmail(this.email);
		
		return users;
	}
}

- 그다음 Controller로 간다.(참고로 Validation은 Controller단까지만 하고 절대 serveice단 까지 가지않는다. service단은 dao만 다루기 때문이다.)

- 우선 아까 Vaildation 어노테이션을 걸었떤 클래스 앞에 @Valid 어노테이션을 걸고, 

- 그다음 가장 중요한 리턴값을 받아올 BindingResult 객체를 선언해야한다. 이때 반드시 Vaildation을 적용한 클래스 옆에 작성해야 한다. 아니면 인식을 못한다.

- 그리고 hasErrors() 메서드를 통해 Vaildation결과값에 에러가 있는지 없는지 if문을 이용하여 있으면 있다고 출력하고 만약 있다면 FieldError 객체에 error값을 담은 후 Custom Exception으로 던져주면 이쁘게 잘나온다.

@PostMapping("/api/join")
	public @ResponseBody CMRespDto<?> join(@RequestBody @Valid JoinDto joinDto, BindingResult bindingResult) {

		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);
	}