본문 바로가기

JPA7

[JPA] 프록시 객체와 지연로딩 정리 HTML 삽입 미리보기할 수 없는 소스 1. 프록시 객체란 프록시 객체는 실제 Entity를 대신하는 가짜 객체이다. 사용법을 보면은 무슨 뜻인지 이해가 갈 것이다. 먼저 java에서 프록시 객체를 생성하는 방법은 이렇다. entityManager.getReference(타겟엔티티.class, 엔티티의PK) getReference함수의 리턴값을 확인해 보면 'the found entity instance'라고 적혀있다. 즉 엔티티 객체를 돌려준단 것이다. 그러면 getReference 함수를 통해서도 Entity 객체가 조회되고 find() 함수를 통해서도 Entity가 조회되는데 무슨 차이가 있는걸까? 그 차이는 getClass()를 직접 로깅을 해보는 순간 다르단 걸 알 수 있다. EntityMana.. 2023. 8. 27.
JPA 지연 로딩 Json파싱 에러 HTML 삽입 미리보기할 수 없는 소스 1. JPA 지연 로딩 에러 발생 상황 BoardEntity와 MemberEntity가 연관 관계를 가지며 Member가 부모 Board가 자식 관계이다. @NotNull @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_no", nullable = false) private Member member; 원래는 즉시 로딩으로 사용하다가 지연 로딩으로 변경 후 게시판 상세 조회 시 에러가 발생했다. 2. 지연 로딩 json 변환 시 에러 원인 RestContoller 코드 /** * 게시판 상세 조회 * * @param boardNo * @return */ @GetMapping("/board/{boardNo}.. 2023. 8. 10.
[SpringDataJpa] QueryDsl 정리 HTML 삽입 미리보기할 수 없는 소스 1. QueryDsl 정의 JPA를 사용하다보면 method query나 jpql로 해결하기 애매한 문제들이 발생한다. 또한 jpql, mybatis처럼 문자열을 통해 쿼리를 작성하다 보면 문법에 의한 에러를 한번쯤은 겪게 되는데 QueryDsl을 사용하면 쿼리를 메소드를 통해 작성할 수 있고 자동완성, 컴파일 단계에서의 타입 체크등을 할 수 있어 더욱 편하게 쿼리를 작성할 수 있게된다. 2. QueryDsl 사용 이유 위에서 'JPA를 사용하다 보면 method query나 jpql로 해결하기 애매한 문제들' 이 발생한다고 하였다. 내가 겪은 문제는 동적 쿼리에 대한 처리였다. 자세한 상황은 아래와 같다. @GetMapping("/board") public Lis.. 2023. 8. 10.
[SpringDataJpa] findAll() n+1 문제 해결 HTML 삽입미리보기할 수 없는 소스 1. findAll() n+1 발생 원인 토의 프로젝트를 하며 게시판 목록 조회를 하던 중 findAll()을 사용하였는데 연관관계인 Member 조회 쿼리가 미친듯이 날라가는 것을 보고 멘붕이 왔다. 내가 알고 있는 배경 지식으로는 도무지 이해가 안 가는 상황이었다. 환경은 다음과 같다. BoardEntity @DynamicInsert // null 값 전달 시 insert 컬럼에서 제외,=> Default 값 적용 가능 @Entity @Getter @Table(name = "board") @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString public cl.. 2023. 8. 9.