JPA

양방향 연관관계 설정 mapped by

린예라 2024. 11. 15. 21:12

JPA는 객체간의 관계를, 테이블의 관계로 바꿔서 표현해줘야 한다.

 

관계형데이터베이스는 외래키 하나로 양쪽 테이블을 참조할 수 있지만, 객체의 경우는 팀에서 멤버를 조회 할 때와, 멤버에서 팀을 조회하려면 각각 참조할 요소가 필요하다.

 

이 차이를 매꾸기 위해 객체, 즉 엔티티쪽에서는 연관관계의 주인을 설정해줘야 한다.

 

왜냐하면 테이블에서 해당하는 칼럼은 하나인데, 엔티티에서는 해당 칼럼과 매칭되는 객체의 요소가2개가 있으면 문제가 될 수 있기 때문이다.

 

그렇기에 연관관계의 주인을 설정해야한다. 두개의 값중에 한개의 값만 테이블의 칼럼의 값을 수정할 수 있게 하는 것이다. 연관관계의 주인이 아닌쪽에 mapped by속성을 붙여주고, 주인이 아닌쪽은 값의 변경이 불가하고 읽기만 가능하다.

그렇다면 연관관계의 주인이 아닌쪽에는 값을 넣지 않아도 되는 걸까?

대답은 NO다. 이것또한 문제가 될 수 있는게, 주인이 아닌쪽에 값을 넣지 않는것도 문제가 될 수있다.

위와같은 코드에서 만약 커밋이 되기전에 Team.member를 조회하면 어떻게될까? 아무값도 나오지 않을 것이다. 당연하다 값을 설정해주지 않았으니까 나오지 않는다.

왜냐하면, flush() 되어야 연관관계의 주인을 기반으로 db의 테이블 값을 수정하고, 그 수정된 값을 양쪽 객체에 세팅해주고, 해당 값을 다시 영속성컨텍스트 1차캐시로 가져오기 때문이다.

 

즉 연관관계의 주인에만 값을 설정해주고, 양쪽에서 참조가 되게하려면 flush()로 db에 한번 갔다와야 한다는 것이다.

그렇기에 처음부터 연관관계의 주인과, 주인이 아닌곳에 모두 값을 설정해주면 문제가 생길일이 없다.