JPA 8

[JPA] 영속성 컨텍스트 (Persistence Context) - (3)

플러시 (Flush) 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 기능을 한다. 트랜잭션이 커밋될 때, 플러시가 동작해 쓰기 지연 SQL 저장소에 쌓아뒀던 쿼리들을 데이터베이스에 전송한다. 즉, 영속성 컨텍스트와 데이터베이스를 동기화하는 작업이다. ※ 플러시가 발생해도 1차 캐시 안의 내용은 삭제되지 않는다. 직접 호출 (em.flush()) //영속 상태인 member 엔티티 Member member = new Member(200L, "A"); em.persist(member); //플러시를 직접 호출하면 쿼리가 플러시 호출 시점에 전송됨 em.flush(); transaction.commit(); JPQL 쿼리 실행 시 호출 JPQL 쿼리를 실행하는 다음 코드를 보자. em.pers..

JAVA/JPA 2021.03.31

[JPA] 영속성 컨텍스트 (Persistence Context) - (2)

1차 캐시 (First Level Cache) 1차 캐시는 영속성 컨텍스트 내에 존재하는 캐시이다. 영속성 컨텍스트에 엔티티가 저장되는 순간, 1차 캐시에 다음과 같은 형태로 저장된다. { key : @Id로 선언한 필드 값, value : 해당 엔티티 } find()가 호출되는 순간, EntityManager 내부의 이 1차 캐시를 먼저 탐색하게 된다. 이 때, 찾는 엔티티를 발견했다면 즉시 반환한다. 만약 1차 캐시에 해당 엔티티가 존재하지 않는다면, 데이터베이스에서 조회한다. ※ 1차 캐시는 Global하지 않다. 즉, 영속성 컨텍스트끼리 이 1차 캐시를 공유하지 않는다. 객체의 동일성 보장 영속성 컨텍스트는 영속 상태의 엔티티들에 대한 동일성(Identity)을 보장한다. 1차 캐시에 의해, me..

JAVA/JPA 2021.03.30

[JPA] 영속성 컨텍스트 (Persistence Context) - (1)

영속성 컨텍스트 (Persistence Context) 영속성 컨텍스트는 JPA에서 매우 중요한 개념으로, 엔티티를 영구 저장하는 환경이라는 의미를 가진다. 영속성 컨텍스트는 논리적인 개념이다. 즉 실제로 존재하는 개념이 아니며, 우리는 코드 내에서 영속성 컨텍스트에 EntityManager을 통해 접근한다. JPA는 매 요청마다 EntityManagerFactory에서 EntityManager를 생성한다. 이렇게 생성된 EntityManager는 내부적으로 DB 커넥션 풀을 사용해 데이터베이스와 연동된다. 스프링에서 EntityManager를 주입받아 사용할 때, 같은 트랜잭션 범위의 EntityManager들은 동일 영속성 컨텍스트에 접근한다. 엔티티의 생명주기 (Entity Lifecycle) 비영..

JAVA/JPA 2021.03.30

[JPA] 상속관계 매핑

상속관계 매핑 객체는 상속관계가 존재하지만, 관계형 데이터베이스는 대부분 상속 관계가 존재하지 않는다. 하지만 관계형 데이터베이스의 슈퍼/서브타입 모델링 기법이 객체의 상속 관계와 꽤 유사하다. 우리는 이를 이용해 객체의 상속 구조를 매핑할 수 있다. 상속 관계를 매핑하는 방법은 다음과 같다. @Entity @Inheritance(strategy = InheritanceType.XXX) // 상속전략 선택 public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int price; } @Entity public class Album extends..

JAVA/JPA 2021.03.30

[JPA] 다양한 연관관계

이번 포스팅에서는 다양한 연관관계들과, 그 연관관계를 JPA에서 어떻게 표현하는지 알아보자. 다대일 관계 (ManyToOne) 가장 많이 사용되기 때문에 꼭 알아야 하는 연관관계이다. 앞선 포스팅에서 살펴본 예시로, Member와 Team의 관계가 이에 해당한다. Member는 하나의 Team만 가질 수 있고, Team은 다수의 Member를 가질 수 있기 때문에, 이는 Member 입장에서 다대일 관계에 해당한다. @Entity public class Member{ @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; //연관관계 설정 : 멤버 입장에서 다대일 매핑 @Many..

JAVA/JPA 2021.03.19

[JPA] 연관관계 매핑

테이블 기준 객체 모델링 아래 코드들을 통해 Member와 Team의 연관관계를 모델링 해보자. @Entity public class Member{ @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; private int age; @Column(name = "TEAM_ID") private Long teamId; } @Entity public class Team{ @Id @GeneratedValue private Long id; private String name; } //팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team); //회원 ..

JAVA/JPA 2021.03.16

[JPA] JPA 매핑 - 기초

객체 매핑하기 @Entity : JPA가 관리할 객체 @Id : DB의 PK와 매핑할 필드 persistence.xml : JPA 속성 파일 hibernate.dialect 속성에 각 DBMS 언어 지원 EntityManagerFactory JPA는 Persistence 클래스에서 설정 정보를 읽는다. 이후 Persistence에서 EntityManagerFactory를 생성한다. EntityManagerFactory는 EntityManager를 생성한다. 매핑 어노테이션 @Column name : 필드와 매핑될 테이블의 칼럼 이름을 지정 insertable, updatable : T/F 설정, 읽기 전용 여부를 지정 nullable, unique length : 길이 제한 @Column(name = "..

JAVA/JPA 2021.03.16

[JPA] JPA 소개

SQL 중심 개발의 한계 다음 코드를 보자. public class Member{ private String memberId; private String name; //... } INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES ... SELECT MEMBER_ID, NAME FROM MEMBER M UPDATE MEMBER SET ... 위 코드에서, Member 객체에 전화번호 정보에 해당하는 필드 tel을 추가하고자 한다. 우리는 Member 객체에 단순히 tel 필드를 추가하는 것에 더해, 모든 MEMBER 관련 쿼리에 tel에 관한 정보를 추가해줘야 한다. 엔티티 신뢰성 문제 MemberDAO에서 Member 객체 하나를 꺼내왔다고 가정하고, 이 객체를 member라 ..

JAVA/JPA 2021.03.16