본문 바로가기

Spring/JPA

(8)
JPA Basics - JPQL Advanced 1. 경로 표현식 ◍ 경로표현식: .(점)을 찍어 객체 그래프를 탐색하는 것 select m.username -> 상태 필드 from Member m join m.team t. -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A' ◍ 용어 정리 ○ 상태필드(state field): 단순히 값을 저장하기 위한 필드(ex> m.username) ○ 연관필드(association field): 연관 관계를 위한 필드 ◼ 단일값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex> m.team) ◼ 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션(ex> m.orders) ◍ 특징 ○ 상대 필드 ..
JPA Basic - JPQL Basic 0. 기본 ◍ JPQL: 엔티티 객체를 대상으로 쿼리 ◍ JPA는 SQL을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공. ◍ 검색 조건이 있는 쿼리가 필요할 때 사용. ◍ 동적쿼리: Criteria 보다 쿼리DSL ◍ QueryDSL ○ 문자가 아닌 자바코드로 JPQL 작성 가능 ○ JPQL빌더 역할 ○ 컴파일 시점에 문법 오류를 찾을 수 있음 ○ 동적 쿼리 작성 편리함 ○ 단순하고 쉬움 ○ 실무사용 권장! ◍ 네이티브 SQL ○ JPA가 제공하는 SQL을 직접 사용하는 기능 ○ JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능 EX> 오라클 CONNECT BY, 특정 DB만 사용하는 SQL 힌트 ◍ JDBC 직접 사용, SpringJdbcTemplate 등 ○ JPA를 사용하면서 JD..
JPA Basic - 값 타입 1. 기본 값 타입 ◍ JPA의 데이터 타입 분류 ○ 엔티티 타입 ◼ @Entity로 정의하는 객체 ◼ 데이터가 변해도 식별자로 지속해서 추적 가능 ○ 값 타입 ◼ int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 ◼ 식별자가 없고 값만 있으므로 변경시 추적 불가 ◍ 값타입 분류 ○ 기본 값 타입: 자바 기본 타입(int, double)/ 래퍼 클래스(Integer, Long)/ String ○ 임베디드 타입: 복합 값타입 ○ 컬렉션 값타입 ◍ 기본값 타입 ○ 생명 주기를 엔터티에 의존 ○ 값 타입은 공유하면 안됨. ○ 자바의 기본 차입은 절대 공유 불가. ◼ int,double같은 기본 타입은 절대 공유 못함 ◼ 기본 타입은 항상 값을 복사함. ◼ Integer..
JPA Basic - 프록시, CASCADE, 고아객체 1. 프록시 ◍ 기초 ○ em.find = 데이터 베이스 통해서 실제 엔티티 객체 조회 ○ em.getReference(): 데이터 베이스 조회를 미루는 가짜 엔티티 조회(프록시) ○ 특징 ◼ 실제 클래스를 상속 받아서 만들어짐. ◼ 실제 클래스와 겉 모양이 같다. ◼ 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상) ◼ 프록시 객체는 실제 객체의 참조(target)를 보관 ◼ 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 ○ 프록시 객체의 초기화 Member member = em.getReference(Member.class, "id1"); member.getName() //1. getName() //2. 영속성 컨텍스트에 초기화 요청 //3. DB조..
JPA Basic - 상속관계 매핑 1. 상속관계 매핑 ◍ 관계형 데이터 베이스는 상속관계 없음 ◍ 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사. -> 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 ◍ 방법 ○ 각각 테이블로 변환 -> 조인전략 (정석 및 깔끔한 설계 - 그러나 성능 이슈 있을 수도) ◼ DTYPE 으로 구분하여 JOIN ◼ 장점: 테이블 정규화. 외래키 참조 무결성 제약조건 활용가능/저장공간 효율화 ◼ 단점: 조회시 조인 많이 사용/ 성능 저하/ 조회 쿼리가 복잡/ 데이터 저장시 INSERT 2번 호출 ○ 통합 테이블로 변환 -> 단일 테이블 전략 (기본) ◼ 장점: 조인이 필요 없으므로 일반적으로 조회 성능 빠름/ 조회 쿼리 단순함 ◼ 단점: 자식 엔티티가 매핑한 컬럼 모두 null 허용/ ..
JPA Basic - 엔티티 매핑 1. 객체와 테이블 매핑: @Entity, @Table ◍ @Entity ○ JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 ○ 주의 ◼ 기본생성자 필수(파라미터가 없는 public 또는 protected 생성자) ◼ final 클래스, enum, interface, innner 클래스에는 사용X ◼ 저장할 필드에 final 사용 X ○ 속성: name ◼ 기본값: 클래스의 이름을 그대로 사용. ◼ 같은 클래스의 이름이 없으면 가급적 기본값 사용. ◍ @Table ○ 엔티티와 매핑할 테이블 지정 ◼ name: 매핑할 테이블 이름(엔티티 이름을 사용) ◼ catalog: 데이터베이스 catalog 매핑 ◼ schema: 데이터베이스 schema 매핑 ◼ uniqueConstraints(DDL..
JPA Basic - 영속성 관리 1. 영속성 컨텍스트 ◍ "엔티티를 영구 저장하는 환경" ○ EntityManager.persist(entity); ◍ 눈에 보이지 않는다. ◍ 엔티티 매니저를 통해서 영속성 컨택스트에 접근(1:1) ◍ J2EE, 스프링 프레임워크 같은 컨테이너 환경.(앤티티 매니저 : 영속성 컨텍스트가 N:1) ◍ 엔터티 생명주기 ○ 비영속(new/transient): 영속성 컨텍스트와 전혀 관계 없는 새로운 상태 ○ 영속(managed): 영속성 컨텍스트에 관리되는 상태 ○ 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태 ○ 삭제(removed): 삭제된 상태 // 객체를 생성한 상태(비영속) Memeber member = new Member(); member.setId("member1"); m..
JPA Basic - Intro 1. Intro. 1. JPA 공부가 어려운 이유 객체와 테이블을 제대로 설계하고 매핑하는 방법을 알려주지 않는다. 1:N, N:1, 1:1, N:M 매핑등의 개념이 난이도 있다. 실무 노하우 + 성능에 대해서 알려주지 않는다. 2. JPA가 실무 사용이 어려운 이유. JPA의 내부 동작 방식 이해 못해서 JPA가 어떤 SQL을 만들어 내는지 이해하지 못함. JPA가 언제 SQL을 만들어 내는지 이해하지 못함. 3. SQL 중심의 개발의 문제점. 개발자는 객체를 RDB에 저장하게 됨. 객체와 RDB의 차이가 있음. 상속 : RDB에서는 JOIN하는 과정을 거쳐야 하고 그 과정은 매우 복잡. 연관관계: 객체는 참조를 사용/ 테이블은 외래키를 사용 -> 객체를 테이블에 맞추어서 저장. 근데 객체는 Long이..