본문 바로가기

개발/Java & Spring

[Spring] Springboot에서 폼검증(@Valid) - 개발일기 A[7]

헬스일정예약관리 시스템에서 회원을 추가할 때 폼 검증을 수행하고 싶었다.

예전에 수업에서 실습해본적은 있는데, 그대로 따라해도 잘 안되고 ㅠ___ㅠ 

여러 구글링 + 내 예상(은근 잘먹힘)으로 진행해보았다.



compile('org.springframework.boot:spring-boot-starter-web')에는 자동으로 Hibernate Validator를 사용한다고 한다.

따라서 별도의 의존을 추가할 필요가 없다. 

(난 왜 추가 안 했는데도 되나 궁금했는데 ㅋㅋㅋ)


누누이 말하지만, 나는 프론트엔드에 약하고..

내 jsp파일은 매우 단순 그 자체이다. 그래서 인터넷에 떠도는 jquery/ jstl 범벅인 코드를 보고 따라하기가 너무 힘들다 ㅠ____ㅠ 



먼저 폼!


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="">
  <meta name="author" content="">
  <title>관리자페이지</title>
  <!-- Bootstrap core CSS-->
  <link href="${pageContext.request.contextPath}/resources/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  <!-- Custom fonts for this template-->
  <link href="${pageContext.request.contextPath}/resources/vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
  <!-- Page level plugin CSS-->
    <script>
    
    	var message='${message}';
    	if(message!="")
    		alert(message);
    </script>

</head>
<body>

<form:form method="post" modelAttribute="member" >
   <div class="container" style="padding-top:5%">
 	<div class="row">
 	<div class="col-md-3"></div>
 		<div class="col-md-6">
		     <div class="card">
		  <h5 class="card-header">회원추가</h5>
  		<div class="card-body">
            <div class="form-group">
              <label for="InputId">아이디</label>
              <form:input type="text" class="form-control" id="id" name="id"  placeholder="ID" path="id"/><p style="color:red"><form:errors path="id"/></p>
            </div>
            <div class="form-group">
              <label for="InputPassword">비밀번호</label>
              <form:input type="password" class="form-control" id="password"  name="password" placeholder="Password" path="password"/><p style="color:red"><form:errors path="password"/></p>       
            </div>
            <div class="form-group">
              <label for="InputName">이름</label>
              <form:input type="text" class="form-control" id="name" name="name"  placeholder="Name" path="name"/><p style="color:red"><form:errors path="name"/></p>          
            </div>
              <div class="form-group ">
                <div class="form-check">
          <input class="form-check-input" type="radio" name="gridRadios" id="gridRadios1" value="option1" checked>
          <label class="form-check-label" for="gridRadios1">
 	</form:form>
</body>
</html>

path="객체의 프로퍼티 이름" 을 잘 설정해 준다.


그리고 폼 태그에 modelAttribute="member"가 있는데, 내가 member라는 객체를 이 폼에 매핑한다는 뜻이다.


Member.class
@Data
public class Member extends Account{
	
	@NotNull(message="이 값은 비어있을 수 없습니다!!")@Pattern(regexp="^[0-7]*$", message="PT횟수를 선택해주세요!!")
	private int pt;
	@Size(min=2, max=5)@Pattern(regexp="^[ㄱ-ㅎ가-힣]*$", message="올바른 이름을 입력해주세요!!") @NotNull
	private String name;
	@NotNull(message="이 값은 비어있을 수 없습니다!!") 
	private String gender;
	@Pattern(regexp="^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$", message="올바른 전화번호를 입력해주세요!!") @NotNull
	private String phone_number;
	private String center_id;
}
@NotNull, @Size, @Pattern 등이 제공해주는 검증 조건이다. 
직접 만들어서 할 수도 있지만, 사실 제공해주는 것만으로도 충분할 것 같다.


Controller.java


@GetMapping("/manager/addUser")
	public String addUserByGet(Model model){
		model.addAttribute("member",new Member());
		return "manager/addUser";
	}
	
	@PostMapping("/manager/addUser")
	public String addUserByPose(@Valid Member member,BindingResult bindingResult, Model model){
		if(bindingResult.hasErrors()){
			logger.info(bindingResult.getAllErrors().get(0).getDefaultMessage());
			
			return "/manager/addUser";
		}
		Account account=new Account();
		account.setId(member.getId());
		account.setPassword(member.getPassword());
		member.setCenter_id(this.manager.getCenter_id());
		try{
			accountService.save(account, "ROLE_MEMBER", "MEMBER");
			memberMapper.insertMember(member);
		}catch(Exception ex){
			ex.printStackTrace();
			model.addAttribute("message","사용자 추가 에러!!!");
			return "/manager/addUser";
		}
		
		model.addAttribute("message","정상적으로 등록되었습니다.");
		return "/manager/addUser";
	}
GetMapping 에 빈 객체를 전달해주지 않으면 에러가나니 주의한다. 
PostMapping에서 검증하려는 객체 앞에 @Valid를 달아주면 그 결과가 BindingResult로 넘어온다. 
아래 코드에서 에러 발생 시 다시 페이지! 로 가면


완성