Java

[Java] Validation

Luke_look 2023. 7. 6. 21:15

1) Validation종류
저희 레벨2 플젝에서

@Getter  
@Setter  
public class SignupRequestDto {  
@NotBlank  
@Size(min = 4,max = 10)  
@Pattern(regexp = "\[a-z0-9\]_$")  
private String username;  
@NotBlank  
@Size(min = 8,max = 15)  
@Pattern(regexp = "\[a-zA-Z0-9\`~!@#$%^&_()\_=+|{};:,.<>/?\]\*$")  
private String password;  
private boolean admin = false;  
private String adminToken = "";

}  

유저 네임과 비번의 제한을 주었습니다. @Size면 유저네임의 크기를 말합니다. 이런 식으로 애너테이션을 사용하여 유효성 검사 하는 것을 Java Bean Validation API라고 합니다. 이 방식 말고도 Apache Commons, Google Guava 등 외부 라이브러리를 사용하여 유효성 검사를 수행할 수도 있습니다.

그럼 Validation의 종류를 나열해 보겠습니다.

@NotNull: 해당 필드의 값이 null이 아니어야 함을 나타냅니다.
@Null: 해당 필드의 값이 null이어야 함을 나타냅니다.
@AssertTrue: 해당 필드의 값이 true여야 함을 나타냅니다.
@AssertFalse: 해당 필드의 값이 false여야 함을 나타냅니다.
@Min(value): 숫자 필드가 특정 최소값 이상이어야 함을 나타냅니다.
@Max(value): 숫자 필드가 특정 최대값 이하이어야 함을 나타냅니다.
@DecimalMin(value): 숫자 필드가 특정 최소값(소수점 포함) 이상이어야 함을 나타냅니다.
@DecimalMax(value): 숫자 필드가 특정 최대값(소수점 포함) 이하이어야 함을 나타냅니다.
@Size(min, max): 문자열, 컬렉션, 맵, 배열의 크기가 특정 범위에 있어야 함을 나타냅니다.
@Digits(integer, fraction): 숫자 필드가 특정 형식(정수 자릿수, 소수점 자릿수)을 가져야 함을 나타냅니다.
@Past: 날짜와 시간 필드가 과거여야 함을 나타냅니다.
@Future: 날짜와 시간 필드가 미래여야 함을 나타냅니다.
@Pattern(regex): 문자열 필드가 특정 정규 표현식 패턴을 맞춰야 함을 나타냅니다.
@Email: 문자열 필드가 이메일 형식을 맞춰야 함을 나타냅니다.
이러한 애너테이션 형태로 유효성 검사를 제공합니다.

그럼 blogProj에서 다시 보겠습니다.

@Getter
@Setter
public class SignupRequestDto {
@NotBlank
@Size(min = 4,max = 10) //username의 크기를 4자에서 10자로
@Pattern(regexp = "[a-z0-9]*$") //a-z, 0-9만 사용
private String username;

@NotBlank
@Size(min = 8,max = 15)    //최소 8자 이상, 15자 이하
//이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)
@Pattern(regexp = "[a-zA-Z0-9`~!@#$%^&*()_=+|{};:,.<>/?]*$")
private String password;
private boolean admin = false;
private String adminToken = "";

}
이렇게 설정하였는데 한 번 postman으로 확인해보면

image-20230706174911137

패스워드가 12 두자리죠? 이렇게 post하면

image-20230706174954347

이런 에러가 뜨며

image-20230706175004449

이런 결과를 가져옵니다.

2) Validation 예외 처리
@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto) {
userService.signup(requestDto);

return "redirect:/api/user/login-page";

}
예외 처리를 해야겠죠? 여기서

@Valid는 유효성 검사가 필요한 객체에 붙이는 애너테이션입니다.

@Valid 주석이 붙은 객체는 해당 객체의 필드에 붙은 Bean Validation 주석들에 따른 유효성 검사를 받게 됩니다.

수업 예제에서는 빈값에 대한 예외 처리를 했습니다.

