SpringBoot #5 다양한 연관관계 처리 #1 연관관계 처리 순서와 사전 설계

2021. 10. 11. 12:23JAVA/Spring

본 글은 스타트 스프링 부트 도서의 내용을 복습하기 위해 작성된 글입니다.

개요

관계형 데이터베이스를 설계할때 하나의 테이블로 처리되는 테이블은 거의 없습니다. 대부분의 경우 PK와 FK를 이용하여 다른 테이블과 연관관계를 맺습니다. 이러한 데이터베이스를 설계하는 작업이 데이터베이스 설계에서 가장 중요한 것처럼, JPA를 이용하는 경우에도 객체 간의 상호 연관관계를 처리하는 작업이 가장 중요합니다.

 

#5에서는 JPA를 이용해서 객체 간의 연관관계를 처리하는 방법에 대해서 학습합니다.

  • 객체 간 연관관계 설정 (현재)
  • 단방향, 양방향 관계의 이해
  • JPQL을 이용한 @Query 처리와 Fetch JOIN(스프링 부트 2.0.0)

 

1. 연관관계 처리의 순서와 사전 설계

객체와 객체와의 관계를 처리하는 연관관계 설계 순서

  1. 필요한 각각의 클래스 정의
  2. 각 클래스의 연관관계에 대한 설정을 추가
    1. '일대다', '다대다' 등의 연관관계 설정
    2. 단방향, 양방향 설정
  3. 데이터베이스상에 원하는 형태의 테이블이 만들어지는지 확인
  4. 테스트 코드를 통해서 정상적으로 동작하는지 확인

 

1.1 관계형 데이터베이스 설계 순서

  1. 가장 중심이 되는 사람이나 명사를 결정하고, 이에 대한 구조를 대략적으로 설계
  2. 1)에서 생성된 데이터들이 상호작용을 하면서 만들어내는 새로운 데이터를 정의
  3. 1)과 2)를 다시 세분화해서 설계

 

STEP1 중심이 되는 데이터 결정

테이블을 선정하기 위해서 예시로 '쇼핑몰'을 예제로 듭니다. 쇼핑몰에서 가장 중요한 데이터는 매출입니다. 하지만 매출 데이터는 반드시 회원과 상품 데이터가 존재해야지만 가능합니다. 결국 원하는 데이터는 매출 데이터이었지만 이를 위해서는 회원과 상품 데이터가 반드시 필요합니다. 아래의 그림은 회원과 상품 데이터를 테이블로 설계한 그림입니다.

STEP2 중싱 데이터 간의 상호 작용

중심이 되는 데이터가 주로 명사나 사람(회원, 상품, ...)이었다면, 이 사이에서 파생되는 데이터는 '동사'의 영역입니다. '동사'에는 중심이 되는 데이터들의 동작과 히스토리가 기록됩니다. 예를 들어 '회원이 상품을 구매했다' 혹은 '회원의 상품 구매 히스토리'와 같이 처리됩니다. 이러한 히스토리를 기록하기 위해서 하나의 테이블을 추가할 수 있습니다.

위의 그림에서 '구매'는 '회원'과 '상품' 데이터가 존재하는 상태에서만 존재가 가능합니다. 위의 그림을 보시면 user00 회원이 상품코드가 P1인 냉장고를 2017년 05월에 구입한 것을 알 수 있습니다.

 

STEP3 연관 관계 설정(일대일, 다대다 등)

데이터베이스 상에서 연관 관계를 설정하는 방법은 다음과 같습니다. 상호작용하는 테이블인 구매 테이블을 설계했다면 남은 일은 어떤 데이터가 얼마나 중복해서 나타나는가를 파악하면 됩니다. 위의 그림의 구매 테이블을 보면 회원ID 컬럼의 user00 데이터가 중복해서 나오는 것을 알 수 있습니다. 이 관계를 선분으로 표현하면 아래와 같습니다.

 

데이터베이스의 연관관계

  • 일대일(One To One, 1:1)
  • 일대다(One To Many, 1:N)
  • 다대다(Many To Many, M:N)

JPA의 연관관계

  • 일대일(@OneToOne)
  • 일대다(@OneToMany)
  • 다대일(@ManyToOne)
  • 다대다(@ManyToMany)

JPA의 연관관계 방향

  • 단방향(Unidirectional) 참조 : 한쪽의 클래스만이 다른 클래스의 인스턴스를 참조하도록 설정
  • 양방향(Bidirectional) 참조 : 양쪽 클래스 모두 다른 클래스의 인스턴스를 참조

References

스타트 스프링 부트, 구멍가게코딩단 지음