• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

save와 saveAndFlush 함수의 차이

23.08.07 17:20 작성 조회수 727

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
save와 saveAndFlush 함수의 차이가 궁금해 질문남깁니다.

 

인터넷에서는 보통 save는 영속성 컨텍스트에 등록, saveAndFlush는 DB에 바로 저장이라고 하는데 아래의 블로그를 보니 DB에 바로 저장하는게 아닌 것 같아요.

https://ramees.tistory.com/36

 

  1. 강의에서는 'flush = 쓰기 지연 SQL에 등록 > 이 쿼리를 DB로 전송' 이라고 설명하셨는데, 위 블로그의 실험에 따르면 saveAndFlush는 '쓰기 지연 SQL에 등록' 까지만 이루어지는 함수인가요?

  2. 그렇다면 save/saveAndFlush 두 함수 모두 실제 DB insert는 @Transactional이 끝난 후에 이루어지는건가요?

 

또한 위의 블로그에 따르면

@Transactional 어노테이션이 없으면 save/saveAndFlush 실행 직후 insert문이 나가고,

@Transactional 어노테이션이 있으면 변화가 생긴다는데

  1. 왜 이런 변화가 생기는 건지

궁금합니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.09

안녕하세요, 인프런 AI 인턴이에요. save와 saveAndFlush 함수의 차이에 대해 궁금하신 것 같아 답변 드릴게요.

save 함수는 JPA에서 엔티티를 영속성 컨텍스트에 등록하고, 트랜잭션이 커밋될 때까지 기다리는 역할을 합니다. 따라서 save 함수를 호출해도 실제로 DB에 저장되는 시점은 트랜잭션이 커밋될 때입니다. save 함수는 트랜잭션 범위 내에서 동작하며, 많은 데이터를 한번에 등록할 때 성능상 이점을 가져올 수 있습니다.

반면에 saveAndFlush 함수는 save 함수와는 다르게 바로 DB에 저장을 요청하는 함수입니다. 이때 바로 DB에 저장되기 때문에 영속성 컨텍스트에서 해당 엔티티를 제거하지 않고 계속 추적합니다. 이후에 트랜잭션 커밋이나 flush 메서드가 호출되면 영속성 컨텍스트의 변경된 내용을 DB에 반영합니다.

따라서 saveAndFlush 함수를 호출하면 영속성 컨텍스트에서는 해당 엔티티를 추적하고 있고, 물리적인 DB에도 바로 저장 요청을 보내기 때문에 save와는 다소 다른 동작 방식을 가지고 있습니다.

말씀하신 블로그에서의 실험 결과도 확인해 보시면, saveAndFlush 함수를 호출하면 DB에는 쓰기 지연 SQL에 등록되어 바로 저장되진 않는 것을 알 수 있습니다. 이는 saveAndFlush 함수가 영속성 컨텍스트에는 등록하고, 실제 DB에는 flush 메서드나 트랜잭션 커밋 시에 저장하는 것을 보여주는 겁니다.

@Transactional 어노테이션은 스프링에서 트랜잭션을 처리하기 위해 사용되는 어노테이션입니다. 이 어노테이션을 메서드 레벨이나 클래스 레벨에 붙이면 트랜잭션 범위 내에서 실행된다는 의미입니다.

따라서 @Transactional 어노테이션이 없을 경우 save나 saveAndFlush 함수를 호출하더라도 트랜잭션 범위 외에 있으면 바로 DB에 저장될 수 있습니다. 그러나 @Transactional 어노테이션이 붙어있을 경우 트랜잭션 커밋 시점까지 기다리게 되므로, 트랜잭션 외부에서는 저장된 결과를 확인할 수 없게 됩니다.

이런 이유로 @Transactional 어노테이션의 유무에 따라 상황에 따라서 save나 saveAndFlush 함수의 동작이 달라질 수 있습니다.

추가로 save나 saveAndFlush 함수를 사용할 때 주의해야 할 점은, 많은 양의 데이터를 등록할 때는 성능 저하가 발생할 수 있으니, 배치 등의 방법을 고려해보는 것도 좋습니다.

참고로, 이러한 JPA의 세부 동작은 JPA 구현체마다 다를 수 있으니, 사용하시는 JPA 버전과 구현체에 따라 상세한 동작 방식을 확인해 보시는 것이 좋습니다.

더 궁금한 사항이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!