[학습 포인트] 💡 JPA에서 update 시 @Modifying 애노테이션이 필요한 이유
·
프로젝트 트러블 슈팅 및 몰랐던점 정리/CommunityAPI
JPA의 기본 동작부터 알아보자!JPA에서 사용하는 @Query 애노테이션은 기본적으로 데이터를 **조회(SELECT)**할 때 사용된다. 그래서 UPDATE나 DELETE처럼 데이터를 변경할 때는 JPA에게 추가적으로 알려줘야 한다. 이때 JPA가 헷갈리지 않도록 명확히 알려주는 방법이 바로 @Modifying 애노테이션이다! 🚨 @Modifying이 꼭 필요한 이유 3가지① 변경 쿼리임을 명확히 알려주기 • JPA는 기본적으로 모든 @Query를 SELECT 쿼리라고 생각한다.• 그런데 UPDATE나 DELETE 쿼리는 데이터베이스에서 실제로 데이터를 변경하는 쿼리라서, JPA의 1차 캐시(영속성 컨텍스트)와 충돌이 생기며 이로인한 동기화 과정에서 동기화가 제대로 되지 않아 데이터의 정합성이 깨지는..
[JPA] 성능 최적화를 위한 연관관계 매핑 조회 전략
·
스프링/JPA
xToOne 단건 조회 최적화지연 로딩을 피하기 위해서 즉시로딩으로 설정할 경우 아예 성능 최적화의 여지조차 남지 않게 된다.왜냐하면 연관관계로 매핑되어있는 경우 원치 않는 데이터 또한 즉시 조회하기 때문에 N+1 문제가 발생할 확률이 높기 때문이다. 즉시 로딩으로 설정할 경우 성능 튜닝이 매우 어려워 진다. 항상 지연 로딩을 기본으로 하고, 성능 최적화가 필요한 경우에는 FETCH JOIN을 사용하면 된다. 결론xToOne에서 조회 쿼리를 진행할 경우 그냥 컨트롤러 레이어에서 단일 엔티티를 조회 후 DTO로 변환하는 방법을 선택한다.그런데 만약 단일로 끌고 오는 엔티티가 다른 엔티티와 연관관계로 매핑되어있는 경우, FETCH JOIN으로 끌고온다. 그래도 성능 최적화가 되지 않는다면 New Operat..
[트러블 슈팅] JPA - LazyInitializationException과 N+1
·
프로젝트 트러블 슈팅 및 몰랐던점 정리/CommunityAPI
LazyLoding의 기본 동작LazyInitializationException은 영속성 컨텍스트가 종료된 상태에서 LAZY 전략을 사용하려고 할 때 발생한다. @OneToMany 혹은 @ManyToMany (xToMany) 연관관계 매핑 시 기본 전략은 LAZY 전략이다. 이는 실제 데이터에 접근할 때 까지 연관관계의 매핑된 데이터를 로드하지 않는다. 이로 인해 연관관계로 매핑된 엔티티에 대해서 초기화 되지 않은 프록시 객체로 유지되다가 연관관계로 매핑된 엔티티 필드(데이터가 실제로 필요할 때)에 접근하면 데이터베이스에서 실제 데이터를 조회하려고 시도한다. 이 때 JPA는 영속성 컨텍스트가 활성화된 상태에서 프록시를 초기화하고 데이터베이스와 상호작용을 하게되는데, Spring 에서는 트랜잭션의 범위가..
cheolhyeon
'JPA' 태그의 글 목록