02. 영속성 컨텍스트 설계 이유
1차 캐시

출처 자바 ORM 표준 JPA - https://product.kyobobook.co.kr/detail/S000000935744
자바 ORM 표준 JPA 프로그래밍 | 김영한 - 교보문고
자바 ORM 표준 JPA 프로그래밍 | 자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA
product.kyobobook.co.kr
DB역시 저장공간, 연산능력과 같은 컴퓨팅 리소스를 가진 프로그램 같은 것이라고 말씀드렸죠?
그리고 보통은 서버가 떠있는 컴퓨터(AWS라고 치면 여러분의 ec2 인스턴스)가 아닌 다른 곳에 떠있는 경우가 많습니다. 그리고 다른 여러가지 이유와 함께 DB를 이용하는 작업은 상대적으로 부하와 비용이 심한 작업입니다.
그래서 부하가 심한 작업을 자주하는 것을 줄여야 할 필요가 있었습니다.
자바 어플리케이션 상에서 데이터를 조회 사용할일이 아주 잦은데, 그럴때마다 DB로 “SELECT * FROM….”과 같은 SQL쿼리를 내는 일은 막아야 한다는 거죠!
그러기 위해서 영속성 컨텍스트 내부에 1차캐시를 둡니다.
1. find(”memberB”)와 같은 로직이 있을 때 먼저 1차 캐시를 조회합니다.
2. 있으면 해당 데이터를 반환합니다.
3. 없으면 그 때 실제 DB로 “SELECT * FROM….” 의 쿼리를 내보냅니다.
4. 그리고 반환하기 전에 1차캐시에 저장하고 반환해줍니다.

MemberA, MemberB를 생성할 때 마다 DB를 다녀오는건 비효율적이겠죠?
굳이 여러번 DB를 방문하지 않도록 내부에 “쓰기 지연 SQL 저장소”를 뒀습니다.
1. memberA, memberB를 영속화 하고
2. entityManager.commit() 메서드를 호출하면
3. 내부적으로 쓰기 지연 SQL 저장소에서 Flush가 일어나고
4. “INSERT A”, “INSERT B”와 같은 쓰기 전용 쿼리들이 DB로 흘러들어갑니다.
데이터의 어플리케이션 단의 동일성을 보장해줍니다!
|
1
2
3
|
Member member1 = em.find(Member.class, "minsook");
Member member2 = em.find(Member.class, "minsook");
System.out.println(member1 == member2) => true
|
cs |
엔티티 매핑 심화
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@Entity
@Table (name="USER")
public class Member {
@Id
@Column (name = "user_id")
private String id;
private String username;
private Integer age;
@Enumerated (EnumType. STRING)
private RoleType userRole;
// @Enumerated (EnumType. ORDINAL)
// private RoleType userRole;
@Temporal (TemporalType. TIMESTAMP)
private Date createdDate;
@Temporal (TemporalType. TIMESTAMP)
private Date modifiedDate;
}
|
cs |
- @Entity 관련!
- **기본 생성자**는 필수입니다.(생성자가 하나도 없으면 자바가 만들어주겠지만 그렇지 않다면…🤔)
- final 클래스, enum, interface 등에는 사용 할 수 없어요.
- 저장할 필드라면 final을 사용하시면 안됩니다.
- “@Table”관련!
- 엔티티와 매핑할 테이블의 이름입니다. 생략하는경우 어떻게되는지 찾아보시면 좋을 것 같아요!
- “@Column”관련!
- 객체 필드를 테이블 컬럼에 매핑하는데 사용합니다.
- 생략이 가능합니다!
- 속성들은 자주 쓸 일이 없고, 특정 속성은 무시무시한 effect가 있으니(
검색해보세요) 이름을 지정 할 때 아니고는 보통 생략하기도 합니다.
- “@Enumerated”관련!
- Java Enum을 테이블에서 사용한다고 생각하면 좋을 것 같습니다.
- 속성으로는 Ordinal, String이 있는데, String인경우 해당 문자열 그대로 저장해서 비용은 많이 들지만, 나중에 Enum이 변경되어도 위험할일이 없기 때문에 일반적으로는 String을 사용합니다.
'TIL' 카테고리의 다른 글
| 2022.12.15 JPA 심화(4) (0) | 2022.12.16 |
|---|---|
| 2022.12.14 JPA심화 (3) (0) | 2022.12.14 |
| 2022.12.12 입문 주차 복습, 영속성 (0) | 2022.12.12 |
| [WIL] 2022.12.05 ~ 12.09 스프링 입문 (1) | 2022.12.12 |
| 2022.12.09 DB 개요 (0) | 2022.12.12 |