BE/Spring Boot

[Spring Boot] 연관관계 매핑

셰욘 2025. 2. 10. 19:42
728x90

JPA에서는 테이블의 연관관계를 엔티티 간의 연관관계로 표현할 수 있다.

 

연관관계 매핑 종류

One To One (일대일)

@JoinColumn으로 외래키 이름을 설정해준다.

@JoinColumn(name = "외래키 이름")

 

ex) 사용자(User)와 프로필(Profile)은 1:1 관계

@Entity
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToOne
    @JoinColumn(name = "profile_id") // 외래 키 설정
    private Profile profile;
}

 


One To Many (일대다)

@OneToMany를 사용해준다.

@OneToMany(mappedBy = "변수 이름")

 

ex) 한 명의 사용자는 여러 개의 게시글(Post)를 가질 수 있다 => 1:N

@OneToMany(mappedBy = "user") => Post 엔티티의 user 필드에 의해 매핑됨

 

사용자 엔티티 (User)

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

	// 여기서 mappedBy 에 들어갈 변수 이름은 연결될 엔티티의 변수여야 한다.
    @OneToMany(mappedBy = "user")
    private List<Post> posts;
}

 

 


Many To One (다대일)

연결할 엔티티에 @ManyToOne 을 붙여주고, @JoinColumn으로 외래키 이름을 설정해준다.

@ManyToOne 이 달려있는 변수 이름이 @OneToMany 의 mappedBy 변수 이름과 같아야 한다.

 

ex) 한 명의 사용자는 여러 개의 게시글(Post)를 가질 수 있다 => 1:N

 

게시글 엔티티 (Post)

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

    @ManyToOne
    @JoinColumn(name = "user_id") // 외래 키 설정
    private User user;  // 여기에 있는 변수 이름이 mappedBy에 들어갈 변수 이름과 같아야 한다.
}

Many To Many (다대다)

중간 테이블(엔티티)을 하나 생성해준다.

 

ex) 학생(Student)과 상품(Product)는 N:N 관계

(한 명의 학생이 여러 상품을 구매할 수 있고, 한 상품을 여러 학생이 구매할 수 있다.)

 

구매 엔티티를 하나 생성한다.

상품 1    :    N 구매 M    :    1 학생

 

상품 엔티티 (Product)

@Getter
@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idx;
    private String name;
    private String description;
    private int price;

    @OneToMany(mappedBy ="product")
    private List<Purchase> purchasList;
}

 

 

구매 엔티티 (Purchase)

필드로 idx만 놓고 상품(Product)과 학생(Student)을 다대일로 연결해준다.

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

    @ManyToOne()
    @JoinColumn(name="product_idx")
    private Product product;

    @ManyToOne()
    @JoinColumn(name="student_idx")
    private Student student;
}

 

 

 

학생 엔티티 (Student)

@Getter
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idx;
    private String name;
    private int age;

    @OneToMany(mappedBy ="student")
    private List<Purchase> purchasList;
}
728x90