JPA연관 관계 OneToMany 양방향 관계, Mapped By

오영선·2023년 1월 17일
0
post-custom-banner

공부 할 때 참고 자료
https://youtu.be/hsSc5epPXDs
https://jeong-pro.tistory.com/231

데이터 사이의 관계를 정의 할 때 고려해야 하는 것은 크게 3가지가 있습니다.

  1. 방향 : 단방향, 양방향 참조
  2. 연관 관계의 주인 : 양방향일 때, 연관 관계에서 주체가 누구인지?
  3. 다중성 : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)

1. 방향

데이터 베이스의 조인 테이블과는 다르게 객체 접근 방식은 참조용 필드가 있는 객체만 타 객체를 참조하는 것이 가능합니다.
(예시 :
도서관 A열 책장에 어떤 책들이 있는지 검색->불가능
책이 도서관의 어떤 책장에 꽂혀있는지 검색 -> 가능)

위의 논리에 따르면

단방향의 경우 한 객체만 참조 필드를 가진 것이고,
양방향의 경우에는 두 객체 모두 서로를 참조할 수 있는 필드를 가진 것임을 알 수 있습니다.
(사실 양방향 관계라는 것은 단방향 두개의 조합이라고 볼 수 있겠군요)

두 개의 단방향 연결

@ManyToOne
bookstore;

@OneToMany
books;

-> bookstore_books Join 테이블이 생성된다.
bookstord id, books id를 가진다.

두 개의 양방향 연결

@ManyToOne
bookstore;

@OneToMany(mappedBy = "bookStore")
books;

book 테이블에 bookstore_id column이 추가된다.
mappedBy가 관계의 주인을 명시(book)해줬다.
-> 데이터 베이스에서 외래키를 가지는 테이블이다.

연관관계의 주인 설정

단방향의 관계에서는 주인(제어자)의 구분이 명확하지만
두 객체가 양방향 관계라면 연관 관계의 주인을 지정해야 합니다.

연관 관계의 주인을 지정 하는 것은 두 단방향 관계중, 제어의 권한(외래 키,레코드의 저장, 수정, 삭제 처리)을 갖는 객체를 JPA에게 알려주는 행동입니다.

연관 관계의 주인은 연관 관계를 갖는 두 객체 사이에서 조회, 저장, 수정, 삭제를 할 수 있지만, 연관 관계의 주인이 아니면 조회만 가능합니다.

연관 관계의 주인이 아닌 객체에서 mappedBy 속성을 사용해서 주인을 지정해줘야합니다.

(예시 : 책은 책장이 넓어지거나 변형되면 책장을 새로 구할 수 있지만, 책장은 책을 지정할 수 없다는 가정)

왜 연관 관계의 주인을 지정해야하는가?
-> JPA가 테이블과 매핑을 관리할때, 주인 객체와 피지배 객체의 데이터를 수정할 때 둘 중 어떤 FK를 수정할 지 명시하기 때문입니다.

단, 연관관계의 주인과 피지배 객체 모두 데이터 동기화를 위해 제어해주어야합니다.

다중성

여기서는 생략하겠습니다.

일대다 ↔ 다대일
일대일 ↔ 일대일
다대다 ↔ 다대다(실무에서는 사용 금지)

post-custom-banner

0개의 댓글