작성
·
266
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를 보아도 달라진게 하나도 없는데 해당 라인의 코드를 적는 이유를 모르겠습니다.
만약 이유가 있다면 확인할만한 방법이 뭐가 있을까요?
답변 1
0
안녕하세요.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); 코드가 필요한 것입니다!
위는 객체 상태만 업데이트해주면 되는 상황이라 좀 더 필요성이 낮아보일 수 있습니다. 실제로 연관관계 편의 메서드 라고 검색해보시면 양방향 관계에서 연관관계 편의 메서드를 사용하지 않았을 때 더 문제가 되는 경우(클릭)도 많으니 한 번 살펴보셨으면 좋겠습니다!
감사합니다.
답변해주셔서 감사합니다.
Entity Manager 상에서 감지는 하게 되지만 객체가 가진 값은 변화가 없기 때문에 해당 객체를 그대로 사용하면 생각한 것과 다른 결과가 나온다고 이해하면 맞은 걸까요?
어차피 같은 값을 가져올테니 필요 없는 쿼리를 날리는 소모를 줄이고 최적화 위주로 생각한다면 객체가 가진 값이 db 데이터랑 다른 값을 가지고 있으니 이를 바꿔준다. 이래 이해했는데.. 맞으려나요.