회원가입으로 받은 데이터(SignupDto)를 User Entity로 변환하여 DB에 저장한다
1. Builder 패턴 사용
Dto 데이터를 오브젝트에 담기 쉬운 방법으로 Builder 패턴을 사용하는 방법이다.
lombok이 지원해주는 어노테이션 @Builder를 User.java에 추가한다.
SignuDto.java에 builder패턴 메서드를 생성한다.
package com.GStagram.domain.auth;
import com.GStagram.model.User;
import lombok.Data;
@Data // Getter, Setter
public class SignupDto {
private String username;
private String password;
private String email;
private String name;
public User toEntity() {
return User.builder()
.username(username)
.password(password)
.email(email)
.name(name)
.build();
}
}
위와 같이 toEntity를 생성하면 Dto가 가지고 있는
username, password, email, name 데이터를 기반으로한 User 객체가 생성된다.
Dto가 가지고 있는 데이터를 그대로 User 오브젝트에 담아서 return 해주기 때문에
컨트롤러에서 toEntity를 가지고 데이터를 불러오면 된다.
AuthController.java
@PostMapping("/auth/signup")
public String signup(SignupDto signupDto) { // key = value (x-www-form-urlencoded)
log.info(signupDto.toString());
User user = signupDto.toEntity();
log.info(user.toString());
return "auth/login"; // 회원가입이 완료되면 로그인 페이지로 이동한다.
}
클라이언트가 입력한 데이터를 Dto를 통해서 받아온 로그
2022-10-25 08:26:00.124 INFO 45675 --- [nio-8080-exec-2] com.GStagram.domain.auth.AuthController : SignupDto(username=qwe2487, password=1234, email=repeater2487@naver.com, name=이민혁)
Builder 패턴을 이용하여 Dto 데이터를 User 오브젝트에 담은 로그
2022-10-25 08:26:00.163 INFO 45675 --- [nio-8080-exec-2] com.GStagram.domain.auth.AuthController : User(id=null, username=qwe2487, password=1234, name=이민혁, website=null, bio=null, email=repeater2487@naver.com, phone=null, gender=null, prifileImageUrl=null, role=null, createDate=null)
-> toEntity에 담긴 username, password, email, name은 정상적으로 받아와졌고, 나머지 값들은 null 값
2. 회원가입 Service 생성
AuthService.java
package com.GStagram.domain.auth;
import com.GStagram.model.User;
import org.springframework.stereotype.Service;
@Service
public class AuthService {
//회원 가입 진행
public void signupReg(User user) {
}
}
-> @Service 어노테이션을 걸어주면 IoC 컨테이너에 등록이 되면서, Transection 관리까지 해주게 된다.
Service를 완성하는데엔 Repository가 필요하기 때문에 UserRepository.java 클래스를 생성한다.
UserRepository.java
package com.GStagram.repository;
import com.GStagram.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
-> 원래는 @Repository 어노테이션을 걸어주어야 하지만, 부모클래스인 JpaRepository가 이미 @Repository 어노테이션을 받고 있기 때문에 따로 걸지 않아도 IoC 컨테이너에 자동으로 등록이 된다.
3. 의존성 주입
이제 AuthController에서 AuthService에게 회원가입을 요청해야한다.
즉, AuthController가 AuthService를 의존하는 관계이기 때문에 의존성주입(DI : Dependency Injection)을 받아야 한다.
@Controller 어노테이션이 붙어있으면 SpringBoot가 AuthController를
IoC컨테이너를 관리하고 있는 메모리에다가 객체를 생성해서 Load 해주는데,
객체를 생성하기 위해서는 생성자라는 조건이 필요하다.
생성자를 실행시킬 때엔 이미 IoC컨테이너에 등록되어 있는 데이터를 찾아서 매개변수로 넣게된다.
그걸 찾아서 생성자에 주입한 후 컨트롤러가 IoC컨테이너에 등록이 되게 되는 것이다.
여기서는 의존성 주입방법 중 @RequiredArgsConstructor 어노테이션을 이용할 것이다.
AuthController.java
package com.GStagram.domain.auth;
import com.GStagram.model.User;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@RequiredArgsConstructor
@Controller
@Slf4j
public class AuthController {
private final AuthService authService;
@GetMapping("/auth/login")
public String loginPage() {
return "auth/login";
}
@GetMapping("/auth/signup")
public String signupPage() {
return "auth/signup";
}
@PostMapping("/auth/signup")
public String signup(SignupDto signupDto) { // key = value (x-www-form-urlencoded)
log.info(signupDto.toString());
User user = signupDto.toEntity();
log.info(user.toString());
authService.signupReg(user);
return "auth/login"; // 회원가입이 완료되면 로그인 페이지로 이동한다.
}
}
-> @RequiredArgsConstructor 어노테이션은 final이 걸린 것만 골라서 생성자를 자동으로 만들어준다.
4. 회원가입 기능 구현
다음으로 AuthService가 UserRepository를 의존하여 DI를 받아야한다.
그 후, UserRepository에 sava 메서드를 이용하여 User 오브젝트를 DB에 저장한다.
여기서 sava 메서드의 리턴타입은 내가 넣는 매개변수의 타입 이다
즉, User 타입으로 받을 수 있다.
AuthService.java
package com.GStagram.domain.auth;
import com.GStagram.model.User;
import com.GStagram.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@Service
public class AuthService {
private final UserRepository userRepository;
//회원 가입 진행
public User signupReg(User user) {
User userEntity = userRepository.save(user);
return userEntity;
}
}
AuthController.java
@PostMapping("/auth/signup")
public String signup(SignupDto signupDto) { // key = value (x-www-form-urlencoded)
log.info(signupDto.toString());
User user = signupDto.toEntity();
log.info(user.toString());
User userEntity = authService.signupReg(user);
log.info(userEntity.toString());
return "auth/login"; // 회원가입이 완료되면 로그인 페이지로 이동한다.
}
테스트하여 마지막 로그를 살펴보면
2022-10-25 08:52:25.708 INFO 45849 --- [nio-8080-exec-6] com.GStagram.domain.auth.AuthController : User(id=1, username=qwe2487, password=1234, name=이민혁, website=null, bio=null, email=qwe2487@ajou.ac.kr, phone=null, gender=null, prifileImageUrl=null, role=null, createDate=2022-10-25T08:52:25.665969)
-> primary key인 id가 자동으로 추가된 것을 볼 수 있다
H2-console에서 확인해보면 데이터가 정상적으로 DB에 INSERT된 것을 볼 수 있다