Spring/JPA
-
JPA - 값 타입(기본값, 임베디드, 불변 객체, 컬렉션Spring/JPA 2022. 3. 10. 17:49
값 타입 기본값 타입 임베디드 타입(복합 값 타입) 값 타입과 불변 객체 값 타입의 비교 값 타입 컬렉션 JPA의 데이터 타입 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 값 타입 - int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 - 식별자가 없고 값만 있으므로 변경시 추적 불가 값 타입 기본값 타입 - 자바 기본 타입(int, double) - 래퍼 클래스(Integer, Long) - String 임베디드 타입 - 복합 값 타입 컬렉션 값 타입 기본값 타입 String, int 등 생명주기를 엔티티에 의존 (예시 : 회원을 삭제하면 이름, 나이 필드도 함께 삭제) 값 타입은 공유하면 안된다.(예시 : 회원 이..
-
JPA - 프록시와 연관관계(즉시 로딩, 지연 로딩, CASCADE)Spring/JPA 2022. 3. 10. 13:12
프록시와 연관관계 프록시 즉시 로딩과 지연 로딩 영속성 전이(CASCADE)와 고아 객체 프록시 프록시란? 실제 클래스를 상속받아서 만들어지는 객체 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메서드 호출한다. em.find()와 em.getReference() 차이 - em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 - em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 객체의 초기화 프록시 객체는 처음 사용할 때 한 번만 초기화된다. 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것이 아닌 프록시 객체를 통해서 실제 엔티티에 접근한다. 프록시 객체는 원본 엔티티를 상속받..
-
JPA - 상속관계 매핑Spring/JPA 2022. 3. 9. 18:05
상속관계 매핑 관계형 데이터베이스는 상속 관계라는 개념이 없다. 대신에 슈퍼타입 서브타입 관계라는 모델링 기법이 있는데 이를 이용하여 객체의 상속과 DB의 슈퍼타입 서브타입 관계를 매핑하여 사용한다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 클래스마다 테이블을 생성하는 전략 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXXX) - JOINED : 조인 전략 - SINGLE_TABLE : 단일 테이블 전략 - TABLE_PER_CLASS : 구현 클래스마다 테이블 생성 전략 @DiscriminatorColumn(name="DTYPE"..
-
JPA - 다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다)Spring/JPA 2022. 3. 9. 15:43
다대일 [ N : 1 ] 일대다 [ 1 : N ] 일대일 [ 1 : 1 ] 다대다 [ N : M ] 다양한 연관관계 매핑(다대일, 일대다, 일대일, 다대다) 테이블은 외래 키 하나로 서로 양쪽 조인이 가능하지만 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하다. 즉, 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이 된다. 객체 양방향 관계는 A->B, B->A 처럼 참조를 양쪽에서 해줘야 한다. 여기서 중요한 것은 외래 키를 관리할 연관관계 주인을 지정해줘야 한다. 연관관계의 주인은 외래 키를 관리하는 참조이며 연관관계의 주인이 아닌 객체들을 외래 키에 영향을 주지 않는다. 즉, 읽기만 가능하고 쓰기, 업데이트, 삭제가 안된다는 뜻이다. 다대일 [ N : 1 ] 단방향과 양방향 [N : 1] 에..
-
JPA - 연관관계 매핑Spring/JPA 2022. 3. 8. 18:10
연관관계 매핑 단방향 연관관계 양방향 연관관계 객체를 테이블에 맞추어 모델링하면 연관관계를 만들 수 없지만 테이블은 외래 키로 조인을 사용하여 연관된 테이블을 찾을 수 있다. 이런 차이 때문에 객체를 테이블에 맞춘 모델링은 좋은 방법이 아니다. @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @Column(name = "TEAM_ID") private Long teamId; … } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; … } 위와 같이..
-
JPA - 엔티티 매핑Spring/JPA 2022. 3. 8. 14:26
엔티티 매핑 데이터베이스 스키마 자동 생성 객체와 테이블 매핑 필드와 컬럼 매핑 기본 키 매핑 - 직접 할당, 자동할당(@GeneratedValue) @GeneratedValue의 identity 전략 데이터베이스 스키마 자동 생성 DDL을 애플리케이션 실행 시점에 자동 생성 객체 중심으로 개발이 가능 각 데이터베이스에 맞는 적절한 DDL 생성 생성된 DDL은 개발 장비에서만 사용하는게 좋다. (운영서버에서 사용하기 위해서는 적절히 다듬은 후 사용해야한다) spring.jpa.hibernate.ddl-auto 옵션 설명 사용 시점 create 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) 개발 초기 단계 create-drop 테이블 생성 후 종료 시점에 테이블 DROP (CREATE + D..
-
JPA - 영속성 컨텍스트Spring/JPA 2022. 3. 7. 16:57
영속성 컨텍스트 1차 캐시 동일성(identity) 보장 트랜잭션을 지원하는 쓰기 지연(Transactional write-behind) 변경 감지(Dirty Checking) 지연 로딩(Lazy Loading) 플러시 준영속 상태 1차 캐시 영속 상태인 Entity, 즉, 영속 컨텍스트에서 관리되는 Entity는 조회 시 1차 캐시에서 가져온다. 1차 캐시에 저장되어 있지 않은 Entity는 데이터베이스에서 조회한 후 1차 캐시에 저장한다. Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); //1차 캐시에 저장됨(영속) em.persist(member); //1차 캐시에서 조회 Member findMembe..
-
JPA - JPA의 내부 동작과 Entity의 생명주기Spring/JPA 2022. 3. 7. 14:52
JPA의 내부 동작과 Entity의 생명주기 JPA의 내부 동작 Entity의 생명주기 JPA의 내부 동작 요청이 들어올 때 JPA가 내부적 처리되는 과정은 아래의 그림과 같다. 요청이 들어오면 EntityManagerFactory가 각 요청마다 EntityManger를 생성해주고, EntityManager는 커넥션 풀을 이용해 DB에 접근한다. JPA의 강점 JPA는 특정 데이터베이스에 종속되지 않는다. 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 다르기 때문에 JPA에서는 hibernate.dialect로 특정 데이터베이스를 지정할 수 있다. H2 : org.hibernate.dialect.H2Dialect Oracle 21g : org.hibernate.dialect.Oracle12cDial..