[Spring] DB 테이블의 관계

JunWoo An·2023년 11월 13일
0

스파르타코딩클럽

목록 보기
18/46

JPA를 사용하기 전 자바에서 SQL문을 통한 MYSQL DB를 구현할때 테이블간의 관계를 외래키(FK)를 통해 구현했다. 이때 테이블의 관계를 좀더 알아보자.

DB테이블의 방향성

만약 어떤 손님들의 목록이 저장된 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대N, N대M

우선 1대1 관계에 대해 얘기해보자 대표적으로 결혼을 생각하면 쉽다. 결혼은 반드시 남자1명과 여자1명이 결혼이 가능하지 남자1명이 여러명의 여자 혹은 여자1명이 여러명의 남자와 결혼은 허락되지않는다. 이처럼 서로 1대1로 대응하는 관계를 1대1 관계라고한다.

다음으로 1대N 관계부모와 자식을 생각하면 쉽다. 부모는 여러명의 자식을 가질수있지만 여러명의 자식은 단 하나의 부모만 가질수있다. 이때 1이 부모, N이 자식이 된다. 앞서 서술한 코드의 경우 N이 음식, 1이 손님으로 한명의 손님이 여러개의 음식을 시킬순있지만 하나의 음식은 여러명에게 주문될수 없는 관계이다.

다음으로 N대M 관계손님과 음식을 생각하면 된다. 한명의 손님은 여러개의 음식을 시킬수있으며 한가지의 음식또한 여러명에게 주문될수있다. 서로 다수에게 참조될수있는 관계를 뜻한다.

profile
도전하는 사람

0개의 댓글