Overview
이전에는 JPA/Hibernate 를 통하여 아주 기본적인 mapping 구조만 다루었었다.
그러나 Real-World 에서의 database 에서는 하나의 database, 즉 하나의 Schema 내에 여러 개의 table 들이 존재하거, 각 table 사이의 특별한 관계가 있을 수 있다.
이에 대한 modeling 을 JPA 가 수행할 수 있다.
Advanced Mappings
Advanced Mappings 에는 다음 세 가지가 존재한다.
One-to-One One-to-Many, Many-to-One Many-to-Many
우선 간단하게 One-to-One mapping 을 살펴보자.
One-to-One mapping 은 간단하게 말하면, first name, last name, email 등의 기본적인 column 을 포함한 Instructor 라는 entity 에 대하여 Instructor Detail 이라는, 추가적인 정보를 저장하는 entity 와의 관계를 생각하면 된다.
One-to-Many mapping 은 이름에서도 알 수 있듯이, 하나의 entity 가 여러 개의 entity 에 mapping 되는 구조이다. 예를 들어, Instructor entity 는 여러 개의 Course entity 를 가질 수 있다는 것이다.
마지막으로 Many-to-Many 는 하나의 Course 가 여러 개의 Student 를 가질 수 있으며, 마찬가지로 Student 역시 여러 개의 Course 를 가질 수 있는 구조를 예로 들 수 있다.
더 자세한 내용을 알아보기 전에, Database 에 있어서 중요한 concepts 인 Primary key / Foreign Key, Cascase 에 대하여 알아보자.
Primary Key and Foreign Key
Primary Key 는 잘 알고 있듯이, table 에서 unique 한 row 를 identify 하는 역할을 수행한다.

Foreign Key 는 다른 table 의 primary key 를 자신의 table 안에서 field 로써 사용하는 역할을 수행한다. 위와 같이, instructor_detail table 이 instructor table 에 종속되어 있는 관계이므로, instructor_detail 의 PK(Primary Key) 를 instructor 의 FK(Foreign Key) 로 사용하는 것이 일반적인 방법이다.
Cascade

Cascade 를 번역하면 “폭포처럼 흐르다”라는 뜻을 갖고 있는데, 이런 의미처럼 related entities 들에 대하여 같은 operation 이 연속적으로 수행된다는 것을 의미한다.
위의 이미지처럼, instructor 가 저장되면 instructor_detail 도 저장되고, 이는 삭제의 경우에서도 마찬가지이다. 삭제의 경우, CASCADE DELETE 로 알려져 있다.
그러나 CASCADE DELETE 의 경우, Many-to-Many 의 상황에서는 적절하지 않다. 예를 들어, 하나의 student 를 삭제하려고 할 때, 학생에 mapping 된 course 도 삭제해야 하는 것은 아니다.
따라서 개발자는 상황에 따라서 cascading 을 configure 해야 한다.
Fetch Types: Eager vs Lazy Loading
data 를 fetch / retrieve 하려고 할 때, 모든 것을 retrieve 해야 하는 것에 대한 의문이 있을 수 있다.
만약 One-to-Many 의 상황, 예를 들어 하나의 instructor 가 여러 개의 course 를 갖고 있을 때, instructor 를 retrieve 하는 상황에서 그에 속한 course data 까지 모두 즉시 가져와야할 필요가 있냐는 것이다.
이에 Eager loading 방식은 즉시 모든 data 를 가져오는 것이고, Lazy loading 은 request 가 있을 때 가져오는 방식이다.
Uni-Directional

Uni-Directional 은 단방향으로 entity 의 관계가 정해져 있어, 상위의 entity 에 먼저 접근해야만 하위의 entity 에 접근할 수 있는 성격을 갖고 있다.
Bi-Directional

Bi-Directional 은 양방향으로, 양쪽의 entity 에서 다른 entity 에 접근할 수 있는 reference 가 있는 구조를 의미한다.