경로 표현식 경로 표현식은 점을 찍어 객체 그래프를 탐색하는 것이다. select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' 상태 필드(state field) : 단순히 값을 저장하기 위한 필드, 경로 탐색의 끝이므로 더이상 탐색이 불가능하다. JPQL: select m.username, m.age from Member m SQL: select m.username, m.age from Member m 연관 필드(association field) : 연관관계를 위한 필드, 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티..
Spring JPA 공부/자바 ORM 표준 JPA 프로그래밍
JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리를 만드는 것이 아니라 엔티티 객체를 대상으로 쿼리를 만든다. JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. 이번 강의에서 JPQL을 배우면서 사용할 객체와 DB 모델이다. JPQL 문법 엔티티와 속성은 대소문자 구분을 한다. JPQL 키워드는 대소문자 구분을 하지 않는다.(SELECT, FROM, WHERE) 엔티티 이름을 사용한다. 테이블 이름이 아니다. 별칭은 필수이다 (SQL에서 as 를 통해 지칭했던 것) 집합과 정렬 select COUNT(m), //회원수 SUM(m.age), //나이 합 AVG(m.age), //평균 나이 MAX(m.age), //최대 나이 MIN(m..
JPQL JPQL이 나오게된 배경 JPA를 사용하면 엔티티 객체를 중심으로 개발한다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 한다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다. 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. JPQL의 특징 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. SQL과 문법은 유사하다. SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다. JPQL은 엔티티 객체를 대상으로 쿼리를 짠다 SQL은 데이터베이스 테이블을 대상으로 쿼리를 짠다. JPQL을 한마디로 정의하면 객체 지향 SQL이다. Criteria 소개 //Criteri..
실전 예제 5번에서 추가 된 것은 ADDRESS를 value type 값 타입으로 추가하였다. Address package jpabook.jpashop.domain; import javax.persistence.Embeddable; import java.util.Objects; @Embeddable public class Address { private String city; private String street; private String zipcode; public String getCity() { return city; } private void setCity(String city) { this.city = city; } public String getStreet() { return street;..
기본값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능하다. 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능하다. (Id 값이 변경 안되므로 계속 확인 가능) 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체이다. 식별자가 없고 값만 있으므로 변경시 추적 불가능 하다. 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체된다. 값 타입에는 기본값 타입, 임베디드 타입(embedded type, 복합 값 타입 예) x, y 좌표 같은 느), 컬렉션 값 타입(collection value type)이 있다. 기본값 타입 이 중 기본값 타입에는 int,double..
이번 실전 예제 5의 요구 사항이다. 모든 연관관계를 지연 로딩으로 @ManyToOne, @OneToOne은 기본이 즉시 로딩이므로 지연 로딩으로 변경 Order -> Delivery를 영속성 전이 ALL 설정 Order -> OrderItem을 영속성 전이 ALL 설정 지연 로딩 변경하기 지금 까지 만든 class를 돌아다니면서 ManyToOne과 OneToOne은 LAZY로 변경한다. //Category @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PARENT_ID") private Category parent; //Delivery @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY) private ..
프록시 Member 테이블에 username과 Team team이 존재한다고 할 때, 회원만 출력하고 싶은 경우에도 select는 team도 조회하게 된다. 이것은 큰 낭비인데 JPA는 이것을 프록시로 처리한다. 프록시 기초 em.find() : 데이터베이스를 통해서 실제 엔티티 객체를 조회한다. em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체를 조회한다. 즉, em.getReference()는 select 구문을 안하고도 값을 저장하고 있다. 프록시 특징 실제 클래스를 상속 받아서 만들어진다. 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다.(이론상) 프록시 객체는 실제 객체의 참조를 보관한다. 프록..
실전 예제 3에서 추가 된 것 상품의 종류는 음반, 도서, 영화가 있고 이후 더 확장될 수 있다. 모든 데이터는 등록일과 수정일이 필수다. 상품 종류 확장 package jpabook.jpashop.domain; import javax.persistence.Entity; @Entity public class Album extends Item { private String artist; private String etc; ..Getter/Setter } package jpabook.jpashop.domain; import javax.persistence.Entity; @Entity public class Book extends Item{ private String author; private String ..