Search

21. 스프링부트 포토그램 인증 회원가입 유효성 검사하기

포토그램 인증 구현하기

회원가입 구현

전처리하기

AuthController.java
예시로 진행.
//회원가입버튼 -> /auth/signup/ -> /auth/signin @PostMapping("/auth/signup") public String signup(SignupDto signupDto) { //key=value (x-www-form-urlencoded) if(signupDto.getUsername().length() >20) { System.out.println("너 길이 초과했어"); } //User <- SignupDto User user = signupDto.toEntity(); User userEntity = authService.회원가입(user); System.out.println(userEntity); return "auth/signin"; }
Java
복사
유저명에 대한 밸리데이션 체크를 위해 길이 초과에 대한 로그를 잠깐 찍어보자.
유저명을 길게 작성 후 가입하면
오류나면서 콘솔에 가보면
잘 찍혀서 나온다
//회원가입버튼 -> /auth/signup/ -> /auth/signin @PostMapping("/auth/signup") public String signup(SignupDto signupDto) { //key=value (x-www-form-urlencoded) //log.info(signupDto.toString()); if(signupDto.getUsername().length() >20) { System.out.println("너 길이 초과했어"); }else { //User <- SignupDto User user = signupDto.toEntity(); //log.info(user.toString()); User userEntity = authService.회원가입(user); System.out.println(userEntity); return "auth/signin"; } return ""; }
Java
복사
그러면 if else 추가로 실패랑 성공을 따로 처리하면 컨트롤러가 너무 복잡해진다.
(유저명말고도 다른것도 다 밸리체크를 해줘야하기때문에)
전처리를 효율적이게 처리하기 위해서 라이브러리가 필요하다.
validation치고 해당 spring boot starter validation 선택
그냥 사람들이 제일 많이 다운받은 최신버전으로 선택.
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>3.1.2</version> </dependency>
XML
복사
복사해서 pom.xml에 복사해서 붙여 넣어주자. 저장하면 라이브러리가 다운된다
라이브러리 추가하고 나면은
AuthController.java에서 signup함수의 매개변수에 Valid 라는 어노테이션을 추가할 수 있다.
@PostMapping("/auth/signup") public String signup(@Valid SignupDto signupDto) { User user = signupDto.toEntity(); User userEntity = authService.회원가입(user); System.out.println(userEntity); return "auth/signin"; }
Java
복사
SignupDto에 대한 밸리데이션을 체크한다는 뜻이다
그리고 SignupDto에 들어가서
package com.cos.photogramstart.web.dto.auth; import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; import com.cos.photogramstart.domain.user.User; import lombok.Data; @Data //Getter, Setter public class SignupDto { @Max(20) private String username; @NotBlank private String password; @NotBlank private String email; @NotBlank private String name; public User toEntity() { return User.builder() .username(username) .password(password) .email(email) .name(name) .build(); } }
Java
복사
유저의 길이 제한에 대한 @Max
패스워드, 이메일, 이름 에 대한 필수값 체크 @NotBlank
Valid 어노테이션에 대해 요 블로그에 자세히 설명되어 있다!
User.java로 넘어와서 valid 어노테이션이 상관없이 데이터베이스 어노테이션이랑 연관되어있는데
@Column(nullable = false) private String password; //패스워드
Java
복사
null이 가능한지에 대한 여부를 묻는 어노테이션을 추가해준다.
@Builder @AllArgsConstructor //전 생성자 @NoArgsConstructor //빈 생성자 @Data //Getter, Setter @Entity // 디비에 테이블을 생성 public class User { @Id //Primart Key(기본키)로 설정 @GeneratedValue(strategy = GenerationType.IDENTITY) //번호 증가 전략이 데이터베이스를 따라간다. private int id; @Column(length=20, unique = true) private String username; //유저아이디 @Column(nullable = false) private String password; //패스워드 @Column(nullable = false) private String name; //이름 private String website; //웹사이트 private String bio; //자기소개 @Column(nullable = false) private String email; //이메일 private String phone; //전화번호 private String gender; //성별 private String profileImageUrl; //사진 private String role; //권한 private LocalDateTime createDate; @PrePersist //DB INSERT 되기 직전에 실행 public void createDate() { this.createDate = LocalDateTime.now(); } }
Java
복사
저장하고나면 스키마가 안바뀌니까 다시 application.yml에서 create로 바꾸고 저장하고 다시 update로 변경
Hibernate: drop table if exists User Hibernate: create table User (id integer not null auto_increment, bio varchar(255), createDate datetime(6), email varchar(255) not null, gender varchar(255), name varchar(255) not null, password varchar(255) not null, phone varchar(255), profileImageUrl varchar(255), role varchar(255), username varchar(20), website varchar(255), primary key (id)) engine=InnoDB Hibernate: alter table User add constraint UK_jreodf78a7pl5qidfh43axdfb unique (username)
Java
복사
콘솔에 보면 not null 추가된걸 볼 수 있다.
AuthController.java
signup함수의 매개변수에 @Valid 추가 옆에 BindingResult 클래스를 추가해준다
public String signup(@Valid SignupDto signupDto, BindingResult bindingResult ) {
Java
복사
@Valid SignupDto signupDto 에서 오류가 발생하면 BindingResult bindingResult에서 다 모아준다.
bindingResult.getFieldErrors()에 다 담아서 모아주기때문에 해당 함수를 사용해서 에러문구 출력한다.
//에러가 존재한다 if(bindingResult.hasErrors()) { Map<String, String> errorMap = new HashMap<>(); for(FieldError error :bindingResult.getFieldErrors()) { errorMap.put(error.getField(), error.getDefaultMessage()); System.out.println("======================"); System.out.println(error.getDefaultMessage()); System.out.println("======================"); } }
Java
복사
그전에 셋팅에서 Run > Console > buffer size를 조금 더 늘려주자.
서버를 다시 껏다가 켜서 회원가입을 해보자
콘솔창에도 오류문구가 잘 찍혀 나온다.
오류가 나오는 애들은 굳이 INSERT 해줄 필요가없다.
그래서 해당부분의 분기를 처리해주도록하자.

*참고