티스토리 뷰
위의 테이블 연관관계를 보면 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개(양방향)
객체의 양방향 관계
- 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다.
- 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
- A -> B (a.getB())
- B -> A (b.getA())
테이블의 양방향 연관관계
- 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리
- MEMBER.TEAM_ID 외래키 하나로 양방향 연관관계를 가짐 (양쪽으로 조인할 수 있다.)
그럼 약간의 딜레마가 생기게 된다.
팀이 변경 되었을 경우에
1) Member의 team객체를 바꿔야할지
2) Team의 members에서 team을 바꿔줘야할지
답은 db입장에서는 TEAM_ID만 바뀌면 된다는 것이다.
하지만 어디에는 넣고 어디에는 안넣고가 발생할 수 있기에 룰이 있다.
연관관계의 주인(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
- 스프링공부
- 로그인
- Intercepter
- 향해99
- thymleaf
- react실행
- JPA
- hypertexttransferprotocol
- 백엔드 개발자 역량
- HTTP
- SpringBoot
- jpa api
- 컨트
- 인터셉터
- 백엔드 개발자 공부
- 향해플러스
- 항해99
- 예외처리
- 향해플러스백엔드
- rejectValue
- filter
- 스프링부트
- React
- ArgumentResolver
- reject
- Java
- exception
- 리터럴
- BindingResult
- 항해플러스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |