inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 데이터 JPA

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

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

449

Hoon Jeon

작성한 질문수 1

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 필드만을 사용해 구현하는 방법은 권장하지 않는 방법인지 궁금합니다.

java JPA spring

답변 4

1

백기선

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

0

Hoon Jeon

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

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

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

0

백기선

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

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

0

Hoon Jeon

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

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

spring boot 2.7.13-SNAPSHOT trace 소문자 로그 안나옴

0

533

1

<스프링 데이터 Common: 기본 리포지토리 커스터마이징> 에 대한 질문

0

392

1

comment table에서 저장될떄 왜 id값이 2부터저장이되는건가요?

0

407

1

@EnableJpaRepositories 설정을 스프링부트가 어디에서 자동설정하나요?

0

450

0

PersistenceContext 관련 질문드립니다.

0

335

1

지금(Eager), 나중에(Lazy)의 의미를 모르겠습니다

0

338

1

transaction 구간이 길어질 경우의 처리방법 문의드립니다.

0

905

1

docker postgres

0

293

1

Multiple DataSource 사용 시 transaction 관련 질문 드립니다.

0

2908

1

entity 중 null이 아닌 필드만 update 할 방법이 있을까요?

0

1190

1

Eager 모드일 경우, join을 inner join으로 바꾸는 법이 있을까요?

0

385

1

엔티티를 상속받는 DTO가 일반적인가요?

1

1847

1

커스텀 타입 클래스를 String 타입 처럼 이용해 쿼리하는 방법에 대해 질문하고 싶습니다.

0

339

1

연관관계 매핑 어떤식으로 해야될지 감이 안잡힙니다.

0

566

4

EntityManager 주입시 Annotation관련 질문드립니다.

0

565

1

클래스 기반 프로젝션 사용 관련 질문

0

560

1

save 메서드 질문드립니다.

0

258

1

복잡한 통계쿼리도 JPA로 가능한가요?

2

5592

1

find 와 get의 차이가 무엇인가요?

0

890

1

실무에서 JPA 할 때 FK로 개발할때 연관관계를 꼭 맺어주어야 하나요?

0

998

1

\dt Did not find any relations.

0

481

1

소스코드는 어디서 볼 수 있을까요?

1

287

1

table 생성과 select 문에 대한 질문

0

174

1

스프링 데이터 RepositoryTest 관련 질문

0

2173

2