본문 바로가기
TIL

빌더&팩토리, DB 연관 관계, 상속

by 스니펫 2024. 1. 10.

빌더

  • 각 클래스에 빌더 메소드를 생성
  • 빌드 어노테이션으로 대체 가능

팩토리

  • 팩토리 크리에이트~~ 메소드로 각 클래스 생성
  • 여러 클래스를 한 팩토리로 컨트롤 가능


DB 연관 관계 정리
1:N / N:1 / N:M

  • 1:N
    @OneToMany
    나 하나에 여러개의 엔티티에 연관 관계를 가짐
    DB에 따로 저장 되진 않음 없어도 무방함
  • N:1
    @ManyToOne
    나 여러개가 하나의 엔티티에 연관 관계를 가짐
    내 DB에 하나의 엔티티의 id값이 외래키로 저장이 됌 -> 이 놈을 가지고 쿼리 상위 호출 가능(Where문)
  • N:M
    @ManyToMany
    나 여러개가 여러개의 엔티티에 연관 관계를 가짐
    이 경우 DB상에서 충돌 나기 때문에 중간 관리자를 두어 관리해야함

상속

 

  • 엔티티 상속
    총 3가지 방법으로 이용되며, 자신에게 필요한 방법에 따라 활용 가능
    모든 방법은 부모 클래스에서 아래 두 어노테이션을 사용한다.
    DiscriminatorColumn : default값은 DTYPE이다. 이게 있어야 부모인지 디비에서 확인한다.
    Inheritance : strategy 속성을 초기화 해줘야하며, 총 4가지가 있으나 3가지를 정리하도록한다.

    1. 조인으로 생성
    Inheritance의 stragegy 속성을 InheritanceType.JOINED을 이용하여 초기화 해주면 사용 가능하다.
    부모와 자식 객체를 모두 테이블로 생성하여 조회시 join을 사용해서 조회를 한다.

    장점으로는 테이블이 정규화되고, 외래키 참조 무결성 제약 조건을 활용할 수 있다.
    또한, 저장 공간을 호율적으로 사용한다.

    단점은 조인을 사용하기 때문에 쿼리가 복잡해지고 성능 저하가 일어난다.
    데이터 세이브시에도 insert가 2번 발생한다.

    2. 한 테이블로 생성
    Inheritance의 stragegy 속성을 InheritanceType.SINGLE_TABLE을 이용하여 초기화 해주면 사용 가능하다.
    모든 테이블을 하나로 만든다.

    장점은 모든 칼럼이 한 테이블에 들어가있어서 조회가 빠르다.

    단점은 저장 공간이 심하게 낭비된다. 모든 자식 클래스의 칼럼값이 null이 가능해야한다.

    3. 각각의 테이블로 생성(비추)
    Inheritance의 stragegy 속성을 InheritanceType.TABLE_PER_CLASS을 이용하여 초기화 해주면 사용 가능하다.
    DB 상속의 의미가 없다. 각각의 테이블로 만든다.

    코드상 상속을 써야할 때만 사용한다. 
    DB는 분리하되 코드내에서 중복하여 사용할 경우에만 사용하고 DB 상속을 이용하려고 할때는 사용하지 말자.
    부모 클래스에 id값을 GeneratedValue을 설정할때 AUTO나 IDENTITY를 사용하면 오류난다. 
    그래서 TABLE을 써야하는데, 쓰고 싶은 사람만 쓰자 자세한건 직접 찾아보는걸 추천한다.

    장점 코드상에서는 상속을 활용할 수 있다.

    단점 DB에서 상속을 사용하는 것이 전혀 아니기 때문에 DB 상속을 하려고 할때는 사용하지 말자
    쓸데없이 복잡해서 코드 구현을 진행하다보면 수많은 오류와의 싸움을 이어가야 하므로 시간이 많고 탐구심이 강한 인간만 해보길 바란다.

'TIL' 카테고리의 다른 글

쇼핑몰 프로젝트 S.A 작성  (1) 2024.05.04
서비스&레포지토리, 댓글 좋아요  (1) 2024.01.11
@EntityGraph  (1) 2023.12.28
도커 컴포즈  (0) 2023.12.19
스프링스케줄러 vs 크론잡  (0) 2023.12.18