keembloo

DB와 객체의 양방향 연관관계 / JPA 양방향 관계 (mappedBy) 본문

Spring

DB와 객체의 양방향 연관관계 / JPA 양방향 관계 (mappedBy)

keembloo 2023. 10. 19. 23:08
728x90

 

1. 단방향 연관관계

 

데이터 베이스 테이블은 외래키 하나로 양쪽 테이블 조인이 가능하다.

따라서 데이터베이스는 연관관계가 FK 참조키로 자동으로 맺어지기 때문에

맺어줄 필요가 없지만 

객체는 참조용 필드가 있는 객체만 다른 객체를 참조하는 것이 가능하다.

(ORM(db 테이블을 객체지향적으로 쓰겠다) 으로 사용하기 때문에 객체도 어떻게 연관지어줄지 고민해야한다.)

 

 그래서 두 객체 사이에 하나의 객체만 참조용 필드를 갖고 참조하면 단방향 관계라고 한다.

 

 

 

2. 양방향 연관관계

 

두 객체 모두가 각각 참조용 필드를 갖고 참조하면

양방향 관계라고 한다.

 

사실 양방향관계는 없고 두 객체가 단방향 참조를 각각 가져서 양방향 관계처럼 사용한다.

 

JPA를 사용하여 데이터베이스와 페러다임을 맞추기 위해서

단방향 연관관계를 할지, 양방향 연관관계를 할지 선택해야한다.

 

 

 


 

다중성

 

데이터베이스를 기준으로 다중성을 결정한다.

 

  • 다대일(N:1)
  • 일대다(1:N) 
  • 일대일(1:1)
  • 다대다(N:N) <- 실무에서 사용금지

 


다대일(N:1)

게시글(N)과 회원(1) 예시

 

- 1명의 회원이 게시글 여러개(N)를 작성할 수 있다.

- 회원과 게시글은 다대일 관계를 갖는다

 

게시글(N)이 회원(1)의 외래키를 갖는다

(데이터베이스는 무조건 다(N)쪽이 외래키를 갖는다)

 

다대일 단방향일때는 

다(N)쪽인 게시글에서 @MayToOne 만 추가해주면된다

 

다대일 양방향일때는

회원(1)쪽에 @OnToMany(mappedBy = "객체명")를 추가한다

 

 


연관관계의 주인

 

사실 주인이라는 말자체가 상당히 헷갈렸다.

쉽게 비유하자면

 

왕 엔티티, 신하 엔티티 있다고할때

 

왕은 신하를 보러가지 않는다.
신하가 왕을 보러간다.
신하(FK)가 왕(PK)을 참조(reference)한다.
왕(PK)은 신하(FK)에게 참조(reference)당한다.

 

때문에 @MayToOne  / @OnToMany 을 쓸때는

왕 엔티티 (1개) 기준에서의 FK필드(여러개) 이면 @OnToMany 

신하 엔티티(여러개) 기준에서 왕필드(1개)이면 @MayToOne

 

 

그럼 연관관계의 주인은?

 

신하 엔티티이다...

주인이라는 단어가 헷갈린다면 실제 일을 하는 엔티티라고 생각하면 될듯.

 

주인(신하)이 아닌 반대편(왕)은 읽기만 가능하고 외래키를 변경하지 못하게 하기 위함이다.

 

@JoinColumn 을 주인(신하)에게 작성하여 주인을 명확하게 해주자.

@JoinColumn을 생략하면 "필드명_참조테이블의기본키"로 매핑한다.

 

 

@OneToMany는 

mappedBy를 작성해주는데 주인이 아니라는 뜻이다.(왕 엔티티)

값에는 주인(신하 엔티티)에서 사용하는 외래키 필드명(객체명)을 적어준다

 

728x90

'Spring' 카테고리의 다른 글

웹소켓 spring에서 사용하기 기본 정리  (0) 2023.11.14
Spring Security 스프링 시큐리티 정리  (1) 2023.10.30
JPA Auditing 정리  (0) 2023.10.18
Spring 아키텍처  (0) 2023.10.17
Spring 이란? 스프링 기본 정리  (0) 2023.10.12