[TIL 65일차] Entity 연관 관계

이건·2024년 8월 23일

1:1 관계

JPA(Java Persistence API)에서 Entity의 1:1 관계는 두 개의 Entity가 서로 1:1로 연결되는 관계를 의미한다. 즉, 한 Entity는 다른 Entity와 정확히 하나의 인스턴스만 연결될 수 있다. 이 관계는 주로 두 Entity 간의 강력한 연관성을 나타내며, 예를 들어, 사용자(User)와 사용자 프로필(Profile) 간의 관계가 이에 해당할 수 있다.

1:1 관계 설정 방법

  1. 주 테이블과 종속 테이블:

    • 주 테이블(예: User)에는 종속 테이블(예: Profile)의 외래 키가 포함된다.
    • 또는, 종속 테이블에 주 테이블의 외래 키가 포함될 수도 있다. 이때 @MapsId 어노테이션을 사용하여 주 테이블의 ID를 종속 테이블의 ID로 매핑할 수 있다.
  2. 어노테이션 사용:

    • @OneToOne: 1:1 관계를 정의한다.
    • @JoinColumn: 외래 키를 정의한다.

예제 코드

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    private Profile profile;

    // getters and setters
}

@Entity
public class Profile {
    @Id
    private Long id;

    @OneToOne
    @JoinColumn(name = "user_id")
    private User user;

    // getters and setters
}

주의사항

  • 양방향 vs 단방향: 1:1 관계는 양방향으로 설정할 수 있으며, 이 경우 두 Entity 모두 서로를 참조할 수 있다. 단방향으로 설정하면 한 Entity만 다른 Entity를 참조한다.
  • Cascade: 관계가 설정된 Entity가 삭제되거나 변경될 때, 다른 Entity에 영향을 미치도록 설정할 수 있다. CascadeType.ALL을 사용하면 모든 작업이 전파된다.

1:N

JPA(Java Persistence API)에서 Entity의 1:N 관계는 한 Entity가 여러 개의 다른 Entity와 연결되는 관계를 의미한다. 즉, 하나의 부모 Entity는 여러 자식 Entity를 가질 수 있지만, 각 자식 Entity는 하나의 부모 Entity에만 속한다. 이 관계는 주로 주체와 그에 소속된 여러 객체 간의 관계를 나타내며, 예를 들어, 하나의 사용자(User)가 여러 게시물(Post)을 작성할 수 있는 경우가 이에 해당한다.

1:N 관계 설정 방법

  1. 주 테이블과 자식 테이블:

    • 주 테이블(예: User)에는 자식 테이블(예: Post)의 외래 키가 포함된다. 자식 Entity는 부모 Entity의 ID를 외래 키로 참조한다.
  2. 어노테이션 사용:

    • @OneToMany: 1:N 관계를 정의한다.
    • @ManyToOne: N:1 관계를 정의하여 자식 Entity가 부모 Entity를 참조한다.
    • @JoinColumn: 외래 키를 정의한다.

예제 코드

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Post> posts = new ArrayList<>();

    // getters and setters
}

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;

    // getters and setters
}

주의사항

  • 양방향 vs 단방향: 1:N 관계는 양방향으로 설정할 수 있으며, 이 경우 부모 Entity와 자식 Entity 둘 다 서로를 참조할 수 있다. 단방향으로 설정하면 한 Entity만 다른 Entity를 참조한다.
  • Cascade: 부모 Entity가 삭제되거나 변경될 때, 자식 Entity에 영향을 미치도록 설정할 수 있다. CascadeType.ALL을 사용하면 모든 작업이 전파된다.

결론

JPA에서 1:N 관계는 부모 Entity와 여러 자식 Entity 간의 관계를 모델링하는 데 유용하며, 적절한 어노테이션과 매핑을 통해 효율적으로 관리할 수 있다. 양방향 또는 단방향 관계를 필요에 따라 설정할 수 있으며, Cascade 옵션을 통해 관계의 일관성을 유지할 수 있다.

N:1

JPA(Java Persistence API)에서 Entity의 N:1 관계는 여러 개의 자식 Entity가 하나의 부모 Entity에 연결되는 관계를 의미한다. 즉, 여러 자식 Entity가 동일한 부모 Entity를 참조할 수 있지만, 각 자식 Entity는 하나의 부모 Entity에만 속한다. 이 관계는 주로 다수의 객체가 하나의 주체를 공유하는 상황에서 사용된다. 예를 들어, 여러 게시물(Post)이 하나의 카테고리(Category)에 속할 수 있는 경우가 이에 해당한다.

