우리는 POST 요청을 통해 브라우저의 BODY 영역에 있는 Form 내부의 데이터를 데이터 저장소에 저장하고 싶을 때가 있다.
Spring Boot에서는 DTO(Data Transfer Object)라는 걸 이용해서 데이터를 전송 받은 후, Entity화 시킨 이후 비즈니스 로직을 수행하는 Service에서 JpaRepository를 상속하는 Repository라는 Interface를 DI(의존성 주입) 받은 후, save() 메소드를 이용해 DB에 최종적으로 저장하게 된다.
코드로 쉽게 확인해 보자.
@Slf4j
@RequiredArgsConstructor
@Controller //1.IoC 2.파일을 반환하는 컨트롤러
public class AuthController {
@PostMapping("/auth/signup")
public String signup(SignupDto signupDto){
User user = signupDto.toEntity();
User userEntity = authService.회원가입(user);
System.out.println(userEntity);
return "auth/signin";
}
}
package com.hansol.photogramstart.dto;
import com.hansol.photogramstart.domain.user.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();
}
}
package com.hansol.photogramstart.domain.user;
import org.springframework.data.jpa.repository.JpaRepository;
//JpaRepository를 상속했기 때문에 어노테이션 없이도 자동으로 IoC에 등록이 됨
public interface UserRepository extends JpaRepository<User, Long> {
}
package com.hansol.photogramstart.domain.user;
//JPA(Java Persistance API)를 이용해 데이터를 영구히 저장할 것
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data //Getter, Setter 생성
@Entity //DB에 TABLE을 생성
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY) //번호 증가 전략
@Id
private Long id;
private String username;
private String password;
private String email;
private String name;
private String website;
private String bio;
private String phone;
private String gender;
private String profileImgUrl;
private String role;
private LocalDateTime createDate;
@PrePersist //DB에 INSERT되기 직전에 실행
public void createDate(){
this.createDate = LocalDateTime.now();
}
}
package com.hansol.photogramstart.service;
import com.hansol.photogramstart.domain.user.User;
import com.hansol.photogramstart.domain.user.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@Service //1.IoC 2.트랜잭션 관리
public class AuthService {
private final UserRepository userRepository;
public User 회원가입(User user) {
//회원가입 진행
User userEntity = userRepository.save(user);
return userEntity;
}
}