[포토그램] 1. 회원가입 - Form 값 DB에 저장

이전 포스팅

스프링 시큐리티를 통해 비인증된 회원을 회원가입창으로 Redirection 하고. CSRF 토큰을 제거했다.

이제 회원가입 창에 입력한 정보를 DB에 저장해보자.



Form 입력 값 저장할 SignupDto 객체

회원가입창의 Form에 입력한 데이터를 저장할 Dto 객체이다.
Setter 를 만들면 컨트롤러의 파라미터로 사용할 때



컨트롤러 생성

AuthController 클래스이다.
/auth/signin 이 들어오면 로그인html파일을. /auth/signup 이 들어오면 회원가입html파일을 준다.
Post 방식으로 /auth/signup이 오면. 즉 폼에 값이 입력되어오면 폼 값을 SignupDto 객체에 담아 활용한다.



User 객체

사용자 정보를 저장하는 User는 Form 태그로 입력한 것 뿐 아니라 더 많은 필드를 갖는다.
우리는 이 User 을 객체 뿐 아니라 RDBMS 의 Entity 로도 사용할 것이다.
따라서 ORM 기술인 JPA를 이용해 해당 객체를 Entity화 하겠다.

@Entity

객체를 DB에 테이블로 생성해준다.

@Id

Primary Key가 될 속성을 가리킨다.

@GeneratedValue

자동으로 값을 만들 속성의 방식을 지정한다.

@Column

열 제약조건을 건다.

@PrePersis

DB에 Insert 되기 직전에 실행할 메서드를 지정한다. 여기서는 날짜 필드의 값을 정하기 위해 사용하였다.



UserRepository 생성

리포지토리란?

위에서 ORM 기술인 JPA로 User 객체를 테이블화 하였다. 즉 User 테이블이 존재하는 것인데, 이 테이블에 CRUD를 수행하려면 어떻게 해야할까? EntityManager 객체로 쿼리를 만들어야될 것이다.
하지만 JPA는 JpaRepository를 상속하고 <객체클래스,ID클래스> 를 입력하는 것만으로 해당 테이블에 기본적인 CRUD를 제공한다.



Builder 패턴으로 SignupDto 담은 User 객체 생성

이제 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

AuthService는 UserRepository 로 DB에 User 객체를 저장한다.

  • AuthService 클래스를 생성한다.
  • RequiredArgsConstructor 어노테이션 덕분에 Service는 필드인 Repository를 자동으로 주입받는다.
  • @Transactional 어노테이션은 DB의 Write, Delete, Insert 시 트랜잭션을 보장해준다.
  • 회원가입 메서드는 파라미터 user를 User 테이블에 저장 후 반환한다.


비밀번호 해시

현재 비밀번호가 그대로 노출되는 문제가 있다. 비밀번호와 Role을 추가해보자.

SecurityConfig에서 암호화에 사용하는 BCrptPasswordEncoder 객체를 스프링빈으로 등록한다.

AuthService에서 빈으로 등록된 BCryptPasswordEncoder 를 주입받고, 회원가입 할 User 객체에서 password만 암호화 후 userRepository.save를 진행시킨다.

DB에서 확인해보면 비밀번호가 제대로 암호화된 것을 확인할 수 있다.



최종적으로 Controller 에서 저장

Form 태그 입력 결과를 DB에 저장하기 위한 모든 준비가 완료되었다.

  1. Form 태그 입력결과를 SignupDto 객체로 받는다.
  2. SignupDto 객체를 Builder 를 활용해 User 객체로 변환한다.
    (JPA로 User 테이블과 UserRepository가 생성되어있음)
  3. UserService가 UserRepository의 메서드로 해당 2번의 User를 User 테이블에 삽입한다.

의존관계는 Service는 Repository를. Controller는 Service를 의존하게된다.


좋은 웹페이지 즐겨찾기