객체지향 쿼리 언어 소개JPA는 다양한 쿼리 방법을 지원JPQLJPA CriteriaQueryDSL네이티브 SQLJDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용JPQL 소개가장 단순한 조회 방법EntityManager.find()객체 그래프 탐색(a.getB().getC())나이가 18살 이상인 회원을 모두 검색하고 싶다면?JPQLJPA를 사용하면 테이블이 아닌 엔티티 객체를 중심으로 개발해야 한다.SQL은 테이블을 대상으로 작성되기에 테이블에 종속적이게 된다.문제는 검색 쿼리다.왜냐면 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 되기 때문이다.모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다.결국은 애플리케이션이 필요한 데이터만 DB..
기본값 타입JPA는 데이터 타입을 최상위 레벨로 보면 엔티티 타입과 값 타입으로 분류한다.엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자(PK)로 지속해서 추적 가능예) 회원 엔티티의 몸무게나 나이 값을 변경해도 식별자로 인식 가능값 타입int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경 시 추적 불가예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체값 타입 분류 기본값 타입자바 기본 타입(int, double) -> primitive 타입래퍼 클래스(Integer, Long)String임베디드 타입(embedded type, 복합 값 타입)컬렉션 값 타입(collection value type)기본값 타입예..
프록시Member를 조회할 때 Team도 함께 조회해야 할까?코드예시회원과 팀 함께 출력public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름: " + member.getUsername()); System.out.println("소속팀: " + team.getName());}member와 team을 같이 가져와서 사용하고 싶은 경우회원만 출력public void printUser(String memberId) { Member member = em.find(Memb..
상속관계 매핑객체는 상속관계가 있지만 관계형 데이터베이스는 상속 관계가 없다.그나마 객체의 상속관계와 비슷한 데이터 모델이 있다.슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다.상속관계 매핑이란 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑하는 거다.DB의 슈퍼타입, 서브타입 관계라는 논리 모델링 기법을 어떤 세 가지 방법으로 구현하든 JPA에서는 매핑을 하도록 지원해준다.슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법에는 3가지가 있다.각각 테이블로변환 -> 조인 전략통합 테이블로 변환 -> 단일 테이블 전략서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략조인 전략ITEM이라는 테이블을 만들고 ALBUM, MOVIE, BOOK 테이블을 만든 다음에 데이터를..