프로젝트 생성시 hibernate 버전 선택 방법내가 사용하는 스프링 부트의 Dependency Version 참고하여 선택org.hibernate 로 검색하여 version 확인https://docs.spring.io/spring-boot/docs/curre
jpa 기본설정위치: main/resource/META-INF/persistence.xml 파일 위치 중요!!javax.persistence로 시작:JPA 표준 속성hibernate로 시작: 하이버네이트 전용 속성database dialectjpa 는 특정 데이터베이스
jpa 구동방식EntityManagerFactory가 생성되고, 각각 EntityManager가 생성 EntityManagerFactory: 하나만 생성해서 애플리케이션 전체 공유EntityManager: 필요시 생성/종료 => 쓰레드간 절대 공유 XJPA의 모든 데이
Object Realational MappingPersistence Context"엔티티를 영구 저장하는 환경"눈에 보이지 않는 논리적인 개념Entity Manager를 통해서 접근(1:1)엔티티의 생명주기
영속성 컨텍스트의 이점1차 캐시동일성 보장(identity)트랜잭션을 지원하는 쓰기 지연(Transactional write-behind)변경 감지(Dirty Checking)지연 로딩(Lazy Loading)
1차 캐시에서 조회데이터베이스에서 조회영속 엔티티의 동일성 보장
트랜잭션을 지원하는 쓰기 지연
변경 감지
개념영속성 컨텍스트의 변경내용을 데이터베이스에 반영(동기화)발생변경 감지쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록,수정,삭제)플러시 방법직접호출: em.flush()트랜잭션 커밋: 플러시 자동 호출JPQL 쿼리 실행: 플러시 자동 호출플러시 모드 옵션e
개념영속 상태의 엔티티를 영속성 컨텍스트에서 분리영속성 컨텍스트가 제공하는 기능 사용 X분리 방법em.detach(entity): 특정 엔티티만em.clear(): 영속성 컨텍스트 완전히 초기화em.close(): 영속성 컨텍스트 종료
엔티티 맵핑객체와 테이블 매핑: @Entity, @Table필드와 컬럼 매핑: @Column기본 키 매핑: @Id연관관계 매핑: @ManyToOne,@JoinColumn@EntityJPA 사용해서 테이블과 맵핑하기 위해서는 반드시 추가기본 생성자 필수(파라미터 없는 p
자동생성애플리케이션 실행시점에 DDL 자동생성테이블이 아닌, 객체 중심!!!운영서버에서는 사용 지양!!!속성persistence.xml 에서 옵션 설정 가능운영장비에서는 절대 create, create-drop, update 사용하지 않을 것!!!DDL 생성기능제약조건
기본키 맵핑 어노테이션직접할당@Id만 사용자동생성@Id@GeneratedValue 자동생성 전략 IDENTITY: 데이터베이스에 위임, MYSQLSEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE@SequenceGenerator 필요TABLE: 키 생
목표단방향 연관관계연관관계 사용양방향 연관관계연관관계의 주인양방향 연관관계 저장양방향 연관관계 주의점 1\. 객체의 연관관계 != 테이블의 연관관계객체: 참조(주소)를 통한 relation테이블: 외래키를 통한 relation📌 객체 연관관계 & 테이블 연관관계의 맵
테이블 구조에 맞춘 객체 모델링(외래키 사용 not 참조)객체 지향 모델링어노테이션@ManyToOne: 다대일(N:1) 맵핑 정보 명시(neccessary)@JoinColumn(name="TEAM_ID"): 외래키 맵핑시 사용(optional)생략시 기본전략 사용: 필
DB 테이블: 외래키 하나로 양방향 조회가 가능한 양방향 관계객체: 회원-팀(N:1), 팀-회원(1:N)1) 개념객체 & 테이블 연관관계객체 연관관계: 회원 => 팀(단방향) & 팀 => 회원(단방향)테이블 연관관계: 회원 <=> 팀(양방향)사실상 객체의 경우 2
📌 1. 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정순수 객체 관점에서는 주인 & 역방향 모두에 값을 입력📌 2. 연관관계 편의 메소드 사용작성시 getter,setter와 구분될 수 있도록 네이밍📌 3. 무한루프 조심 toString(), lombok, J
1\. 단방향 맵핑만으로도 이미 연관관계 맵핑은 완료된 것이다처음 jpa 설계시 일단 단방향 맵핑만으로 연관관계 설정은 끝사실상 객체 관점에서 양방향 맵핑은 반대 방향 조회 기능이 추가된 것일 뿐이후 반대방향 조회가 필요할 경우 방향 추가(테이블에는 어차피 영향 X)J
연관관계 맵핑시 고려사항 3가지다중성단방향 / 양방향테이블: 외래키 하나로 양쪽 조인 가능(사실상 방향이라는 개념 X)객체: 참조용 필드가 있는쪽으로 참조 가능(사실상 양방향은 단방향 2개)(양방향인 경우) 연관관계의 주인외래키를 관리(등록,수정,삭제)하는 역할(양방향
1\. 일대다 단방향일(1)이 연관관계의 주인테이블의 경우 항상 다(N)쪽에 외래키가 존재객체와 테이블간 패러다임이 다르기 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조사실상 실무에서는 이러한 연관관계 설정 지양@JoinColumn 필수 사용미사용시 조인 테이블
일대일은 반대도 일대일외래키 선택: 주 테이블 or 대상 테이블외래키에는 반드시 유니크 제약조건 필요 1\. 일대일 단방향(주 테이블에 외래키)가장 일반적이고 관리하기 쉬운 모델 2\. 일대일 양방향(주 테이블에 외래키)다대일 양방향처럼 외래키가 있는 곳이 연관관계의
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계 표현이 불가연결 테이블을 추가하여 1:N, N:1로 풀어내야함객체의 경우, 컬렉션을 사용하여 객체 2개만으로도 다대다 관계 표현이 가능@ManyToMany 사용, @JoinTable로 연결 테이블 지정다대다 맵핑
@JoinColum외래키 맵핑시 사용@ManyToOnemappedBy 속성이 없다 => 항상 연관관계의 주인이어야 함@OneToMany
1.단일 테이블 전략어노테이션 미추가시 JPA의 기본사용 전략부모 테이블에 모든 컬럼 생성@Entity@Inheritance(strategy = InheritanceType.JOINED)public class Item {}2.조인 전략각각 테이블 생성
1\. 조인 전략장점테이블이 정규화되어 있음외래키 참조 무결성 제약조건 활용 가능저장공간 효율화단점조회시 조인 많이 사용(성능 저하 가능성), 쿼리 복잡도 증가저장시 insert 쿼리 2번 호출📌기본적으로 실무에서 정석으로 사용되는 전략(객체와 가장 잘 맞고 깔끔한
📌공통 맵핑 정보가 필요할 때 사용상속관계 맵핑이 X엔티티가 X => 테이블과 맵핑되지 X부모 클래스를 상속받는 자식 클래스에 단순히 맵핑 정보만 제공em.find(BaseEntity.class, id) 와 같은 조회가 당연히 안됨추상클래스로 생성할 것을 권장직접 생
기본개념em.find() vs em.getReference()em.find(): 실제 엔티티 객체 조회em.getReference(): DB 조회를 미루는 가짜(프록시) 엔티티 객체 조회(쿼리 X)em.find() => select 쿼리 실행 em.getRefere
지연로딩 사용 어노테이션
기본개념특정 엔티티를 영속상태로 만들 때 연관된 엔티티도 영속상태로 만드는 것
기본개념부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제orphanRemoval = true컬렉션에서 빠진 첫번째 자식은 DB에서 자동 삭제주의점참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제되는 기능@OneToOne, @OneToM
1\. JPA의 데이터 타입 분류1) 엔티티 타입@Entity로 정의하는 객체식별자가 존재 => 데이터가 변해도 지속해서 추적 가능2) 값 타입int, Integer, String과 같이 단순 값으로 사용하는 자바 기본 타입이나 객체식별자가 없음(값만 존재) => 데이
1\. 기본개념새로운 값 타입을 직접 정의JPA에서는 임베디드 타입이라고 명명주로 기본값 타입을 모아서 만들기 때문에 "복합값 타입"이라고도 부름int, String 과 같은 값 타입(엔티티X, 변경시 추적 불가)예시)2\. 사용법@Embeddable: 값 타입을 정의
값 타입 공유 참조임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험(부작용 발생)참조값을 공유하기 때문에 변경된 값이 여러 엔티티에 전부 반영값 타입 복사값 타입의 실제 인스턴스인 값을 공유하는 것은 위험따라서, 값(인스턴스)를 복사해서 사용객체 타입의 한계
값 타입의 경우, 인스턴스가 다르더라도 그 안의 값이 같으면 같은 것으로 봐야함동일성(identity) 비교: 인스턴스의 참조 값을 비교, == 사용'동등성(equivalence) 비교: 인스턴스의 값을 비교, equals() 사용값 타입은 반드시 a.equals(b)
기본개념값 타입을 하나 이상 저장할 때 사용@ElementCollection, @CollectionTable 사용데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다.컬렉션을 저장하기 위한 별도의 테이블이 필요함
JPA는 다양한 쿼리 방법을 지원📌JPQLJPA Criteria📌QueryDSLnative SQLJDBC API를 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용실무에서는 95% JPQL + QueryDSL 사용1\. JPQL 소개📌가장
📌 JPQL 소개객체지향 쿼리이므로 테이블이 아닌, 엔티티 객체를 대상으로 쿼리SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않음결국은 SQL로 변환됨1\. 기본문법엔티티, 속성: 대소문자 구분 OJPQL 키워드: 대소문자 구분 X (select, from,
1\. 기본개념SELECT절에 조회할 대상을 지정하는 것프로젝션 대상엔티티임베디드 타입스칼라 타입(숫자, 문자 등 기본 데이터 타입) -> SQL은 스칼라 타입만 가능했음DISTINCT로 중복 제거 가능2\. 프로젝션 예시3\. 여러 값 조회 프로젝션 예시new 명령어
내부조인외부조인세타조인ON절 활용한 조인: 조인 대상을 미리 필터링(JPA 2.1부터 지원)연관관계 없는 엔티티 외부조인(하이버네이트 5.1부터 지원)실행 쿼리(on절): PK키를 비교함실행 쿼리(연관관계 없는 경우): PK키 비교X
타입 표현 케이스문자: ‘HELLO’, ‘She’’s’숫자: 10L(Long), 10D(Double), 10F(Float)Boolean: TRUE, FALSEENUM: jpabook.MemberType.Admin (패키지명 포함)엔티티 타입: TYPE(m) = Memb
1\. 기본개념.을 찍어 객체 그래프를 탐색하는 것용어 정리상태필드: 단순히 값을 저장하기 위한 필드연관필드: 연관관계를 위한 필드단일값: @ManyToOne, @OneToOne, 대상이 엔티티컬렉션: @OneToMany, @ManyToMany, 대상이 컬렉션2\. 특
1\. 기본개념SQL의 조인 종류가 XJPQL에서 성능 최적화를 위해 제공하는 전용 기능연관된 엔티티/컬렉션을 SQL 한 방에 함께 조회하도록 함명령어 'join fetch' 직접 사용LEFT/INNER JOIN FETCH + 조인경로지연로딩이 걸려있더라도 페치조인이
1\. 페치 조인의 한계📌 페치 조인 대상에는 별칭 사용 X📌 둘 이상의 컬렉션은 페치 조인 X📌 컬렉션을 페치 조인할 경우 페이징 API 사용 X => hibernate는 경고 로그 & 메모리에서 페이징일대다의 경우 '다'에 맞춰서 데이터 뻥튀기가 발생하기 때
엔티티 구조도 예시(다형적으로 구성)TYPE조회 대상을 특정 자식 개체로 한정예) Item 중 Book, Movie를 조회TREAT자바의 type casting과 유사하게 동작상속 구조에서 부모타입을 특정 자식타입으로 다룰 때 사용FROM, WHERE, SELECT(h
1\. 엔티티 직접 사용 - 기본키 값JPQL에서 엔티티를 직접 사용할 경우 SQL에서 해당 엔티티의 PK를 사용함실행쿼리(where절에서 PK를 사용)2\. 엔티티 직접 사용 - 기본키 값실행쿼리(where절에서 PK를 사용)
1\. 기본개념정적 쿼리미리 정의해서 이름을 부여해두고 사용하는 JPQL사용방법: 어노테이션, XML에 정의애플리케이션 로딩 시점에 초기화 후 재사용장점: 애플리케이션 로딩 시점에 쿼리 검증(문법 오류 발견 등)2\. 어노테이션에 정의하여 사용엔티티에 정의사용 소스3\