본문 바로가기
Today I Learned 2024. 5. 23.

(24.05.23)[6주차] Spring 숙련 강의 03

SQLD 취득에 공부를 할 때, 단순히 쿼리문에 대해서 공부한 것 뿐만아니라 엔터티의 관계에 대해서 이론적으로 공부한 것이 조금 도움이 많이 되는 학습이었다.

 

하지만, Java에서의 JPA 일 경우에는 또 표현하는 방법이 많이 다르기 때문에 같이 연관 시켜서 학습한 것을 복습하고 기억할 수있도록 해야할 것.


Spring 숙련 강의 간단정리

  • DB내 Entity를 Java에서 관계를 형성할 때, 객체로 상용하면서 방향성을 가지게 되기 때문에 이에 대한 1:1, 1:N, N:1, N:M Entity끼리의 관계를 정리
  • SQL쿼리에 의한 JOIN과 차이점을 보이기 때문에 꼭 기억을 해둬야할 것
    • Entity의 관계에 대해서 SQL쿼리를 통해서 DB가 알아서 해주나 Java에서는 JPA 기능을 활용해야
    • Annotation을 활용하여 정의
더보기

DB table간의 방향

  • JOIN의 의미를 가지고 오는것

1 대 1 관계

@OnetoOne

  • 1 대 1 관계를 맺어주는 역할

단방향 관계

단방향의 FK 주인 정하기

  • 1 대 1 관계에서는 FK 주인을 직접 지정
    • FK 주인만이 외래 키등록, 수정, 삭제
    • 주인이 아닌 쪽은 FK 읽기=조회만 가능
      • ****단,주인이 아닌 Entity 내부에다가 그 Entity 자체를 FK 주인에게 추가하라는 메서드를 만들어서 설정 가능 : 우회하기

양방향 관계

  • 단방향과 같이 FK 주인은 똑같이 **@JoinColumn()** 를 사용

 

N 대 1 관계

@OnetoMany

  • N 대 1 관계를 맺어주는 역할

단방향 관계

  • Annotation만 다르지 1:1과 비슷함

양방향 관계

  • FK 주인이 아닌 Entity에서 Java 컬렌션을 사용하여 PK 주인 Entity를 참조하는 형태

 

1 대 N관계

@OneToMany

  • FK 주인이 1인 상황인 것
  • FK 주인이 아닐경우에는 어떤 Annotation도 쓰지 않아도 됨

단방향 관계

  • ***** 단, 1:N 관계의 특징으로 @JoinColumn(name = "food_id") 을 만들어서 지금과 같이 가지고 오는게 아니라 상대한테 만들어버리는것*

양방향 관계

  • 양방향이 당연하게 존재하면 안되는 것
    • JPA에도 억지로 만드려고 하지 않고 지원도 안함

 

N 대 M 관계

@ManyToMany

  • N 대 M 관계를 맺어주는 역할

단방향 관계

  • FK 주인 Entity와 그 외 Entity가 서로 N:M 상황이기 떄문에 중간 테이블이 있는 것과 같은 것
    • 중간 테이블은 단방향으로 진행되는 테이블이라고 가정
  • FK 주인 Entity와 그 외 Entity가 서로 N:M 상황이기 떄문에 중간 테이블이 있는 것과 같은 것
    • 중간 테이블은 단방향으로 진행되는 테이블이라고 가정

양방향 관계

  • 중간 테이블에서 양방향으로 주고 받는 것

직접 중간 테이블 만들기

  • **@ManyToOne** 을 사용해서 양쪽의 Entity에 연결을 하게 되는 것
    • 기존의 N:M관계에서 생겨난 중간 엔터티일 경우에는 PK는 FK들 전체로 되는 것 참고

JPA의 연간관계 정보 가져오기

  • JPA 는 연관관계가 설정된 Entity들의 정보들을 전부 가지고 올지 아니면 필요한 것만 가지고 올지 Fetch Type을 통해서 구분해서 가지고 오게됨

지연 로딩

  • LAZY
  • 필요한 시점에서 가져오는 것
  • **@OneToMany** Annotation일 경우, Fetch Type의 default 값이 LAZY
    • 즉, 가지고 오는 타입이 컬렉션 타입으로 많을 경우, 효율적인 조회를 위해 지연 로딩이 기본
  • 지연 로딩된 Entity의 정보를 조회하려고 할 때 반드시 영속성 컨텍스트가 존재
    • ***즉, Transaction이 걸려 있어야 하기 때문에, 지연로딩에 의한 get 메서드를 사용한 조회에 있어서도 무조건 Transaction이 걸려 있어야함

즉시 로딩

  • EAGER
  • 실행되어야할 때 즉시 가지고 오는 것
  • **@ManyToOne** Annotation일 경우, Fetch Type의 default 값이 EAGER
    • 일반 객체 타입으로 가져오기 때문에 즉시 가져와도 상관이 없기 때문에

 


이해는 했지만, 그만큼 다뤄야하는 Java 코드가 많아지게 되면서 실습과 병행을 하다보니

더디게 느껴지는 학습 시간이 좀더 더디게 되는 듯

IntelliJ의 단축키를 좀더 외워둬서 빠르게 사용하는 방법도 좋은 방법이라고 보기 때문에

 

일단 1차 학습이 마무리 된다면 복습에는 단축키도 자유롭게 사용하면서 빠르게 2차 3차 복습을 진행해야할것!