[스프링부트] 29. Persistence Context

백하림's avatar
Apr 04, 2025
[스프링부트] 29. Persistence Context
notion image
💡
new 로 생성된 객체는 persist() 되기 전에는 Persistence Context의 관리를 받지 못하는 비영속 상태이고, persist() 가 실행되어야 비로소 Persistence Context가 관리하는 영속 상태로 전환됩니다.

UserService

package shop.mtcoding.blog.user; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor @Service public class UserService { private final UserRepository userRepository; @Transactional public void 회원가입(UserRequest.JoinDTO joinDTO) { User user = joinDTO.toEntity(); // 1. 비영속 객체 System.out.println("비영속 user : " + user.getId()); userRepository.save(user); // user 객체 System.out.println("영속/동기화 user : " + user.getId()); } public User 로그인(UserRequest.LoginDTO loginDTO) { User user = userRepository.findByUsername(loginDTO.getUsername()); if (!user.getPassword().equals(loginDTO.getPassword())) { throw new RuntimeException("유저네임 혹은 비밀번호가 틀렸습니다"); } return user; } }

UserRepository

package shop.mtcoding.blog.user; import jakarta.persistence.EntityManager; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @RequiredArgsConstructor @Repository public class UserRepository { private final EntityManager em; /* 1. createNativeQuery -> 기본 쿼리 (근본) 2. createQuery -> JPA가 제공해주는 객체지향 쿼리 3. NameQuery -> Query Method는 함수 이름으로 쿼리 생성 - 하지마 ! 4. EntityGraph -> 지금 이해 못 함 */ public void save(User user) { em.persist(user); // 2. user는 이제 영속 객체 // 3. user는 데이터베이스와 동기화 됨 } // 객체지향 쿼리 public User findByUsername(String username) { return em.createQuery("select u from User u where u.username = :username", User.class) .setParameter(username, username) .getSingleResult(); } }

UserRequest

package shop.mtcoding.blog.user; import lombok.Data; public class UserRequest { // insert되는 용도의 DTO에는 toEntity 메소드를 만든다. @Data public static class JoinDTO { private String username; private String password; private String email; public User toEntity() { return User.builder() .username(username) .password(password) .email(email) .build(); } } @Data public static class LoginDTO { private String username; private String password; } }
notion image
Share article

harimmon