JAVA/메서드 정리

관계별 "연관관계 편의 메서드" 적용 가능성

min민 2025. 1. 15.

 

 

1.1. ManyToOne 관계

ManyToOne 관계에서는 주로 자식 엔티티에서 부모 엔티티를 참조한다.
이 경우, 자식 엔티티가 연관관계의 주인이므로 편의 메서드를 작성할 수 있다.

@Entity
public class Order {
    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    public void setMember(Member member) {
        this.member = member;
        member.getOrders().add(this); // 양방향 관계 설정
    }
}

 

 

1.2. OneToMany 관계

OneToMany는 기본적으로 양방향 관계일 때 주인이 아닌 엔티티가 되므로, 주로 읽기 전용으로 사용된다.

 

하지만 mappedBy로 매핑된 엔티티에서도 편의 메서드를 작성해 양쪽 관계를 설정할 수 있다.

@Entity
public class Member {
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

    public void addOrder(Order order) {
        orders.add(order);
        order.setMember(this); // 양방향 관계 설정
    }
}

 

 

 

1.3. OneToOne 관계

OneToOne 관계에서도 연관관계 편의 메서드를 작성할 수 있다.

 

이 경우 양쪽 엔티티 중 어느 쪽이든 주인이 될 수 있으므로, 관계의 주인 쪽에 편의 메서드를 작성하는 것이 일반적이다.

@Entity
public class Delivery {
    @OneToOne(mappedBy = "delivery")
    private Order order;

    public void setOrder(Order order) {
        this.order = order;
        order.setDelivery(this); // 양방향 관계 설정
    }
}

 

 

 

1.4. ManyToMany 관계

ManyToMany는 양쪽 엔티티가 서로 다수의 관계를 가지므로, 양쪽 모두 편의 메서드를 작성해야 할 경우가 많다.

 

특히 중간 테이블이 존재하지 않는 간단한 ManyToMany 관계에서 편의 메서드가 유용하다.

@Entity
public class Student {
    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private List<Course> courses = new ArrayList<>();

    public void addCourse(Course course) {
        courses.add(course);
        course.getStudents().add(this); // 양방향 관계 설정
    }
}

 

 

 

 

 

2. 관계별로 편의 메서드 작성 시 주의사항

2.1. 관계의 주인을 정확히 이해하기

연관관계의 주인은 외래 키를 소유한 쪽이다. 편의 메서드는 일반적으로 관계의 주인 쪽에 작성하며, 주인이 아닌 엔티티에 작성하는 경우 mappedBy로 매핑된 필드를 잘 활용해야 한다.

 

 

2.2. 무한 루프 방지

편의 메서드에서 한쪽 엔티티를 설정하면서 반대쪽도 다시 설정하도록 구현할 때, 무한 루프에 주의해야 한다.

 

 

예를 들어, 아래와 같은 코드는 루프를 유발할 수 있다.

public void setMember(Member member) {
    this.member = member;
    member.addOrder(this); // 다시 setMember 호출 가능 -> 루프 발생
}

 

 

이를 방지하려면, if 조건문으로 중복 설정을 방지해야 한다

public void setMember(Member member) {
    if (this.member != member) {
        this.member = member;
        member.getOrders().add(this);
    }
}

 

 

 

2.3. 관계의 복잡성 고려

ManyToMany는 중간 테이블을 직접 관리해야 하는 경우가 많다.

 

이때 @ManyToMany 대신 중간 엔티티를 활용한 OneToMany 및 ManyToOne 조합으로 구현하는 것이 좋다.

이는 편의 메서드 작성과 관계 관리의 복잡성을 줄여준다.

 

 

 

총 정리

1. 연관관계 편의 메서드는 ManyToOne, OneToMany, OneToOne, ManyToMany 관계에 모두 적용할 수 있다.

- 다만, 관계의 특성과 엔티티의 역할에 따라 작성 방식과 필요성이 달라진다.

 

2. 관계의 주인을 정확히 이해하고, 무한 루프 방지와 중복 설정에 유의하며, 적절한 방식으로 편의 메서드를 활용해야 한다.

- 이를 통해 코드의 일관성을 유지하고 유지보수성을 높일 수 있다.

댓글