분류 전체보기 99

JPQL 문법 1

JPQL 문법 기초 select m from Member as m where m.age > 18 엔티티와 속성은 대소문자를 구분한다. 엔티티와 인스턴스의 대소문자를 신경 써야한다. (Member, Team, age, name) JPQL 키워드는 대소문자 구분을 하지 않는다. (SELECT, FROM, WHERE / 소문자도 가능) 테이블 명이 아닌 엔티티의 이름 사용한다. (Member = O / MEMBER = X) 별칭은 필수로 기입해야한다. (m) (as는 생략가능) 집합과 정렬 SQL에서 지원하는 아래와 같은 함수가 모두 가능하다. select COUNT(m), //회원수 SUM(m.age), //나이 합 AVG(m.age), //평균 나이 MAX(m.age), //최대 나이 MIN(m.age),..

JPA 2022.12.22

JPA 쿼리 언어 종류

JPA 지원하는 쿼리 방식 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTEmplete 함께 사용 JPQL 조회 방법이 가장 단순함(EntityManager.find()) 객체 그래프 탐색이 가능함(a.getB().getC) 조건을 주고 검색 할 때 JPA를 사용하면 엔티티 객체 중심으로 개발 검색할 때도 테이블이 아닌 엔티티를 대상으로 검색하는 것이 객체 지향적임 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오는 검색조건이 포함된 쿼리문이 필요 JPQL 특징 JPQL = JPA에서 SQL을 추상화한 객체지향 쿼리 언어 제공 SQL문과 유사한 SELECT, FROM,W..

JPA 2022.12.22

값 타입 정리

JPA의 테이터 타입분류 (최상위) 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 회원 엔티티의 정보가 변경되도 ID로 인식 가능 값 타입 int Integer String 처럼 단순한 값으로 사용하는 자바 기본타입인 객체 식별자가 없고 값만 있음으로 변경시 추적 불가 값 타입 분류 기본값 타입 : 생명주기를 엔티티에 의존(Entity 삭제시 필드도 삭제) 값 타입은 공유하면 안됨(서로 다른 객체가 동시 변경되거나 생성되면 안됨) 기본값 종류 자바 기본 타입: int, duble 기본타입은 절대 공유되지 않음 기본 타입은 항상 값을 복사함 래퍼클래스 : Integer, Long 래퍼 타입은 특수 클래스를 공유(참조)가능하지만 변경 할 수 없음 String 임베디드..

JPA 2022.12.21

프록시와 연관관계 (즉시로딩/지연로딩)

