작성
·
301
2
안녕하세요.
우선 양질의 컨텐츠 항상 잘보고 있습니다.
우연히 수강한 jpa 토크온세미나를 시작으로 이렇게 프로젝트 강의까지 오게되었습니다.
많이 배웠습니다. 정말 감사합니다.
다른게 아니라 엔티티 클래스 구현까지 강의를 수강 도중
연관관계 편의 메소드에서 궁금한 것이 있어 글 남겼습니다.
1. 현재 member의 소속 여부에 대한 처리
이를 테면 "Order" 엔티티 클래스에서, member가 orders에 현재 속하고 있는지 확인하고 만약 그렇다면 해당 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);
}
그렇지 않으면 특이사항 이겠지만, Order의 member를 변경할 때 member.orders에서 문제가 생기지 않은가 싶어서
주석 부분을 패스하신 이유가 궁금합니다.
더하여 만약 Order의 Member처럼 현업에서 이렇게 변경 소지가 없는 필드 변수를 final 처리하는지가 개인적으로 궁금합니다.
2. 편의 메소드 위치
두번째로 편의 메소드를 어떤 객체가 갖는 것이 옳은가에 대한 고민이 듭니다.
저는 외래키의 주인이 되는, 이를 테면 Member와 Order의 경우 Order에 위치하는 것으로 생각했는데,
Order와 OrderItem의 경우 order를 외래키로 주인이 되는 OrderItem이 아닌 Order에서 orderItem.setOrder을 호출하니 어떤 쪽에서 set를 갖는 것이 옳은가 정하기가 어렵습니다.
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
혹시 현업에서는 이와 같은 상황에서 어느쪽이 '주' 가 된다를 정하는 규칙, 또는 다른 팀원을 위해서 표시하는 방법이 있는지 궁금합니다.
ps. 더 좋은 질문을 가져오도록 노력하겠습니다. 감사합니다.
답변 4
1
0
안녕하세요. 진환님^^
제가 설명이 좀 부족했네요.
memberA를 memberB로 변경할 때 다음과 같은 코드가 없어도 됩니다. (정석은 물론 코드가 있어야겠지만요)
orderA.member.getOrders.remove(this.member);
위 코드는 연관관계의 주인이 아니기 때문에 설정을 해도 DB에 반영되지 않습니다.
반면에 다음 코드는 연관관계의 주인이기 때문에 꼭 설정을 해주어야 합니다.
orderA.setMember(memberB);
물론 가장 좋은 방법은 연관관계 편의 메소드에서 양쪽다 잡아주는 것이 좋습니다^^!
도움이 되셨길 바래요^^
0
1. 현재 member의 소속 여부에 대한 처리
그렇다면 아래처럼 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 하는게 더 편할 수 있다라는 말씀이시죠?
알겠습니다. 책도 많이 읽고 강의도 열심히 보면서 더 단단해져 오겠습니다.
감사합니다.
0
안녕하세요. 김진환님^^
JPA 토크온 세미나 덕분에 저도 강의를 만들게 되었어요^^! 오프라인 강의여서 열정이 넘쳐났던 기억이 나네요 ㅋㅋㅋ
1. 현재 member의 소속 여부에 대한 처리
원칙적으로 말씀하신 내용이 맞습니다! 그런데 실무에서는 이렇게 하면 너무 복잡해져서, 연관관계의 주인 쪽에만 값을 변경하는 것 정도로 저는 타협하는 편입니다. 연관관계의 주인에 설정된 값으로만 실제 DB에 반영되기 때문이지요. 물론 순수한 객체 상태에서는 조심해야 합니다.
2. 편의 메소드 위치
아~ 이게 정답이 정말 없습니다. 제가 케바케라는 것을 많이 좋아하지는 않습니다. 그런데 이건 코드를 딱! 작성해보고 그 상황에 맞는 곳에 편의 메소드를 위치 시켜야 합니다. 보통 비즈니스 로직을 작성해보면, 그 상황에 더 맞는 위치가 자연스럽게 드러납니다^^
감사합니다^^