쿼리 메서드 기능은 스프링 데이터 JPA가 제공하는 마법 같은 기능으로, 아래 3가지가 존재한다. 하나씩 학습해 보자.메서드 이름으로 쿼리 생성메서드 이름으로 JPA NamedQuery 호출@Query 애노테이션을 사용해서 리포지토리 인터페이스에 쿼리 직접 정의 1. 메서드 이름으로 쿼리 생성스프링 데이터 JPA는 메서드 이름을 분석해서 JPQL 쿼리를 실행한다. 예를 들어 이름과 나이를 기준으로 회원을 조회하는 경우, 아래와 같이 코드를 작성하면 된다.public interface MemberRepository extends JpaRepository { ... List findByUsernameAndAgeGreaterThan(String username, int age);} 참고쿼리 메서드 ..
백엔드/Spring
이번 강의는 새로 학습한 내용이나 실무에서 중요하다고 하신 내용만 정리하려고 한다. 1. 예제 도메인 모델도메인 모델 동작 확인아래 코드에 적용된 롬복(Lombok)에 대해 간단하게 설명한다.@Setter실무에서는 가급적 Setter는 사용하지 않기@NoArgsConstructor(AccessLevel.PROTECTED)기본 생성자를 막고 싶어도 JPA 스펙상 PROTECTED로 열어 둬야 함@ToString가급적 연관관계가 없는 내부 필드에만 사용하기@Entity@Getter @Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)@ToString(of = {"id", "username", "age"})public class Member { @Id @..
실무에서 너무 성능이 안 나와서 튜닝을 해야 할 경우, 코드를 확인해 보면 대부분 아래에 나열해 둔 문제가 자주 발생한다고 한다.지연 로딩과 조회 성능 최적화컬렉션 조회 최적화페이징과 한계 돌파OSIV와 성능 최적화등록 및 수정에선 거의 문제가 발생하지 않고, 90% 정도 조회할 때 성능 문제가 발생한다. 따라서 조회용 샘플 데이터를 입력한 뒤 각 문제에 맞춰 API 성능을 최적화하는 방법을 학습한다. 이번 섹션에선 OSIV(Open Session In View)에 따라 성능을 최적화할 수 있는 방법을 학습한다. JPA에서 사용하는 EntityManager가 하이버네이트에선 Session으로 변경됐다. 따라서 JPA에선 Open EntityManager In View로 불려야 하지만 관례상 OSIV로 부..
실무에서 너무 성능이 안 나와서 튜닝을 해야 할 경우, 코드를 확인해 보면 대부분 아래에 나열해 둔 문제가 자주 발생한다고 한다.지연 로딩과 조회 성능 최적화컬렉션 조회 최적화페이징과 한계 돌파OSIV와 성능 최적화등록 및 수정에선 거의 문제가 발생하지 않고, 90% 정도 조회할 때 성능 문제가 발생한다. 따라서 조회용 샘플 데이터를 입력한 뒤 각 문제에 맞춰 API 성능을 최적화하는 방법을 학습한다. 이번 섹션에선 주문 내역에서 추가로 주문한 상품 정보를 추가로 조회하는 API를 만든다. Order 기준으로 컬렉션인 OrderItem과 Item이 필요하다.이전 섹션에서는 xToOne 관계만 있었다. 이번에는 컬렉션인 일대다 관계(OneToMany)를 조회하고, 최적화하는 방법을 학습한다. 참고이전 섹션..
실무에서 너무 성능이 안 나와서 튜닝을 해야 할 경우, 코드를 확인해 보면 대부분 아래에 나열해 둔 문제가 자주 발생한다고 한다.지연 로딩과 조회 성능 최적화컬렉션 조회 최적화페이징과 한계 돌파OSIV와 성능 최적화등록 및 수정에선 거의 문제가 발생하지 않고, 90% 정도 조회할 때 성능 문제가 발생한다. 따라서 조회용 샘플 데이터를 입력한 뒤 각 문제에 맞춰 API 성능을 최적화하는 방법을 학습한다. 이번 섹션에선 주문 및 배송 정보와 회원을 조회하는 API를 만들면서, 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결해 본다.참고실무에서 JPA를 사용하려면 지금부터 설명하는 내용을 100% 이해해야 한다. 안 그러면 엄청난 시간을 날리게 될 수도 있다. 간단한 주문 조회 V1: 엔티티를 직접 노..
이번 강의는 API 개발과 성능 최적화에 초점을 맞춘 강의다. 최근에는 주로 REST API로 개발하기 때문에 이전 [스프링 부트와 JPA 활용1] 편에서 구현해 둔 핵심 기능을 REST API로 구현해 보고, 스프링 부트와 JPA를 사용할 때의 API 개발 실무 노하우를 학습한다. 참고템플릿 엔진을 사용해 렌더링 하는 Controller와 API 스타일의 Controller를 둘 다 사용한다면 패키지를 분리하는 게 낫다.- 예외 처리 등을 공통으로 하는 경우가 많은데, 화면의 경우 템플릿 엔진에서 문제가 생기면 공통 에러 화면(HTML)이 나오게 된다. 그러나 API의 경우는 공통 에러용 JSON API 스펙이 나가야 한다.- 따라서 공통 처리 같은 관점에서 조금씩 차이가 발생하기 때문에 패키지를 분리..
저번 글에 이어서 객체지향 쿼리 언어인 JPQL의 문법을 학습한다. [자바 ORM 표준 JPA 프로그래밍 - 기본편] (9) 객체지향 쿼리 언어1 - 기본 문법1. 객체지향 쿼리 언어 소개JPA는 다양한 쿼리 방법을 지원한다. DB에서 특정 조건으로 데이터를 뽑으려면 결국 SQL이 실행돼야 한다. 이전 섹션들에서 JPA가 제공한 em.find() 같은 것 말고도, 검색 조dev-meung.tistory.com 1. JPQL(Java Persistence Query Language)경로 표현식a. 개념경로 표현식은 .(점)을 찍어서 객체 그래프를 탐색하는 것을 말한다. 아래처럼 사용해서 엔티티의 필드를 읽어오거나 엔티티와 연관된 엔티티 필드를 읽어올 수 있다.SELECT m.username # -> 상태 ..
1. 객체지향 쿼리 언어 소개JPA는 다양한 쿼리 방법을 지원한다. DB에서 특정 조건으로 데이터를 뽑으려면 결국 SQL이 실행돼야 한다. 이전 섹션들에서 JPA가 제공한 em.find() 같은 것 말고도, 검색 조건 같은 걸 적용하는 복잡한 쿼리를 어떻게든 짤 수 있어야 한다.- JPQL- JPA Criteria- QueryDSL- 네이티브 SQL- JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용실무에선 대부분 JPQL로 해결할 수 있지만 가끔가다 표준 문법으로 처리할 수 없는 경우가 생기면 다른 쿼리 방법을 사용해야 한다. 아래에서 하나씩 알아보자. JPQL가장 단순한 조회 방법은 지금까지 해온 EntityManager를 통해 find()로 조회하거나, 객체 ..
1. 기본값 타입JPA의 데이터 타입 분류JPA는 최상위 레벨에서 보면 데이터를 크게 두 분류(엔티티 타입, 값 타입)로 나눈다.엔티티 타입@Entity로 정의하는 객체를 말한다.데이터가 변해도 식별자로 지속해서 추적할 수 있다.ex. 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식할 수 있다.값 타입int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말한다.식별자가 없고 값만 존재하므로 변경할 경우 추적할 수 없다.ex. 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체된다. 값 타입은 크게 세 가지(기본값 타입, 임베디드 타입, 컬렉션 값 타입)로 구분한다.기본값 타입자바 기본 타입(int, double)래퍼 class(Integer, Long)..
1. 프록시먼저, 프록시를 언제 사용해야 하는지 알아보자. 아래에서 Member를 조회할 때 Team도 함께 조회해야 할까? 회원 이름과 소속 팀 이름을 함께 출력하려면 Member를 조회할 때 Team도 같이 조회하면 좋다. 회원 이름만 출력하면 된다면 Member만 조회하는 게 낫다. 따라서 사용하지 않는다면, 연관관계가 걸려있다고 해도 같이 조회하지 않는 게 성능상으로 더 효율적이다.JPA는 이 문제를 지연 로딩이나 프록시를 통해 해결한다. 프록시보단 지연 로딩을 주로 사용하지만, 프록시 구조를 알아둬야 즉시 로딩과 지연 로딩에 대해 깊이 이해할 수 있다.// 회원과 팀 함께 출력public void printUserAndTeam(String memberId) { Member member = ..