JPA 사용법 4 (연관관계)

작성자 : 조회수 :

이번 게시글은 연관관계에 대해서 공부하려 합니다.

 

OneToOne(1:1 , 일대일 관계)

 

ManyToOne, OneToMany (1:N , N:1 일대다 관계)

 

ManyToMany (N:M , 다대다 관계)

 

크게 세가지가 있습니다. 하나씩 알아 보려고 합니다.



OneToOne(1:1 , 일대일 관계)



위 사진처럼 한 명의 학생은 하나의 학생증만을 가질 수 있습니다.

학생증은 (카드아이디, 소지자 학생의 아이디, 만든 날짜, 잔고) 등의 애트리뷰트를 가지고있습니다.

 

그럼 학생과 학생증의 관계는 한 명당 한 개의 카드니 1:1 관계가 됩니다. 코드를 만들어보겠습니다.



코드 자체는 매우 간단합니다. 11 관계니 위 코드대로 진행해서 어플리케이션을 실행한다면


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를 해보겠습니다.