동석쿠
프로그래밍 공부
동석쿠
전체 방문자
오늘
어제
  • 공부 (80)
    • 공부기록 (64)
      • 웹개발 (6)
      • Java (7)
      • cs 공부 (3)
      • http 웹 기본 지식 (8)
      • 자바 스프링 (20)
      • 개인 미니프로젝트 (3)
      • 알고리즘 공부 (6)
      • 면접준비 (2)
      • 프론트공부 (8)
      • 파이썬 플라스크 (1)
    • 항해99 기록 (14)
      • 회고록 (10)
      • 팀프로젝트 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 항해99
  • 상속
  • 리프레쉬토큰
  • 리프레시토큰
  • 리스트
  • 자바스크립트
  • 알고리즘
  • 자바
  • 파이썬
  • Post
  • 리액트
  • Get
  • lombok
  • 문법
  • 스프링부트
  • JPA
  • 스프링
  • API
  • 프로그래머스
  • Java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
동석쿠

프로그래밍 공부

공부기록/자바 스프링

JPA 연관관계

2022. 4. 17. 00:09

연관관계를 맺을 때마다 부모? 자식? 주인? 용어가 자꾸 혼동이 돼서 면접 준비도 할 겸 나만의 정리를 해보려 한다.

 

다중성

연관관계의 다중성은

  • 다대일(N:1)(ManyToOne)
  • 일대다(1:N)(OneToMany)
  • 일대일(1:1)(OneToOne)
  • 다대다(N:N)(ManyToMany)

가 있다. 다대다는 가급적 쓰지 않는 것이 좋다고 한다.

 

방향

방향은 단방향과 양방향 두 가지가 있다.

단방향은 서로 연관된 엔티티 중 한쪽만 상대방을 알고 있는 거고 양방향은 둘 다 서로를 알고 있는 것이라 생각하면 된다

 

예를 들어보자

 

대학교 수강신청에서 내가 듣는 수강 과목들은 여러 개(N) 개이고 나는 한 명이다. 이때 나를 기준으로 1:N 관계이고

나는 내가 듣는 수강과목들이 뭐뭐가 있는지 알아야 하니 수강과목을 알 필요가 있다. 

반면 수강과목 입장에선 누가 나를 듣는지? 를 알 필요가 없다

(단 이 과목에 몇 명에 학생이 듣는지 size를 알아야한다면 다대다가 된다)

이럴 경우 나는 과목을 알아야 하지만, 과목은 날 몰라도 되므로 단방향 관계가 된다.

 

이제 개강을 하고 수업이 시작됐다. 어떤 한 과목에서 교수님(1)은 수강학생(N) 명과 연관관계를 맺는다. 이때 수강학생들은 이 수업의 교수님이 누구인지 알아야 하고, 교수님 또한 내 학생들이 누구누구가 있는지 알아야 하므로 이땐

양방향 관계다

 

정리하면 코드적으로 서로가 서로를 불러와야 할 이유가 있다면 양방향, 한쪽만 알아도 된다면 단방향으로 설정해주면 된다.

 

연관관계의 주인

데이터베이스는 외래 키(FK) 하나로 두 테이블이 연관관계를 맺는다고 한다.

결론부터 말하면 외래 키를 가지고 있는 쪽이 주인이다.

JPA에서  두 테이블을 양방향으로 매핑시키면 둘 중 하나는 외래 키를 관리하게 시켜야 하는데 외래 키를 관리하는 쪽이 연관관계의 주인이라고 한다.

보통 외래 키를 가진 테이블과 매핑되는 엔티티가 외래 키를 관리하는 것이 효율적이므로, 보통 이곳을 연관관계의 주인으로 선택한다.

외래 키를 관리하는 연관관계의 주인만이 외래 키를 변경할 수 있으며, 주인이 아닌 곳은 읽기만 가능하다.

 

그래서 어쩌라는 건데?

pk는 그 테이블의 고유키, fk는 다른 테이블에서 가져온 테이블에 있는 외래 키

 

연관관계에서

@JoinColumn(name = "주인아닌애")
@ManyToOne

이렇게 지정해주는 쪽은 외래 키를 쥐어주는 것이다. 즉 둘 사이의 관계에서 주인임을 정해주는 것.

@OneToMany(mappedBy = "주인인애")

만약 One 쪽에서 mappedBy를 지정해주지 않으면 그저 '단방향'으로 연관관계가 맺어진다. 단방향일 경우 One 쪽에선

Many 쪽을 조회할 수 없다. 

 

그러나 One 쪽에서 Many 쪽을 조회하고 싶다면 mappedBy를 붙여 '양방향' 연관관계를 맺어주면 된다.

 

보통 Many 쪽에서 외래 키를 관리한다. 즉 대부분의 경우 Many 쪽이 주인인 것 

<그렇다고 One 쪽에서 외래 키 관리를 아예 못하는 건 아닌데 코드가 복잡해진다.>

 

 

'공부기록 > 자바 스프링' 카테고리의 다른 글

Querydsl 공부 <기본 문법>  (0) 2022.06.07
Querydsl 공부 <환경 설정 및 기본 엔티티 설정>  (0) 2022.05.26
스프링 아이템기능 리팩터링  (0) 2022.03.19
스프링 아이템기능 구현, 단어 뒤집기, 파파고 API  (0) 2022.03.12
스프링 룰렛기능 만들기 (가챠시스템), 자바 난수 설정, 확률설정  (0) 2022.03.09
    '공부기록/자바 스프링' 카테고리의 다른 글
    • Querydsl 공부 <기본 문법>
    • Querydsl 공부 <환경 설정 및 기본 엔티티 설정>
    • 스프링 아이템기능 리팩터링
    • 스프링 아이템기능 구현, 단어 뒤집기, 파파고 API
    동석쿠
    동석쿠

    티스토리툴바