인프런 커뮤니티 질문&답변

Hoon Jeon님의 프로필 이미지
Hoon Jeon

작성한 질문수

스프링 데이터 JPA

JPA 프로그래밍 5. 엔티티 상태와 Cascade

EqualsAndHashCode와 관련하여 질문드립니다.

작성

·

383

1

안녕하세요 뒤늦게 강의를 알게되어 보고있습니다.

강의를 진행하시면서 작성하시는 코드를 직접 따라해보며 생긴 질문들이 있어 질문드립니다. 먼저 저는 lombok을 사용해 @EqualsAndHashCode 를 사용하였습니다. 이전 강의에서 @Data 애노테이션에 대한 문제를 인지하고 getter와 setter 등을 분리시켜 필요한것만 사용하고있습니다. 강의에서 작성한 Post와 Comment클래스 모두에 hashcode와 equals를 primary key인 id 필드만 사용하여 equals와 hashcode 를 작성하니 문제가 생겼습니다. 

Post의 Comment 컬렉션인 HashSet에 Comment를 추가할 때 equals와 hashcode를 비교하여 중복검사를 하게되는데 문제는 아직 저장하지 않은 Transient 상태의 객체들은 Id 값이 부여되지 않은 null 인 상태여서 Post에 Comment를 여러개 추가하면 자꾸 null인 아이디 때문에 덮어씌어져 결국 하나의 Comment만 추가됩니다. 

이 문제를 해결하기 위해 id 필드가 아닌 비즈니스 정보를 가진 필드들을 이용하여 equals와 hashcode 를 작성해야 하는지 ID 필드만을 사용해 구현하는 방법은 권장하지 않는 방법인지 궁금합니다.

답변 4

1

백기선님의 프로필 이미지
백기선
지식공유자

영속화 시킨 코멘트만 Post에 추가를 하도록 작성하시면 id가 null이 아닐테고 equals, hashCode도 제대로 사용할 수 있을겁니다. 

0

Hoon Jeon님의 프로필 이미지
Hoon Jeon
질문자

일반적인 서비스의 경우 말씀하신대로 당연히 포스트가 먼저 등록이 되어있을테고 코멘트도 하나씩 처리되겠지만 강의에서 작성하신 테스트 코드를 실행 중에 발생한 내용이었습니다.

결국 쿼리 자체는 등록한 코멘트만큼 발생할테니 성능에는 차이가 없겠네요. 나중에 서비스를 구현할 때 주의하도록 하겠습니다.

연휴기간에도 빠른 답변주셔서 정말 감사합니다. 올려주신 강의 보면서 더 열심히 공부할게요. 즐거운 연휴보내세요.

0

백기선님의 프로필 이미지
백기선
지식공유자

만들기 나름이지만, 보통 코멘트를 추가하기 전에 포스트는 이미 있지 않나요? 그리고 코멘트 여러개를 한번에 저장하는게 아니라 코멘트를 하나씩 처리할테니 save는 한번만 일어날거 같은데요. 어떤식으로 기능을 구현할꺼냐에 달린거 같습니다.

말씀하신대로 포스트와 코멘트 여러개를 모두 한번에 처리하는 경우라 한다면 결국에 save를 몇번 호출하던 세번 호출하던 한 트랜잭션안에서 SQL 쿼리는 세번 발생할거라 큰 차이가 없을거 같습니다.

0

Hoon Jeon님의 프로필 이미지
Hoon Jeon
질문자

답변 감사합니다. 제가 원하던 것은 아직 영속화 시키지 않은 Transient 상태의 코멘트들을 포스트에 추가시키고 포스트가 영속화 될 때 전파속성인 Cascade를 이용해 같이 영속화 시키는 것이었습니다. 

말씀해주신대로 코멘트를 먼저 영속화 시키고 영속화된 코멘트만 포스트에 추가시키는 방법은 결국 2개의 코멘트와 하나의 포스트를 영속화시키기 위해 세 번의 save를 호출해야할텐데 이러면 제가 원했던 상태 전파를 이용해 한 번의 save 호출만으로 코멘트 모두와 포스트를 영속화 시키는 것은 id로만 equals, hashCode를 구현했을 때 힘들다는 말씀이시죠?

Hoon Jeon님의 프로필 이미지
Hoon Jeon

작성한 질문수

질문하기