개발이좋아

[Spring] JSR - 303, JSR- 380 유효성 검사 Annotation 본문

Web개발/Spring

[Spring] JSR - 303, JSR- 380 유효성 검사 Annotation

noobdev 2020. 4. 1. 20:48

JSR - 303 또는 JSR- 380 Annotation은 Bean 객체에 값이 주입될 때 그 값이 정당한 값인가에 대한 여부를 검사하는 유효성 검사 어노테이션이다.

이런 유효성 검사를 하는 어노테이션은 1.0 스펙인 JSR - 303과 2.0 스펙인 JSR - 380으로 나뉘게 된다.

 

웹 프로젝트 시 사용자가 입력한 값의 유효성 체크 등에 쓰이며, Spring MVC에서는 요청명에 매핑된 메서드의 매개변수인 커스텀 객체에 유효성을 검사할 때 사용된다.

 

 

JSR - 303 Reference

https://beanvalidation.org/1.0/spec/

 

JSR - 380 Reference

https://beanvalidation.org/2.0/spec/

 


JSR - 303 어노테이션

  • @AssertTrue : Bean 객체에 주입되는 값이 true가 아닌 경우 오류 발생
// data1의 값이 true가 아니면 오류 발생
@AssertTrue
private boolean data1;

public boolean isData1() {
		return data1;
	}

public void setData1(boolean data1) {
	this.data1 = data1;
}

 

 

  • @AssertFalse : Bean 객체에 주입되는 값이 false가 아닌 경우 오류 발생
// data2의 값이 false가 아니면 오류 발생
@AssertFalse
private boolean data2;

public boolean isData2() {
	return data2;
}

public void setData2(boolean data2) {
	this.data2 = data2;
}

 

 

  • @Max(값) : 값보다 큰 값이 들어오면 오류 발생
  • @Min(값) : 값보다 작은 값이 들어오면 오류 발생
// data3의 값이 10 미만이거나 100 초과인 경우 오류 발생
@Max(100)
@Min(10)
private String data3;

public String getData3() {
	return data3;
}

public void setData3(String data3) {
	this.data3 = data3;
}

 

 

  • @DecimalMax(value = 값, inclusive = true/false) : @Max와 같으나 inclusive가 false면 값이 같거나 큰 값이 들어온 경우 오류 발생, 즉 값이 100인 경우  100보다 작은 값이 들어와야 함 (생략 시 true)
  • @DecimalMin(value = 값, inclusive = true/false) : @Min과 같으나 inclusive가 false면 값이 같거나 값보다 작은 값이 들어온 경우 오류 발생, 즉 값이 10이면 10보다 큰 값이  들어와야 함(생략시 true)
// @Min, @Max와 같으나 inclusive가 false라면 값이 같거나 미만 혹은 초과하는 값이 들어온 경우 오류 발생
@DecimalMax(value = "100", inclusive = false)
@DecimalMin(value = "10", inclusive = false)
private String data4;

public String getData4() {
	return data4;
}

public void setData4(String data4) {
	this.data4 = data4;
}

 

 

  • @Null : 값이 Null이 아니라면 오류 발생
// data5의 값이 Null이 아니라면 오류 발생
@Null
private String data5;

public String getData5() {
	return data5;
}

public void setData5(String data5) {
	this.data5 = data5;
}

 

 

  • @NotNull : 값이 Null인 경우 오류 발생
// data6의 값이 Null인 경우 오류 발생
@NotNull
private String data6;

public String getData6() {
	return data6;
}
	
public void setData6(String data6) {
	this.data6 = data6;
}

 

 

  • @Digits(integer = 정수 자릿수, fraction = 실수 자릿수) : 지정된 자릿수를 초과한 경우 오류 발생
// data7에 정수 3자리 혹은 실수 3자리 이상의 값이 들어오면 오류 발생
@Digits(integer = 3, fraction = 3)
private String data7;

public String getData7() {
	return data7;
}

public void setData7(String data7) {
	this.data7 = data7;
}

 

 

  • @Size(max = 최대 값, min = 최소 값) : Bean의 값의 길이가 최소 값 미만이거나 최대 값 초과인 경우 오류 발생
// data8의 값의 길이가 2 자리 미만이거나 10 자리 초과인 경우 오류 발생
@Size(max = 10, min = 2)
private String data8;

public String getData8() {
	return data8;
}

