엔터티 update 후 findById vs findAll

yanju·2023년 1월 10일
0
post-thumbnail

같은 트랙잭션 내에서 save를 통해 엔터티 업데이트를 실행한 후 findById, findAll 메소드를 실행해봤다.

findById() 시 update 쿼리 안 나감

findById를 통해 엔터티를 찾았을 때는 update, select 다 발생하지 않았다.

findAll() 메소드 실행 시 update 쿼리 후 select 쿼리 날라감

findAll을 통해 엔터티를 찾았을 때는 update 쿼리 발행 후 select 쿼리가 발생했다.

Flush 발생 조건

1. flush 메소드를 직접 호출

2. 트랜잭션 커밋 시

3. JPQL 쿼리 실행 시 플러시 자동 호출

findAll 메소드는 엔터티매니저가 아닌 DB에 직접 요청하기 때문에 동기화를 위해 flush를 실행 한다.
Critieria를 통해 findAll 메소드는 JPQL로 만들어진다.

전체 코드

@BeforeEach
void 데이터준비() {
    String title = "junit5";
    String author = "메타코딩";
    Book book = Book.builder()
            .title(title)
            .author(author)
            .build();
    bookRepository.save(book);
}


@Test
public void 책수정_test() {
    // given
    Long id = 1L;
    String title = "junit";
    String author = "데어코딩";
    Book updatebook = new Book(id, "junit", "데어코딩");
    
    // update
    Book bookPS = bookRepository.save(updatebook);

    // update 쿼리 x
    bookRepository.findById(bookPS.getId());

    // update 쿼리 후 select
    bookRepository.findAll()
            .stream()
            .forEach((b) -> {
                System.out.println("2.==============");
                System.out.println(b.getId());
                System.out.println(b.getTitle());
                System.out.println(b.getAuthor());
            });

    // then
    assertEquals(id, bookPS.getId());
    assertEquals(title, bookPS.getTitle());
    assertEquals(author, bookPS.getAuthor());
}

참고
https://www.inflearn.com/questions/6187/findbyid-%EC%99%80-findall-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%B4-%EA%B6%81%EA%B8%88%ED%95%A9%EB%8B%88%EB%8B%A4

0개의 댓글