ecsimsw

JPA / 김영한님 질문과 답변 / 연관관계 편의 메소드의 '주' 본문

JPA / 김영한님 질문과 답변 / 연관관계 편의 메소드의 '주'

JinHwan Kim 2020. 6. 30. 06:45

질문

1. 현재 member의 소속 여부에 대한 처리

  이를 테면 "Order" 엔티티 클래스에서, memberorders에 현재 속하고 있는지 확인하고 만약 그렇다면 해당 Orders에서 member를 제거 후 변경된 member를 추가해야하는 것은 아닌지.

public void setMember(Member member){
/*
if(this.member.getOrders() != null){
this.member.getOrders().remove(this);
}
*/

this.member = member;
member.getOrders().add(this);
}

 그렇지 않으면 특이사항 이겠지만, Ordermember를 변경할 때 member.orders에서 문제가 생기지 않은가 싶어서 주석 부분을 패스하신 이유가 궁금합니다.

  더하여 만약 OrderMember처럼 현업에서 이렇게 변경 소지가 없는 필드 변수를 final 처리하는지가 개인적으로 궁금합니다.

 


2. 편의 메소드 위치

  두번째로 편의 메소드를 어떤 객체가 갖는 것이 옳은가에 대한 고민이 듭니다.

  저는 외래키의 주인이 되는, 이를 테면 MemberOrder의 경우 Order에 위치하는 것으로 생각했는데,

  OrderOrderItem의 경우 order를 외래키로 주인이 되는 OrderItem이 아닌 Order에서 orderItem.setOrder을 호출하니 어떤 쪽에서 set를 갖는 것이 옳은가 정하기가 어렵습니다.

public void addOrderItem(OrderItem orderItem){
  orderItems.add(orderItem);
  orderItem.setOrder(this);
}

 

  혹시 현업에서는 이와 같은 상황에서 어느쪽이 '' 가 된다를 정하는 규칙, 또는 다른 팀원을 위해서 표시하는 방법이 있는지 궁금합니다.

 

  ps. 더 좋은 질문을 가져오도록 노력하겠습니다. 감사합니다. 

 

답변

안녕하세요. 김진환님^^

JPA 토크온 세미나 덕분에 저도 강의를 만들게 되었어요^^! 오프라인 강의여서 열정이 넘쳐났던  기억이 나네요 ㅋㅋㅋ

 

1. 현재 member의 소속 여부에 대한 처리 

원칙적으로 말씀하신 내용이 맞습니다! 그런데 실무에서는 이렇게 하면 너무 복잡해져서, 연관관계의 주인 쪽에만 값을 변경하는 것 정도로 저는 타협하는 편입니다. 연관관계의 주인에 설정된 값으로만 실제 DB에 반영되기 때문이지요. 물론 순수한 객체 상태에서는 조심해야 합니다.

 

2. 편의 메소드 위치

아~ 이게 정답이 정말 없습니다. 제가 케바케라는 것을 많이 좋아하지는 않습니다. 그런데 이건 코드를 딱! 작성해보고 그 상황에 맞는 곳에 편의 메소드를 위치 시켜야 합니다. 보통 비즈니스 로직을 작성해보면, 그 상황에 더 맞는 위치가 자연스럽게 드러납니다^^

 

감사합니다^^

 

질문 2

  그렇다면 아래처럼 orderA의 member가 memberA로 결정이 된 상태에서

orderA.setMember(memberA);  

// orderA.member = memberA;
// memberA,orders.add(A);

  orderA의 member를 memberB로 변경하고자 한다면 

orderA.member.getOrders.remove(this.member);
orderA.setMember(memberB);

  처럼 직접 orders에서 remove 하는게 더 편할 수 있다라는 말씀이시죠?

 

알겠습니다. 책도 많이 읽고 강의도 열심히 보면서 더 단단해져 오겠습니다.

감사합니다.

Comments