[JPA] 객체지향 쿼리 언어 - 중급 문법
·
JPA
경로 표현식.(점)을 찍어 객체 그래프를 탐색하는 것select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드where t.name = '팀A' 각 내부 동작 방식 다름 상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex: m.username)연관 필드(association field): 연관관계를 위한 필드단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티(ex: m.team) 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션(ex: m.orders) 경로 표현식 예제select o..
[JPA] 객체지향 쿼리 언어 - 기본문법
·
JPA
객체지향 쿼리 언어 소개JPA는 다양한 쿼리 방법을 지원JPQLJPA Criteria (거의 사용x)QueryDSL네이티브 SQLJDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용JPQL엔티티 객체를 대상으로 하는 객체지향 쿼리 언어 (테이블X, 클래스O) = 객체지향SQL 💡JPQL: 엔티티 객체를 대상으로 쿼리SQL: 테이블을 대상으로 쿼리 단순한 조회는EntityManager.find()객체 그래프 탐색 (a.getB().getC()) 문제는 검색쿼리1. 모든 DB 데이터를 객체로 변환해 검색은 불가능 → 필요한 데이터만 DB에서 불러오려면 검색 조건이 포함된 SQL이 필요2. SQL과 문법 유사 (SELECT, FROM, WHERE, GROUP BY, HAV..
[JPA] 값 타입
·
JPA
기본값 타입(아는 내용들.. 그냥 가볍게 읽기)✓ JPA의 데이터 타입 분류엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능Ex. 회원엔티티의키나나이값을변경해도식별자로인식가능값 타입int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경시 추적 불가Ex. 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 ✓ 값 타입 분류기본값 타입자바 기본 타입(int, double)래퍼 클래스(Integer, Long)String임베디드 타입(embedded type, 복합 값 타입)컬렉션 값 타입(collection value type) : 자바 컬렉션에 기본값 타입이나 임베디드 타입을 넣은 것 ✓ 기본값 타..
[JPA] 영속성 전이와 고아 객체
·
JPA
영속성 전이: CASCADE엔티티 상태 변경(저장, 삭제 등)을 연관된 엔티티까지 전파하는 설정 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. -Parent@Entitypublic class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent") private List childList = new ArrayList();-Child@Entitypublic class Child { @Id @GeneratedValue private Long id; ..
[JPA] 프록시와 지연 로딩 전략
·
JPA
프록시먼저, Member를 조회할 때 Team도 함께 조회해야 할까? 멤버만 출력하면 된다면?연관관계 걸렸다고 팀까지 가져오면 낭비 경우에따라 멤버만 or 멤버+팀 가져오려면? ➡︎ 프록시, 지연로딩 프록시 기초em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 (근데 사실 잘 안씀) Member member = new Member();member.setName("user1");em.persist(member);em.flush();em.clear();//Member findMember = em.find(Member.class, member.getId()); //select쿼리 바로 나감..
[JPA] 고급 매핑(상속)
·
JPA
상속관계 매핑관계형 데이터베이스에는 상속 관계 없음.대신 슈퍼 타입, 서브 타입 관계라는 모델링 기법이 객체 상속과 유사상속 관계 매핑 : 객체 상속과 DB 슈퍼타입 서브타입 관계 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법각각 테이블로변환-> 조인전략통합 테이블로 변환 -> 단일 테이블 전략서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략주요 어노테이션@Inheritance(strategy=InheritanceType.XXX)JOINED: 조인 전략SINGLE_TABLE: 단일 테이블 전략TABLE_PER_CLASS: 구현 클래스마다 테이블 전략@DiscriminatorColumn(name=“DTYPE”)@DiscriminatorValue(“XXX”) 1. 조인 전략 (정..
[JPA] 다양한 연관관계 매핑
·
JPA
✓ ORM 매핑연관관계 매핑시 고려사항 3가지다중성 (다대일 : @ManyToOne, 일대다 : @OneToMany, 일대일 : @OneToOne, 다대다 : @ManyToMany) 앞이 주인단방향, 양방향연관관계의 주인 다대일[N:1] 다대일 단방향가장 많이 사용하는 연관관계다대일의 반대는 일대다다대일 양방향외래 키가 있는 쪽이 연관관계의 주인양쪽을 서로 참조하도록 개발 일대다[1:N]일대다 단방향(권장x)@Entity public class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany @JoinColumn(name = "TEAM_ID") private..
[JPA] 연관관계 매핑
·
JPA
연관관계가 필요한 이유용어 이해방향(Direction): 단방향, 양방향다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이해연관관계의 주인(Owner): 객체 양방향 연관관계는 관리 주인 이 필요 예제 시나리오회원과 팀이 있다.회원은 하나의 팀에만 소속될 수 있다.회원과 팀은 다대일 관계다. 객체를 테이블에 맞추어 모델링 (연관관계가 없는 객체) 객체를 테이블에 맞추어 모델링하면 연관관계가 없는 객체가 됨→ 참조 대신, MEMBER 테이블의 외래 키, TEAM_ID를 그대로 사용 객체를 테이블에 맞추어 모델링(참조 대신 외래 키를 그대로 사용)@Entitypublic class Member { @Id @GeneratedValue priva..
[JPA] 엔티티 매핑
·
JPA
@Entity, @Table : 객체와 테이블 매핑@Column : 필드와 컬럼 매핑@Id : pk 매핑@ManyToOne,@JoinColumn : 연관관계 매핑 객체와 테이블 매핑(@Entity, @Table)@Entity@Entity가 붙은 클래스 ← JPA가 관리하는 엔티티JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수✓ 규정기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)final 클래스, enum, interface, inner 클래스 사용 x → @Entity를 붙일 수 없음저장할 필드에 final 사용 x✓ @Entity 속성(안봐도됨)속성 : name@Entity(name="Member")//엔티티 이름 지정 (기본값: 클래스 이름) //가급적 기..
[JPA] 영속성 관리 - 내부 동작 방식
·
JPA
JPA에서 중요한 2가지객체와 관계형 데이터베이스 매핑영속성 컨텍스트 영속성 컨텍스트엔티티를 영구 저장하는 환경JPA가 엔티티의 생명주기를 관리하고, 데이터 변경사항을 추적하여 DB에 동기화하는 공간EntityManager.persist(entity); → 영속성 컨텍스트에 엔티티를 저장한다 뜻영속성 컨텍스트는 논리적인 개념이며 눈에 보이지 않음엔티티 매니저를 통해서 영속성 컨텍스트에 접근엔티티 매니저 생성시 - 영속성 컨텍스트라는 눈에 보이지않는 공간이 생김(1:1, N:1) ✓ 엔티티 매니저 팩토리와 엔티티 매니저웹 애플리케이션이 실행될 때 EntityManagerFactory 생성요청 올 때마다 EntityManage 생성해, 커넥션 풀을 사용해서 DB에 접근 엔티티의 생명주기비영속 (new/tra..