본문 바로가기

JPA

(7)
자바 ORM 표준 JPA 프로그래밍 _ 기본(김영한) _ JPQL 소개, 문법 JPA는 다양한 쿼리 방법을 지원한다 JPQL JPA Criteria (자바코드로 JPQL 작성. 복잡하고 실용성X. QueryDSL 사용 권장) QueryDSL (자바코드로 JPQL 작성. JPQL 빌더 역할. 동적 쿼리 작성 편리함) 네이티브 SQL (JPA가 제공하는 SQL을 직접 사용. JPQL로 해결할 수 없는 특정 DB에 의존적인 기능 사용) JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 (영속성 컨텍스트를 적절한 시점에 플러시 해야함) JPQL(Java Persistence Query Language) JPA를 사용하면 엔티티 객체를 중심으로 개발 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB 데이터를 객체로 변환해서 검색하는..
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자(pk)로 지속해서 추적 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 예시) int a = 100; a = 200; 하면 완전히 다른 값으로 대체됨 값 타입 분류 기본값 타입 자바 기본 타입(int, double) wrapper 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) 컬렉션 값 타입(collection value type) 기본값 타입 예시) String name, int age 생명주기를 엔티티에 의존함 (예시: 회원을 삭제하면 이름, 나이 필..
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 프록시와 연관관계 관리 'Member → Team' 다대일 매핑일 때 Member를 조회하면 Team도 조회해야 할까? 프록시 em.find() : DB를 통해서 실제 엔티티 객체 조회 em.getReference() : DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회 [프록시 특징] 실제 클래스를 상속받아 만들어짐 (타입 체크 시 주의, '==' 비교는 실패함, 'instance of' 사용할 것) 실제 클래스와 겉 모양이 같음 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨 (이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 ..
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 고급 매핑 상속관계 매핑 RDB는 상속 관계를 구현할 수 없음 슈퍼타입, 서브타입 관계라는 모델링 기법이 객체의 상속과 유사 슈퍼타입, 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 → 조인 전략 통합 테이블로 변환 → 단일 테이블 전략 서브타입 테이블로 변환 → 구현 클래스마다 테이블 전략 [주요 어노테이션] @Inheritance(strategy=InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name="DTYPE") @DiscriminatorValue("XXX") [조인 전략] 장점 테이블 정규화 외래키 참조 무결성 제약조건 ..
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 연관관계 매핑 예제 시나리오 회원과 팀이 있다 회원은 하나의 팀에만 소속될 수 있다 회원과 팀은 다대일 관계다 테이블에 맞춘 객체 모델링의 문제점 Member 엔티티에서 Team 엔티티를 참조하지 않고 Team에 대한 외래키(teamId)를 그대로 사용 객체 그래프를 탐색할 수 없고, Member 조회를 통해 얻은 Team 객체 식별자로 다시 DB를 조회해야 함 객체를 테이블에 맞추어 모델링하면 객체 간의 협력 관계를 만들 수 없다 단방향 연관관계 @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; @ManyToOne @JoinColum..
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 엔티티 매핑 엔티티 매핑 @Entity, @Table : 객체와 테이블 매핑 @Column : 필드와 컬럼 매핑 @Id : 기본 키 매핑 @ManyToOne, @JoinColumn : 연관관계 매핑 @Entity @Entity가 붙은 클래스(Entity)는 JPA가 관리함 기본 생성자 필수 (파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스는 안 됨 저장할 필드에 final 사용하면 안 됨 속성 기능 기본값 name JPA에서 사용할 Entity 이름을 지정한다. 같은 클래스 이름이 없으면 가급적 기본값을 사용한다. 클래스 이름을 그대로 사용 @Table 속성 기능 기본값 name 매핑할 테이블 이름 Entity 이름을 사용 catalog..
자바 ORM 표준 JPA 프로그래밍 - 기본(김영한) _ 개념 정리 객체와 관계형 데이터베이스의 차이 상속 연관관계 데이터 타입 데이터 식별 방법 주의사항 EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유 EntityManager는 스레드 간에 공유하면 안 된다(사용하고 버려야 함) JPA의 모든 데이터 변경은 트랜잭션 안에서 실행 영속성 컨텍스트 영속성 컨텍스트는 논리적인 개념 EntityManager를 통해서 영속성 컨텍스트에 접근한다 [영속성 컨텍스트의 이점] 1차 캐시 : 반복 가능한 읽기(repeatable read) 등급의 트랜잭션 격리 수준을 DB가 아닌 애플리케이션에서 제공 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) : 트랜잭션 커밋 순간 DB에 SQL을 ..