@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
// Validation 예외처리
List fieldErrors = bindingResult.getFieldErrors();

if(fieldErrors.size() > 0) {
    for (FieldError fieldError : bindingResult.getFieldErrors()) {
        log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
    }
    return "redirect:/api/user/signup";
}

userService.signup(requestDto);

return "redirect:/api/user/login-page";

}
여기서 BindingResult는 Spring Framework에서 제공하는 인터페이스.

BindingResult 바인딩 과정에서 발생한 오류를 추적 제공하는 역할
※ 여기서 바인딩이란?

특정 메서드나 변수, 필드가 어떤 행동과 연결되어 있는 과정. 웹 api에서는 사용장의 입력값과 객체에 연결 되어 있는 것

@ValidrequestDto의 유효성 검사를 수행하도록 지시 합니다.
BindingResult는 유효성 검사의 결과를 담게 됩니다.
if(fieldErrors.size() > 0)는 유효성 검사에서 오류가 발생했는지 확인합니다. 여기서 fieldErrors.size() > 0는 유효성 검사가 하나라도 오류나면 에러 로깅을 하기 위해서입니다.
for (FieldError fieldError : bindingResult.getFieldErrors())를 통해서 필드 오류를 순회하며 필드의 이름과 메세지 로깅.

1) Validation종류
저희 레벨2 플젝에서

```java

@Getter
@Setter
public class SignupRequestDto {
@NotBlank
@Size(min = 4,max = 10)
@Pattern(regexp = "[a-z0-9]$")
private String username;
@NotBlank
@Size(min = 8,max = 15)
@Pattern(regexp = "[a-zA-Z0-9`~!@#$%^&
()_=+|{};:,.<>/?]*$")
private String password;
private boolean admin = false;
private String adminToken = "";

}

```

 

 


유저 네임과 비번의 제한을 주었습니다. @Size면 유저네임의 크기를 말합니다. 이런 식으로 애너테이션을 사용하여 유효성 검사 하는 것을 Java Bean Validation API라고 합니다. 이 방식 말고도 Apache Commons, Google Guava 등 외부 라이브러리를 사용하여 유효성 검사를 수행할 수도 있습니다.

그럼 Validation의 종류를 나열해 보겠습니다.

 

 

 

 

@NotNull: 해당 필드의 값이 null이 아니어야 함을 나타냅니다.
@Null: 해당 필드의 값이 null이어야 함을 나타냅니다.
@AssertTrue: 해당 필드의 값이 true여야 함을 나타냅니다.
@AssertFalse: 해당 필드의 값이 false여야 함을 나타냅니다.
@Min(value): 숫자 필드가 특정 최소값 이상이어야 함을 나타냅니다.
@Max(value): 숫자 필드가 특정 최대값 이하이어야 함을 나타냅니다.
@DecimalMin(value): 숫자 필드가 특정 최소값(소수점 포함) 이상이어야 함을 나타냅니다.
@DecimalMax(value): 숫자 필드가 특정 최대값(소수점 포함) 이하이어야 함을 나타냅니다.
@Size(min, max): 문자열, 컬렉션, 맵, 배열의 크기가 특정 범위에 있어야 함을 나타냅니다.
@Digits(integer, fraction): 숫자 필드가 특정 형식(정수 자릿수, 소수점 자릿수)을 가져야 함을 나타냅니다.
@Past: 날짜와 시간 필드가 과거여야 함을 나타냅니다.
@Future: 날짜와 시간 필드가 미래여야 함을 나타냅니다.
@Pattern(regex): 문자열 필드가 특정 정규 표현식 패턴을 맞춰야 함을 나타냅니다.
@Email: 문자열 필드가 이메일 형식을 맞춰야 함을 나타냅니다.
이러한 애너테이션 형태로 유효성 검사를 제공합니다.

그럼 blogProj에서 다시 보겠습니다.

 

```java

