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를 쓰는 게 여기서는 더 맞는 거 같다. 두개의 차이는 별로 없다. 뭐가 더 좋은지, 어떤 게 좋은지는 각자 판단하고 원하는 걸 쓰면 된다.
'공부 > Spring' 카테고리의 다른 글
Spring 개발 - HandlerMethodArgumentResolver 적용하기 (0) | 2018.09.13 |
---|---|
스프링(Spring) 개발 - 로그인, 로그아웃 하기 (61) | 2018.05.11 |
스프링(Spring) 개발 - Validator를 이용한 회원가입 만들기 (50) | 2018.05.09 |
스프링(Spring) 설정 - MySQL을 사용하여 마이바티스(MyBatis) 연동하기 (8) | 2018.05.02 |
스프링(Spring) 설정 - 인터셉터(Interceptor) 설정 (60) | 2018.04.26 |