경로 표현식 .을 찍어 객체 그래프를 탐색하는 것을 경로 표현식이라고 한다. select m.username //상태 필드 from Member m join m.team t //단일 값 연관 필드 join m.orders o //컬렉션 값 연관 필드 where t.name = '팀A' 경로 표현식 용어 정리 상태 필드 : 단순히 값을 저장하기 위한 필드 (ex : m.username) 연관 필드 : 연관관계를 위한 필드 (단일 값, 컬렉션 값) 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 (ex: m.team) 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 (ex: m.orders) 경로 표현식 특징 상태 필드 경로 탐색의 끝으로 탐..
JPQL 소개 JPQL은 객체지향 쿼리 언어다. → 테이블을 대상으로 쿼리하는 것이 아닌, 엔티티 객체를 대상으로 쿼리 한다. 예시 비교 모델 Member 엔티티 @Entity public class Member { @Id @GeneratedValue private Long id; private String userName; private int age; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; } Team 엔티티 @Entity public class Team { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "team") private..
JPA는 다양한 쿼리 방법을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 다양한 쿼리 방법 맛보기 우리가 배운 것 중에 가장 간단한 조회 방법은 EnfifyManager.find() 를 한 뒤, 객체 그래프를 탐색하는 방법이었다. (a.getB().getC()) 이때, 만약 나이가 18살 이상인 회원을 모두 검색하고 싶다면? JPQL을 사용해보자. JPA의 문제점 JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 : 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 한다. 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하다. → 애플리케이션이 필요한 ..
1. 기본 값 타입 JPA의 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능. 예) 회원 entity의 키 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자 X → 변경시 추적 불가 값 타입 분류 기본 값 타입 : 자바 기본 타입, 래퍼 클래스(Integer, Long), String 임베디드 타입 : 복합 값 타입 컬렉션 값 타입 기본 값 타입 생명주기를 엔티티에 의존 : 회원 삭제 -> 그 안의 필드도 같이 삭제 값 타입은 공유 ❌ 📌Note : 자바의 기본 타입은 절대 공유 불가능 int, double 같은 primitive type은 공유가 불가능하다..
프록시 ❓Member를 조회할 때 Team도 함께 조회해야 할까? package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntit..
상속관계 매핑 관계형 데이터베이스는 상속 관계가 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다. 상속관계 매핑이란 객체의 상속과 DB의 슈퍼타입-서브타입 관계를 매핑하는 것을 의미한다. : 조인전략(각각 테이블로 변환), 단일 테이블 전략, 구현 클래스마다 테이블 전략(서브타입 테이블로 변환) 기법이 있다. Album, Movie, Book은 모두id, name, price를 가지고 있다(공통 변수) 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name="DTYPE"..
연관관계 매핑 시 고려사항 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 즉, 방향의 개념이 없다. 객체 참조용 필드가 있는 쪽으로만 참조 가능 (단방향) 한쪽만 참조하면 단방향 양쪽이 서로 참조하면 양방향(객체 입장 : 단방향을 2개) 연관관계 주인 외래 키를 관리하는 곳을 연관관계 주인으로 관리하자. 주인의 반대편은 단순 조회만 가능하도록 설계하는 것이 바람직하다. 다대일 [N:1] 다대일(N:1) 단방향 ERD 가장 많이 사용하는 연관관계이다. 다대일의 반대 → 일대다 다대일 양방향 ERD 외래 키가 있는 쪽이 연관관계의 주인이다. 양쪽을 서로 참조하도록 개발한다..
단방향 연관관계 목표 객체와 테이블 연관관계의 차이를 이해해야 한다. 객체의 참조와 테이블의 외래 키를 어떻게 매핑하는지에 대해 이해한다. 용어 이해 방향(Direction): 단방향, 양방향 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해 연관관계의 주인(Owner): 객체 양방향 연관관계는 관리가 필요 연관관계가 필요한 이유 : 객체지향 설계의 목표는 자율적인 객체들의 협력 공통체를 만드는 것이다. 예제 시나리오 회원과 팀이 있다. 회원은 하나의 팀에만 소속될 수 있다. 회원(N)과 팀(1)은 다대일 관계이다. 객체를 테이블에 맞추어 모델링 객체를 테이블에 맞추어 모델링 코드 @Entity public class Member { @Id @G..
객체와 테이블 매핑 엔티티 매핑 소개 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑 : @Column 기본 키 매핑 : @Id 연관관계 매핑 : @ManyToOne,@JoinColumn @Entity @Entity가 붙은 클래스는 JPA가 관리하는 클래스로 엔티티라고 부른다. JPA를 사용해서 테이블과 매핑할 클래스는 반드시 @Entity 필수! 주의사항 기본 생성자 필수 (파라미터가 없는 public 또는 protected) final 클래스, enum, interface, inner 클래스 사용할 수 없다. 저장할 필드에 final 키워드를 사용할 수 없다. 속성 name JPA에서 사용할 엔티티 이름 지정. 기본값 : 클래스 이름을 그대로 사용(예: Member) 같은 클래스..
JPA 에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑하기 (Object Relational Mapping) 영속성 컨텍스트 JPA를 보통 쓰게되면, 엔티티 매니저 팩토리와 엔티티 매니저에 대해 이해를 해야한다. 예를 들면, 고객의 요청이 올 때마다 엔티티 팩토리를 통해 엔티티 매니저를 생성한다. 엔티티 매니저는 내부적으로 데이터 커넥션을 사용해서 데이터베이스를 사용하게 된다. ❓그럼 영속성 컨텍스트란 뭘까? 영속성 컨텍스트란? 엔티티를 영구 저장하는 환경 EntityManager.persist(entity); : DB에 저장한다기보다 영속성 컨텍스트를 통해 엔티티를 영속화 한다는 의미이다. → 영속성 컨텍스트에 엔티티를 저장한다. 영속성 컨텍스트는 논리적인 개념이고, 눈에 보이지 않는다. 엔티..