티스토리 뷰

인프런 - 김영한 jpa 강의 중

위의 테이블 연관관계를 보면 MEMBER에서 TEAM_ID를 가지고 있기에 MEMBER에서는 TEAM을 알 수 있다. 하지만 TEAM에서는 당연하게 MEMBER_ID가 없다.

 

원래 대로라면 다대일 관계이기에 TEAM이 갖고있는 MEMBER들을 얻기 위해서는 MEMBER에서 TEAM을 조회해야만 알 수 있다.

 

양방향 객체 연관관계를 보면 TEAM은 MEMBER LIST를 가지고 있는 것으로 된다. 객체지향 관점으로 봤을 때에는 TEAM은 여러 멤버들이 속해 있기 때문이다.

 

member

@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;

 

team

@OneToMany(mappedBy = "team") //mappedBy는 나는 무엇과 연결되어있지? 라면 Member에서 선언한 필드의 team이다.
private List<Member> members = new ArrayList<>(); //arrayList를 쓰는 이유는 nullPoint가 뜨지 않기 위함

 

객체에 이렇게 처리를 해주면 

Member findMember = em.find(Member.class, member.getId());
List<Member> members = findMember.getTeam().getMembers();

for (Member member1 : members) {
    System.out.println("m = " + member1.getUsername()) ;
}

tx.commit();

 

로그

Hibernate: 
    select
        member0_.MEMBER_ID as MEMBER_I1_1_0_,
        member0_.TEAM_ID as TEAM_ID3_1_0_,
        member0_.USERNAME as USERNAME2_1_0_,
        team1_.TEAM_ID as TEAM_ID1_4_1_,
        team1_.name as name2_4_1_ 
    from
        Member member0_ 
    left outer join
        Team team1_ 
            on member0_.TEAM_ID=team1_.TEAM_ID 
    where
        member0_.MEMBER_ID=?
Hibernate: 
    select
        members0_.TEAM_ID as TEAM_ID3_1_0_,
        members0_.MEMBER_ID as MEMBER_I1_1_0_,
        members0_.MEMBER_ID as MEMBER_I1_1_1_,
        members0_.TEAM_ID as TEAM_ID3_1_1_,
        members0_.USERNAME as USERNAME2_1_1_ 
    from
        Member members0_ 
    where
        members0_.TEAM_ID=?
m = member1

멤버를 찾아와 준다.

 

연관관계의 주인과 mappedBy

- mappedBy = JPA의 멘탈붕괴 난이도

- mappedBy는 처음에는 이해하기 어렵다.

- 객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다.

 

객체와 테이블이 관계를 맺는 차이

객체

- 회원 -> 팀 연관관계 1개 (단방향)

- 팀 -> 회원 연관관계 1개 (단방향)

 

db

- 회원 <-> 팀 연관관계 1개(양방향)

인프런 - 김영한 jpa 강의

객체의 양방향 관계

- 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다.

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

- A -> B (a.getB())

- B -> A (b.getA())

 

인프런 - 김영한 jpa 강의

테이블의 양방향 연관관계

- 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리

- MEMBER.TEAM_ID 외래키 하나로 양방향 연관관계를 가짐 (양쪽으로 조인할 수 있다.)

 

인프런 - 김영한 jpa 강의

 

그럼 약간의 딜레마가 생기게 된다.

팀이 변경 되었을 경우에

1) Member의 team객체를 바꿔야할지

2) Team의 members에서 team을 바꿔줘야할지

 

답은 db입장에서는 TEAM_ID만 바뀌면 된다는 것이다.

 

하지만 어디에는 넣고 어디에는 안넣고가 발생할 수 있기에 룰이 있다.

 

인프런 - 김영한 jpa 강의 중

연관관계의 주인(Owner)

양방향 매핑 규칙

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

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

- 주인이 아닌쪽은 읽기만 가능

- 주인은 mappedBy 속성 사용 x

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

 

* 만약 jpa를 잘해서 team.getMembers를 연관관계의 주인으로 설정했고 거기서 수정이 이루어 진다면, MEMBER 테이블이 수정되는게 이상하지 않은가? 이런 것 자체가 굉장히 헷갈리게 한다.

 

간단하게 생각해서 외래키를 가지고 있는 쪽이 주인이 된다. 그 주인을 다른 곳에서 변경하면 안된다. team_id를 가진 member가 주인이고 다른곳에서 member를 변경하면 안된다.

 

 

 

 

'dev_공부일지 > JPA 기본' 카테고리의 다른 글

다중성 - 다대일과 일대다,  (1) 2024.02.02
양방향 매핑시 가장 많이 하는 실수  (0) 2024.02.01
단방향 연관관계  (1) 2024.02.01
기본 키 매핑  (1) 2024.01.31
필드와 컬럼 매핑 및 속성들  (1) 2024.01.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함