작성
·
136
0
package jpabook.jpashop.domain.repository;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityManager;
import jpabook.jpashop.domain.item.Item;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class ItemRepository {
private final EntityManager em;
public void save(Item item) {
if (item.getId() == null) { // 이 부분입니다.
em.persist(item);
} else {
em.merge(item);
}
}
public Item findOne(Long id) {
return em.find(Item.class, id);
}
public List<Item> findAll() {
return em.createQuery("select i from Item i",Item.class).getResultList();
}
}
위의 코드에서 item.getId() == null을 왜 사용하는건가요??
MemberRepository 클래스와 코드 형식이 거의 비슷한데, MemberRepository 클래스에서는 member.getId() == null 코드를 사용하지 않아서 질문드립니다.
그리고 item은 처음에 id가 없다는 말도 이해안되어서 질문드립니다.
감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
item.getId() == null
을 사용하는 이유는, Item
엔티티의 id
가 null
인지 확인하여 이 Item
엔티티가 새로 생성된 엔티티인지, 또는 이미 데이터베이스에 존재하는 엔티티인지를 판단하기 위함입니다. JPA에서 엔티티의 id
는 보통 데이터베이스에 해당 엔티티가 저장될 때 생성됩니다. 따라서, id
가 null
이라면 아직 데이터베이스에 저장되지 않는, 즉, 새로 생성된 엔티티라고 볼 수 있습니다.
특히, Spring Data JPA를 사용할 때 CrudRepository.save(…)
메소드는 내부적으로 JPA의 EntityManager
를 사용하여 엔티티를 저장합니다. 엔티티가 새로운 것이라면 entityManager.persist(…)
메소드를 호출하여 엔티티를 저장(영속화)하고, 이미 기존에 데이터베이스에 존재하는 엔티티라면 entityManager.merge(…)
메소드를 호출하여 해당 엔티티의 변경 내용을 데이터베이스에 업데이트합니다.
item.getId() == null
을 MemberRepository
클래스에서 사용하지 않는 경우, MemberRepository
의 구현 로직이 ItemRepository
와 다르거나 특정 로직 구현방식에 따른 차이일 수 있습니다. 대부분의 경우, 엔티티의 id
값을 통해 새로운 엔티티인지 여부를 판단하는 것은 일반적인 패턴이나, 특정 상황에 따라 다른 방식으로 구현될 수 있습니다.
데이터베이스에 저장되기 전의 엔티티는 id
값이 자동으로 생성되지 않습니다. 따라서, 엔티티가 처음 생성될 때는 id
값이 null
이 되는 것이 일반적입니다. 이를 통해 새로운 엔티티를 저장할 때와 기존 엔티티를 업데이트할 때의 처리를 구분짓게 됩니다.
이 정보가 도움이 되셨기를 바랍니다.