전체 글
-
[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) 테스트 예제 코드 - 해..
-
[Test] 스프링 부트에서 TestEntityManager를 이용하여 JPA 테스트 하는 방법개발 지식/Test 2023. 11. 28. 23:24
JPA의 영속성 컨텍스트의 1차 캐시, 쓰기 지연 SQL 저장소(IDENTITY 전략 시 사용 안됨), 변경 감지 등의 동작을 확인하고 쿼리가 어떻게 날라가는지를 확인하기 위한 테스트를 하고 싶을 때 스프링 부트에서 테스트 하는 방법(추가적으로 지연 로딩, 즉시 로딩도 테스트하고 싶을 때) 예제 코드 @DataJpaTest public class JpaTest { @Autowired private TestEntityManager em; @Test void test() { Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new Member(); member.setName("A"); member.setTeam(t..
-
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' 에러해결게시판 만들기(modoo-board) 2023. 11. 28. 17:53
에러 로그 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unable to map collection com.modooboard.member.entity.Member.roles - 애플리케이션을 돌리려..
-
[JPA] 즉시 로딩과 지연 로딩인프런 - 스프링/JPA 프로그래밍 - 기본편 2023. 11. 28. 10:51
- 프록시 초기화 시점은 정확하게 그 객체의 메서드를 호출할 때이다. 단순히 그 객체를 가져오는 부분에서는 초기화가 안된다. - 즉시 로딩은 JPQL에서 N + 1 문제를 일으킨다. 예를 들어서 회원과 팀이 N:1 관계에서 즉시 로딩으로 설정되었을 때 회원을 조회했을 때 10명이 조회되면 최초 쿼리 1개와 회원 10명의 팀을 각각 세팅하는 쿼리 10개가 추가적으로 나가는 상황이 발생하여 N + 1 문제라고 지칭하는 것이다. (주의할 점은 JPQL이 아닌 em.find로 조회하는 경우 조인을 하여 한번에 가져온다.) - 지연 로딩으로 설정하여도 팀이 필요한 시점에 N개 만큼 추가적으로 쿼리가 날라가는 것은 동일하다. N+1 문제를 해결하는 대안은 일단 총 3가지 정도가 있다. N+1 문제 해결하는 방법 3..
-
[JPA] 프록시인프런 - 스프링/JPA 프로그래밍 - 기본편 2023. 11. 27. 16:26
- 상황에 따라 다르다. - 위의 getName() 메서드 호출과 같이 데이터가 실제로 필요한 시점에 프록시 객체의 Member 타입의 target이 영속성 컨텍스트를 이용하여 초기화되는 방식으로 작동한다. - 4번째 항목의 반대 상황 즉, 영속성 컨텍스트에서 em.getReference()를 호출하여 프록시 객체가 있는 상황이면 이후에 em.find()를 호출하면 프록시 객체를 반환한다. (영속성 컨텍스트에서 반복적으로 객체를 가져오면 무조건 같은 객체이다.) - 5번 항목 예시 코드 Member refMember = em.getReference(Member.class, member.getId()); System.out.println("refMember = " + refMember.getClass())..
-
[JPA] Mapped Superclass - 매핑 정보 상속인프런 - 스프링/JPA 프로그래밍 - 기본편 2023. 11. 27. 15:24
예시 코드 - JPA의 Auditing 기능은 아래 참고 https://prospective-developer-seo.tistory.com/47 [Spring Data JPA] JPA Auditing 기능 JPA Auditing이란? - Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통되는 필드나 컬럼이 존재한다. - 대표적으로 생성일자, 수정일자, 식별자 등 - Audit는 prospective-developer-seo.tistory.com 출처: 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 https://www.inflearn.com/course/ORM-JPA-Basic 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강..
-
[JPA] 상속관계 매핑인프런 - 스프링/JPA 프로그래밍 - 기본편 2023. 11. 27. 15:12
- 어떤 전략을 사용하든 상위 타입은 abstract 클래스로 만드는 것이 좋다.(하위 타입 없이 상위 타입만 생성하는 경우는 없기 때문) - 추상 클래스는 생성자를 가질 수 있다.(하위 타입에서 호출함으로써 인스턴스 필드를 초기화 하는 과정이 필요할 수도 있기 때문) 단일 테이블 전략 예제 코드 @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING) public abstract class Item ..