JPA

[JPA] 연관관계 매핑이론 : 단방향, 양방향 매핑

sian han 2022. 7. 25. 16:21

기본키 제약조건

1. null 아님

2. 유일

3. 변하면 안된다

 

왠만하면 비즈니스와 관련없는 대체키를 사용해라 (시퀀스 || auto_increment )

 

 

※ 연관관계 매핑이론

 - 여기서 하차하는 사람 많다고 했음 정신똑바로 차리고 고고

 

 

▷ 객체를 테이블에 맞추어 데이터 중심으로 모델링하면 협력관계를 만들 수 없다

  - 테이블은 외래키로 조인을 사용해서 연관된 테이블을 찾는다.

  - 객체는 참조를 사용해서 연관된 객체를 찾는다

  - 테이블과 객체 사이에는 이런 큰 간격이 있다.

 

 

▶ 단방향 매핑

 

 

 

 

 

▷ 데이터지향적모델링

 

 

▷ 객체지향적 모델링

@joinColumn : 연관관계를 적어준다 (name = "TEAM_ID") 요렇게

  - 이렇게 써주면 Team 테이블의 Id 컬럼과 FK 로 매핑이된다 = 연관관계매핑

@ManyToOne : 조인하기 싫어 ! 멤버만 가지고 싶어 ! => 옵션을 넣어주면됨 ▽

  - @ManyToOne(fetch = FetchType.LAZY)

      ㄴ 멤버만 조회됨 (Team 객체는 실제 사용되는 시점에 코드를 추가로 넣어주면된다)

              - findTeam.getName(); < = 이런식으로. 이걸 지연로딩이라고 함

                                                            김영한님은 모두 FetchType을 LAZY 로 바르라고 권장

 

 

 

 

 

▷ persist (등록)

그래서 이렇게 persist 인자로 Team 객체를 넣어주기만하면 알아서 쿼리를 짜줌

 

 

▷ persist (수정)

 

 

▷ find (조회)

 = > 조회할때도 getTeam 으로 바로 조회할 수 있다

 

 

 

 

 

 

▶ 양방향 매핑

양방향매핑이란 ? : Member에서도 Team 을 가고싶고, Team 에서도 Member로 가고싶다 ! 

ex ) A 팀에 속한 멤버리스트를 모두 가져오고싶음 : team.getMemberList();

 

 - 양방향매핑은 사실 그렇게 좋은방법이 아니니, 일단 단방향으로 설계를 다 해놓고

    꼭 양방향매핑을 사용해야 하는 경우 사용하자 ! 

 

 

 

@OneToMany 어노테이션을 추가하고 컬렉션을 넣어주면됨 => 역방향으로 조회가능

 

객체의 양방향관계는 사실 양방향 관계가 아니라

서로다른 단방향 관계 2개이다 (짭양방향)

벗 테이블 연관관계는 FK 한개만 있으면 서로 조인할 수 있다 (찐양방향)

 

 

 

 

 

여기서 생기는 문제

만약 team 에다가 members 를 넣는다면 ..? 

member.setTeam(); 을 해도 member 가 업데이트되고

team.members 에 값을 넣어도 member 가 업데이트 됨

그렇담 둘 중 어떤걸 믿어야할까 ? 

== > 두개는 어차피 다르니, 둘중에 주인(owner) 를 정하고, 한놈은 조회만하게 만들자 ! 라고 똑똑이가 정함

 

 

 

 

▶ 연관관계의 주인 (양방향 매핑규칙)

  - 객체의 두 관계 중 하나를 연관관계의 주인으로 지정

  - 연관관계의 주인만이 외래키를 관리(등록,수정)

  - 주인이 아닌쪽은 조회만 가능

  - 주인이 아니면, mappedBy 속성으로 주인 지정

  - 주인은 mappedBy 속성을 사용할 수 없음

 

 = > member.team 과 team의members 둘중에 하나만 연관관계의 주인으로 정할 수 있음

이렇게 주인을 정하고 두개 한번에 업데이트를하면, 주인것만 업데이트 됨

 

mappedBy : (mappedBy = "team") 

  - team 은 종속되었다 (team은 Member에 매핑이"되었다" = Member가 주인)

  - team 에서 값을 업데이트해봤자 DB에 영향을 줄 수 없음

 

team.getMembers().add(member); => 영향을 줄 수 없음

member.setTeam(team); => 정상반영

 

쨋든 객체관점에서 생각했을 때 두개 코드를 다 날려주는게 좋음

 

 

 

▷ 그렇담 누구를 주인으로 정하는게 좋을까 ? 

  - 외래키가 있는곳을 주인으로 정해라 (Member) => 인지부조화가 안생김

      ex ) team 을 update 했는데 왜 Member 테이블이 update 되지 ? !!!! => 멘붕 

         ㄴ 이런걸 방지하기 위해

 

 

 

 

▷ find (조회)

 

 

 

 

▶ 연관관계 매핑 어노테이션

@ManyToOne : 다대일

@OneToMany : 일대다

@OneToOne : 일대일

@ManyToMany : 다대다

@JoinColumn, JoinTable

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'JPA' 카테고리의 다른 글

[JPA] 지금껏 Mybatis 잘 쓰다가 왜 JPA ? / JPA 란 / JPA 기초  (0) 2022.07.24