스프링 부트

엔터티 update 후 findById vs findAll

yanJuicy 2024. 7. 24. 21:51
반응형

같은 트랙잭션 내에서 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

반응형

'스프링 부트' 카테고리의 다른 글

외부설정과 프로필2  (0) 2024.06.07
외부설정과 프로필 1  (0) 2024.06.01
타임리프 스프링 통합과 폼  (0) 2024.05.29
타임리프 기본  (0) 2024.05.23
자동 구성(Auto Configuration)  (0) 2024.05.19