참치코더의 꿈 메모장

JPA / Named Query, 벌크 연산 기본 정리 본문

JPA

JPA / Named Query, 벌크 연산 기본 정리

참치깡 2025. 11. 10. 18:49
728x90

 

Named Query

 

- Named Query는 미리 이름을 붙여 정의해두는 정적 쿼리입니다.

- 프로젝트 빌드 시점에 JPQL 문법 오류를 잡을 수 있고, 재사용성도 높다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 정의하는 방법
@Entity
@NamedQuery(
    name = "Member.findByUsername",
    query = "select m from Member m where m.username = :username"
)
public class Member {
    ...
}
 
 
// 사용 방법
List<Member> members = em.createNamedQuery("Member.findByUsername", Member.class)
    .setParameter("username""user1")
    .getReusltList();
cs

 

Named Query의 장점

 

컴파일 시점 검증

 

- 런타임이 아닌 애플리케이션 로딩 시점에 문법 오류를 감출한다.

 

재사용성이 높다.

 

- 여러 곳에서 동일 쿼리를 이름으로 호출이 가능하다.

 

성능 향상 가능

 

- 일부 JPA 구현체는 Named Query를 미리 파싱 및 캐싱 한다.

 

JPA 벌크 연산(Bulk Operation)

 

벌크 연산이란...

JPA에서 여러 엔티티를 한 번에 수정 또는 삭제하는 연산을 말한다.

SQL의 UPDATE, DELETE 문처럼 한 번의 쿼리로 대량 데이터를 조작한다.

1
2
3
4
5
6
7
8
9
10
11
int resultCount = em.createQuery("update Member m set m.age = m.age + 1")
    .executeUpdate();

em.clear(); // 영속성 컨텍스트 초기화
 
// 이 코드는 실제 DB에 바로 반영되자만, 영속성 컨텍스트에는 반영되지 않는다.
 
// JPA의 일반적인 변경 감지는 엔티티를 조회 -> 변경 감지(Dirty Checking) 과정을 거치지만,
// 벌크 연산은 이 과정을 무시하고 바로 SQL을 날린다.
 
// 결과적으로, DB와 영속성 컨텍스트 간 데이터 불일치가 발생한다.
 
 
cs

 

벌크 연산 후 주의사항

 

- 벌크 연산 후에는 꼭 영속성 컨텍스트를 초기화 해야 한다.

 

- em. clear()을 하지 않으면 영속성 컨텍스트와 실제 DB의 내용이 달라지기 때문에 습관적으로 벌크연산

  (excuteUpdate( ))을 한다면, 초기화하는 버릇을 기르자.

 

 

728x90
Comments