JPA를 사용하다 보면 N+1 문제를 직면하는 일이 많다. N+1 문제란 예를 들어 친구 목록을 가져오는데 각각 친구들의 상태 메시지는 다른 테이블에서 가져온다고 가정하면 두 테이블을 한 번에 가져오지 않았을 때 쿼리는 두 번 나가게 될 것이고 친구들 전체를 가져오게 된다면 N+1로 쿼리 수가 상당히 많아질 것이다. 즉, 추가적인 쿼리를 계속 보내는 것이다. 따라서 이러한 다수의 쿼리를 보내는 것을 방지하기 위해 한 번에 가져와야 하는데 그때 쓰이는 방법은 JPA에서는 @EntityGraph이고, QueryDSL에서는 .fetchJoin을 해주면 된다. JPA(EntityGraph) @Override @EntityGraph(attributePaths = {"userCar", "account", "addr..
요즘 마지막 학기 프로젝트로 인해 뜸했다.. 프로젝트를 진행하면서 도메인 안에 위처럼 ENUM 타입이 있는데 정보를 입력할 때 ENUM은 셀렉트 박스로 하고 싶었다. ENUM public enum CarCategory { LIGHT("경차"), SMALL("소형차"), SEMI_MEDIUM("준중형"), MEDIUM("중형"), SEMI_FORMAL("준대형"), LARGE("대형"); @Getter private final String description; CarCategory(String description) { this.description = description; } } 차량 종류에 대한 ENUM이다. 컨트롤러 /** * enum */ @ModelAttribute("carCategories"..
서비스 코드에서 레파지토리를 사용하려고 하는데 제목과 같은 오류가 났을 경우 Repository 선언에 아래와 같이 final을 붙이면 된다. 안 붙이게 되면 빈 주입이 되지 않아 null이 된다. private final UserCarRepository userCarRepository; (서비스 부에서 Repository 선언한 코드) 이런 실수를 하다니
[본 포스팅은 실전! Querydsl 편을 기반으로 작성하였습니다.] 실전! Querydsl - 인프런 | 강의 Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런... www.inflearn.com 예를 들어 이름이 비어있거나 나이가 비어있을 때 데이터를 조회하기 위해선 동적 쿼리를 짜야한다. @Test public void dynamicQuery_WhereParam() { String usernameParam = "member1"; Integer ageParam = null; List result = searchMember2(usernameParam, ageParam); assertThat(result.size()).isEqualTo(1); } private L..
[본 포스팅은 실전! Querydsl 편을 기반으로 작성하였습니다.] 실전! Querydsl - 인프런 | 강의 Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런... www.inflearn.com 데이터를 DB에서 반환받을 때 필요한 정보만 받아야 할 때가 많이 있다. 그래서 프로젝션으로 결과를 반환받는데 이때 방법을 Projections와 @QueryProjection을 사용해서 받아볼 것이다. 상황) 모든 멤버의 ID를 제외하고 이름과 나이를 반환받기 1. 프로퍼티 접근 - Setter Projections.Bean() List result = queryFactory .select(Projections.bean(MemberDto.class, member.us..
[본 포스팅은 실전! Querydsl 편을 기반으로 작성하였습니다.] 실전! Querydsl - 인프런 | 강의 Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런... www.inflearn.com 강의를 보고 따라 해보니 다음과 같은 오류가 났다. Unable to load class 'com.mysema.codegen.model.Type'. This is an unexpected error. Please file a bug containing the idea.log file. 그 이유는 gradle의 버전이 올라가면서 맞지 않았던 모양이다. 따라서 아래와 같이 수정해주면 된다. gradle buildscript { ext { queryDslVersion = "..
[본 포스팅은 실전! 스프링 데이터 JPA -인프런 편을 기반으로 작성하였습니다.] 실전! 스프링 데이터 JPA - 인프런 | 강의 스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다. www.inflearn.com (스프링 데이터 JPA를 사용합니다.) JPA에서 Auditing을 사용해 등록일, 수정일, 등록자, 수정자 기록을 남길 수 있다. 실무에서는 최소한의 등록일, 수정일 정도의 기록이 없으면 나중에 힘들어진다고 한다..! 코드로 따라 해 보기 STEP 1) main 함수가 들어가 있는 클래스에 @EnableJpaAuditing 애노테이션을 넣고, 작성자, ..
[본 포스팅은 실전! 스프링 데이터 JPA -인프런 편을 기반으로 작성하였습니다.] 실전! 스프링 데이터 JPA - 인프런 | 강의 스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다. www.inflearn.com 만약 나이가 20살 이상인 사람들의 나이를 +1 하려고 한다고 가정하자. 그러면 repository에서 다음과 같이 해주면 되는데 @Query로 쿼리를 직접 짜주고 @Modifying을 해주면 된다. @Modifying(clearAutomatically = true) //변경한다고 알림, 영속성 콘텍스트 초기화 @Query("update Member m ..
[본 포스팅은 실전! 스프링 데이터 JPA -인프런 편을 기반으로 작성하였습니다.] 실전! 스프링 데이터 JPA - 인프런 | 강의 스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다. www.inflearn.com 어떤 게시판을 봐도 모든 게시글을 한 페이지에 넣어 보여주는 서비스는 이 세상에 절대 없을 것이다. 그리고 그 게시글들을 페이지 별로 나누는 것이 페이징이다. 스프링 데이터 JPA에서는 페이징 기능을 편리하게 제공한다. 1. JPA Repository에서 반환타입(Page)과 파라미터(Pageble)를 넣어준다. 예를 들어 나이가 10살인 멤버 목록을 가..
[본 포스팅은 자바 ORM 표준 JPA 프로그래밍 기본 편을 기반으로 작성하였습니다.] 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의 JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런 www.inflearn.com 페치 조인은 실무에서 가장 중요한 부분이다. 페치 조인(fetch join) SQL 조인 종류가 아님 JPQL에서 성능 최적화를 위해 제공하는 기능 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 즉, 나와 관련된 것들은 다 긁어옴 페치 조인과 일반 조인의 차이 일반 조인 실행 시 연관된 엔티티를 함께 조회하..