JPA 1차 캐시
--->원리
예를들어 Entity 테이블 저장을 하면, 생성된 아이디에 연결된 데이터가 1차 캐시에 잠시 저장됨.
-바로 DB에 저장되는것이 아님)
-예를들어, save라는 메소드로 저장한 객체는 1차 캐시에 저장된 객체와 다른 객체이다
-만약 리턴값을 받아온다면 1차 캐시에서 저장된 Entity 값을 가져온다
-만약 캐시에 값이 없다면, ID값을 가져와 DB에서 가져옴
--->캐시 사용 이유
-DB 조회수를 줄이기 위해서 (성능 효율 효과)
Entity 업데이트 실패----
-윗 원리로 인하여, update시, update는 "1차 캐시에 적용이 되지만", 데이터에는 변경 내용이 저장이 안됨.
ex)
public User updateUserFail() {
// 회원 "user1" 객체 추가
User user = new User("user1", "뷔", "콜라");
// 회원 "user1" 객체를 영속화
User savedUser = userRepository.save(user);
// 회원의 nickname 변경
savedUser.setNickname("얼굴천재");
// 회원의 favoriteFood 변경
savedUser.setFavoriteFood("버거킹");
// 회원 "user1" 을 조회
User foundUser = userRepository.findById("user1").orElse(null);
// 중요!) foundUser 는 DB 값이 아닌 1차 캐시에서 가져오는 값
return foundUser;
}
--> 데이터까지 변경이 안되고 캐시 까지만 변경되고 끝난 상황. (Update가 안됨)
Entity 업데이트 하는 방법 2가지.
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);
return savedUser2;
}
2)@Transactional을 선언 함으로써, 위 코드랑 다르게 마지막에 "User savedUser2 = userRepository.save(savedUser1);" save를 안해도 됨
@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;
}
}