JPA 42

[JAVA] 지연로딩과 조회 성능 최적화

주문 + 배송정보 + 회원을 조회하는 API를 만들자 지연 로딩때문에 발생하는 성능 문제를 단계적으로 해결해보자. 1. 엔티티를 직접 노출 (실무에서는 엔티티를 노출하는 일은 없으니 가볍게 보고 넘기기로 하자.) @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List all = orderRepository.findAll(); return all; } 위에 코드는 엔티티를 직접 노출하는 개발 방식 양방향 연관관계일때 문제가 생김 → 무한루프에 빠져버림 (잘못된 코드) 이러한 경우 양방향이 걸리는데를 다 @JsonIgnore 를 걸어줘야함 → 그렇다면 무한 루프가 생기는 일은 피할 수 있지만 지연로딩 관련한 문제는 해결되지 않는다. 지연로딩으로 ..

JAVA 2022.05.19

[JAVA] CRU API

회원등록 API를 만들때 controller에서 entity를 파라미터로 받아서 사용하지 말자. entity는 굉장히 여기저기서 사용되므로 이름이 바뀌거나 하기 쉽다. 근데 이때 이름이 바뀌면 API 스펙이 바뀌므로 API가 작동이 안될수 있다. 따라서 API 를 개발할 때는 controller 에서 DTO를 사용하자! @RestController // Controller + ResponseBody -> 데이터를 바로 json이나 xml로 보내자! @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public Cre..

JAVA 2022.05.17

[TEST] Memory DB 사용

Memory DB는 오로지 테스트만 하고 외부 DB를 사용하지 않고 끝내고 싶을때, 테스트를 완전히 격리 된 환경에서 테스트 하기 위해서 사용한다. → JVM 안에서 메모리 모드로 띄우는거다. 테스트 코드 작성 시 운영의 설정파일과 따로 사용 하는 것이 좋다. 테스트 디렉토리 안에 resource 파일 생성 후 설정 파일(application.yml)을 생성하면, 테스트 코드가 실행 시에 그 설정파일을 참조한다. H2 Database Engine Using H2 Documentation Reference: SQL grammar, functions, data types, tools, API Features: fulltext search, encryption, read-only (zip/jar), CSV, ..

JAVA 2022.03.16

[JAVA] 결과조회(fetch)

fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환 fetchOne() : 단 건 조회 결과가 없으면 : null 결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException fetchFirst() : limit(1).fetchOne() fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행 fetchCount() : count 쿼리로 변경해서 count 수 조회 @Test public void resultFetch() throws Exception{ //given List fetch = jpaQueryFactory .selectFrom(member) .fetch(); Member fetchOne = jpaQueryFact..

JAVA 2022.03.14

[TEST] 예외 발생 테스트

만약 예외가 발생하는 코드를 테스트 할때 회원가입 중복 확인 테스트 진행 시 IllegalStateException (이미 존재하는 회원) 을 처리해주지 않으면 테스트 코드 실행 시 실패로 뜸 Test 어노테이션 옆에 excepted를 지정해주면 해당 exception 발생시에는 그냥 넘어갈 수 있다 @Test(expected = IllegalStateException.class) public void 중복_회원_예외() throws Exception{ //given Member member1 = new Member(); member1.setName("kim"); Member member2 = new Member(); member2.setName("kim"); //when memberService.joi..

JAVA 2022.03.08

[JAVA] Q-Type

Q-Type class는 Querydsl을 설정을 진행을 완료하면 @Entity가 붙은 클래스를 찾아 자동으로 생성된다. 예 ) @Entity가 붙은 User.java 의 QUser.java 클래스 파일이 자동으로 생성됨 이러한 Q-Type의 class들은 Querydsl을 사용할 때 우리가 만든 도메인 클래스의 구조를 설명해주는 역할을 한다. Q class 인스턴스를 사용하는 방법은 2가지가 있다. 1. 별칭 직접 지정 QMember qMember = new QMember("m"); 2. 기본 인스턴스 사용 QMember qMember = QMember.member; 이걸 더 줄여서 사용하기 위해 static import와 함께 사용한다. 아래 처럼 선언하면 굳이 선언을 해주지 않아도 사용 할 수 있다..

JAVA 2022.03.07

[TEST] 날짜 자동 생성 테스트

test code 작성 중 문제 발생 [문제] createdDate 자동 생성 테스트 코드 작성 중 문제가 발생 → 테스트를 위해 우선 데이터를 삽입 후 날짜를 비교해야 하는데 날짜가 null로 삽입됨 [해결] BaseTimeEntity에 @EntityListeners(AuditingEntityListener.class) 을 이용해 JPA 청취 기능을 하는데 main함수가 있는 클래스에서 JPA 청취 가능을 시켜주지 않으면 사용이 불가하다. 따라서 기능 구현을 할 클래스에 @EnableJpaAuditing 어노테이션을 붙여주면 생성됨 package movie.finder.Repository; import movie.finder.domain.Movie; import movie.finder.repositor..

JAVA 2022.03.03

[JAVA] Querydsl 설정

Querydsl build.gradle 작성 시 유의사항 보통 요즘은 spring boot 2.6 이상 이기 때문에 Querydsl을 5.0을 사용한다. 또한 2.6 이상부터는 다음과 같은 부분을 확인해야 한다. build.gradle 설정 변경 PageableExecutionUtils Deprecated(향후 미지원) 패키지 변경 Querydsl fetchResults() , fetchCount() Deprecated(향후 미지원) build.gradle 설정 방법 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.6.3' id 'io.spring.dependency-man..

JAVA 2022.03.03

[JAVA] web 확장 - 페이징과 정렬

Spring data가 제공하는 페이징과 정렬 기능을 사용할 수 있다. @GetMapping("/members") public Page list(@PageableDefault(size = 5, sort = "id") Pageable pageable){ // 만약 page를 1 부터 시작하고 싶다면? -> 기본이 0 // 아래 처럼 구현체를 새로 만들어 다른 클래스로 넘겨주면됨 // PageRequest request = PageRequest.of(1, 2); // new MemberDto(member); 를 메소드 레퍼런스를 써서 저렇게 변경 가능 return memberRepository.findAll(pageable) .map(MemberDto::new); } 또한 파라미터로 Pageable을 받을 ..

JAVA 2022.03.03