강의 내용에 의문점이 생겨 질문드립니다.
204
작성한 질문수 31
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이 되는 것이 일반적입니다. 이를 통해 새로운 엔티티를 저장할 때와 기존 엔티티를 업데이트할 때의 처리를 구분짓게 됩니다.
이 정보가 도움이 되셨기를 바랍니다.
트랙잭션 격리수준 선택에 대해서 질문
0
16
1
안녕하세요 치킨 디도스 이벤트 보고 흉내내보려 들어왔습니다..
0
25
2
실무 내용 문의드려요
0
27
2
SingletonService가 JVM이 뜰 때 생성되는게 맞나요?
0
41
2
임포트 오류
0
38
2
답을언제쯤받아볼수있나요
0
54
2
형 책 어떻게 받아?
1
60
1
@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.
0
33
2
mvc 패턴 - 적용 강의에서 회원가입할 때 redirect가 아닌 forward인 이유가 궁금합니다.
0
30
1
프로젝트가 없어요..
0
60
2
JpaCursorItemReader의 정렬 조건 부재의 영향
1
47
2
changeTeam 메서드 질문
0
35
1
"컴파일 시점에 없는 값을 어떻게 참조할 것인가?" 섹션
1
54
2
테스트 관련 질문!
0
57
2
handleBindException 의 기대의도가 방향이 맞는지 궁금합니다.
0
43
2
SpringBoot 4.0.6 버전에서 PackageLogTracePostProcessor exception
0
88
3
인텔리제이 오류
0
53
1
프로젝트 의존 관계
0
53
2
application.properties가 적용되지 않아요
1
73
3
새 프로젝트 속 제너레이터에 SpringBoot가 없습니다.
0
55
2
섹션3. 11 회원객체 다이어그램
0
37
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
37
1
강의 연장 요청
0
49
2
설정 정보 없이 임베디드 데이터베이스 생성
0
41
1