@Getter
@Setter
public class SignupRequestDto {
@NotBlank
@Size(min = 4,max = 10) //username의 크기를 4자에서 10자로
@Pattern(regexp = "[a-z0-9]*$") //a-z, 0-9만 사용
private String username;

```

@NotBlank
@Size(min = 8,max = 15)    //최소 8자 이상, 15자 이하
//이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)
@Pattern(regexp = "[a-zA-Z0-9`~!@#$%^&*()_=+|{};:,.<>/?]*$")
private String password;
private boolean admin = false;
private String adminToken = "";

}
이렇게 설정하였는데 한 번 postman으로 확인해보면

image-20230706174911137

패스워드가 12 두자리죠? 이렇게 post하면

image-20230706174954347

이런 에러가 뜨며

image-20230706175004449

이런 결과를 가져옵니다.

2) Validation 예외 처리
@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto) {
userService.signup(requestDto);

return "redirect:/api/user/login-page";

}
예외 처리를 해야겠죠? 여기서

@Valid는 유효성 검사가 필요한 객체에 붙이는 애너테이션입니다.

@Valid 주석이 붙은 객체는 해당 객체의 필드에 붙은 Bean Validation 주석들에 따른 유효성 검사를 받게 됩니다.

수업 예제에서는 빈값에 대한 예외 처리를 했습니다.

```java

@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
// Validation 예외처리
List fieldErrors = bindingResult.getFieldErrors();

```

if(fieldErrors.size() > 0) {
    for (FieldError fieldError : bindingResult.getFieldErrors()) {
        log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
    }
    return "redirect:/api/user/signup";
}

userService.signup(requestDto);

return "redirect:/api/user/login-page";

}
여기서 BindingResult는 Spring Framework에서 제공하는 인터페이스.

BindingResult 바인딩 과정에서 발생한 오류를 추적 제공하는 역할
※ 여기서 바인딩이란?

특정 메서드나 변수, 필드가 어떤 행동과 연결되어 있는 과정. 웹 api에서는 사용장의 입력값과 객체에 연결 되어 있는 것

@ValidrequestDto의 유효성 검사를 수행하도록 지시 합니다.
BindingResult는 유효성 검사의 결과를 담게 됩니다.
if(fieldErrors.size() > 0)는 유효성 검사에서 오류가 발생했는지 확인합니다. 여기서 fieldErrors.size() > 0는 유효성 검사가 하나라도 오류나면 에러 로깅을 하기 위해서입니다.
for (FieldError fieldError : bindingResult.getFieldErrors())를 통해서 필드 오류를 순회하며 필드의 이름과 메세지 로깅.

1) Validation종류
저희 레벨2 플젝에서

```java

@Getter
@Setter
public class SignupRequestDto {
@NotBlank
@Size(min = 4,max = 10)
@Pattern(regexp = "[a-z0-9]$")
private String username;
@NotBlank
@Size(min = 8,max = 15)
@Pattern(regexp = "[a-zA-Z0-9`~!@#$%^&
()_=+|{};:,.<>/?]*$")
private String password;
private boolean admin = false;
private String adminToken = "";

}

