[JPA] 양방향 연관관계 주인 @ManyToOne / @OneToMany / MappedBy 선언위치

2022. 7. 11. 19:43·📂 Backend Engineering
728x90
반응형

[요약]

1대多

多에 1을 조회할 수 있는 fk가 존재 

多는 연관관계의 주인 

多에서 @Joincolum선언은 1을 조회할 수 있는 fk를 나타냄

1에서는 mappedBy를 통해 단순조회 

 

1대1

연관관계 주인으로 선언한 곳에 

@JoinColumn(name = "종속관계_id")

연관관계의 종속에

@MappedBy("주인 객체")

 

1. 객체와 테이블 서로 다른 연관관계 


[Member와 Team의 연관관계]

객체와 테이블을 표현한 그림이다. 

객체, PK, FK에 주의하여 살펴보자

 

- 객체 연관관계 포인트 2가지

  •  회원-> 팀 1개
  •  팀 -> 회원 연관관계 1개

- 테이블 연관관계 1가지

  • 회원 <-> 팀의 관계 
  • FK와 PK로 양쪽의 연관관계를 알 수 있다.

[객체의 양방향 관계]

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

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

 

예시

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

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

2. @ManyToOne과 @OneToMany


@Entity
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "member_id")
	private Long id;

	@Column(name = "user_name")
	private String name;

	@ManyToOne
	private Team team;
}
@Entity
public class Team {
	@Id@GeneratedValue
	@Column(name = "Team_Id")
	private Long id;
    
	private String name;
    
	@OneToMany(mappedBy = "team")
	private List<Member> members = new ArrayList<>();
    
}

[Member입장에서]

1. 다수

2 Member에 ManyToOne 선언

[Team입장에서]

1. 소수 

2. Team에 OneToMany선언

3. MappedBy선언 

 

3. MappedBy는 Member와 Team 중 어디에 선언할까?


 

[테이블의 양방향 관계]

외래키 하나로 두 테이블의 연관관계를 정의한다.

Member의 TEAM_ID(FK)를 통해 TEAM을 알 수 있고, TEAM의 TEAM_ID(PK)를 통해 MEMBER를 알 수 있다.

 

 

4. 결론 : Member와 Team 중 어디에서 키를 관리할까?


~~에 의해 MappedBy 됐어  즉, 종에게 MappedBy를 선언한다.

[양방향 매핑 규칙]

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

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

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

4. 주인은 mappedBy 속성 사용하지 않음

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

[누구를 주인으로 할까?]

⭐️⭐️⭐️⭐️외래키가 있는 곳을 주인으로 정한다. (외래키는 보통 多쪽)

외래키  = 多 = 주인

@Entity
public class Team {
	@Id@GeneratedValue
	@Column(name = "Team_Id")
	private Long id;
    
	private String name;
    
	@OneToMany(mappedBy = "team")
	private List<Member> members = new ArrayList<>();
    
}
@Entity
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "member_id")
	private Long id;

	@Column(name = "user_name")
	private String name;

	@ManyToOne
	private Team team;
}

여기에서는 Member.team이 연관관계 주인 

 

추가) @JoinColumn


[Member입장에서]

Member가 Join하는 컬럼을 선언 

 

@JoinColumn(name = "team_id")

private Team team;

 

해석하자면 Team 객체에서 가지고 있는 team_id를 통해 Join하겠다는 어노테이션

public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "member_id")
	private Long id;

	@Column(name = "user_name")
	private String name;

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

 

 

 

 

 

 

혹시 더 좋은 방법이 있다면 댓글로 피드백 부탁드리겠습니다! 감사합니다.

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'📂 Backend Engineering' 카테고리의 다른 글

[JPA] @Inhertance 조인 전략 / 상속관계 매핑  (0) 2022.07.30
[Spring] 내가 헷갈려서 정리한 @RestController @Controller @Response @RequestParam @RequestBody @ModelAttribute정리  (0) 2022.07.17
[JPA] @Entity란? / @Entity주의사항 / 리플랙션  (0) 2022.07.10
[JPA] 영속성 컨텍스트 | JPA 내부에서 어떻게 동작하는가?  (0) 2022.07.09
[JPA] JPA를 사용하는 이유 및 객체와 SQL 중심의 개발 문제점  (0) 2022.07.03
'📂 Backend Engineering' 카테고리의 다른 글
  • [JPA] @Inhertance 조인 전략 / 상속관계 매핑
  • [Spring] 내가 헷갈려서 정리한 @RestController @Controller @Response @RequestParam @RequestBody @ModelAttribute정리
  • [JPA] @Entity란? / @Entity주의사항 / 리플랙션
  • [JPA] 영속성 컨텍스트 | JPA 내부에서 어떻게 동작하는가?
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (103)
      • ⭐ Featured (4)
      • 📂 Backend Engineering (36)
      • 📂 Troubleshooting & Ops (10)
      • 📂 Infra & System (7)
      • 📂 Reflections (20)
        • Year-in-Review (4)
        • Work & Career (10)
        • Lessons Learned (6)
      • 📂 Team Journal (10)
      • 📂 Archive (16)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인프라 로그 저장 비용 감소하는 방법
    해피해킹 방향키
    QueryDSL
    해피해킹 키매핑
    nestjs pipe body
    Azure log 비용 줄이기
    스냅샷과 히스토리
    스냅샷과히스토리성 차이
    db 날린 썰
    validation failed (numeric string is expected)
    di동작원리
    nestjs pipe
    di란
    해피해킹 카라비너
    di의존성
    db 날림
    해피해킹 커스텀
    JPA
    창업패키지후기
    githubaction 라벨 배포
    typedi란
    서이추
    githubaction 라벨 ci/cd
    Azure 로그 최소 저장 30일
    토이프로젝트개발일지
    db 초기화
    해피해킹 꿀팁
    azure ci/cd
    개발썰
    typedi 동작원리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
foodev
[JPA] 양방향 연관관계 주인 @ManyToOne / @OneToMany / MappedBy 선언위치
상단으로

티스토리툴바