N:1 관계 설정 방법

  1. 자식 테이블과 주 테이블:

    • 자식 Entity(예: Post)는 부모 Entity(예: Category)의 외래 키를 가지고 있다. 이를 통해 자식 Entity가 어떤 부모 Entity에 속하는지를 정의한다.
  2. 어노테이션 사용:

    • @ManyToOne: N:1 관계를 정의한다. 여러 자식 Entity가 하나의 부모 Entity를 참조한다.
    • @JoinColumn: 외래 키를 정의한다.

예제 코드

@Entity
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "category")
    private List<Post> posts = new ArrayList<>();

    // getters and setters
}

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "category_id")
    private Category category;

    // getters and setters
}

주의사항

  • 양방향 vs 단방향: N:1 관계는 양방향으로 설정할 수 있으며, 이 경우 부모 Entity와 자식 Entity가 서로를 참조할 수 있다. 단방향으로 설정하면 한 Entity만 다른 Entity를 참조한다.
  • Cascade: 자식 Entity가 부모 Entity를 참조할 때, Cascade 옵션을 설정하여 부모 Entity의 생명 주기와 자식 Entity의 생명 주기를 연관시킬 수 있다.

결론

JPA에서 N:1 관계는 여러 자식 Entity가 동일한 부모 Entity를 참조하는 구조를 모델링하는 데 유용하다. 적절한 어노테이션과 매핑을 통해 이 관계를 효율적으로 관리할 수 있으며, 필요에 따라 양방향 또는 단방향 관계를 설정할 수 있다. 이를 통해 데이터베이스의 무결성을 유지하고, 객체 간의 관계를 효과적으로 표현할 수 있다.

N:M

JPA(Java Persistence API)에서 Entity의 N:M 관계는 여러 개의 자식 Entity가 여러 개의 부모 Entity와 연결되는 관계를 의미한다. 즉, 하나의 Entity가 여러 다른 Entity와 연관될 수 있으며, 반대로 다른 Entity도 여러 개의 같은 Entity와 연관될 수 있다. 이 관계는 주로 다대다의 관계를 표현할 때 사용되며, 예를 들어, 학생(Student)과 과목(Course) 간의 관계가 이에 해당한다. 한 학생이 여러 과목을 수강할 수 있고, 동시에 여러 학생이 하나의 과목을 수강할 수 있다.

N:M 관계 설정 방법

N:M 관계를 설정하기 위해서는 중간 테이블이 필요한다. JPA에서는 이 중간 테이블을 자동으로 생성하거나 직접 정의할 수 있다.

  1. 중간 테이블 생성: 여러 개의 부모 Entity와 자식 Entity 간의 관계를 나타내기 위해 중간 테이블을 사용한다.

  2. 어노테이션 사용:

    • @ManyToMany: N:M 관계를 정의한다.
    • @JoinTable: 중간 테이블의 이름과 외래 키를 정의한다.

예제 코드

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    // getters and setters
}

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "courses")
    private List<Student> students = new ArrayList<>();

    // getters and setters
}

주의사항

  • 중간 테이블의 관리: JPA가 중간 테이블을 자동으로 생성하도록 할 수 있지만, 필요에 따라 수동으로 중간 Entity를 만들어 관리할 수도 있다.
  • Cascade: N:M 관계의 경우, Cascade 옵션을 설정하여 부모 Entity와 자식 Entity 간의 생명 주기를 연관시킬 수 있다.
  • 성능 고려: N:M 관계는 중간 테이블을 통해 데이터베이스에 추가적인 조인이 발생할 수 있으므로 성능에 유의해야 한다.

결론

JPA에서 N:M 관계는 여러 개의 자식 Entity와 여러 개의 부모 Entity 간의 복잡한 관계를 표현하는 데 유용한다. 적절한 어노테이션과 중간 테이블 설정을 통해 이 관계를 효과적으로 관리할 수 있으며, 데이터베이스의 무결성을 유지하면서 객체 간의 관계를 명확히 할 수 있다.

0개의 댓글