public void setData8(String data8) {
	this.data8 = data8;
}

 

 

  • @Pattern(regexp = 정규식) : Bean의 값이 정규식을 위반하는 경우 오류 발생
// data9의 값이 소문자 a ~ z, 대문자 A ~ Z가 아닌 값이 들어오는 경우 오류 발생
@Pattern(regexp = "[a-zA-Z]*" )
private String data9;

public String getData9() {
	return data9;
}

public void setData9(String data9) {
	this.data9 = data9;
}

 

 

JSR - 303은 위와 같은 어노테이션들이 주로 쓰인다.

 

 


JSR - 380 어노테이션

  • @NotEmpty : 주입된 값의 길이가 0이면 오류 발생 (공백도 글자로 인정)
// data1의 값의 길이가 0이면 오류 발생 (공백도 문자로 취급)
@NotEmpty
private String data1;

public String getData1() {
	return data1;
}

public void setData1(String data1) {
	this.data1 = data1;
}

 

 

  • NotBlank : 주입된 값의 길이가 0이면 오류 발생 (공백은 문자취급 X)
// data2의 길이가 0인 경우 오류 발생 (공백은 문자취급X)
@NotBlank
private String data2;

public String getData2() {
	return data2;
}
    
public void setData2(String data2) {
	this.data2 = data2;
}

 

 

  • @Positive : 주입된 값이 양수가 아닌 경우 오류 발생 (자료형 int형이여야함)
// data3의 값이 양수 아닌 경우 오류 발생
@Positive
private int data3;

public int getData3() {
	return data3;
}

public void setData3(int data3) {
	this.data3 = data3;
}

 

 

  • @PositiveOrZero : 주입된 값이 0 또는 양수가 아닌 경우 오류 발생 (자료형이 int형이 여야함)
// data4의 값이 0 또는 양수가 아닌 경우 오류 발생
@PositiveOrZero
private int data4;

public int getData4() {
	return data4;
}

public void setData4(int data4) {
	this.data4 = data4;
}

 

 

  • @Negative : 주입된 값이 음수가 아닌 경우 오류 발생 (자료형 int형이 여야함)
// data5의 값이 음수가 아닌 경우
@Negative
private int data5;

public int getData5() {
	return data5;
}

public void setData5(int data5) {
	this.data5 = data5;
}

 

 

  • @NegativeOrZero : 주입된 값이 0 또는 음수가 아닌 경우 오류 발생  (자료형이 int형이 여야함)
// data6의 값이 0 또는 음수가 아닌 경우 오류 발생
@NegativeOrZero
private int data6;

public int getData6() {
	return data6;
}

public void setData6(int data6) {
	this.data6 = data6;
}

 

 

  • @Email : 주입된 값이 Email형식이 아닌 경우 오류 발생
// data7의 값이 Email 형식 (@)이 아닌 경우 오류 발생
@Email
private String data7;

public String getData7() {
	return data7;
}

public void setData7(String data7) {
	this.data7 = data7;
}

 

 

JSR - 380은 위와 같은 어노테이션들이 주로 쓰인다

 

 

 


Controller 클래스에서 유효성 검사 추가

클라이언트에 요청명에 매핑된 메서드의 매개변수에 @Valid 어노테이션을 주입 받음으로써 유효성 검사를 할 수 있다. 이때 매개변수에는 BindingResult 클래스도 같이 주입받으며 BindingResult 객체에 오류의 대한 정보가 들어오게 된다.

 

@Controller
public class TestController {

	@PostMapping("/input_pro")
	public String input_pro(@Valid DataBean1 dataBean1, BindingResult result) {
		
		if(result.hasErrors()) {
			return "input_data";
		}
		
		return "input_success";
	}
}

위의 코드는 input_pro 메서드의 커맨드 객체인 DataBean1의 프로퍼티에 자동으로 주입되는 값들이 프로퍼티에 설정한 JSR -303 혹은 JSR - 380 어노테이션에 위배되는 값이 들어와 오류가 발생한 경우 input_data.jsp를 요청하고 정당한 값이 들어와 오류가 없는 경우에는 input_success.jsp 요청하는 코드이다.

 

오류의 여부는 BindingResult객체의 hasErrors( ) 메서드를 통하여 확인할 수 있다.

 

 

 

본 포스팅은 필자가 공부한 내용을 정리한 포스팅으로 오류가 존재할 수 있습니다.
참고 : 인프런 - 만들면서 배우는 Spring MVC5
Comments