Today I Learned
(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차 복습을 진행해야할것!
'Today I Learned' 카테고리의 다른 글
(24.05.25)[6주차] WIL (0) | 2024.05.25 |
---|---|
(24.05.24)[6주차] Spring 숙련 강의 04 마무리 (0) | 2024.05.24 |
(24.05.22)[6주차] Spring 숙련 강의 02 (0) | 2024.05.22 |
(24.05.21)[6주차] Spring 숙련 강의 01 (0) | 2024.05.21 |
(24.05.20)[6주차] compare, compareTo 메서드 비교 & 사용자 정의 Comparator 활용 (0) | 2024.05.20 |