Develop

[Spring-Boot] Bean Validator 라이브러리 이용하여 유효성 검사하기 본문

웹 개발/Spring

[Spring-Boot] Bean Validator 라이브러리 이용하여 유효성 검사하기

개발 기록 2024. 3. 7. 21:19

<form:form> 태그를 사용해봤으니

이제 Bean Validator 라이브러리 이용하여 유효성을 검사해보겠다

 


 

먼저 사용하기 전에 pom.xml에  Maven Dependency를 추가해야한다.

 

<!-- validation -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 

 


 

1. VO에 유효성 검사 규칙 추가하기

 

어노테이션을 이용하여 간단하게 검사 규칙을 추가할 수 있다

 

noticeVO

package com.example.demo.domain;


import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;

import org.apache.ibatis.type.Alias;

import lombok.Data;

@Data
@Alias("noticeVO")
public class NoticeVO {
	
	private int noNum; // 게시글 번호(AI) no_num
	
	//@NotBlank(message="제목을 입력해주세요.")
	@Pattern(regexp = "[a-zA-Z0-9ㄱ-힣]{1,30}", message = "최소 1자, 최대 30자까지 입력 가능하며 영문, 숫자, 한글만 입력 가능합니다.")
	private String noTitle; // 제목
	
	//@NotBlank(message="내용을 입력해주세요.")
	@Pattern(regexp = "[a-zA-Z0-9ㄱ-힣]{1,300}", message = "최소 1자, 최대 300자까지 입력 가능하며 영문, 숫자, 한글만 입력 가능합니다.")
	private String noContent; // 내용
	
	private String noFile; // 파일 경로
	private String noState; // 글 상태
	
	
}

 

나는 pattern을 이용하였다.

뒤에오는 message는 해당 유효성 검사를 통과하지 못했을 때 나타나는 메세지이다.

 

 

빈 밸리데이터 어노테이션 종류

@Null  // null만 혀용한다.
@NotNull  // null을 허용하지 않는다. "", " "는 허용한다.
@NotEmpty  // null, ""을 허용하지 않습니다. " "는 허용한다.
@NotBlank  // null, "", " " 모두 허용하지 않는다.

@Email  // 이메일 형식을 검사한다. 다만 ""의 경우를 통과 시킨다. @Email 보다 아래 나올 @Patten을 통한 정규식 검사를 더 많이 사용한다.
@Pattern(regexp = )  // 정규식을 검사할 때 사용된다.
@Size(min=, max=)  // 문자길이를 제한할 때 사용하며, int는 불가다

@Max(value = )  // 숫자 value 이하의 값을 받을 때 사용된다.
@Min(value = )  // 숫자 value 이상의 값을 받을 때 사용된다.

@Pattern(regexp = )	// 정규표현식으로 검증식 세울 수 있다.

@Positive  // 값을 양수로 제한한다.
@PositiveOrZero  // 값을 양수와 0만 가능하도록 제한한다.

@Negative  // 값을 음수로 제한한다.
@NegativeOrZero  // 값을 음수와 0만 가능하도록 제한한다.

@Future  // 현재보다 미래
@Past  // 현재보다 과거

@AssertFalse  // false 여부, null은 체크하지 않는다.
@AssertTrue  // true 여부, null은 체크하지 않는다.

@Valid	// 해당 object validation 실행

 


 

 

2. Controller 수정

 

Controller

// 글쓰기 POST
@PostMapping("/write")
public String writePOST(@Valid @ModelAttribute("noticeVO") NoticeVO noticeVO, BindingResult bindingResult) throws Exception {
    logger.info("글 정보 noticeVO : " + noticeVO);

    // 검증 실패시 다시 입력 페이지로 
    if(bindingResult.hasErrors()) {
        logger.info("errors={}", bindingResult);
        return "/notice/write";
    }

    // 검증 성공시
    nService.write(noticeVO);
    return "redirect:/notice/main";
}

 

 

1. 매개변수 앞에 @Valid 어노테이션을 달아줘야한다.

@Valid @ModelAttribute("noticeVO") NoticeVO noticeVO

 

2. 매개변수 뒤에 BindingResult를 추가해야한다.

(꼭 유효성 검사를 하는 매개변수 뒤쪽에 추가해야함!)

BindingResult bindingResult

 

3. 컨트롤러 안에 검증 실패시 다시 입력 폼이 있는 페이지로 가도록 한다.

// 검증 실패시 다시 입력 페이지로 
if(bindingResult.hasErrors()) {
    logger.info("errors={}", bindingResult);
    return "/notice/write";
}

 


 

3. view단에 에러메세지 위치 추가

 

JSP

<body>
	<h1>write.jsp</h1>
	
	<form:form action="/notice/write" method="post" modelAttribute="noticeVO" enctype="">
		제목 <form:input path="noTitle" placeholder="제목"/> 
		<form:errors path="noTitle" class="error_text"/> <br><br>
		내용 <form:textarea path="noContent" />
		<form:errors path="noContent" class="error_text"/> <br>
		<br>
		<hr>
		<input type="submit" value="등록하기">
		<input type="button" value="돌아가기" onclick="location.href='/notice/main'">
	</form:form>

</body>

 

 

유효성 검사를 통과하지 않았을 때 나오는 메세지를 

어디다가 표현할 것인지 적어줘야한다.

<form:errors path="noTitle" class="error_text"/>

 

noTitle 이 유효성 검사를 통과하지 못했을 때 에러메세지는 여기에 나타난다.

 


 

결과

 

 

 

+) 나는 class="error_text" 를 통해 메세지를 빨간색으로 바꿔주었다.

<style>
.error_text{
	color: RED;
}

 

 


 

참고한 글

 

[Spring Boot] Validation 적용하는 법 - BindingResult 적용하기 (velog.io)

 

[Spring Boot] Validation 적용하는 법 - BindingResult 적용하기

spring boot 2.3 version 이상부터는 spring-boot-starter-web 의존성 내부에 있던 validation이 사라졌습니다.때문에 사용하시는 spring boot version이 2.3 이상이라면 validation 의존성을 따로 추가해주셔야

velog.io