연관관계를 사용하는 이유
객체가 서로 관계가 있는 경우, 객체를 참조하여 연관된 내용들을 확인할 수 있습니다.
테이블의 입장에서는 연관관계를 통해 불필요한 칼럼을 생성하지 않아도 됩니다.
방향 (Direction)
단방향 관계: 두 Entity가 관계를 맺을 때, 한쪽의 Entity만 참조하고 있는 것을 의미한다
양방향 관계: 두 Entity가 관계를 맺을 때, 양쪽이 서로 참조하고 있는 것을 의미한다
다중성 (Multiplicity)
Many To One: 다대일 (N : 1)
One To Many: 일대다 (1 : N)
One To One: 일대일 (1 : 1)
Many To Many: 다대다 (N : N)
위의 관계 중에 일대다(1 : N)와 다대일(N : 1)은 같은 것이라고 생각할 수 있다.
예를 들어, 유저가 게시판에 등록하는 글의 관계를 보면
유저는 여러개의 글을 등록할 수 있어 : 유저와 게시판의 관계는 일대다(1 : N)
게시판에는 여러 유저가 등록한 글이 존재하므로 : 게시판과 유저의 관계는 다대일(N : 1)
어떻게 생각하면 같은 것인데, 중요하게 중점을 두어야 하는 것은
"어떤 Entity를 중심으로 상대 Entity를 바라보느냐" 이다.
연관 관계의 주인 (Owner)
Entity 사이의 관계에서의 주인을 찾는 방법은
연관관계를 갖는 두 테이블에 대해서 외래 키(Foreign Key)를 갖는 테이블이 연관관계의 주인이 된다.
연관관계의 주인만이 외래 키(Foreign Key)를 관리할 수 있고, 반면 주인이 아닌 Entity는 읽기만 할 수 있다.
Fetch 기본 전략
@ManyToOne , @OneToOne 어노테이션의 경우 FetchType.EAGER ( 즉시로딩 )을 기본 전략으로 사용하며,
@OneToMany, @ManyToMany 어노테이션의 경우 FetchType.Lazy ( 지연로딩 )을 기본 전략으로 사용합니다.
fetch : global fetch 전략 설정
@ManyToOne, @OneToOne(fetch = FetchType.EAGER) "즉시 로딩"
- 엔티티를 조회할 때 연관된 엔티티도 함께 조회
- 연관된 엔티티를 즉시 조회, hibernate는 가능하면 SQL 조인을 사용해서 한 번에 조회
- 객체가 계속 연결되어있을 경우 무한루프로 stack overflow 가능성..
@OneToMany, ManyToMany(fetch = FetchType.LAZY) "지연 로딩"
- 연관된 엔티티를 프록시로 조회, 프록시를 실제 사용할 때 초기화하면서 데이터베이스 조회
- 프록시 객체 : 지연 로딩 기능을 위해 실제 엔티티 객체 대신 데이터베이스 조회를 지연할 수 있는 가짜 객체
프록시란? > 프록시란 실제 엔티티 객체 대신에 사용되는 객체로서 실제 엔티티 클래스와 상속 관계 및 위임 관계에 있습니다. 프록시 객체는 실제 엔티티 클래스를 상속 받아서 만들어지므로 실제 엔티티와 겉모습이 같습니다.
아직 큰틀에서만 이해가 되었고 세부사항은 이해가 잘 되지않아 큰범위에서만 기록했다.
추후 JPA에 대한 공부를 할때 더 기록해야겠다.
'Spring > spring boot' 카테고리의 다른 글
Spring-React CORS란? (0) | 2021.12.10 |
---|---|
Spring JPA @Transactional 어노테이션 (0) | 2021.12.04 |
API-Web Sever (0) | 2021.11.29 |
spring SQL(Structured Query Language) (0) | 2021.11.28 |
spring ORM(Object Relational Mapping) (0) | 2021.11.28 |