이제 시큐리티 사용해서 회원가입 기능을 만들어보자
1. 프론트에서 막아준다.
maxlength, required!!
form 태그로 요청할 수 있는데 굳이 ajax를 사용할 필요 없다!
form 태그로 요청하면 타입은 x-www-form-urlencoded!!
회원가입할 때 컨트롤러에서 받을 값은 3개(username, password, email),
유저 오브젝트로는 3개 값만 받을 수 없으니까 Dto를 만들어준다.
회원가입을 할 때 서버 입장에서 필요한 건 요청받는 Dto이다.
이름을 joinReqDto라고 만들자.
Req는 Request의 약자이다.
Dto에서 엔티티로 변환하는 방법을 알아보자.
1. 생성자로 만들어서 넣는 방법 -> 인수를 넣어주는 순서가 중요!
public class JoinReqDto {
private String username;
private String password;
private String email;
public User toEntity() {
User user = new User(null, username, password, email, null, null);
return user;
}
}
이렇게 생성자에 주입이 가능한 이유
=> id를 Integer로 만들었기 때문!!
만약 id를 int로 만들었다면 null을 넣지 못하고 숫자를 넣어주어야 한다.
생성자를 넣을 때 인수의 타입이 int라면 id를 빼고 생성자를 새로 만들어서 오버로딩 해야한다.
그러면 id가 null 이니까 auto increment로 알아서 들어간다.
생성자를 또 만들어야 하니까 너무 귀찮다.
null을 허용하기 위해 Integer를 사용한 것이다.
id는 Wrapper 클래스로 만들어야 한다.
2. 컴파일 시에 에러를 찾지 못한다.
@AllArgsConstructor
@NoArgsConstructor
@Data // Getter(필수), Setter, toString
public class JoinReqDto {
private String username;
private String password;
private String email;
public User toEntity() {
User user = new User(null, password, username, email, null, null);
return user;
}
}
인수를 주입하는 순서가 뒤죽박죽 되어도 에러를 찾지 못해 위험하다.
3. Setter를 사용한다.
@AllArgsConstructor
@NoArgsConstructor
@Data // Getter(필수), Setter, toString
public class JoinReqDto {
private String username;
private String password;
private String email;
public User toEntity() {
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
return user;
}
}
생성자에 직접 주입하는 것보다 안전하고, 넣고 싶은 필드만 넣어줄 수 있지만 코드가 지저분해진다.
4. 빌더 패턴을 사용한다.
User 클래스에 @Builder 어노테이션 추가
static 메서드인 User.builder( ) 메서드를 사용한다.
@AllArgsConstructor
@NoArgsConstructor
@Data // Getter(필수), Setter, toString
public class JoinReqDto {
private String username;
private String password;
private String email;
public User toEntity() {
User user = User.builder()
.username(username)
.password(password)
.email(email)
.build();
return user;
}
}
코드가 한 줄로 끝난다.
필요한 것만 넣어줄 수 있고, 순서도 상관없다.
테스트 파일은 이름의 끝에 ~~Test 라고 붙여주는 게 관례이다.
빌더 패턴의 원리를 알아보자.
package site.metacoding.blogv3;
import org.junit.jupiter.api.Test;
class Person {
private String username;
private String password;
public Person username(String username) {
this.username = username;
return this;
}
public Person password(String password) {
this.password = password;
return this;
}
public static Person builder() {
return new Person();
}
}
public class BuilderTest {
@Test
public void 빌더_테스트() {
Person person = Person.builder().username("ssar").password("1234");
}
}
Person 클래스의 username( ), password( ) 메서드의 핵심은 자기 자신을 리턴해주는 것이다.
이게 빌더이다.
- 내가 넣고 싶은 필드 값만 넣을 수 있다.
- 순서에 상관이 없다.
- 컴파일 시에 오류를 잡아낼 수 있다.
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9