inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

엔티티 설계시 주의점

엔티티에서 equals 오버라이딩, fetch join 2번 질문

해결된 질문

178

pink102557

작성한 질문수 6

0

게시글이 여러 댓글과 이미지를 가지고 있는 경우 게시글을 조회할 때 댓글과 이미지를 한번에 조회하는 것을 구현하고 있었습니다.

 

@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);
  1. 우선 OneToMany에서 fetch join을 2번하면 에러가 나더라구요 이 경우에 그럼 Comments와 Images를 따로 fetch join해서 가져와야하나요?

  2. 테스트에서 em.flush(); em.clear(); 하면 assertThat(findPost.getComments()).contains(comment);여기서 테스트 fail을 합니다. 영속성에서 제거가 돼서 그런 것 같은데 em.flush를 안하고 테스트를 해도 의미가 있는 건지 궁금합니다. 만약 em.flush를 해야지 의미 있다면 equals와 hashcode를 id값으로 오버라이딩을 해야하나요?

  3. 강의를 다 듣고 프로젝트에 적용해보려니까 여러군데에서 막히네요.. 개념이 부족한 거겠죠?

java spring 웹앱 spring-boot jpa

답변 1

0

y2gcoder

안녕하세요. 안채연님, 공식 서포터즈 y2gcoder입니다.

  1. 컬렉션 페치 조인은 하나만 허용합니다! 나머지는 batchsize를 통해 가져오시는 것을 추천합니다! 이러한 성능 최적화와 관련된 부분을 설명해주는 활용 2편 강의를 수강하시는 것을 정말 추천합니다 🙂

  2. 말씀하신대로 영속성 컨텍스트 내에서만 엔티티 간의 동일성을 보장해주기 때문에 테스트 에러가 발생한 것으로 보입니다! 이 때는 두 엔티티의 id값을 비교하시는 것을 추천합니다. id가 동일하면 두 엔티티는 동일하다고 할 수 있습니다 🙂 id는 엔티티의 식별자에 해당하기 때문입니다.

  3. 저도 실무나 프로젝트를 진행하다 보면 강의에서 들은 내용을 적용해보기도 하고, 잊어버렸던 내용을 다시 복습하기도 하는 것 같습니다. 그때마다 저는 영한님께서도 늘 말씀하시는 학습의 3단계 중 체화를 하고 있는게 아닌가 하며 학습을 하고 있는 순간이라 생각하고 있습니다! 저는 좋은 순간이라고 생각합니다! 파이팅입니다!

 

감사합니다.

1

pink102557

답변 감사합니다!! 좋은 순간이라 생각하고 프로젝트에 계속 적용해보겠습니다!

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