😃 Today I Leaned
- SpringBoot
⭐알게 된 점⭐
Entity 연관 관계
- DB 테이블에서는 테이블 사이의 연관관계를 FK로 맺을 수 있고 방향 상관없이 조회가 가능함
- Entity에서는 상대 Entity를 참조하여 Entity 사이의 연관관계를 맺을 수 있음
- 상대 Entity를 참조하고 있지 않다면 상대 Entity를 조회할 수 없음
- Entity에서는 DB 테이블에는 없는 방향의 개념이 존재함
단방향 관계
// Food Entity
@Entity
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
-------------------------------------------------------------
// User Entity
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
- Food Entity에서만 User Entity를 참조할 수 있음
- User Entity에는 Food Entity의 정보가 없기 때문에 음식 정보를 조회할 수 없음
양방향 관계
// Food Entity
@Entity
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
-------------------------------------------------------------
// User Entity
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user")
private List<Food> foodList = new ArrayList<>();
}
- Food Entity와 User Entity는 서로를 참조하고 있음
- 음식 : 고객 = N : 1 관계로 한명의 고객은 여러번 주문이 가능한 상황
- 이를 Java 컬렉션을 사용하여 표현
1대 1 관계 ( @OneToOne )
- 보통 N의 관계인 Entity가 외래 키의 주인이지만, 1대 1 관계에서는 외래 키의 주인을 직접 지정해야함
- 외래키의 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며, 아닌 쪽은 오직 읽기만 가능함
- @JoinColumn()은 외래 키의 주인이 활용하는 어노테이션
- 단방향 관계
// Food Entity가 외래키의 주인인 경우
-------------------------------------------------------------
@Entity
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
-------------------------------------------------------------
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
- 양방향 관계
- 외래 키의 주인을 지정해 줄 때 mapperBy 옵션을 사용
- mapperBy의 속성값은 외래 키의 주인인 상대 Entity의 필드명을 사용
// Food Entity가 외래키의 주인인 경우
-------------------------------------------------------------
@Entity
@Table(name = "food")
public class Food {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
-------------------------------------------------------------
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "user")
private Food food;
}
1대 N 관계 ( @OneToMany )
N대 1 관계 ( @ManyToOne )
N대 M 관계 ( @ManyTo Many )
🐰 END
DB 테이블에서는 방향 상관없이 연관관계를 설정할 수 있었지만
Entity에서는 방향을 신경쓰면서 연관관계를 설정해야해서
많이 헷갈릴 것 같다.
아직 1대N관계와 N대 1 관계의 차이는 잘 모르겠다..!