본문 바로가기

JPA8

[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] 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.
[스프링부트] junit 테스트 코드(5/5) - 예외 테스트 HTML 삽입 미리보기할 수 없는 소스 1. 예외 테스트란 실제 코드를 작성할 때 개발자는 예외처리를 하게 된다. 그에 따라 테스트코드를 작성할 때 예외 처리가 개발자가 의도한대로 동작하는지에 대해서도 테스트 코드를 통한 검증이 필요하다. 2. 예외 테스트 작성 방법 Service코드 /** * 게시판 생성 * @param boardCreateDto */ public Board createBoard(BoardCreateDto boardCreateDto) { // memberNo를 통해 회원 엔티티 조회 => 조회 결과가 없다면 예외 Member findMember = memberRepository.findById(boardCreateDto.getMemberNo()).orElseThrow(() -> new.. 2023. 8. 8.