1. JPA 연관관계 원리

🎁 우리가 정리하고 가야할 키워드 = ORM, Hibernate, JPA, Spring Data JPA

Untitled

🌱 JPA 정리 (ORM, Hibernate, JPA)

👑 Spring Data JPA

👩‍❤️‍👨 JPA 연관관계 매핑

2. 자주 발생하는 JPA 에러 및 조치방법

1. 다대일 관계에서 주로 발생 하는 에러

2. 연관 객체의 변경사항이 저장되지 않는 에러

3. 연관 객체의 변경사항이 업데이트 되지 않는 에러

4. 연관관계 조회시 발생하는 N+1 에러

5. save() 이후 변경사항이 반영되지 않는 에러

6. OneToMany 단방향 매핑 이슈

7. 테스트코드는 통과했는데 런타임에 발생한 초기화 에러

3. JPA 연관관계 에러 안나게 개발하는 법

<aside> 💡 JPA의 내부 작동 흐름에 대해 이해하는 것이 정말 중요하다.

<aside> 💡 아래의 행위를 해주지 않는다면 db에 쿼리가 날라가지 않아 db에 반영이 바로 되지 않음을 꼭 기억!

💁‍♂️ Raw JPA 관점에서 순서대로 보자면

persist(), merge() > (영속성 컨텍스트에 저장된 상태) > flush() > (DB에 쿼리가 전송된 상태) > commit() > (DB에 쿼리가 반영된 상태)

💁‍♀️ 이제, Raw JPA를 추상화시킨 SpringDataJpa 관점에서 연결해서 보자면

@Transactional 어노테이션이 해당 함수 종료시점에 flush, commit을 모두 수행하며 Repository 기본 구현체인 SimpleRepository 클래스의 save 메소드에 보면 @Transactional 어노테이션이 달려있기 때문입니다. (깃헙 코드 링크)

결론은, flush 와 commit 사이 즉, DB에 쿼리가 전송된 상태에서 추가동작이 필요한경우 SimpleRepository 대신 Repository 를 개별로 구현하여 @Transactional 이 달리지 않은 saveAndFlush() 를 구현하고, 그렇지 않다면 기본적으로 save() 메소드만 사용합니다.

</aside>

<aside> 💡 지연 로딩(LAZY)를 우선적으로 사용한다.

<aside> 💡 OneToMany 매핑은 양방향으로 해준다.

<aside> 💡 save() 이후에는 반환된 인스턴스를 사용해야 한다.