양방향 연관관계 약화시키기?

좋은 질문입니다. “양방향 연관관계에서 중간 테이블을 둬서 해결했다”는 말은 단순히 "양방향 연관관계를 없앴다"는 뜻이 아니라, 두 엔티티 간 직접적인 강한 결합을 완화시키기 위해 중간에 제3의 엔티티를 둬서 연관관계를 우회했다는 의미입니다.


🔁 기존 양방향 연관관계 예시 (강한 결합)

java코드 복사class Member {
    @OneToMany(mappedBy = "member")
    private List<Order> orders;
}

class Order {
    @ManyToOne
    private Member member;
}
  • MemberOrder, OrderMember 양방향으로 연관되어 있음.

  • 서로 직접 참조 → 서로 강하게 결합됨.

  • 문제: 순환 참조 위험, 무한 루프(JSON 직렬화), 유지보수 어려움


🔄 중간 테이블(엔티티)을 둬서 해결

java코드 복사class Member {
    @OneToMany(mappedBy = "member")
    private List<MemberOrder> memberOrders;
}

class Order {
    @OneToMany(mappedBy = "order")
    private List<MemberOrder> memberOrders;
}

class MemberOrder {
    @ManyToOne
    private Member member;

    @ManyToOne
    private Order order;
}

✅ 이렇게 하면?

  • Member ↔ Order 간 직접 참조를 제거

  • 중간 엔티티(MemberOrder) 가 매핑 정보를 갖고 있음

  • 양방향이긴 하지만 한 단계 우회하기 때문에 훨씬 유연하고 명확


📌 비유

  • 직접적인 양방향 관계: 두 사람이 서로 줄로 연결됨 → 끊으면 둘 다 영향

  • 중간 테이블 방식: 두 사람 사이에 만남 기록이라는 중간 역할자가 있음 → 기록만 지우면 됨


✅ 요약

항목
양방향 직접 관계
중간 엔티티 방식

참조 방식

서로 직접 참조

중간 엔티티를 통해 참조

결합도

높음

낮음

유지보수

어려움

쉬움

활용 예

단순한 관계

복잡한 매핑 (예: 주문에 수량, 상태 추가 등)


필요 시 MemberOrder 같은 중간 테이블에 추가 정보(수량, 역할, 권한 등) 도 저장 가능하므로 실무에서도 중간 테이블 방식은 훨씬 더 유연하고 확장성이 좋습니다.

Last updated