목록JPA (28)
개발놀이터
이 포스팅은 인프런 김영한 님의 실전! Querydsl 편을 보고 각색한 포스팅입니다. 자세한 내용은 강의를 확인해주세요 프로젝션과 결과 반환 - 기본 프로젝션이란 뭘까? 그냥 간단하게 select 대상으로 지정된 것을 말한다. 크게 봤을 때 프로젝션이 한개일 때와 여러개일 때로 나눠볼 수 있다. 프로젝션 대상이 하나일 때 @Test public void simpleProjection() { List result = queryFactory .select(member.username) .from(member) .fetch(); for (String s : result) { System.out.println("s = " + s); } } select문에 member.username하나만 있는 상황이다. 이럴..
이 포스팅은 인프런 김영한 님의 실전! Querydsl 편을 보고 각색한 포스팅입니다. 자세한 내용은 강의를 확인해주세요 QueryDSL 시작하기 먼저 QueryDSL을 시작하기 위해선 gradle에서 설정을 해줘야한다. //querydsl 추가 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.6.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'war' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } g..
*스프링 데이터 JPA에서의 QueryDSL 사용 사용자 정의 리포지토리를 사용하면 된다. (Spring Data JPA 참고) *QueryDSL 페이징 연동 + 스프링 데이터 JPA 1. 사용자 정의 리포지토리를 사용해서 구현체를 만든다. 2. 인자값으로 Pageable을 넘긴다. 3. queryFactory에서 offset메서드, limit메서드를 사용한다. // offset(pageable.getOffset()), limit(pageable.getPageSize()) 4. fetchResults()메서드로 최종연산을 마무리 짓는다. // 이유 : 페이징 처리를 하려면 전체 데이터 개수를 알고 있어야 하므로 5. total사이즈를 뽑는다. fetchResults()의 결괏값으로 QueryResults..
*프로젝션과 결과 반환 프로젝션 : select 대상 지정 -프로젝션 대상이 하나일 때 (단일 타입) List result = queryFactory.select(member.username).from(member).fetch(); 1. 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있음 2. 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 -프로젝션 대상이 둘 이상일 때 (튜플 사용) List result = queryFactory.select(member.username, member.age).from(member).fetch(); -사용방법 for (Tuple tuple : result) { String username = tuple.get(member.username); Integer ag..
*QueryDSL *QueryDSL 시작하기 build.gradle plugins에 id "com.ewerk.gradle.plugins.querydsl"version "1.0.10" 추가 build.gradle dependencies 에 implementation 'com.querydsl:querydsl-jpa' 추가 build.gradle에 맨아래에 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClass..
@Bean public AuditingAware auditorProvider() { return () -> { ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); String loginId = (String) attr.getRequest().getSessio().getAttribute("loginId"); if (loginId != null) { return Optional.of(loginId); } else { return Optional.of("Anonymous"); } } } *JPA Auditing AuditorAware Auditing에서 createdDa..
*스프링 데이터 JPA *공통 인터페이스 1. 인터페이스로 repository를 만든다 2. JpaRepository를 상속받는다. 상속 받을 때 public interface MemberRepository extends JpaRepository 이렇게 상속하는데 제네릭 첫번 째 부분은 매핑할 엔티티이고 두번 째는 해당 엔티티의 PK타입이다. *메소드 이름으로 쿼리 생성 메소드 이름을 분석해서 JPQL 쿼리를 실행해주는 기능으로 파라미터가 많지않을 경우 (한두개) 해당 기능을 사용하면 좋다. public List findByName(String name); 이렇게 선언만 해주면 스프링 데이터 JPA가 메소드 이름을 분석해 JPQL을 작성해준다. 위의 예제는 select m from Member m whe..
*Restful API 설계 앞으로 보여주는 예제들은 XToOne (ManyTonOne, OneToOne) 인 상황에서의 성능 최적화를 다루고 있다. *version1 = 응답 값으로 엔티티를 직접 외부에 노출함 @GetMapping("/api/v1/simple-orders") public List orderV1() { List all = orderRepository.findAll(new OrderSearch()); return all; } 문제점 1. 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다. 2. 기본적으로 엔티티의 모든 값이 노출된다. 3. 응답 스펙을 맞추기 위한 로직이 추가된다. (@JsonIgnore, 별도에 뷰 로직 등등) 4. 실무에서는 같은 엔티티에 대해 API가 용도에 따라 다..
*경로표현식 경로표현식이란? .(점)을 찍어 객체 그래프를 탐색하는 것 select m.name -> m.name = 상태 필드 from Member m join m.team t -> m.team = 단일 값 연관 필드 join m.orders o where -> m.orders = 컬렉션 값 연관 필드 t.name = 'teamA' 상태필드 : 단순히 값을 저장하기 위한 필드 = 경로 탐색의 끝, 탐색 X 연관필드 : 연관관계를 위한 필드 -단일 값 연관 필드 (@ManyToOne, @OneToOne, 대상이 엔티티) = 묵시적 내부조인 발생, 탐색 O -컬렉션 값 연관 필드 (@OneToMany, @ManyToMany, 대상이 컬렉션) = 묵시적 내부조인 발생, 탐색 X 묵시적 조인, 명시적 조인 묵..
*JPQL -테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 -SQL을 추상화해서 특정 데이터베이스 SQL에 의존X -JPQL을 한마디로 정의하면 객체 지향 SQL JPQL이 해결해야할 가장 큰 문제점 = 동적쿼리 그에 따른 해결책 = Criteria, Querydsl Criteria의 특징 -문자가 아닌 자바코드로 JPQL을 작성할 수 있음 -JPQL 빌더 역할 -JPA 공식기능 -치명적인 단점 : 너무 복잡하고 실용성이 없다. -Criteria대신 Querydsl 사용 권장 Querydsl의 특징 -문자가 아닌 자바코드로 JPQL을 작성할 수 있음 -JPQL 빌더 역할 -컴파일 시점에 문법 오류를 찾을 수 있음 -동적 쿼리 작성 편리함 -단순하고 쉬움 -실무 사용 권장 *JPQL 소개 -JPQ..