inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 데이터 JPA

예제 도메인 모델과 동작확인

연관관계 설정에 대해서 질문이 있습니다.

302

mbh1069

작성한 질문수 2

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
예제 도메인 모델과 동작확인 강의에서 8:55분에 보면 연관 관계를 위해서 changeTeam이라는 메소드를 생성하시는데

 

해당 코드에서 team.getMembers().add(this)라는 코드가 있는데 해당 코드가 없어도 동작에 아무 이상이 없고

 

또한 Member에서 getMembers를 출력해보거나 DB를 보아도 달라진게 하나도 없는데 해당 라인의 코드를 적는 이유를 모르겠습니다.

 

만약 이유가 있다면 확인할만한 방법이 뭐가 있을까요?

java spring spring-boot jpa

답변 1

0

y2gcoder

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

연관관계 편의 메서드를 작성하는 이유는 JPA 엔티티의 객체 상태를 고려해야 하기 때문입니다. 말씀하신대로 했을 때, 아래의 코드를 보겠습니다!

아래는 하나의 트랜잭션 내에서 작성된 코드입니다!(EntityManager를 그대로 사용하기는 하나 spring data jpa 를 사용했을 때와 별 차이는 없습니다.)

Team team = new Team();
team.setName("TeamA");
em.persist(team);

Member member = new Member();
member.setName("member1");

member.changeTeam(team); // == member.setTeam(team); 
em.persist(member);

System.out.println(team.getMembers().size());

위의 코드에서 출력은 어떻게 나올지 예상해보시면 좋을 것 같습니다!

 

정답은 0 입니다.

왜냐하면 아직 트랜잭션 커밋 전이고, team의 객체 상태에서는 members 에 member가 추가되지 않았기 때문입니다. 만약 이 상황에서 team.getMembers() 를 이용해서 비즈니스 로직을 짜야한다면? 저희가 예상한 동작과는 다르게 결과가 나올 확률이 높습니다.

위의 코드에서는 member 쪽 team에 설정만 해줬을 뿐, team의 members 에는 변경사항이 반영되지 않은 상태입니다. 이러한 상황을 방지하고자 객체에서도 상태를 바로 업데이트 해주기 위해 team.getMembers().add(member); 코드가 필요한 것입니다!

위는 객체 상태만 업데이트해주면 되는 상황이라 좀 더 필요성이 낮아보일 수 있습니다. 실제로 연관관계 편의 메서드 라고 검색해보시면 양방향 관계에서 연관관계 편의 메서드를 사용하지 않았을 때 더 문제가 되는 경우(클릭)도 많으니 한 번 살펴보셨으면 좋겠습니다!

 

감사합니다.

1

mbh1069

답변해주셔서 감사합니다.

Entity Manager 상에서 감지는 하게 되지만 객체가 가진 값은 변화가 없기 때문에 해당 객체를 그대로 사용하면 생각한 것과 다른 결과가 나온다고 이해하면 맞은 걸까요?

어차피 같은 값을 가져올테니 필요 없는 쿼리를 날리는 소모를 줄이고 최적화 위주로 생각한다면 객체가 가진 값이 db 데이터랑 다른 값을 가지고 있으니 이를 바꿔준다. 이래 이해했는데.. 맞으려나요.

 

 

0

y2gcoder

넵 위의 케이스에서는 그렇게 이해해주시면 될 것 같습니다!

changeTeam 메서드 질문

0

20

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

78

1

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

112

3

MemberRepository 구현체

0

64

1

pdf 표현 질문드립니다.

0

66

1

로그가 남지 않는 문제.

0

90

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

73

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

73

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

96

2

Sort 인터페이스는 잘 사용 안하나요?

0

52

1

스캔대상 질문드립니다.

0

46

1

하이버네이트6에서의 최적화에 이은 질문

0

88

1

save() vs saveAndFlush DB 통신 횟수

0

55

1

순수 JPA 리포지토리 코드 수정부분

0

87

2

bulk연산 후 flush하는 이유를 모르겠어요

0

153

3

bulk insert 질문입니다.

0

186

2

교만했던 것 같아요.

0

147

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

151

2

동적 테이블에 대한 질문

0

87

1

영속성 전이와 연관관계

0

134

2

강의 10:25 질문

0

75

1

단건 update 질문

0

99

2

엔티티 와 도메인의 경계

0

129

1

UsernameOnlyDto 타입 type mismatch 오류

0

122

1