JPQL - 경로 표현식.(점)을 찍어 객체 그래프를 탐색하는 것select m.username -> 상태 필드 (Member의 username을 가리킴) from Member m join m.team t -> 단일 값 연관 필드 (Member에서 Team(엔티티)으로 넘어감) join m.orders o -> 컬렉션 값 연관 필드 (Member에서 Orders(컬렉션)으로 넘어감)where t.name = '팀A'경로 표현식 용어 정리상태 필드(state field) : 단순히 값을 저장하기 위한 필드(ex: m.username). 경로 탐색의 끝으로 더 이상 탐색 불가연관 필드(association field) : 연관관계를 위한 필드단일 값 연관 필드 : @M..
Spring
소개JPA는 JPQL, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API 직접 사용 그리고 MyBatis, SpringJdbcTemaplate을 함께 사용하는 방법 등의 다양한 쿼리 방법을 지원한다.JPQL가장 단순한 방법으로 JPA를 사용하면 엔티티 객체를 중심으로 개발을 진행한다. 문제는 검색 쿼리인데, 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색하지만, 모든 DB 데이터를 개체로 변환해서 검색하는 것은 불가능하다. 따라서 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공SQL과 문법이 유사하며, SELECT, FROM, WHERE, GROUP BY,..
JPA의 데이터 타입 분류엔티티 타입@Entity로 정의하는 객체데이터(속성)가 변해도 식별자로 지속해서 추적 가능값 타입int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고, 값만 있으므로 변경 시 추적 불가값 타입 분류기본값 타입: 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String생명주기를 엔티티에 의존 (회원을 삭제하면 이름, 나이 필드도 함께 삭제)값 타입은 공유하면 안됨 (회원 이름 변경 시, 다른 회원의 이름도 함께 변경되면 안됨)int, double 같은 기본 타입은 항상 값을 복사하므로 절대 공유하면 안됨Integer 같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경..
엔티티 조회는 2가지 방식으로 할 수 있다.em.find() : DB를 통해서 실제 엔티티 객체 조회em.getReference() : DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회(DB에 쿼리가 안나감)프록시란?실제 클래스를 상속 받아서 만들어져서 실제 클래스와 겉 모양이 같다. 따라서 이론상으로 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다.프록시는 가짜 객체로 실제 객체의 참조(target)을 보관한다.프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다.프록시 객체의 초기화 과정member에서 em.getReference()로 프록시 객체를 가지고 왔다.member.getName()을 호출하면 MemberProxy의 getName()을 보는데 M..
상속 관계 매핑: 객체의 상속과 구조와 DB의 슈퍼-서브 타입 관계를 매핑해준다.(관계형 DB는 상속 관계X, 슈퍼-서브 타입 관계라는 모델링 기법이 객체 상속과 유사)JOINED : 조인 전략SINGLE_TABLE : 단일 테이블 전략TABLE_PER_CLASS : 구현 클래스마다 테이블 전략1. 조인 전략: 가장 정규화된 모델링으로 엔티티들을 각각 테이블로 만들어서 부모의 기본 키를 기본 키 + 외래 키로 사용한다.(슈퍼 타입에 조인)슈퍼 타입 엔티티(부모 엔티티)에 @Inheritance(strategy = InheritanceType.JOINED)를 추가한다. 다만, 객체는 타입이 있는데 테이블은 타입에 개념이 없다. 따라서 슈퍼 타입의 속성으로 DTYPE을 두어서, 슈퍼 타입 테이블을 보고 어떤..
연관관계 매핑시 고려사항 3가지1. 다중성다대일(@ManyToOne) : 주인 쪽에 표기일대다(@OneToMany) : 주인이 아닌 쪽에 표기. 일쪽에서 다를 조회하는 로직 필요 시 매핑(양방향 매핑)일대일(@OneToOne)다대다(@ManyToMany) : 사용하지 말 것2. 단방향, 양방향테이블 : 방향이라는 개념이 없으며, 외래 키 하나로 양쪽에서 조인 가능객체 : 연관관계 매핑을 객체가 참조하는 방식으로 하여, 참조용 필드가 있는 쪽으로만 참조 가능한쪽 필드만 참조하면 단방향, 양쪽이 서로 참조하면 양방향연관관계의 주인을 결정해야 함3. 연관관계의 주인객체의 양방향 관계는 참조가 2군데 있어서 둘중 테이블의 외래 키를 관리할 곳을 지정해야 함연관관계의 주인은 외래 키를 관리하는 쪽이고, 주인의 반..
단방향 연관관계 매핑JPA를 사용해서 객체 연관관계와 테이블 연관관계를 매핑하면 위 그림과 같이 된다. 회원 객체의 Member.team 필드와 회원 테이블의 MEMBER.TEAM_ID의 왜래키 컬럼이 매핑되는 것이다.회원과 팀의 관계가 다대일 관계이므로 회원 엔티티에 @ManyToOne을 추가하고 @JoinCalumn으로 Team의 TEAM_ID와 조인하였다.회원 엔티티와 팀 엔티티// 회원 엔티티@Entitypublic class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOn..
객체와 테이블 매핑@EntityJPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이며 @Entity가 붙은 클래스는 JPA가 관리하며, 엔티티라 한다.기본 생성자가 필수로 있어야 함final 클래스, enum, interface, inner 클래스에 사용할 수 없으며, 저장할 필드에 final을 사용하면 안된다.@Table(name=" ")를 사용하여 테이블 이름을 정할 수 있다.데이터베이스 스키마 자동 생성DDL을 애플리케이션 실행 시점에 자동으로 생성하며 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성한다.데이터베이스 방언별로 DDL이 달라짐 → Oracle로 실행하면 varchar2로 생성되지만 h2로 실행하면 varchar로 생성된다. 테이블 중심 → 객체 중심스..
JPA에서 중요한 것 2가지?객체와 RDB 매핑영속성 컨텍스트영속성 컨텍스트?: 엔티티를 영구 저장하는 환경으로 논리적인 개념이다.엔티티 매니저를 통해서 영속성 컨텍스트에 접근한다.(엔티티 매니저와 영속성 컨텍스트가 J2SE 환경에서 1:1관계이고, J2EE, 스프링 프레임워크 같은 컨테이너 환경에서는 N:1 관계이다.) 엔티티 생명주기 비영속 상태 (new/transient): 객체를 생성만 하고 엔티티와 연결하지 않음 영속 상태 (managed): 객체를 생성하고 저장한 상태로 영속성 컨텍스트가 관리하는 엔티티 준영속 상태 (detached): 엔티티를 영속성 컨텍스트에서 분리 ex) em.detach(member); 삭제 (removed): 객체를 삭제한 상태 ex) em.remove(member)..
보호되어 있는 글입니다.