이번 게시글은 연관관계에 대해서 공부하려 합니다.
OneToOne(1:1 , 일대일 관계)
ManyToOne, OneToMany (1:N , N:1 일대다 관계)
ManyToMany (N:M , 다대다 관계)
크게 세가지가 있습니다. 하나씩 알아 보려고 합니다.
OneToOne(1:1 , 일대일 관계)
위 사진처럼 한 명의 학생은 하나의 학생증만을 가질 수 있습니다.
학생증은 (카드아이디, 소지자 학생의 아이디, 만든 날짜, 잔고) 등의 애트리뷰트를 가지고있습니다.
그럼 학생과 학생증의 관계는 한 명당 한 개의 카드니 1:1 관계가 됩니다. 코드를 만들어보겠습니다.
코드 자체는 매우 간단합니다. 1대1
관계니 위 코드대로 진행해서 어플리케이션을 실행한다면
DB에서 자동으로 Student 테이블의 id 컬럼의 참조를 만들어 내는 것을 확인할 수 있습니다.
ManyToOne ( 다대일, M:1 ) (학생 테이블 기준일때)
여러 명의 학생이 하나의 반에 소속됩니다. 그래서
Student N : 1 Class 관계를 가집니다.
이런 DB 연관관계가 있다고 했을 때 (사실 DB 관계로는 class_id 애트리뷰트를 참조하는거지만 JPA 기준으로)
코드는 이렇게 됩니다.
여기까지가 학생 – 클래스(반) 에서 학생이 가진 단 방향 이라면 이제
1:M 을 위해서 양방향 관계를 만들어보겠습니다.
OneToMany (1:N 일대다 관계)
학생 클래스는 위의 코드 그대로이지만 반 클래스에는 28줄에 새로운 코드가 생겼습니다.
하나의 반에는 여러 명의 학생이 있어야 하니 위의 코드처럼 리스트로 받아올 수 있습니다.
하지만 여기서 문제가 생깁니다.
제1 정규화 법칙에 따르면 각 컬럼들은 원자 성을 가져야 하는데
자바는 위의 코드처럼 리스트<컬렉션>처럼 여러 값을 가질 수 있게 됩니다.
그래서 자바 에서는 반 쪽에서 생기는 것이 아니라
학생 쪽에서 컬럼이 없더라도 알아서 생깁니다.
---
이제 연관관계의 주인을 정해 줘야 합니다.
양방향에서는 연간관계의 주인을 정해 주인 쪽에서 수정,삽입,삭제 연산을 진행 할 수 있도록 합니다.
크게 달라진 점은 없습니다.
mappedBy 옵션이 붙은 쪽이 주인이 아니라는 뜻 입니다.
다음 시간에는
위의 연관관계의 주인 보충설명과
Eager전략, JpaRepository를 이용해 insert, select, update를 해보겠습니다.