JPA 15

JPQL

JPQL 소개    • JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.    • JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하 지 않는다.    • JPQL은 결국 SQL로 변환된다.  • 엔티티와 속성은 대소문자 구분O (Member, age)• JPQL 키워드는 대소문자 구분X (SELECT, FROM, where) Entity 이름 사용 ( table name X)@Entity(name = "Member") 별칭은 필수(m) (as는 생략가능)select m from Member as m where m.age > 18  • TypeQuery: 반환 타입이 명확할 때 사용• Query: 반환 타입이 명확하지 않을 때 ..

JPA 2024.08.30

JPA의 다양한 쿼리방법

JPA는 다양한 쿼리 방법을 지원JPQLJPA CriteriaQueryDSL네이티브 SQLJDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 가장 단순한 조회 방법 :  EntityManager.find()     /      객체 그래프 탐색(a.getB().getC()) JPQLJPA를 사용하면 엔티티 객체를 중심으로 개발문제는 검색 쿼리검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공SQL과 문법 유사, SELECT, FROM, WHERE, GRO..

JPA 2024.08.30

JPA 기본 값 타입

JPA의 데이터 타입 분류엔티티 타입 @Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경시 추적 불가예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류• 기본값 타입생명주기를 엔티티의 의존값 타입은 공유 X 회원 A 변경시 다른 회원 B의 변경이 일어나서는 안된다.   • 임베디드 타입(embedded type, 복합 값 타입)새로운 값 타입을 정의할 수 있음JPA는 임베디드 타입이라함주로 기본값 타입을 모아서 만든 복합 타입이라고도함int or Spring 같은 값..

JPA 2024.08.28

JPA 고아객체

• 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티 를 자동으로 삭제• orphanRemoval = true • Parent parent1 = em.find(Parent.class, id); parent1.getChildren().remove(0); //자식 엔티티를 컬렉션에서 제거• DELETE FROM CHILD WHERE ID=? 주의사항 !참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능참조하는 곳이 하나일 때 사용해야함!특정 엔티티가 개인 소유할 때 사용@OneToOne, @OneToMany만 가능참고: 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고 아 객체 제거 기능을 활성화 하면, 부모를 제거할 때 자식도 함께 제거된다. 이것은 Ca..

JPA 2024.08.25

JPA 상속관계 맵핑

• 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법    • 각각 테이블로 변환 -> 조인 전략    • 통합 테이블로 변환 -> 단일 테이블 전략    • 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략  조인 전략 장점 테이블 정규화 외래 키 참조 무결성 제약조건 활용가능 저장공간 효율화 단점 조회시 조인을 많이 사용, 성능 저하 조회 쿼리가 복잡함 데이터 저장시 INSERT SQL 2번 호출  단일 테이블 전략장점조인이 필요 없으므로 일반적으로 조회 성능이 빠름조회 쿼리가 단순함단점자식 엔티티가 매핑한 컬럼은 모두 null 허용단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상 황에 따라서 조회 성능이 오히려 느려질 수 있다.   구현 클래스마다 테이블 전략이 전..

JPA 2024.08.22

JPA 연관관계 매핑

다대일 [N:1]일대다 [1:N]일대일 [1:1]다대다 [N:M] 연관관계 매핑 시 고려사항 3가지 다중성단방향, 양방향연관관계의 주인 다중성다대일: @ManyToOne -> 가장 많이 쓴다.일대다: @OneToMany일대일: @OneToOne다대다: @ManyToMany -> 실무에서 사용하면 안 된다!대칭성이 있다고 생각하면 생각하기 편하다. 단방향, 양방향테이블외래 키 하나로 양쪽 조인 가능사실 방향이라는 개념이 없음 객체참조용 필드가 있는 쪽으로만 참조 가능한쪽만 참조하면 단방향양쪽이 서로 참조하면 양방향 ->이해하기 쉽게 표현한 것이지 방향은 하나다.연관관계의 주인 • 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음• 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데• 객체 양방향 ..

JPA 2024.08.22

JPA 연관관계

방향(Direction): 단방향, 양방향다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해연관관계의 주인(Owner).. 어려운 내용: 객체 양방향 연관관계는 관리 주인이 필요 JPA계의 포인터 import jakarta.persistence.*;@Entity@TableGenerator( name = "MEMBER_SEQ_GENERATOR", table = "MY_SEQUENCES", pkColumnValue = "MEMBER_SEQ", allocationSize = 1)public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQU..

JPA 2024.08.21