em.find() vs em.getReference() find : 데이터베이스를 통해 실제 엔티티 객체를 조회함 getReference : 데이터베이스 조회를 미루는 가짜 엔티티 객체() 조회 프록시의 특징 프록시 객체는 처음 사용할 때 한번만 초기화됨 프록시 객체를 초기화 할때 프록시 객체가 실제 엔티티로 바뀌는것이 아님, 초기화 되면 프록시 객체를 통해 실제 엔티티에 접근이 가능하다. 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 == 비교가 불가, instance of 사용하여 비교. 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 getReference()를 호출해도 프록시 객체가 아닌 실제 엔티티 객체가 반환됨 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때(EntityMan..

JPA 2022.12.21

@MappedSuperclass

객체의 공통된 속성이 존재할 때, 해당 속성을 BaseEntity로 설정하여 같은 속성을 컬럼값으로 지정할 수 있다. BaseEntity @MappedSuperclass public abstract class BaseEntity { private Long id; private String name; 위와 같이 @MappedSuperClass로 공통속성을 지정하여 Member와 Seller 객체의 인스턴스처럼 ,DB의 컬럼처럼 사용 할 수 있다. Member 엔티티 @Entity public class Member extends BaseEntity { @Id @GeneratedValue private Long id; ...... 해당 속성값을 상속받을 엔티티에서는 extends 로 상속받아 사용한다. 상속..

JPA 2022.12.20

상속관계 매핑

상속 관계 매핑 관계형 데이터베이스 (RDB)는 상속 관계가 존재하지 않는다. 슈퍼타입 서브타입 관계라는 모델링 기법이 존재하는데 이는 객체의 상속과 유사하다. 객체의 상속 구조와 DB의 슈퍼타임 서브타입의 관계를 매핑하는 것을 상속관계 매핑이라 한다. 상속관계 매핑 전략은 아래와 같다. 각 테이블로 변환 -> 조인 전략 통합테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스별 테이블 전략 JPA는 부모 객체(슈퍼타입 DB)의 클래스에 에노테이션을 통한 구조 설정이 가능하다. @Inheritance(strategy=InheritanceType.XXX) : 상속 관계 매핑 설정 JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현..

JPA 2022.12.20

연관관계 매핑

연관관계 설정시 고려사항 1. 연관 관계 매핑 종류 다대일 (N:1) - @ManyToOne 일대다 (1:N) - @OneToMany 일대일 (1:1) - @OneToOne 다대다 (N:M) - @ManyToMany 2. 단방향 or 양방향 DB테이블 외래 키 하나로 양쪽을 조인하여 사용 DB에는 방향 개념이 없이 조인키로 붙힘 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조시 단방향, 양쪽 서로 참조시 양방향 3. 연관관계의 주인 양방향 연관관계를 맺을 경우 테이블은 왜래 키 하나로 두 테이블의 연관관계를 조회할 수 있지만 객체의 경우 2개의 참조가 생김 연관관계의 주인 : 왜래 키를 관리하는 참조 주인의 반대편 : 왜래 키에 영향을 주지 않는 단순 조회 다대일 단방향 보편적이고 안정적인 방식..

JPA 2022.12.20

연관관계 매핑 기초

Team에 소속된 Member라는 객체가 있다고 가정하자. Member는 하나의 팀만 가지고 있고 Team은 여러 Member가 있다고 가정하자 DB테이블을 중심으로 설계한다면 협력관계 (Meber를 통해 Team의 정보를 가져오거나 Team을 통해 Member를 가져오는 것)를 만들 수 없다. DB테이블은 왜래 키를 통한 조인으로 연관된 테이블을 붙혀 가져올수 있지만 객체는 참조를 통해 다른 객체를 찾아오기 때문이다. 이러한 이유로 객체에서는 Team객체를 직점 넣어 연관관계를 부여한다. 객체 지향 언어의 모델링 단방향 매핑 Member @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME")..

JPA 2022.12.19

영속성과 엔티티 매핑

영속성 컨텍스트 엔티티를 영구 저장하는 환경 DB를 영속성 컨텍스트라는 곳 안에 저장하는 것 영속성 켄텍스트는 논리적인 개념 엔티티매니저를 통해 영속성 컨텍스트에 접근 엔티티의 생명주기 비영속성 : 영속성 컨텍스트와 상관없는 상태 (저장할 객체를 생성한 상태) 영속 : 영속성 컨텍스트에 관리되는 상태 엔티티 매니저를 통해 객체를 넣은 상태 (저장시점 or SELECT쿼리를 통해 찾아와서 엔티티 매니저에 들어가 관리되는 경우) 커밋 전에 쿼리를 몰아두었다가 커밋되는 시점에 한번에 쿼리가 날라감. 준영속 : 영속성 컨텍스트에 저장되었다가 분리되는 상태 삭제 : 삭제된 상태 영속성 컨텍스트의 이점 1차 캐시 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연 변경 감지 지연로딩 조회 시 1차 캐쉬에서..

JPA 2022.12.16

JAP 기본 원리 및 사용하는 이유

ORM Objrvy-trlational mapping (객체 관계 매핑) 관계형 데이터베이스와 객체지향 언어를 프레임워크가 중간에서 매핑함. 애플리케이션과 JDBC 사이에서 JPA가 ORM프레임워크로서 매핑 역할을 함 JPA의 동작위치 객체 지향 언어와 관계형데이터베이스(RDB)의 매핑 Team 이라는 객체과 Member라는 객체가 있고 Team은 Member의 부모라고 가정해보자, 이때 관계형 데이터에서는 Member라는 객체에 Team에 대한 정보를 참조하기 위해 teamId라던가 FK 값으로 참조값을 DB에 저장하게 될것이다. 이때 객체 지향 언어인 자바에서는 Member를 조회해 올때 DAO를 통해 해당 Member와 관련된 Team에 대한 객체도 함께 넣어 주어야 할 것이다. Team과 Memb..

JPA 2022.12.15