Spring/자바 ORM 표준 JPA프로그래밍 10

JPQL 기본 문법과 기능

JPQL JPQL은 객체지향 쿼리 언어이다. 엔티티 객체를 대상으로 쿼리한다. JPQL 문법 select m from Member m where m.age >18 엔티티는 대문자로, 속성은 소문자로 구분 O (Member, age) JPQL 키워드는 대소문자 구분X ( SELECT, select ) 엔티티 이름 사용, 테이블 이름이 아님! 별칭은 필수(m) TypeQuery : 반환 타입이 명확할 때 사용 Query: 반환 타입이 명확하지 않을 때 사용 query.getResultList() : 결과가 하나 이상일 때 리스트 반환. 결과가 없으면 빈 리스트 반환 query.getSingleResult() : 결과가 정확히 하나일때 단일 객체 반환. 결과 없거나 둘 이상이면 exception 발생 < 파라..

객체지향 쿼리언어 소개 (JPQL / QueryDSL)

JPA는 다양한 쿼리 방법을 지원한다 JPA JPA Criteria : 너무 복잡하여 QueryDSL 사용권장. QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SprintJdbc Template 함께 사용 JPQL JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. JPQL은 검색 할때 테이블이 아닌 엔티티 객체를 대상으로 검색한다. SQL은 데이터베이스 테이블을 대상으로 검색. JPQL을 한마디로 정의하면 객체지향 SQL ( 객체지향 쿼리 언어 ) JPQL은 SQL을 추상화해서 특정베이스 SQL에 의존하지 않는다. JPQL을 위처럼 사용하면, 아래와 같이 실행된 SQL을 볼 수 있다 ! 😃 Criteria 문자가 아닌 자바코드로 JPQL을 작성할수 ..

값 타입 ( 기본값, 임베디드 타입 @Embedded, 값 타입 컬렉션@CollectionTable )

JPA의 데이터 타입은 크게 2가지로 분류됨 -> 엔티티타입 / 값 타입 엔티티타입 식별자 O @Entity로 정의하는 객체 생명주기 관리 데이터가 변해도 식별자로 지속해서 추적 가능 ( 공유 가능) ex. 회원 엔티티의 키 또는 나이 값을 변경해도 식별자로 인식 가능 값 타입 식별자 X int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 생명 주기를 엔티티에 의존 식별자가 없고 값만 있으므로 변경시 추적 불가 (공유하지 않는 것이 안전) ex. 숫자 100을 200으로 변경하면 완전히 다른값으로 인식 1. 값 타입은 정말 값 타입이라 판단될 때만 사용 2. 엔티티와 값 타입을 혼동해서 엔티티 값으로 만들면 안됨. 3. 식별자가 필요하고, 지속적으로 값을 추적/변경 ..

프록시와 연관계/ 즉시로딩: EAGER / 지연로딩: LAZY / 영속성전이:cascade/ 고아객체: orphanRemoval

프록시 * Member를 조회할 때, 매번 Team도 함께 조회해야 될까? em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 특징 실제 클래스를 상속 받아서 만들어진다. 실제 클래스와 겉 모양이 같다. 사용하는 입장에서 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. 프록시 객체는 실제 객체의 참조(target)을 보관한다. 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출한다. 프록시 객체의 초기화 프록시 객체는 처음 사용할 때 한번만 초기화 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다. 초기화되면 프록시 객체를 통해서 실제 엔티티에 ..

고급매핑 : 상속관계 매핑 /@MappedSuperclass

상속관계매핑 관계형 데이터베이스는 상속관계가 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리모델을 실제 물리모델로 구현하는 방법 총 3가지 1. 조인전략: 각각 테이블로 변환 @Inheritance(strategy=InheritanceType.JOINED) 2. 단일 테이블 전략: 통합 테이블로 변환 @Inheritance(strategy=InheritanceType.SINGLE_TABLE) 3. 구현 클래스마다 테이블 전략 : 서브타입 테이블로 변환 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 정리 : 조인전략 과 단일 테이블 ..

다양한 연관관계 매핑

다대일[N:1] 일대다[1:N] 일대일[1:1] 다대다[N:M] 연관관계 매핑 시 고려사항 3가지 1. 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 2. 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없음 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향 3. 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘 중 테이블의 외래키를 관리할 곳을 지정해야함. 연관관계의 주인 : 외래 키를 관리하는 참조 주인의 반대편 : 외래키에..

연관관계 매핑 기초

객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 방향(Direction) : 단방향, 양방향 다중성(Multiplicity): 다대일(N:1) , 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해 연관관계의 주인(Owner) : 객체 양방향 연관관계는 관리 주인이 필요 1. 연관관계가 필요한 이유 - 객체지향 설계의 목표는 자율적인 객체들의 협력공동체를 만드는 것이다. by조영호(객체지향의 사실과 오해) - 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력관계를 만들 수 없다. 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. 객체는 참조를 사용해서 연관된 객체를 찾는다. 테이블과 객체 사이에는 이런 큰 간격이 있다. - 참조 대신 외래키를 그대로 사..

엔티티 매핑

1. 객체와 테이블 매핑 @Entity @Entity 가 붙은 클래스는 JPA가 관리, 엔티티라 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity는 필수이다. 주의점 : 기본생성자 필수 ( 파라미터가 없는 public 또는 protected 생성자) : final 클래스, enum, interface, inner 클래스 사용 X : 저장할 필드에 final 사용 X name 속성 - JPA에서 사용할 엔티티 이름을 지정한다. - 기본값 : 클래스 이름을 그대로 사용 ( ex. Member) - 같은 클래스 이름이 없으면 가급적 기본값을 사용한다. @Table 엔티티와 매핑할 테이블 지정 속성 기능 기본값 name 매핑할 테이블 이름 엔티티 이름 사용 catalog 데이터베이스 catalog..

영속성 컨텍스트

JPA에서 가장 중요한 두가지 1. 객체와 관계형 DB 매핑하기 2. 영속성 컨텍스트 * 엔티티 매니저 팩토리와 엔티티 매니저 영속성 컨텍스트 JPA를 이해하는데 가장 중요한 용어 "엔티티를 영구적으로 저장하는 환경" 이라는 뜻 EntityManager.persist(entity) ; 엔티티매니저를 통해서 영속성 컨텍스트에 접근한다. 엔티티의 생명주기 비영속 ( new) : 영속성 컨텍스트와 전혀 관계없는 새로운 상태 영속 (managed) : 영속성 컨텍스트에서 관리되는 상태 준영속 ( detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) : 삭제된 상태 영속성 컨텍스트의 장점 1차 캐시 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 (transactio..

JPA 소개

JAVA : 객체지향 언어 DB: 관계형 DB ( oracle, MySQL, .. ) -> 객체를 관계형 DB에 관리 -> SQL 중심의 개발 -> 무한 CRUD 반복 패러다임의 불일치 객체 vs 관계형DB *객체와 관계형 DB의 차이 1. 상속 2. 연관관계 - 객체는 참조를 사용 ex. Member.getTeam() - 테이블은 외래키 사용 ex. JOIN ON member.member_id = team.team_id 3. 데이터 타입 - 객체 모델링은 자바컬렉션에서 관리 가능 - 객체를 테이블에 맞추어 모델링/ 테이블에 맞추어 객체를 저장해야 한다. 4. 데이터 식별 방법 -> 객체를 자바 컬렉션애 저장하듯이 DB를 저장할 기술이 필요하다. JPA ( Java Persistence API) : 자바..