MultipleBagException의 발생 원인과 해결 방법
·
Project 하면서 알아가는 것들
서론이번에는 JPA를 사용하면서 발생한 MultipleBagException 오류와 해결하는 방법에 대해서 알아보도록 하겠습니다. 구조AppUser@Getter@Setter@ToString@Entity@Table(name = "app_user")public class AppUser { ... @OneToMany(mappedBy = "user") private List boards; @OneToMany(mappedBy = "user") private List comments;} AppUserRepository@Query( "SELECT u FROM AppUser u" + " JOIN FETCH u.boards b" + ..
JPA의 N + 1 문제를 알아보고 해결하자
·
Project 하면서 알아가는 것들
서론다른 사람이 짠 JPA Query를 보면서 N + 1 문제가 발생하는 코드를 발견하였고,  이를 해결하고 말로만 듣던 N + 1 문제가 정확히 어떤 것을 의미하는지를 알아보겠습니다. JPA의 동작 원리먼저, N + 1의 문제를 확인하기 전에 알면 이해에 도움되는 간단한 JPA의 동작 원리에대해 알아보겠습니다.기본적인 동작은 위와 같이 작동합니다. 하지만, 여기서 Fetch 전략에 따라 연관 Entity 처리 방식이 바뀌게 됩니다.Fetch 전략의 기본 값은 EAGER입니다. EAGER조회한 Entity에서 연관 Entity가 있다면 즉시 로딩하는 전략입니다.먼저, 해당 Entity를 가져와고 연관된 Entity가 있다면 확인 후 개별적으로 Query를 보내게 됩니다. LAZY조회한 Entity에서 연..
@Transactional의 readonly와 OSIV는 뭐 하는 친구일까?
·
Project 하면서 알아가는 것들
서론Spring Boot 프로젝트를 하면서 궁금했던 Transactional의 readOnly와 그와 자주 언급되는 OSIV에 대해서 알아보는 시간을 가지겠습니다. Dirty Checking개념Transactional과 OSIV에 대해서 이야기 전에 가장 먼저 알아야할 개념입니다.JPA는 특정 Entitiy가 영속성 컨텍스트에 로드될 때 초기 상태를 스냅샷을 찍고, 트랜잭션이 종료될 떄 찍은 스냅샷과 비교합니다. 만약, 스냅샷과 다른 상태라면 자동으로 업데이트를 해주는 것을 말합니다. 스냅샷 (SnapShot)사진을 찍는다의 의미로, JPA에서는 Entity 특정 시점의 원본 상태를 저장해둔 복사본을 의미한다.이러한, 스냅샷은 메모리에서만 존재하는 특징을 가진다. 코드// 트랜잭션 시작@Transacti..