Post와 User는 N:1 관계이다.
@Test
void findById() {
// given
userRepository.save(givenUser);
Post savedPost = postRepository.save(givenPost);
em.flush();
em.clear();
//when
Post foundPost = postRepository.findById(givenPost.getId()).get();
em.flush();
// then
assertThat(foundPost).isNotNull();
assertThat(savedPost).usingRecursiveComparison().isEqualTo(foundPost);
}
User와 Post를 저장하고 findById를 호출했다.
Hibernate:
select
p1_0.id,
p1_0.content,
p1_0.created_at,
p1_0.created_by,
p1_0.title,
p1_0.user_id
from
posts p1_0
where
p1_0.id=?
Hibernate:
select
u1_0.id,
u1_0.age,
u1_0.created_at,
u1_0.created_by,
u1_0.hobby,
u1_0.name
from
users u1_0
where
u1_0.id=?
그런데 예상한 쿼리문보다 하나 더 쿼리가 발생했다. 원래라면 첫 번째 쿼리문만 나가야 하는데 두 번째 쿼리문까지 발생했다. 왜 그럴까? assertThat(savedPost).usingRecursiveComparison().isEqualTo(foundPost);
때문이었다.
isEqualTo()는 동등성 비교를 한다. 이걸 비교하기 위해 두 번째 쿼리문이 나가게 된 것이다.
isEqualTo()를 들어가보면 필드끼리 비교한다고 나와있다. User 필드를 비교하기 위해 쿼리문이 하나 더 나가게 됐다.
즐겁게 읽었습니다. 유용한 정보 감사합니다.