JPA

·JPA
01. 페치 조인(fetch join) 이란? 페치 조인은 SQL의 조인 종류와는 무관하다. JPQL에서 성능 최적화를 위해 제공하는 기능으로, 연관된 엔티티나 컬렉션의 SQL을 한 번에 함께 조회하는 기능이다. 쿼리로 내가 원하는 대로 어떤 객체 그래프를 한 번에 조회할 것을 동적인 타이밍에 정할 수 있다. join fetch 명령어를 사용하면 된다. 페치 조인 ::= [LEFT [OUTER] | INNER] JOIN FETCH 조인경로 02. 엔티티 페치 조인 Member를 가져올 때 Team도 가져오고 싶은 경우, JPQL로 select m from Member m join fetch m.team 을 작성하고 실제 나가는 SQL 쿼리문을 보면 SELECT M.*, T.* FROM MEMBER M I..
·JPA
01. 경로 표현식이란? 경로 표현식이란 .(점)을 찍어 객체 그래프를 탐색하는 것이다. 3가지 경로 표현식이 존재한다. 세 가지 중 어떤 것을 사용하느냐에 따라 내부 동작이 달라지기 때문에 반드시 이해하고 사용해야 한다. 02. 경로 표현식 용어 정리 상태 필드(state field) : 단순히 값을 저장하기 위한 필드이다. 예시로는 select m.username 이 있다. 연관 필드(association field) : 연관관계를 위한 필드이다. 단일 값 연관 필드와 컬렉션 값 연관 필드로 나뉜다. 단일 값 연관 필드 : @ManyToOne, @OneToOne 에 사용하며 대상이 엔티티이다. 예시로는 join m.team t 이 있다. 컬렉션 값 연관 필드 : @OneToMany, @ManyToMa..
·API
지난 글에 이어서 이번에는 엔티티를 Dto로 변환하여 응답을 내려주는 것을 할 것이다. 01. 코드 작성 다음과 ordersV2 를 작성한다. @GetMapping("/api/v2/simple-orders") public List ordersV2() { List orders = orderRepository.findAllByString(new OrderSearch()); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) // order를 dto로 변환함 .collect(Collectors.toList()); return result; } @Data static class SimpleOrderDto { private Long orderId; pr..
·API
API 개발 고급 에서는 주문 + 배송정보 + 회원을 조회하는 API를 만들 것이다. 지연 로딩 때문에 발생하는 성능 문제를 해결하는 것이 목표이다. Order - Member 는 ManyToOne, Order - Delivery 는 OneToOne 이다. 여기에서는 @XToOne에 대한 성능 최적화를 위한 과정을 진행한다. Order - OrderItem은 OneToMany이며 Collection 형태로, 나중에 진행한다. 00. 컨트롤러 작성 요청을 받아 처리할 컨트롤러를 작성하자. @RestController로 Json 형태로 객체 데이터를 반환함을 명시한다. @RequiredArgsConstructor 로 final 필드인 orderRepository를 주입받는다. @RestController @..
·JPA
작성 개요 현재, 인프런에서 김영한님의 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의를 듣고 있다. 자바 ORM 표준 JPA 프로그래밍 - 기본편 에서 들은 내용을 기본으로 하는 강의라서 복습할 겸, 내가 제대로 내용을 이해하고 있는지 정리할 겸 작성을 시작하게 되었다. 01. @Getter 와 @Setter에 관하여 예제에서는 엔티티 클래스에 Getter, Setter를 모두 열어두었다. 실무에서는 Getter 열어두고, Setter는 꼭 필요한 경우에만 사용하는 것을 추천한다고 한다. 실무에서 엔티티 데이터는 조회할 일이 많으므로 Getter는 열어두는 것이 편리하다. Getter는 단순히 데이터를 호출하는 것이므로 호출하는 것 자체만으로 어떤 일이 발생하지 않는다. 하지만 Set..
·JPA
01. 프로젝션 프로젝션이란? SELECT 절에 조회할 대상을 지정하는 것을 말한다. 프로젝션 대상으로는 엔티티, 임베디드 타입, 스칼라 타입 (숫자, 문자 등 기본 데이터 타입) 이 있다. 관계형 데이터베이스 같은 경우, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)만 넣을 수 있다. 엔티티 프로젝션 다음 쿼리의 예시를 보자. SELECT m FROM Member m 이렇게 가져온 쿼리의 결과는 영속성 컨텍스트에 관리가 될까? 된다. 아래는 예시 코드이다. 아래 실행 결과와 같이 영속성 컨텍스트에서 관리되고 있음을 볼 수 있다. 다음 쿼리의 예시를 보자. SELECT m.team FROM Member m Member를 통해 Team을 조회하고 싶다면 다음과 같이 작성하면 된다. List result ..
·JPA
01. JPQL 소개 JPQL 소개 JPQL은 객체지향 쿼리 언어이다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라, 엔티티 객체를 대상으로 쿼리한다. 즉 @Entity(name = "")에 name에 해당하는 값을 말한다. 중요한 것은 JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다는 것이다. JPQL은 결국 SQL로 변환된다. (최대한 SQL문과 비슷하게 짜는 것이 좋다.) 02. JPQL 문법 JPQL 문법 예시로 select m from Member as m where m.age > 18을 들 수 있다. 엔티티와 속성은 대소문자를 구분한다. JPQL 키워드는 대소문자를 구분하지 않는다. (SELECT, FROM, WHERE 등) 엔티티 이름을 사용해야 한다. 테이블 이름..
·JPA
01. 값 타입 컬렉션 값 타입 컬렉션 값 타입을 컬렉션에 담아서 쓰는 것을 말한다. 값 타입을 하나 이상 저장할 때 사용한다. Member 엔티티의 favoriteFoods 변수, addressHistory 변수는 값 타입을 컬렉션으로 갖고있다. 관계형 데이터베이스는 기본적으로 컬렉션을 테이블 내에 담을 수 있는 구조가 없다. @ElementCollection, @CollectionTable을 사용한다. @ElementCollection은 컬렉션 객체임을 JPA에게 알려주는 어노테이션이다. @CollectionTable의 name 속성으로 매핑한 테이블명을 작성한다. @CollectionTable의 joinColumns 속성은 FK를 지정하는 것이다. favoriteFoods에는 예외적으로 @Colum..
coding-orange
'JPA' 태그의 글 목록