1차 캐시 활용으로 동일 트랜잭션 내 불필요한 DB 조회 방지 → 같은 엔티티를 다시 조회해도 DB 하지 않아 성능 이점
변경 감지(Dirty Checking) + flush를 통한 자동 update
EntityManager내 값과 변경사항을 비교, 감지하여 반영
-> setter나 필드 변경만 해도 트랜잭션 커밋 시 자동으로 update
트랜잭션 범위 내에서의 일관성 있는 객체 관리 → 하나의 트랜잭션에서 동일 객체 보장, equals/hashCode 비교 유리
객체지향 쿼리 지원 → 도메인 중심으로 쿼리 구성 가능
DB에 반영되는 시점이 명확하지 않을 수 있음 → flush()가 실행되기 전까지는 실제 DB에 반영되지 않음 → 로그 상에서는 SQL이 보이지 않아서 디버깅 어려움
연관관계 위주의 쿼리 작성 유도
→ JPA보단 native query가 적합한 경우도 있음
→ n+1 문제
예상치 못한 Lazy Loading → 트랜잭션 밖에서 프록시 객체 접근 시 LazyInitializationException
성능 튜닝 난이도 존재 → N+1 문제, 복잡한 fetch join 사용 시 성능 예측 어려움
JPA 써봤어요? 어땠어요? 라고 질문을 받아서
EntityManager로 오는 이점도 있지만 단점도 있는 것 같다고 시작해서 답변을 했다.
EntityManager부터 오는 이점이 많지만,
잘 알고 사용하지 않으면 당황할 수 있다. 연관관계 위주로 쿼리를 작성한다거나,
DB에 반영되는 시점이 정확하지 않다거나 하는 점 등을 고려해서 사용해야 할 것 같다.