오늘은 spring에서 유효성 검사를 배우고, 실제로 적용해보는 연습을 했다.
유효성 검사란..
위의 사진 처럼 데이터가 유효한 데이터 인지 아닌지 확인해주는 기능을 의미한다.
validation을 사용하려면 먼저 셋팅이 되어 있어야 한다.
1. application-conetext
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
p:basename="/WEB-INF/message"
/>
사용자가 지정한 메세지를 출력하기 위해서 위와 같은 MessageSource 클래스를 받아온다.
2. web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListner를 web.xml에 추가한다.
3. pom.xml
<!-- validate -->
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<!-- jackson -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
maven repository에서 라이브러리들을 가져와서 추가해줘야 한다. validation, hibernate, jackson core, databind, mapper를 가지고 왔다.
그리고 form validation 검사를 해줄 formData 클래스를 만들어준다
package com.sist.web;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
public class FormData {
@NotNull
private String id;
@NotBlank
private String pwd;
@NotEmpty
private String name;
@Email
private String email;
@Min(20)
@Max(50)
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
어노테이션을 사용해서 각변수의 validation을 지정할 수 있다.
package com.sist.web;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
/*
* public String join(@ModelAttribute("vo") MemberVO vo)
*
*/
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class JoinController {
@ModelAttribute
public FormData formData()
{
return new FormData();
}
@GetMapping("join/form.do")
public String form() // 입력창 (회원가입, 로그인, 글쓰기, 수정하기...) => 유효성 검사(Validation)
{
return "join/form";
}
@PostMapping("join/form.do")
public String submit(@ModelAttribute @Valid FormData formData, Errors erros, Model model)
{
if(erros.hasErrors()) return "join/form";
model.addAttribute("vo", formData);
return "join/submit";
}
}
modelAttribute로 어노테이션을 올려 formData 클래스를 생성해주고, 메모리를 할당한다.
창을 띄워주기 위해 getmapping을 써주고, postmapping으로는 데이터 값을 받아와서 처리를 해줄 수 있도록 만든다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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 http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form:form modelAttribute="formData" method="POST">
<p>
<label>ID<br>
<form:input path="id"/>
<form:errors path="id"/>
</p>
<p>
<label>Password<br>
<form:input path="pwd"/>
<form:errors path="pwd"/>
</p>
<p>
<label>Name<br>
<form:input path="name"/>
<form:errors path="name"/>
</p>
<p>
<label>Age<br>
<form:input path="age"/>
<form:errors path="age"/>
</p>
<p>
<label>Email<br>
<form:input path="email"/>
<form:errors path="email"/>
</p>
<input type="submit" value="전송">
</form:form>
</body>
</html>
사용자로부터 값을 받아오는 창
만약 여기서 옳지 않은(=유효하지 않은) 데이터가 입력되면, 아래와 같이 창이 뜨게된다.
맨위와는 달리 직접 설정해준 메세지가 넘어오고 있다.
실제 사이트 회원가입에 적용해보면 이런 느낌이다.
@PostMapping("member/join.do")
public String member_join_ok(@ModelAttribute @Valid MemberVO memberVO,Errors errors,Model model)
{
if(errors.hasErrors())
{
model.addAttribute("main_jsp", "../member/join.jsp");
return "main/main";
}
return "redirect:../main/main.do";
}
컨트롤러에서는 값을 이렇게 처리해주고 있다.
'programming > Gukbi' 카테고리의 다른 글
국비 교육 95일차 - vue 활용 검색페이지 만들기 (0) | 2021.05.14 |
---|---|
국비 교육 93일차 - VueJS (0) | 2021.05.11 |
국비 교육 91일차 - 검색 기능 완성 (0) | 2021.05.07 |
국비 교육 89일차 - 차세대 개발, java로만 spring 개발하기 (0) | 2021.05.03 |
국비 교육 88일차 - ajax이용 댓글창 띄우기 (0) | 2021.05.01 |