헬스일정예약관리 시스템에서 회원을 추가할 때 폼 검증을 수행하고 싶었다.
예전에 수업에서 실습해본적은 있는데, 그대로 따라해도 잘 안되고 ㅠ___ㅠ
여러 구글링 + 내 예상(은근 잘먹힘)으로 진행해보았다.
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로 넘어온다.
아래 코드에서 에러 발생 시 다시 페이지! 로 가면
완성