[포토그램] 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에 저장하기 위한 모든 준비가 완료되었다.
- Form 태그 입력결과를 SignupDto 객체로 받는다.
- SignupDto 객체를 Builder 를 활용해 User 객체로 변환한다.
(JPA로 User 테이블과 UserRepository가 생성되어있음) - UserService가 UserRepository의 메서드로 해당 2번의 User를 User 테이블에 삽입한다.
의존관계는 Service는 Repository를. Controller는 Service를 의존하게된다.
Author And Source
이 문제에 관하여([포토그램] 1. 회원가입 - Form 값 DB에 저장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kiwonkim/포토그램-1.-회원가입-모델-생성-DB-연동저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)