Spring/boot

[JPA] DB의 data가 update 되는 플로우 정리

코딩균 2022. 2. 18. 16:11

유져가 회원가입을 완료한 후에 마이페이지 같은 곳에서 자신의 정보를 바꾼다고 가정

JPA는 이러한 update 에서 어떠한 과정을 거치는가에 대해 정리해보려 한다

 

예시 코드

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor // final에 해당되는 필드에 대한 constructor 자동 생성 어노테이션
public class UserService{

	private final UserRepository userRepository;
    
	@Autowired // constructor injection
		public UserService(UserRepository userRepository){
    		this.userRepository = userRepository;
        }
    
 
 	@Transactional
	public void update(Long id, String name){
    		User user = userRepositroy.findById(id);
    		user.setName(name);
        }
}

update service 메소드를 살펴보며 JPA 의 동작과정 이해하기

  1. findById - id 값을 가지고 영속성 컨텍스트 1차 캐시를 살펴본다
  2. findById - 영속성 컨텍스트에 영속 entity가 없다면 DB에서 가져와 영속 entity로 만든다
  3. setName - 영속 entity에 변화를 주어서 JPA가 변경 감지를 하도록 한다
  4. transaction - 변경이 감지되고 spring AOP가 동작하면서 transaction이 끝나는 시점에서 영속성 컨텍스트에서 flush가 발생
  5. transaction - transaction commit