일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 | 29 | 30 |
- 시스템설계방법
- 전략패턴
- react-ga
- cypressBDD
- 리액트구글애널리틱스
- formik submitting not working
- git squash
- file not found Error
- 가상면접2장
- gitsquash
- 시스템설계면접
- git commit merge
- git commit 협업
- cypress React
- react
- FirebaseAnalytics
- 시스템설계면접예시
- 시스템설계
- 시스템설계면접팁
- Git commit 합치기
- awss3
- 가상면접3장
- 리팩터링2판테스트
- 디자인패턴
- 가상면접으로대규모시스템
- 헤드퍼스트전략패턴
- 테스트코드책
- formik react-query submitting not working
- 리팩토링2판4장
- s3이미지다운로드됨
- Today
- Total
mingg IT
[JPA] 영속성 컨텍스트 와 EntityManager 본문
영속성 컨텍스트란?
영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다.
애플리케이션과 DB 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다.
Entity Manager를 통해 엔티티를 저장하거나 조회하면 Entity Manager는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
Transactional 사용하면 영속성 캐싱 기능을 사용한다.
1차 캐시는 map의 형태로 key는 id value는 해당 entity id로 존재하면 1차로 entity에 존재하는지 검사하고
존재하지 않으면 실제쿼리로 DB에 보내고 조회한다.
예시를 확인해보자.
@Test
void cacheFindTest() {
// System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
// System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
System.out.println(userRepository.findById(1L).get());
System.out.println(userRepository.findById(1L).get());
System.out.println(userRepository.findById(1L).get());
}
결과를 확인해보면 1차 캐싱기능을 활용해서 Select 문은 한번만 작동하는것을 알 수 있다.
그렇다면 findByEmail을 사용하면 ?
@Test
void cacheFindTest() {
System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
System.out.println(userRepository.findByEmail("martin@fastcampus.com"));
}
Select문이 두번 사용된다.
비영속상태와 영속상태를 알아보도록 하겠다.
UserServiceTest.java
@Test
void test() {
userService.put();
System.out.println(">>>" + userRepository.findByEmail("newUser@fastcampus.com"));
}
비 영속 상태
UserService.java
@Transactional
public void put() {
User user = new User();
user.setName("newUser");
user.setEmail("newUser@fastcampus.com");
}
결과를 확인해보면 비어 있음을 확인할 수 있다.
영속 상태
UserService.java
@Transactional
public void put() {
User user = new User();
user.setName("newUser");
user.setEmail("newUser@fastcampus.com");
//userRepository.save(user);
entityManager.persist(user);
user.setName("newUserAfterPersist");
}
save 액션을 취하지 않아도 반영됨을 알 수 있다.
영속성 컨텍스트 내부에서 관리되는 엔티티는 set을 통해서 객체가 변경되는 이후에 transcaction 이 완료된 이후에 별도의 save가 없어도 DB에 반영된다.
이는 JAP에서 Entity Life Cycle을 공부하지 않으면 실제업무에서 문제가 발생했을때 파악하기 힘들 수 있기 때문에 공부해놔야함.
영속성 컨텍스트 관리하에 조회, 1차 캐시, 쓰기 지연 등 개발자가 신경쓰지 않아도 될 편의성을 제공하고 있지만
허나 놓치면 개발자가 의도하지 않은 동작이 할 수 있다. 사이드 이펙트를 막을 수 잇다.
'BackEnd' 카테고리의 다른 글
[Spring] AOP 개념 정리 (ver 2022년) (0) | 2021.12.29 |
---|---|
[Jpa] @transactional 격리수준과 전파속성 (0) | 2021.12.26 |
[JPA] deleteAll(), deleteAllInBatch(), deleteInBatch() 차이점 (0) | 2021.12.09 |
[Spring] AOP custom annotation 사용하기 (0) | 2021.11.18 |
[Spring] 내가 보기 위해 만드는 편리한 annotation 모음 (0) | 2021.11.18 |