본문 바로가기

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


반응형

JPA

(55)
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..
API 개발을 위한 JPA 1 - crud 메서드 작성시 유의점 JPA를 사용하면 엔티티라는 개념이 있기 떄문에 API를 개발할 때 주의해야할 부분들이 많다. 공통으로 예외처리를 하거나 할때 패키지나 구성 단위로 공통처리를 하는 경우가 많다 . 예외 처리의 경우 API같은 경우에는 에러 API 스팩을 반환하고 서버사이드 랜더링은 에러 페이지를 반환한다 . 위의 차이점들과 같이 API 와 서버사이드랜더링 사이에 차이점들이 있기 떄문에 API 컨트롤러와 서버사이드 랜더링 컨트롤러를 나눠 주는 것이 좋다 1. 엔티티를 직접 Dto의 역할로 쓰지 말자 . 엔티티를 요청 데이터를 바인딩 받는 용도로 사용하거나 , 응답 데이터를 반환하는 용도로 사용할 경우 엔티티의 수정이 생길 경우 API 스펙이 바뀌어 버린다. 또 엔티티는 여러 곳에서 함께 사용하기 떄문에 presentati..
JPA 공부 20 - JPQL . 9 벌크 연산 재고가 10개 미만인 모든 상품의 가격을 10% 상승시키는 쿼리를 날려야 한다면? JPA의 변경 감지 기능으로 실행하기에는 너무 많은 SQL이 실행된다 . 1. 재고 10개 미만 재품을 리스트로 조회하고 , 2. 상품 엔티티 가격을 10% 증가시키고 3.트랙잭션 커밋 시점에 변경 감지 동작 변경된 데이터 수만큼 업데이트 문이 나갈 것이다. 이런 문제를 위해 JPA에서는 벌크연산을 제공한다. 쿼리 한 번으로 여러 테이블 로우를 변경할 수 있다. 간단한 예시로 멤버의 나이를 모두 20살로 바꿔야 한다고 하자 int resultCount = em.createQuery("update Member m set m.age = 20") .executeUpdate(); 쿼리는 한번만 나가고 모든 값이 20으로 변경됬다...

반응형