본문 바로가기

Java/JPA21

JPA 실전2편 - 주문조회 API 쿼리 방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다. 2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다. 3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다. 4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다 주문+배송정보+회원을 조회하는 API 양방향 연관관계가 걸린 곳은 꼭! 한 곳을 @JsonIgnore 처리해야한다. 안그러면 양쪽을 서로 호출하면서 무한루프발생. 엔티티를 API응답으로 노출하는것보다는 DTO로 변환해서 반환하는 것이 더 좋다. (실무에서는 List로 바로 반환하지말고 result객체로 한 번 더 감싸주자) 간단한 주문조회를 하는 컨트롤러 메서드.. 2023. 12. 12.
JPA 실전2편 - 회원 관련 API 회원등록 API 요청 값으로 엔티티 대신에 DTO를 RequestBody에 매핑한다. @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){ Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data //api용 DTO, 이렇게하면 api스펙 까지 않아도 뭐가 넘어오는지 알 수 있음.절대 엔티티로 바로 사용하지 마시오 static class.. 2023. 12. 7.
JPA실전1 정리 스프링 부트 스타터(https://start.spring.io/)) 스프링부트로 설정이 다 자동화되었다. persistence.xml없다. 쿼리파라미터 남기는 라이브러리. build.gradle에 등록.(개발단계에서만 사용하는 것을 권장함. 개발단계에서는 편하게 사용해도 된다. 운영시스템에 적용하려면 성능테스트 꼭 필요.(성능저하 이슈) implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' 예제 설계에서 Member 엔티티에 사실 OrderList는 필요 없다. Order에서 Member 정보 참조해서 하면 됨. * 참고: 회원이 주문을 하기 때문에, 회원이 주문리스트를 가지는 것은 얼핏 보면 잘 설계한 것 같지만, 객체 세 .. 2023. 11. 26.
JPQL - Named 쿼리, 벌크연산 Named 쿼리 - 정적쿼리 미리 정의해서 이름을 부여해두고 사용하는 JPQL. 어노테이션이나 xml에 정의한다. Spring Data JPA에서는 인터페이스 메소드 위에다가 바로 @Query 어노테이션으로 사용가능 -> 실무에서는 스프링데이터jpa써야겠죠? Named 쿼리 장점: 애플리케이션 로딩 시점에 초기화 한 후 재사용, 애플리케이션 로딩시점에 쿼리 검증함..(쿼리 이상하면 QuerySyntaxException오류 발생) 캐시하고 있어서 코스트 절약 @Entity @NamedQuery( name = "Member.findByUsername", // 클래스명.###이 관례임 query = "select m from Member m where m.username = :username" ) public.. 2023. 11. 22.
JPQL - fetch join(패치조인) - 적극활용 권장 이거 모르면 실 무 못 함. 데이터 여러개 조회할 때 좋음 JPQL에서 성능 최적화를 위해 제공함.페치 조인은 객체 그래프를 SQL한번에 조회한다.(즉시로딩)명시적으로 즉시로딩 하는거라고 볼 수 있음, 프록시 아니고 진짜데이터 들고옴. 주로 조회성 기능할때 사용 String jpql = "select m from Member m join fetch m.team"; List members = em.createQuery(jpql,Member.class) .getResultList(); for (Member member : members) { System.out.println("username = " + member.getUs.. 2023. 11. 21.
JPQL-프로젝션,조인,조건식 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. JPQL은 SQL과 문법이 유사함. 엔티티 객체를 대상으로 쿼리. JPQL문법 select_문 :: == select_절 from_절 [where_절] [groupby_절] [having_절] [orderby_절] update_문 :: = update_절[where_절] delete_문 :: = delete_절[where_절] 엔티티와 속성은 대소문자 구분o(Member, age) JPQL키워드는 대소문자 구분x(select) 엔티티 이름 사용, 테이블 이름이 아님. 별칭은 필수(Member m) TypeQuery, Query TypeQuery : 반환 타입이 명확할 때 사용 Query : 반환 타입이 명확하지.. 2023. 11. 21.