본문으로 바로가기

Validator를 이용한 회원가입 http://to-dy.tistory.com/33?category=700248 )을 했다면 이번엔 Hibernate를 이용하여 회원가입을 해본다. 이전것을 수정하는 거라서.. 이전 자료는 꼭 참고하자. 둘의 차이를 간단하게 말하면 Validator는 클래스를 만들어 검증을 한다면, Hibernate는 데이터를 받을 때 VO에서 자동으로 검증한다. 뭐가 좋은지는 모르겠다. 편한 걸 쓰자. 두 개의 차이는 검색하면 나온다. 다음에 정리해야지.



1) Hibernate 의존성 추가

pom.xml

1
2
3
4
5
6
7
8
9
10
11
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.5.6-Final</version>
        </dependency>  
 
        <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-validator</artifactId>
           <version>6.0.9.Final</version>
        </dependency>
cs



2) RegisterRequest.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package tody.lovely.util;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
 
@Entity
public class RegisterRequest {
    
    @Column
    @NotEmpty(message="이메일을 입력해주세요.")
    @Email(message="이메일 형식에 맞춰 올바르게 입력해주세요.")
    private String email;
    
    @Column
    //@NotEmpty(message="아이디를 입력해주세요.")
    @Pattern(regexp="\\w{4,8}", message="아이디를 4~8자로 입력해주세요.")
    private String id;
    
    @Column
    //@NotEmpty(message="이름을 입력해주세요.")
    @Pattern(regexp="\\S{2,8}", message="이름을 공백없이 2~6자로 입력해주세요.")
    private String name;
    
    @Column
    //@NotEmpty(message="비밀번호를 입력해주세요.")
    @Size(min=4, max=12, message="비밀번호를 4~12자로 입력해주세요.")
    private String pw;
    
    @Column
    //@NotEmpty(message="비밀번호를 입력해주세요.")
    @Size(min=4, max=12, message="비밀번호를 4~12자로 입력해주세요.")
    private String checkPw;
    
    //비밀번호 확인
    public boolean isPwEqualToCheckPw() {
        return pw.equals(checkPw);
    }
 
    /* Getter, Setter 생략 */
 
}
 
cs

RegisterRequest에서 유효성 검사를 한다. 데이터로 넘어가기 전에 검증을 하고 넘어가게 된다. 컬럼들을 선언한 것 위에 @어노테이션들이 잔뜩 생겼다. Validator를 만들지 않고 간단하게 검증을 할 수 있다. null, 길이(size), 정규표현식, 칼럼 등등을 체크할 수 있고, 조건에 맞지 않으면 message를 BindingResult에 담겨서 보내진다. 


Hibernate Annotation : https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/?v=6.0#section-builtin-constraints

정규표현패턴 : https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html



3) UserController.java 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    @RequestMapping("/register/step3")
    public ModelAndView step3(@Valid RegisterRequest regReq, BindingResult bindingResult) throws Exception{
        
        //@Valid 검증        
        if(bindingResult.hasErrors()) {
            ModelAndView mv = new ModelAndView("user/register/step2");
            return mv;
        }
 
        //비밀번호 확인
        boolean check = regReq.isPwEqualToCheckPw();
        if(!check) {
            bindingResult.rejectValue("checkPw""noMatch""비밀번호를 확인해주세요.");
            ModelAndView mv = new ModelAndView("user/register/step2");
            return mv;
        }
        
        try {
            userSer.register(regReq);
        } catch (AlreadyExistingEmailException e) {
            bindingResult.rejectValue("email""duplicate""이미 가입된 이메일입니다.");
            ModelAndView mv = new ModelAndView("user/register/step2");
            return mv;
        } catch (AlreadyExistingIdException e) {
            bindingResult.rejectValue("id""duplicate""이미 가입된 아이디입니다.");
            ModelAndView mv = new ModelAndView("user/register/step2");
            return mv;
        }
 
        ModelAndView mv = new ModelAndView("user/register/step3");
        return mv;
    }
cs

다른건 변함없고 요청 URL /register/step3 만 변화가 생겼다. 비슷하니까 추가된 부분만 보자.

- 2행 : @Valid 어노테이션이 추가되었다. 이것으로 인해 아래 로직이 실행되기 전에 RegisterRequest에서 유효성 검사를 하고 BindingResult에 그 결과가 담긴다.

- 11~16행 : 비밀번호 확인 부분이다. 원래는 RegisterRequestValidator 클래스에 있었던 부분이다.


Service, ServiceImpl, VO, DAO, SQL 등은 변함 없다. 비밀번호 확인때문에 Validator를 쓰는 게 여기서는 더 맞는 거 같다. 두개의 차이는 별로 없다. 뭐가 더 좋은지, 어떤 게 좋은지는 각자 판단하고 원하는 걸 쓰면 된다.