
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;
}
}

Share article