엔티티에서 equals 오버라이딩, fetch join 2번 질문
게시글이 여러 댓글과 이미지를 가지고 있는 경우 게시글을 조회할 때 댓글과 이미지를 한번에 조회하는 것을 구현하고 있었습니다.
@SpringBootTest
@Transactional
@Rollback(value = false)
class PostRepositoryTest {
@Autowired PostRepository postRepository;
@Autowired UserRepository userRepository;
@Autowired CommentRepository commentRepository;
@Autowired ImageRepository imageRepository;
@Autowired EntityManager em;
@Test
void 게시글조회시_댓글_이미지_함께_조회() {
User user = User.builder()
.username("tester")
.password("password")
.build();
userRepository.save(user);
Post post = Post.builder()
.title("테스트제목")
.content("테스트내용")
.build();
postRepository.save(post);
Comment comment = Comment.builder()
.post(post)
.user(user)
.content("댓글입니다.")
.build();
commentRepository.save(comment);
Image image = Image.builder()
.image("/file/test")
.post(post)
.build();
imageRepository.save(image);
em.flush();
em.clear();
Post findPost = postRepository.findByIdWithCommentsAndImages(post.getId()).get();
assertThat(findPost.getId()).isEqualTo(post.getId());
assertThat(findPost.getTitle()).isEqualTo("테스트제목");
System.out.println(findPost.getComments().get(0).getContent());
assertThat(findPost.getComments()).contains(comment);
}
}
@Query("select p from Post p " +
"left join fetch p.comments " +
// "left join fetch p.images " +
"where p.id = :id")
Optional<Post> findByIdWithCommentsAndImages(@Param("id") Long id);우선 OneToMany에서 fetch join을 2번하면 에러가 나더라구요 이 경우에 그럼 Comments와 Images를 따로 fetch join해서 가져와야하나요?
테스트에서 em.flush(); em.clear(); 하면 assertThat(findPost.getComments()).contains(comment);여기서 테스트 fail을 합니다. 영속성에서 제거가 돼서 그런 것 같은데 em.flush를 안하고 테스트를 해도 의미가 있는 건지 궁금합니다. 만약 em.flush를 해야지 의미 있다면 equals와 hashcode를 id값으로 오버라이딩을 해야하나요?
강의를 다 듣고 프로젝트에 적용해보려니까 여러군데에서 막히네요.. 개념이 부족한 거겠죠?
답변 1
0
안녕하세요. 안채연님, 공식 서포터즈 y2gcoder입니다.
컬렉션 페치 조인은 하나만 허용합니다! 나머지는 batchsize를 통해 가져오시는 것을 추천합니다! 이러한 성능 최적화와 관련된 부분을 설명해주는 활용 2편 강의를 수강하시는 것을 정말 추천합니다 🙂
말씀하신대로 영속성 컨텍스트 내에서만 엔티티 간의 동일성을 보장해주기 때문에 테스트 에러가 발생한 것으로 보입니다! 이 때는 두 엔티티의 id값을 비교하시는 것을 추천합니다. id가 동일하면 두 엔티티는 동일하다고 할 수 있습니다 🙂 id는 엔티티의 식별자에 해당하기 때문입니다.
저도 실무나 프로젝트를 진행하다 보면 강의에서 들은 내용을 적용해보기도 하고, 잊어버렸던 내용을 다시 복습하기도 하는 것 같습니다. 그때마다 저는 영한님께서도 늘 말씀하시는 학습의 3단계 중 체화를 하고 있는게 아닌가 하며 학습을 하고 있는 순간이라 생각하고 있습니다! 저는 좋은 순간이라고 생각합니다! 파이팅입니다!
감사합니다.
OrderServiceTest 상문주문 테스트 시 update 쿼리 문의
0
27
1
sdk 설정 오류
0
68
2
오탈자 - @Transactional
0
63
1
src/test/resources 테스트 경로 문제
0
60
1
상품 등록후 H2 db 출력 순서 바꿀 수 있나요?
0
70
1
MemberRepositoryTest 실행오류
0
90
1
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
1
197
2
강의 마지막 QueryDSL 사용 부분 질문있습니다
1
154
2
클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.
0
57
1
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
0
81
1
기본 생성자
0
67
1
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
0
107
1
멤버서비스테스트 부분에서 막힙니다.
0
174
4
실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?
0
124
1
초반에 h2 다운로드 과정 꼭 필요한가요?
0
129
2
자신 필드에도 get으로 접근하는 이유가 있을까요?
0
122
1
24분 27초 연관관계 편의 메서드 위치
0
118
1
단건 주문만 가능하게 한건 의도한 부분이신가요?
0
114
2
빌드 툴, Gradle
0
65
1
h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다
0
82
2
Repository에서 EntityManager 주입 방식 차이
0
97
1
롬복과 사용자 정의 setter 메서드
0
78
1
주문 목록 조회 fetch join 질문드립니다
0
91
1
dirty checking 질문드립니다.
0
87
1





