임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있다.
- jpa는 임베디드 타입(embeded type)이라고 함
- 주로 기본값 타입을 모아서 만들어서 복합값 타입이라고도 함
jpq에서 임베디드 타입 사용법
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
기본 생성자 필수
임베디드 타입의 장점
- 재사용
- 높은 응집도
- Period.iswork()처럼 해당 값 타입만 사용하는 의미있는 메소드를 만들수 있다.(객체지향적 설계가 가능하다)
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 보유한 엔티티 생명주기
임베디드 타입과 테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐이다.
- 임베디드 타입을 사용하기 전과 후의 매핑하는 테이블은 같다.
- 객체와 테이블을 아주 세밀하게 매핑하는 것 가능
- 잘 설계한 ORM애필리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다.
@AttributeOverride : 속성 재정의
- 한 엔티티에서 같은 값 타입을 사용하려면 컬럼 명이 중복
- @AttributeOverride, @AttributeOverrides를 사용해서 컬럼 명 속성을 재정의
객체 타입의 한계
- 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다
- 문제는 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본타입이 아니라 객체 타입이다
- 자바 기본 타입에 값을 대입하면 값을 복사한다.
- 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다
- 객체의 공유 참조는 피할 수 없다
Spring, thymeleaf, JPA,
->JPQL
->통합 프로젝트
queryDSL
객체지향 쿼리 언어(JPQL)
10-1. JPA는 다양한 쿼리 방법을 지원한다.
- JPQL
- QuetyDSL
- JPA Criteria
- 네이티브 SQL
- JDBC API 직접 사용
- MyBatis
-SpringJDBCTemplate
JPQL 소개
- 단순한 조회 : EntityManager.find()
-> 나이가 18세 이상인 회원을 모두 검색하고 싶다면?
JPQL이란
- jpa를 사용하면 엔티티 객체를 중심으로 개발
- 문제는 검색 쿼리
- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
- 모든 db데이터를 객체로 변환해서 검색하는 것은 불가능
- jpa는 sql을 추상화한 jpql이라는 객체 지향 쿼리 언어를 제공
- sql문법이 유사, select,from.where,group by, having,join지원
- JPQL 엔티티 객체를 대상으로 쿼리
- SQL은 데이터베이스 테이블 대상으로 쿼리
- JAVA Persistence Query Language
- jpql을 한마디로 정의하면 객체지향 sql이다.
jpql 문법
- 대소문자 구분
-> 엔티티와 속성은 대소문자 구분
-> jpql 키워드는 구분하지 않음
- 엔티티 이름
->테이블명 대신 엔티티명을 사용
-> @Entity(name="...")
-> 지정하지 않을 시 클래스명을 기본값으로 사용(추천)
- 별칭은 필수
-> jpql은 별칭 필수
-> AS는 생략 가능