개발 지식/JPA
-
[JPA] 영속성 전이(CASCADE)와 고아 객체 정리개발 지식/JPA 2023. 11. 30. 10:27
영속성 전이 시 주의할 점 @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List postList = new ArrayList(); - persist를 하는 경우에 영속성 전이를 제대로 동작시키기 위해서는 연관관계 주인쪽 세팅뿐만 아니라 member.getPostList().add(post) 이런 식으로 양방향 세팅을 해야한다. - 영속성 전이의 부모와 자식 관계는 말 그대로 영속성이 전이되는 것만 해당하고 연관관계의 주인은 db에 연관관계가 있는 객체들을 저장할 때 반드시 연관관계를 세팅해야 하는 쪽을 의미하므로 둘은 전혀 다른 개념이다.(연관관계의 주인이 아닌 쪽은 읽기만 가능) CascadeType.REMOVE vs 고아 객체..
-
[JPA] Referential integrity constraint violation개발 지식/JPA 2023. 11. 29. 22:56
- 현재 member가 삭제되면 해당 member의 post들도 삭제가 될 수 있게 CascadeType.REMOVE를 적용해둔 상태이다. - 해당 코드에서 em.flush() 코드를 제거하면 정상작동하는데 delete 쿼리를 확인하고 싶어서 추가하였을 때 Referential integrity constraint violation 에러가 발생하였다. - 참조 무결성 제약 조건이란 참조할 수 없는 외래키 값을 가질 수 없다는 조건이다. 즉, member를 삭제하였더니 post가 참조하고 있는 member가 참조할 수 없는 상황이 되어서 발생한 것 같다. - 혹시 영속성 전이가 일어나지 않은 것 아닐까 하는 생각에 post1이 영속성 컨텍스트에 있는지 확인해봤다. System.out.println(em.g..
-
[JPA] em.merge(entity)는 내부 코드 들여다보기개발 지식/JPA 2023. 11. 29. 11:53
- SimpleJpaRepository의 save() 메서드의 em.merge(entity)는 어떻게 동작하는지 궁금해서 디버깅을 통해 내부 코드를 살펴보자. - 준영속 상태의 엔티티를 save하는 메서드를 실행하고 위의 부분에 브레이크포인트를 걸고 내부로 들어가보자 - 대충 읽어보면 공유된 엔티티 매니저 프록시가 em에 할당되었음을 알 수 있다. (정확한 원리는 다음에!) em.merge(entity)에서 내부로 들어가게 되면 SharedEntityManagerCreator의 private static class인 SharedEntityManagerInvocationHandler의 invoke() 메서드로 이동하게 된다. SharedEntityManagerInvocationHandler의 invoke ..
-
[JPA] JpaRepository 관련 코드 들여다보기개발 지식/JPA 2023. 11. 28. 23:36
- spring data jpa를 이용하여 데이터 엑세스 계층 코드를 작성할 때 보통 다음과 같이 JpaRepository 를 확장하여 인터페이스를 만든다. public interface MemberRepository extends JpaRepository { } - 서비스 계층에서 엔티티를 저장할 때 다음과 같이 save 메서드를 호출한다. memberRepository.save(member); - 위의 save 메서드는 CrudRepository 인터페이스에 있는 메서드로 실제 어떤 구현체의 메서드가 실행되는지 확인하기 위해서는 디버깅 과정이 필요하다. (상속관계: JpaRepository -> PagingAndSortingRepository -> CrudRepository) 테스트 예제 코드 - 해..
-
[JPA] Entity 클래스의 @NoArgsConstructor(access = AccessLevel.PROTECTED)개발 지식/JPA 2023. 11. 7. 16:52
Entity가 기본생성자를 필요로 하는 이유 - JPA는 DB 값(레코드)을 자바 객체로 매핑할 때 Reflection을 이용한다. - Reflection이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 Java API이다. - JPA에서는 자바 객체로 매핑할 때 기본생성자를 통해 먼저 객체를 만들고나서, Reflection을 통해 필드 값을 주입한다. - 따라서 Entity에는 기본생성자가 필요하고 기본생성자가 없다면 예외가 발생한다.(InstantiationException) Proxy 객체란? - 상속을 이용해 특정 객체를 한 번 감싸 이전, 이후에 특정 로직을 추가하도록 하는 개념이다. - JPA의 fetch 타입을 LAZY(지연로딩)으로 할 ..