스프링 시큐리티를 통해 비인증된 회원을 회원가입창으로 Redirection 하고. CSRF 토큰을 제거했다.
이제 회원가입 창에 입력한 정보를 DB에 저장해보자.
회원가입창의 Form에 입력한 데이터를 저장할 Dto 객체이다.
Setter 를 만들면 컨트롤러의 파라미터로 사용할 때
AuthController 클래스이다.
/auth/signin 이 들어오면 로그인html파일을. /auth/signup 이 들어오면 회원가입html파일을 준다.
Post 방식으로 /auth/signup이 오면. 즉 폼에 값이 입력되어오면 폼 값을 SignupDto 객체에 담아 활용한다.
사용자 정보를 저장하는 User는 Form 태그로 입력한 것 뿐 아니라 더 많은 필드를 갖는다.
우리는 이 User 을 객체 뿐 아니라 RDBMS 의 Entity 로도 사용할 것이다.
따라서 ORM 기술인 JPA를 이용해 해당 객체를 Entity화 하겠다.
@Entity
객체를 DB에 테이블로 생성해준다.
@Id
Primary Key가 될 속성을 가리킨다.
@GeneratedValue
자동으로 값을 만들 속성의 방식을 지정한다.
@Column
열 제약조건을 건다.
@PrePersis
DB에 Insert 되기 직전에 실행할 메서드를 지정한다. 여기서는 날짜 필드의 값을 정하기 위해 사용하였다.
리포지토리란?
위에서 ORM 기술인 JPA로 User 객체를 테이블화 하였다. 즉 User 테이블이 존재하는 것인데, 이 테이블에 CRUD를 수행하려면 어떻게 해야할까? EntityManager 객체로 쿼리를 만들어야될 것이다.
하지만 JPA는 JpaRepository를 상속하고 <객체클래스,ID클래스> 를 입력하는 것만으로 해당 테이블에 기본적인 CRUD를 제공한다.
이제 SignupDto의 값들을 대입한 User 객체를 생성해야한다.
이때 자바의 Builder 패턴을 사용한다.
public class User {
private String name;
private int age;
public static UserBuilder builder() {
return new UserBuilder();
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
public class UserBuilder {
private String name;
private int age;
public User build() {
User user = new User();
user.setName(this.name);
user.setAge(this.age);
return user;
}
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
}
Builder 패턴은 객체의 필드를 대입하기 위한 패턴이다.
위와 같이 builder() 로 Builder 객체를 생성하고,
.필드명(변수) 로 Builder 객체의 필드에 값들을 대입하며,
.build() 메서드로 Builder 객체의 값을 원 객체에 대입하여 반환한다.
Builder 객체 생성 -> Builder 객체 값 대입 -> 원 객체 값 대입 -> 원 객체 반환
User 클래스를 보면 @Builder가 추가되어있다.
Lombok이 위의 Builder를 자동으로 추가해준다.
SignupDto 클래스이다. toEntity 메서드로 Builder 를 통해 SignupDto 의 필드를 담은 User 객체를 생성한다.
AuthService는 UserRepository 로 DB에 User 객체를 저장한다.
현재 비밀번호가 그대로 노출되는 문제가 있다. 비밀번호와 Role을 추가해보자.
SecurityConfig에서 암호화에 사용하는 BCrptPasswordEncoder 객체를 스프링빈으로 등록한다.
AuthService에서 빈으로 등록된 BCryptPasswordEncoder 를 주입받고, 회원가입 할 User 객체에서 password만 암호화 후 userRepository.save를 진행시킨다.
DB에서 확인해보면 비밀번호가 제대로 암호화된 것을 확인할 수 있다.
Form 태그 입력 결과를 DB에 저장하기 위한 모든 준비가 완료되었다.
의존관계는 Service는 Repository를. Controller는 Service를 의존하게된다.