본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


반응형

분류 전체보기

(160)
QueryDSL 공부 5 - 프로젝션과 결과 반환 프로젝션이란 select 절에 대상을 지정하는 것을 말한다 . 프로젝션 대상이 하나일 경우 반환 타입이 명확하게 지정되지만 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회해야한다 . 단일 프로젝션 조회 @Test void projection_one(){ List fetch = qf .select(member.username) .from(member) .fetch(); for (String s : fetch) { System.out.println("s = " + s); } } 단일 타입이기 떄문에 반환타입이 명확하다 . Tuple 조회 @Test void tuple_projection(){ List fetch = qf .select(member.username, member.age) .from(memb..
QueryDSL 공부 4 - QueryDSL 활용2 (join문) 1. 기본 조인 @Test void join(){ List teamA = qf .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(teamA).extracting("username").containsExactly("member1","member2"); } 팀 이름이 teamA인 회원의 이름을 모두 조회하는 쿼리이다 . join() 메서드의 첫번째 파라미터로는 외래키가 되는 필드를 , 두번째 파라미터로는 조인할 엔티티의 Q - Type을 적어준다 ,inner 조인 ,outer 조인 모두 사용 가능하다. (위의 코드는 모두 static import를 한 상태이기 때문에 위와 같이 사용이 가..
QueryDSL 공부 3 - QueryDSL 활용1 1. where 절 검색 조건 쿼리 where 절에 JPQL에서 제공하는 문법을 모두 제공한다 . (= , >= ,, < , like , between 등등 . . ) @Test void search(){ Member findMember = qf .selectFrom(member) .where( // and 사용하지 않고 , 으로도 표현 가능 member.username.eq("member1") ,member.age.eq(10) ,member.username.startsWith("mem") ,member.id.in(1L,2L,3L)) .fetchOne(); assertEquals(findMember.getUsername(),"member1"); assertEquals(findMember.getAge(),..
QueryDSL 공부 2 - Q-Type 활용 엔티티의 Q type을 생성하기 위해선 2가지 방법이 있다 //생성자를 통해 생성 QMember m = new QMember("m"); //스테틱 변수를 활용 QMember m = QMember.member; 스테틱 변수를 활용할 수 있는 이유는 Q Type의 클래스에 들어가 보면 아래 사진 처럼 자기 자신을 스테틱 변수로 저장하는 필드가 있기 때문이다 . QType 객체를 직접 생성해서 사용할 수도 있지만 static import를 통해 객체를 사용하면 코드를 훨씬 깔끔하게 만들 수 있다. @Test public void QueryDSLTest(){ Member member1 = qf .selectFrom(QMember.member) .where(QMember.member.username.eq("mem..
QueryDSL 공부 1 - queryDSL 설정 QueryDSL 은 JPA 를 사용할때 동적쿼리나 복잡한 쿼리들을 자바로 만들어 낼 수 있도록 도와주는 라이브러리이다. 쿼리가 자바로 작성되기 때문에 컴파일 시점에 오류를 잡아낼 수 있고 , 가독성 있게 작성 할 수 있는 것이 장점이다 . 설치를 해보고 QueryDSL이 어떻게 작동 하는지 알아보자 gradle 을 기준으로 설치를 해보려 한다 . spring initializer를 사용하여 프로젝트를 생성할 경우에 추가할 라이브러리 목록에 QueryDSL은 없기 때문에 따로 추가가 필요하다. plugins { id 'org.springframework.boot' version '2.5.1' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id..
API 개발을 위한 JPA 4 - OSIV (open session in view) OSIV 란 ? JPA가 생기기전 하이버네이트에서 JPA의 EntityManager역할을 하는게 hibernate Session이 었다 . JPA에서는 open entitymanager in view라고 하지만 관례산 OSIV(open session in view)라 한다. 기본값이 true 로 되어 있다 스프링 부트 애플리케이션을 run 하면 2021-06-14 23:20:39.303 WARN 29122 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view r..
API 개발을 위한 JPA 3 - 1:N N:N 관계 컬렉션 조회 최적화 //Controller @GetMapping("/api/v2/member") public List orders(){ List orders = orderRepository.findAll(); List collect = orders.stream().map(o -> new OrderDto(o)).Collect(Collectors.toList()); return collect; } //OrderDto public class OrderDto{ private Long orderId; private String name; private Adress address; //컬랙션 타입 포함 private List orderItems; public OrderDto(Order o){ this.orderId = o.getId(..
API 개발을 위한 JPA 2 - 1:1 ,N:1 성능 최적화 1. 지연로딩 조회 성능 최적화 -지연로딩으로 발생하는 성능 문제를 해결 양방향관계에서 한군데에 @jsonignore를 해줘야 무한루프가 안걸린다. /* lazy로딩 설정시 데이터 요청하면 연관엔티티는 프록시객체가 반환되는데 json binder가 프록시를 인식을 못하기 떄문에 예외가 터진다. 혹시나 아래와 1같은 에러를 만난다면 (bytebuddy는 hibernate가 proxy객체를 만들때 사용하는 라이브러리이다) Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http..

반응형