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. 관계의 주인을 정확히 이해하고, 무한 루프 방지와 중복 설정에 유의하며, 적절한 방식으로 편의 메서드를 활용해야 한다.
- 이를 통해 코드의 일관성을 유지하고 유지보수성을 높일 수 있다.
'JAVA > 메서드 정리' 카테고리의 다른 글
JPA 연관관계 편의 메서드, 사용하면 어떤 이점이 있을까? (1) | 2025.01.15 |
---|---|
Java에서 외부 프로세스 실행: Runtime.getRuntime().exec() 메서드 사용법 (0) | 2024.12.31 |
자바에서 변수의 타입 확인하기: 기본형과 래퍼 클래스 (0) | 2024.12.07 |
Java의 char 타입 연산: 문자 차이를 계산하고 타입 변환 이해하기 (0) | 2024.12.06 |
Char과 Stirng 비교하는법 // Stirng.valueOf(); (0) | 2022.12.23 |
댓글