JPA

양방향 매핑

jojelly 2022. 3. 16. 18:37
반응형

객체는 다른 객체를 부를떄 참조를 한다.

하지만 테이블을 FK를 조인으로 이용하여 가져온다.

이러한 둘의 차이가 있는데..

 

기존 개발에서는 

객체를 테이블에 맞추어 모델링 (참조 대신에 외래 키를 그대로 사용) 하였다.

 이를 단방향 연관관계를 이용하면  

Menber에 Team 타입으로 변수를 만들어 연결해줄 수 있다. 

 

 

현재 1개의 팀이 여러명의 멤버를 가질 수 있기때문에 ManyToOne을 team변수에 넣어준다. 

이렇게 Team team이 테이블에서 FK로 매핑되는걸 알수 있다.

 

하지만 멤버에서 팀을 찾을수는 있지만 팀에서는 멤버를 찾을 수 없다.

 

이때 이제 양쪽을 매핑해주는 

양방향 매핑을 사용하면된다.!

 

멤버는 단방향 매핑때와 동일하게 유지하고 

 

Team클래스에는 Member타입의 리스트를 만들어준다. 보통 ArrayList를 관행처럼 쓴다고 한다.

이때 여기서 Member의 @ManyToOne과는 달리 OneToMany는 mappedBy가 있다 이부분이 중요한데 아래에서 한번더 다루겠다 중요!!

 

이렇게 되면 결론적으로는 테이블과 다르게 객체는 FK로  조인을 하는것이 아니기 때문에 사살상 양방향 관계가 아니라 서로 다른 단 뱡향 관계 2개다.

즉 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어 야 한다.

 

 

 

테이블은 FK를 이용해 양방향을 이용가능

 

이렇기 때문에 양방향 매핑에는 규칙이 생기게 된다. 

  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌쪽은 읽기만 가능
  • 주인은 mappedBy 속성 사용X
  • 주인이 아니면 mappedBy 속성으로 주인 지정

 

즉 연관관계에서 fk를 책임질 주인을 정해야한다는것.

주인이 아니면 mappedBy로 지정이 되었음을 선언해야한다. 

 

 

여기서는 Member 클래스에 Team team이 주인이 되는것이다. 

 

기준은 외래키가 있는곳을 기준으로 주인을 설정하면 된다.

일대 다 중에 다가 있는쪽이 주인이된다. 

 

-->그럼 team클래스에 갑을 넣어도 소용이 없다 안된다. 

주인이 있는곳에다 입력해야 설정된다. 

 

하지만 persist 로 1차 캐시에 들어있는 상태에서는 team 에 mermbers에 값이 없기 때문에 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자

 

그런데 이제 매번 할때 헷갈릴 수 있으니 연관관계 편의 메소드를 생성하자

그 예로 setTeam을 할때 

public void setTeam(team){
this.team = team;
team.getMembers().add(this);
}

라고 team에 members에 넣어주는걸 만들어서 구성해두면 좋다. 

 

그게 아니면

public void addMember(Member member){
members.setTeam(this);
members.add(member);
}

같이 team.addMembers를 하면서 member 에 저장할 수 도있다. 편한대로!

 

 

 

 

++

양방향 매핑시에 무한 루프를 조심하자 • 예: toString(), lombok, JSON 생성 라이브러리

 

Tostring 에서 memeber객체 호출 가서 다시 team객체 호출 을 하면 문제가 된다. 

그러니 룸북으로는 되도록 호출하지 않고  한다해도 한쪽의 객체 string부분을 지우도록하자

 

 

json은 Controller에서 entity자체로 보낼떄 json변환과정에서 다시 team객체를 변환해주고 다시 member가 있으니 객체를 변환해주면서 무한로딩이 된다.

그러니 Controller에서는 entity로 반환하지 말자 DTO로 변환해서 반환하도록 하자. 

반응형

'JPA' 카테고리의 다른 글

@MappedSuperclass  (0) 2022.04.08
1:1매핑  (0) 2022.03.17
[JPA] 매핑 어노테이션 정리 [column,Temporal, Enumerated, Lob, Transient]  (0) 2022.03.13
JPA @Entity @Table @Column  (0) 2022.03.12
JPA Query update오류 해결  (0) 2021.06.22