SPRING

JPA - 양방향 관계_mappedby

고민말고생각하는사람 2024. 10. 29. 21:15

mappedBy

 

객체와 테이블간의 연관관계 차이

 

 

객체는 참조를 통해 관계를 갖는다.

-> 객체 A 는 B를 알고 있어도, 객체 B는 A를 모른다.

따라서, 서로 접근할 수 있도록 하려면? 

관계를 두 번 맺어줘야 한다.

A -> B
B -> A

 

객체 연관관계 = 2개

 

테이블은 pk, fk 조인을 통해 관계를 맺는다. -> 서로 테이블이 이미 갖고 있는 key 값으로 합칠 수 있다.

 

테이블 연관관계 = 1개


객체간의 연관관계를 단방향 2개로 양방향으로 만든 것까진 좋으나,

객체가 서로에 대한 정보를 가지고 있다.

 

가령, 학생이 다니는 학교의 정보를 바꿔야 할지, 학교에 있는 학생의 정보를 바꿔야 할지?

헷갈림.

정말 헷갈림.

 

이런 객체간의 연결문제를 해결하기 위해 암묵적인 룰이 등장함.

 

'한 쪽의 정보만 바꾸는 것으로 하자. 한 쪽은 조회만 되도록 하자.'

'그럼 어느 쪽의 정보를 바꿔야 하나? 외래 키가 있는 곳의 정보를 바꾸도록 하자.

 

'외래키가 있는 곳은 어떤 곳?

'외부에 의존하는 곳'

 

'의존하는 곳의 정보를 수정한다는 것은?'

'원본이 계속해서 유지되도록 보장할 수 있다는 것'


반복 학습

객체에서의 관계와 테이블간의 관계는 관계를 맺는 방식에서부터 차이가 발생한다.

 

테이블은 pk, fk 를 통해 서로 읽어올 수 있는 관계를 맺는다.

 

반면, 

 

객체로서 데이터를 취급할 때

객체 a 와 객체 b 는 a to b / b to a 의 관계를 맺는다. 

 

이에 따라, 어떤 객체의 정보를 수정해야할 지 딜레마에 빠지기 쉽다.

 

그 해결책으로 나온 것이 바로 'mappedBy' 이다.

 

양방향 연관관계를 맺었을 때,

수정, 삭제 등의 작업이 일어나는 쪽은 '외래키'를 가진 쪽으로 하고,

외래키가 없는 쪽은 단순 조회용으로서 사용하는 것.

 

이 때, 외래키가 없는 쪽에 mappedBy 키워드를 사용하여 해당 객체에 읽기 전용 데이터를 삽입함으로써,

객체로서의 특성을 띄며, 책임이 분리되어 딜레마에서도 벗어나게 된다.

 

 

외래키가 있는 쪽이 관계의 주인이 되어

값을 수정하는 이유

 

의존하는 쪽이 '갑' 아닌가? 그럼 주인해야지?

NoNo

 

데이터베이스의 목적은 

데이터를 영구적으로 보존하면서 필요에 따라 수정하는 것이다.

즉, 데이터의 삭제는 정말 필요할 때가 아니면 있어서는 안 된다.

 

참조 되는 쪽(원본)의 정보를 바꾸게 되면, 일괄적인 수정이 가능해서 편해 보이나,

1. 원본 데이터의 훼손

2. 다른 연결 서비스로의 잘못된 정보 전달로 이어짐 

과 같은 문제가 발생할 수 있다.

 

따라서, 이런 문제를 해결하기 위해 관계의 주인을 설정. mappedby 를 통해 객체의 특성을 살린다.

 

 

참조 자료

https://www.inflearn.com/course/ORM-JPA-Basic?srsltid=AfmBOoqQOdSiu9jRnYDF9Dk_A015bTtnmqXEV6ae0ZC_oFGw91LNs7UR