DevBoi

[JPA] 연관관계 매핑 본문

Develop/[JPA]

[JPA] 연관관계 매핑

HiSmith 2021. 7. 30. 17:52
반응형

RDB에서는 테이블 별로, 외래키를 매핑하며, 일대 다 혹은 다대다 의 형태를 가진다.

객체의 참조와, 외래키 매핑 관련되서 공부를 해보자

우선 간단한 예로, 팀과, 멤버에 대한 예제를 공부해보자

여러 사람이 한팀에 소속될 수 있다는 1:n관계라고 생각을 해보자

 

Member 에서는 Team에대한 관계와 조인 컬럼을 설정해준다.

Team은 사실 별건없다.

 

Lombok 을 사용해서 Getter,Setter도 직접 달아주었는데, 이건, 너무 불편해서 그냥 쓰기로했다 ㅋㅋ (매번 메소드 귀찮다)

 

이렇게 만 하면, 자동으로 PK,FK를 매핑해주는 테이블을 생성해준다.

 

예제 코드를 이렇게 작성해서 한번 테스트 해보자

 

 

 

뭐 잘들어간다. 추가로 위의소스에서 약간 수정한 내용은

PK가 id 자동생성 값일때는 String 이 아니라 Integer 나 Long으로 선언해야해서 바꾸었다.

 

만약에 이렇게 생성된 데이터 기준으로 하나의 member를 find 하게되면?

 

이런식으로 알아서 쿼리는 member와 team을 조인하는 쿼리를 발사하여, 값을 가져온다.

이러한 패치 전략 때문에, 추후 JPA N+1 문제에 대해서 발생하는 것이다.

 

양방향 연관관계 주인에 대해서 공부를 해보자

 

처음 단반향 연관관계 때, Member에 Team에 대한 걸 넣어놨다.

이런 경우 한 팀당 여러명의 팀 멤버들이 구성이 될수 있다. 근데, member -> team 이동은되지만

teamd -> member 이동은 안된다. 그 이유는, 바로 이 것이다.

team에는 어떤 멤버로 조인이 되어있는지 알지못한다.

 

그래서 대부분 실무에서 사용하는, 양방향을 사용할때는, Team과 같은 역할을 할때,

매핑되는 곳을 mapping 시켜준다.

 

 

이렇게 될 경우, 이제 어떤 멤버의 정보를 가져와서 같은 팀의 멤버 정보들을 알수있다.

이렇게 코딩을 할 경우에

 

 

이렇게 출력이 된다는 내용이다.

 

이렇게 사용되는 이유는, 객체는 양방향의 개념보다는, 단방향의 개념이 2개를 그냥 양방향

관계라고 설정을 하게된다.

 

자 그러면, 만약에 team id를 바꾼다고 하자, 그러면, team에 있는 members를 바꿔야 할까

아니면 member 에 team을 바꿔야할까...?

 

이럴경우, FK가 있는 Member 에서 team을 FK로 쓰고있기 때문에, 양방향의 주인으로 정한다.

주인으로 정하는 것은 @onetoMany 어노테이션을 사용하는 것이고, 주인이 아닌 곳에서는

mapped by를한다.

 

이 두개의 차이는 주인인 곳은 값을 update하거나 insert하는 것이 가능하지만

주인이 아닌 곳에서는 값을 읽기만 가능하다. 따라서 mapped by가 있는 곳에서 값을 등록하고 add하여도

실제 db의 값은 변하지 않는다.

 

쉽게 말해서, 연관관계 주인은 1:N인 경우? N인 쪽이 주인이 되면된다.

ex. 자동차, 자동차 바퀴인 경우 자동차 바퀴가 연관관계 주인으로 정하자

 

 

반응형

'Develop > [JPA]' 카테고리의 다른 글

JPA 연관관계 주인 및 설정 주의사항  (0) 2021.08.27
JPA 관련 h2연동  (0) 2021.08.17
[JPA] Entity Mapping, Table Managing  (0) 2021.07.28
[JPA] JPA 영속 컨텍스트  (0) 2021.07.26
[JPA] 기초 CRUD 사용 해보자  (0) 2021.07.23