[JPA] 테스트 데이터 삽입 중 발생한 EntityExistsException 문제

eunoia73·2025년 1월 17일

trouble shooting

목록 보기
10/16

❕ 문제 상황 : ChatMessage 검색 기능구현 중 test코드를 짜려고 데이터를 넣다가 발생했다

❗️ 에러 문구 : jakarta.persistence.EntityExistsException: detached entity passed to persist 오류
JPA에서 영속성 컨텍스트가 관리하지 않는(비영속 상태) 엔티티를 persist하려고 할 때 발생한다.

ChatMessage 엔티티의 id는 자동으로 생성되도록 했는데, 테스트 데이터를 넣을 때 임의로 생성해서 persist 해서 충돌이 발생했다

ChatMessage message1 = new ChatMessage(1, "room1", "user1", "안녕하세요!", LocalDateTime.now());
//chatMessage 엔티티의 id
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id;

💡 가능한 해결 방법

ID를 명시적으로 설정하지 않고 생성자 수정

  • ID 값을 포함하지 않는 생성자를 만든다.
<public ChatMessage(String roomId, String sender, String content, LocalDateTime createdAt) {
    this.roomId = roomId;
    this.sender = sender;
    this.content = content;
    this.createdAt = createdAt;
}

✅ 선택한 해결 방법

ID를 null로 설정하여 영속성 컨텍스트에 위임

  • 엔티티의 ID를 null로 설정하고, @GeneratedValue에 의해 JPA가 자동으로 ID를 생성하도록 한다.
  • 생성자 수정이나 SQL 스크립트 작성 없이 간단히 ID를 null로 설정하는 방식으로 문제를 해결할 수 있다.

💡 수정한 test 코드

@BeforeEach
public void before() {
    queryFactory = new JPAQueryFactory(em);

    ChatMessage message1 = new ChatMessage(null, "room1", "user1", "안녕하세요!", LocalDateTime.now());
    ChatMessage message2 = new ChatMessage(null, "room1", "user1", "안녕!", LocalDateTime.now());
    ChatMessage message3 = new ChatMessage(null, "room1", "user1", "hi!", LocalDateTime.now());
    ChatMessage message4 = new ChatMessage(null, "room1", "user1", "안녕안녕!", LocalDateTime.now());

    em.persist(message1);
    em.persist(message2);
    em.persist(message3);
    em.persist(message4);

    em.flush();
    em.clear();
}

0개의 댓글