JPA 영속성 컨텍스트 1차 캐시 이해

송영재·2022년 11월 20일

Spring

목록 보기
30/45
  • 7) 영속성 컨텍스트 1차 캐시

    • Entity 저장 시

    • Entity 조회 시

      1. 1차 캐시에 조회하는 Id 가 존재하는 경우

      2. 1차 캐시에 조회하는 Id 가 존재하지 않은 경우

**'1차 캐시'** 사용의 장점

1. DB 조회 횟수를 줄임
2. **'1차 캐시'**를 사용해 DB row 1개 당 객체 1개가 사용되는 것을 보장 (객체 동일성 보장)
        
  • 8) Entity 삭제

  • 9) Entity 업데이트 실패

    • Entity 객체를 수정해도 DB 에는 update 가 되지 않음

    • 1차 캐시 Entity 객체에만 업데이트 반영됨

    • User DB 에는 반영되지 않음

  • 10) Entity 업데이트 방법 (1)

    • userRepository.save() 사용

    • [UserService] Entity 업데이트 방법 (1)

          public User updateUser1() {
              // 테스트 회원 "user1" 생성
              User user = new User("user1", "RM", "고기");
              // 회원 "user1" 객체를 영속화
              User savedUser1 = userRepository.save(user);
      
              // 회원의 nickname 변경
              savedUser1.setNickname("남준이");
              // 회원의 favoriteFood 변경
              savedUser1.setFavoriteFood("육회");
      
              // user1 을 저장
              User savedUser2 = userRepository.save(savedUser1);
              assert(savedUser1 == savedUser2);
      
              return savedUser2;
          }
  • 11) Entity 업데이트 방법 (2)

    • @Transactional 을 추가

    • 굳이 userRepository.save() 함수를 호출하지 않아도, 함수가 끝나는 시점에 변경된 부분을 알아서 업데이트 해 줌 (이를 "Dirty check" 라고 함)

    • 간단히 함수가 종료되는 시점에 각 Entity 에 save() 가 호출된다라고 이해

      💡 정확한 이해 위해 필요한 추가학습 내용
      : 쓰기 지연 SQL 저장소, flush, commit 등

    • [UserService] Entity 업데이트 방법 (2)

      		@Transactional
          public User updateUser2() {
              // 테스트 회원 "user1" 생성
              // 회원 "user1" 객체 추가
              User user = new User("user1", "진", "꽃등심");
              // 회원 "user1" 객체를 영속화
              User savedUser = userRepository.save(user);
      
              // 회원의 nickname 변경
              savedUser.setNickname("월드와이드핸섬 진");
              // 회원의 favoriteFood 변경
              savedUser.setFavoriteFood("까르보나라");
      
              return savedUser;
          }

0개의 댓글