반응형
같은 트랙잭션 내에서 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());
}
반응형
'스프링 부트' 카테고리의 다른 글
외부설정과 프로필2 (0) | 2024.06.07 |
---|---|
외부설정과 프로필 1 (0) | 2024.06.01 |
타임리프 스프링 통합과 폼 (0) | 2024.05.29 |
타임리프 기본 (0) | 2024.05.23 |
자동 구성(Auto Configuration) (0) | 2024.05.19 |