```
유저 네임과 비번의 제한을 주었습니다. @Size면 유저네임의 크기를 말합니다. 이런 식으로 애너테이션을 사용하여 유효성 검사 하는 것을 Java Bean Validation API라고 합니다. 이 방식 말고도 Apache Commons, Google Guava 등 외부 라이브러리를 사용하여 유효성 검사를 수행할 수도 있습니다.

그럼 Validation의 종류를 나열해 보겠습니다.

@NotNull: 해당 필드의 값이 null이 아니어야 함을 나타냅니다.
@Null: 해당 필드의 값이 null이어야 함을 나타냅니다.
@AssertTrue: 해당 필드의 값이 true여야 함을 나타냅니다.
@AssertFalse: 해당 필드의 값이 false여야 함을 나타냅니다.
@Min(value): 숫자 필드가 특정 최소값 이상이어야 함을 나타냅니다.
@Max(value): 숫자 필드가 특정 최대값 이하이어야 함을 나타냅니다.
@DecimalMin(value): 숫자 필드가 특정 최소값(소수점 포함) 이상이어야 함을 나타냅니다.
@DecimalMax(value): 숫자 필드가 특정 최대값(소수점 포함) 이하이어야 함을 나타냅니다.
@Size(min, max): 문자열, 컬렉션, 맵, 배열의 크기가 특정 범위에 있어야 함을 나타냅니다.
@Digits(integer, fraction): 숫자 필드가 특정 형식(정수 자릿수, 소수점 자릿수)을 가져야 함을 나타냅니다.
@Past: 날짜와 시간 필드가 과거여야 함을 나타냅니다.
@Future: 날짜와 시간 필드가 미래여야 함을 나타냅니다.
@Pattern(regex): 문자열 필드가 특정 정규 표현식 패턴을 맞춰야 함을 나타냅니다.
@Email: 문자열 필드가 이메일 형식을 맞춰야 함을 나타냅니다.
이러한 애너테이션 형태로 유효성 검사를 제공합니다.

그럼 blogProj에서 다시 보겠습니다.

```java

@Getter
@Setter
public class SignupRequestDto {
@NotBlank
@Size(min = 4,max = 10) //username의 크기를 4자에서 10자로
@Pattern(regexp = "[a-z0-9]*$") //a-z, 0-9만 사용
private String username;

```

@NotBlank
@Size(min = 8,max = 15)    //최소 8자 이상, 15자 이하
//이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)
@Pattern(regexp = "[a-zA-Z0-9`~!@#$%^&*()_=+|{};:,.<>/?]*$")
private String password;
private boolean admin = false;
private String adminToken = "";

}
이렇게 설정하였는데 한 번 postman으로 확인해보면

image-20230706174911137

패스워드가 12 두자리죠? 이렇게 post하면

image-20230706174954347

이런 에러가 뜨며

image-20230706175004449

이런 결과를 가져옵니다.

2) Validation 예외 처리
@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto) {
userService.signup(requestDto);

return "redirect:/api/user/login-page";

}
예외 처리를 해야겠죠? 여기서

@Valid는 유효성 검사가 필요한 객체에 붙이는 애너테이션입니다.

@Valid 주석이 붙은 객체는 해당 객체의 필드에 붙은 Bean Validation 주석들에 따른 유효성 검사를 받게 됩니다.

수업 예제에서는 빈값에 대한 예외 처리를 했습니다.

@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
// Validation 예외처리
List fieldErrors = bindingResult.getFieldErrors();

if(fieldErrors.size() > 0) {
    for (FieldError fieldError : bindingResult.getFieldErrors()) {
        log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
    }
    return "redirect:/api/user/signup";
}

userService.signup(requestDto);

return "redirect:/api/user/login-page";

}
여기서 BindingResult는 Spring Framework에서 제공하는 인터페이스.

BindingResult 바인딩 과정에서 발생한 오류를 추적 제공하는 역할
※ 여기서 바인딩이란?

특정 메서드나 변수, 필드가 어떤 행동과 연결되어 있는 과정. 웹 api에서는 사용장의 입력값과 객체에 연결 되어 있는 것

@ValidrequestDto의 유효성 검사를 수행하도록 지시 합니다.
BindingResult는 유효성 검사의 결과를 담게 됩니다.
if(fieldErrors.size() > 0)는 유효성 검사에서 오류가 발생했는지 확인합니다. 여기서 fieldErrors.size() > 0는 유효성 검사가 하나라도 오류나면 에러 로깅을 하기 위해서입니다.
for (FieldError fieldError : bindingResult.getFieldErrors())를 통해서 필드 오류를 순회하며 필드의 이름과 메세지 로깅.

'Java' 카테고리의 다른 글

[Java Spring] 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)  (0) 2023.07.09
[Java] 참조와 접근  (0) 2023.07.08
[Java] 메타 애너테이션  (0) 2023.07.02
[Java Spring] HttpServletResponse  (0) 2023.07.02
[Java] split 메서드  (0) 2023.06.17