[Spring] Entity Relation Diagram(ERD)

WOOK JONG KIM·2022년 11월 19일
0

패캠_java&Spring

목록 보기
55/103
post-thumbnail

ERD(Entity Relation Diagram)

개체-관계 모델, 테이블간의 관계를 설명해주는 다이어그램

웹 ERD 작성: http://draw.io/

위 ERD 잠시 살펴보기

user와 user_history는 1:N 관계
-> user 한명에 매핑되는 user_history는 여러개

user와 review 또한 1:N
-> user 한명이 작성할 수 있는 review는 여러개

book과 review 1:N
-> book하나에 review는 없거나,1 또는 여러개

book과 author,publisher는 각각 M:N, N:1
-> book 한개의 여러 author, author 한명의 여러 book
-> 한개의 publisher에서 여러 book

관계선 종류

실선(Identifying): 식별관계
부모테이블의 PK가 자식테이블의 FK/PK가 되는 경우
부모가 있어야 자식이 생기는 경우

점선(Non-Identifying): 비식별관계
부모테이블의 PK가 자식테이블의 일반속성이 되는 경우
부모가 없어도 자식이 생기는 경우

기호의 종류

  • |: 1개 / 실선은(dash) ‘1'을 나타낸다.
  • ∈: 여러개 / 까마귀 발(crow’s foot or Many)은 ‘다수' 혹은 '그 이상'을 나타낸다.
  • ○: 0개 / 고리(ring or Optional)은 ‘0'을 나타낸다.

  • Type1(실선과 실선): 정확히 1 (하나의 A는 하나의 B로 이어져 있다.)
  • Type2(까마귀발): 여러개 (하나의 A는 여러개의 B로 구성되어 있다.)
  • Type3(실선과 까마귀발): 1개 이상 (하나의 A는 하나 이상의 B로 구성되어 있다.)
  • Type4(고리와 실선): 0 혹은 1 (하나의 A는 하나 이하의 B로 구성되어 있다.)
  • Type5(고리와 까마귀발): 0개 이상 (하나의 A는 0또는 하나 이상의 B로 구성되 있다.)

데이터베이스 기준 연관관계

Primitive type, Reference Type의 차이 : null을 허용할지 안할지

Primitive type: Null이 존재하지 않음
→ boolean, byte, int, long, float, double 등

Reference Type: Null이 존재
→ Integer, Array, Float, Class 등

create table book_review_info (
       id bigint not null,
        created_at timestamp,
        updated_at timestamp,
        average_review_score float not null,
        book_id bigint,
        review_count integer not null,
        primary key (id)
    )

연관 쿼리 오류 발생

Entity의 ID @GeneratedValue의 default는 Auto(H2:SEQUENCE) 저장할 때 문제가 발생

call next value for hibernate_sequence를 이용함으로, 테이블이 달라도 id가 증가하게 된다

book_review_info 테이블의 id 값이 7이 되어 오류 발생(데이터는 1개)

@Test
void crudTest2(){
    Book book = new Book();
    book.setName("JPA 책");
    book.setAuthorId(1L);
    book.setPublisherId(1L);

    bookRepository.save(book);
    System.out.println(">>> " + book);

    BookReviewInfo bookReviewInfo = new BookReviewInfo();
    bookReviewInfo.setBookId(1L);
    bookReviewInfo.setAverageReviewScore(4.5f);
    bookReviewInfo.setReviewCount(2);

    bookReviewInfoRepository.save(bookReviewInfo);
    System.out.println(">>> " + bookReviewInfoRepository.findAll());

		//키 값을 통해 연관테이블 조회 (데이터베이스 기준)
		Book result = bookRepository.findById(
            bookReviewInfoRepository
                    .findById(1L)
                    .orElseThrow(RuntimeException::new)
                    .getBookId()
    ).orElseThrow(RuntimeException::new);

    System.out.println(">>>" + result);
}

이를 해결하기 위해 Entity의 ID @GeneratedValue 전략을 IDENTITY로 수정

@GeneratedValue(strategy = GenerationType.IDENTITY)
IDENTITY로 변경하면 각 테이블에 ID에 자동증가 (id값을 공통으로 관리 X)

public class Book extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
		
		...
}
//DDL -> default as identity
Hibernate: 
    create table book (
       id bigint generated by default as identity,
        created_at timestamp,
        updated_at timestamp,
        author_id bigint,
        category varchar(255),
        name varchar(255),
        publisher_id bigint,
        primary key (id)
    )

//결과값: ID값이 1로 변경되어 테스트 성공
>>> Book(super=BaseEntity(createdAt=2021-07-25T08:57:27.172218200, updatedAt=2021-07-25T08:57:27.172218200), id=1, name=JPA 책, category=null, authorId=1, publisherId=1)
profile
Journey for Backend Developer

0개의 댓글