728x90
연관관계란
연관관계란 DB의 참조입니다.
Java에서는 다른 Class를 참조하기 위해서 Class의 인스턴스를 필드값으로 선언합니다.
이것과 같이 DB에서는 다른 Table의 Data를 조회하기 위해서 해당 Table의 PK값을
Attribute로 선언합니다. 이런 Table들을 연관관계가 있다고 합니다.
하지만 JPA를 사용한다는 것은 Java를 통해 DB에 쿼리문을 보낸다는 것인데
DB에서의 참조는 FK의 유무를 표현하고 한쪽에 FK가 있는 것만으로도 양방향으로 조회가 가능합니다.
하지만 객체는 참조를 선언한 객체만이 조회가 가능하고 다른 객체에서는 조회를 하지 못합니다.
이런 차이점으로 연관관계를 매핑하는 것을 DB에 맞춰서 생각해야 합니다.
연관관계의 필요성
사실 전 연관관계를 잘 사용하지 않습니다. 대신 id를 통해 매핑하는 방식을 주로 사용합니다.
그 이유는 예전에 사이드 프로젝트를 하던 중 연관관계가 필요해 보이는 Entity들에
@OneToMany와 같은 연관관계 어노테이션들을 사용해서 매핑을 하면서 작업을 했습니다.
하지만 나중에 연관 관계가 없는 Entity들간에 관계를 매핑시키거나 관계설정을 잘못한 경우를 발견해
수정을 해보려고 했는데 거의 프로젝트 전체를 갈아엎었습니다.
그 뒤부터는 관계매핑을 할때 많이 고민한 뒤에 관계를 매핑합니다.
물론 관계 매핑이 필요한것은 맞지만 매핑 시키기전에 많은 고민이 필요한 것같습니다.
연관관계의 종류
1. 일대일(@OneToOne)
1개의 Entity가 참조하는 Entity가 1개뿐인 상황입니다.
이 경우에는 양쪽의 Entity에 각 필드에 Entity객체를 선언한 뒤 @OneToOne 어노테이션을 선언합니다.
FK를 관리할 연관관계의 주인이 아닌 Entity에는 @OneToOne(mappedby="e_id")를 통해 단뱡향 관계로 만듭니다.
2. 일대다(@OneToMany)
1개의 Entity가 참조하는 Entity가 여러개인 상황입니다.
이 경우에는 일에 해당하는 Entity에 List<T>의 형태로 다른 Entity를 참조하고 @OneToMany를 선언합니다.
다에 해당하는 Entity에는 필드 값에 @ManyToOne을 선언합니다
DB의 Table에서는 @ManyToOne 어노테이션 선언한 Table에 FK값이 생성됩니다.
즉, 연관관계의 주인이 일에 해당하는 Entity가 되는 것입니다.
때문에 이 관계를 보면 연관관계의 주인인데도 FK가 다른 Entity에 있으므로 선호하지 않는 관계입니다.
3. 다대일(@ManyToOne)
여러개의 Entity가 참조하는 Entity가 1개인 상황입니다.
이 경우는 일대다의 관계의 반대입니다. 각 Entity에 선언하는 어노테이션은 같지만 대신
연관관계의 주인을 다로 해야하기 때문에 @OneToMany(mappedby="b")로 선언해야 합니다.
DB의 Table에서는 @ManyToOne 어노테이션 선언한 Table에 FK값이 생성됩니다.
즉, 연관관계의 주인이 다에 해당하는 Entity가 되는 것입니다.
4. 다대다(@ManyToMany)
다대다의 관계는 앞에서의 관계들과 다르게 중간 테이블이 생성됩니다.
즉, 각각의 Entity에는 FK가 없고 FK만을 가지고 있는 테이블이 생성되어서
PK값으로 중간 테이블을 조회하는 것으로 FK의 역할을 하는 것입니다.
'Spring Data JPA' 카테고리의 다른 글
QueryDSL (0) | 2024.02.28 |
---|---|
N+1 (0) | 2024.02.18 |
Spring Data JPA 동작 과정 (0) | 2024.01.10 |
Spring Data JPA - 영속성컨텍스트 (0) | 2023.07.26 |
Spring Data JPA - Entity (0) | 2023.07.24 |