JPA
를 사용하기 전 자바에서 SQL문을 통한 MYSQL DB를 구현할때 테이블간의 관계를 외래키(FK)를 통해 구현했다. 이때 테이블의 관계를 좀더 알아보자.
만약 어떤 손님들의 목록이 저장된 Customer테이블
이 있으며 또한 저장된 손님들이 주문한 음식목록이 들어있는 Food테이블
이 있다고 가정해보자.
우리는 SQL문을 통해 Join
을 사용하여 데이터를 조회 할수있는데 이때 Customer테이블
을 기준으로 Food테이블
에 Join
을 하는 결과와 Food테이블
을 기준으로 Customer테이블
에 Join
을 하는 결과는 같다. 이러한 결과를 통해 SQL문을 통한 DB에서는 데이터의 방향성을 없다고 본다.
그렇다면 JPA에서는 어떨까? 아래와 같이 두 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;
}
@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<>();
}
Entity의 구현된 코드를 봐서도 알수있지만 Food엔티티는 user엔티티를 , user엔티티는 Food엔티티를 서로 참조하고있는 모습을 볼수있다. 또한 user엔티티에서 @OneToMany이하 두줄을 주석처리할경우 Food에서만 User을 참조할수있는 단방향성이 성립한다. 이처럼 JPA에서는 어느 한쪽만 참조할수있는 단방향성과 양쪽다 서로 참조할수있는 양방향성을 구현할수있게 지원하고있다.
또한 @ManyToOne과 @OneToMany와 같은 어노테이션을 볼수있는데 이것에 대해 알아보자.
우선 1대1 관계
에 대해 얘기해보자 대표적으로 결혼
을 생각하면 쉽다. 결혼은 반드시 남자1명과 여자1명이 결혼이 가능하지 남자1명이 여러명의 여자 혹은 여자1명이 여러명의 남자와 결혼은 허락되지않는다. 이처럼 서로 1대1로 대응하는 관계를 1대1 관계
라고한다.
다음으로 1대N 관계
는 부모와 자식
을 생각하면 쉽다. 부모는 여러명의 자식을 가질수있지만 여러명의 자식은 단 하나의 부모만 가질수있다. 이때 1이 부모, N이 자식이 된다. 앞서 서술한 코드의 경우 N이 음식, 1이 손님으로 한명의 손님이 여러개의 음식을 시킬순있지만 하나의 음식은 여러명에게 주문될수 없는 관계
이다.
다음으로 N대M 관계
는 손님과 음식
을 생각하면 된다. 한명의 손님은 여러개의 음식을 시킬수있으며 한가지의 음식또한 여러명에게 주문될수있다. 서로 다수에게 참조될수있는 관계를 뜻한다.