JPA 연관 관계

박건영(Parkgunyoung)·2022년 6월 9일
0

til

목록 보기
17/17
post-thumbnail
post-custom-banner

JPA 연관관계

우선 JPA에서 가장 중요한 것은 "객체와 관계형 데이터베이스 테이블이 어떨게 매핑되는지를 이해하는 것" 이라고 한다.

그 이유는 JPA의 목적인 "객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결" 이라는 것과 가장 직접적으로 연관되어 있기 때문이라고 한다.

객체와 테이블의 매핑에 대한 내용을 좀 더 구체적으로 나눈다면 예를 들어 1차원적인 매핑과 테이블 간의 연관 관계 매핑으로 나눌 수 있다.

1차원적 매핑의 경우는 @Entity , @Column, @Id, @GenerativeValue, @Enumerated 등의 객체오 데이터베이스 사이의 1:1로 대응되는 것이다.

연관 관계 매핑은 비즈니스 로직, 비즈니스 요구사항에 따라 테이블간의 적절한 관계를 선택해야한다.


연관관계 규칙

연관 관계를 매핑할 때, 생각해야 하는 것은 크게 3가지가 있다.

  1. 방향: 단방향, 양방향(객체참조)

  2. 연관 관계의 주인: 양방향일 때, 연관 관계에서 관리 주체

  3. 다중성:

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

단방향, 양방향

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

따라서 데이터베이스는 단방향이니 양방향이니 나눌 필요가 없다.

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

그렇기 때문에 두 객체 사이에 하나의 객체만 참조용 필드를 갖고 참조하면 단방향관계, 두 객체 모두가 각각 참조용 필드를 갖고 참조하면 양방향 관계라고 한다.

즉, 양방향 관계는 없고 두 객체가 단방향 참조를 각각 가져서 양방향 관계처럼 사용하는 것이다.

따라서 JPA를 사용하여 데이터베이스와 패러다임을 맞추기 위해서 객체는 단방향 연관 관계를 가질지, 양방향 연관 관계를 가질지 선택해야 한다.

선택은 비즈니스 로직에서 두 객체가 서로 참조가 필요한지 여부를 고민해보면 된다.

만약 두 객체가 필요로 인해 서로 단방향 참조를 했다면 양방향 연관관계가 되는 것이다.


무조건 양방향을 하면 좋지않나?

객체 입장에서는 양방향 매핑을 하게 되면 오히려 복잡해질 수 있다.

예시로 일반적인 어플리케이션의 User 엔티티는 굉장히 많은 엔티티와 연관 관계를 갖고 있다.

이러한 경우 모든 엔티티를 양방향 관계로 설정하게 되면 User엔티티는 엄청나게 많은 테이블들과 연관 관계를 맺게 되고, User 클래스를 보면 매우 복잡해진 것을 확인할 수 있다.

또한 다른 엔티티들도 불필요한 연관관계 매핑으로 인하여 복잡성이 증가하게 된다.

-> 그렇기에 이상적인 기준은 기본적으로 연관관계가 필요할 시 단방향으로 매핑을 하고 나중에 반대쪽 테이블에서도 역방향으로 참조가 필요할 시 추가하는 방법이 가장 좋다.


연관관계 주인(mappedBy)

두 객체(A,B)가 양방향 관계일 때 연관 관계의 주인을 지정해야한다.

연관 관계의 주인을 지정하는 것은 두 단방향 관계 중, 제어의 권한(외래 키를 비롯한 테이블 레코드를 저장, 수정, 삭제 처리)을 갖는 실질적인 관계가 무엇인지를 JPA에게 알려준다고 생각하면 된다.

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

** 외래키가 있는 곳을 연관관계의 주인으로 정하면 된다.(무조건!)


<그럼 왜 연관 관계의 주인을 정하여야 하는가?>

두 객체가(게시판, 게시글) 있고 양방향 연관 관계를 갖는다고 생각해보자.

게시글의 게시판을 다른 게시판으로 수정하여 할 때, 게시글 객체에서 set게시판()같은 메소드를 이용할지,
게시판 객체에서 get게시글() 같은 메소드를 이용하여 게시글을 수정하는게 맞는지 헷갈릴 수 있다.

두 객체 입장에서는 둘 다 맞는 방법이긴하다.

하지만 이렇게 객체에서 양방향 연관 관계의 포인트가 두 개일 때는 테이블과 매핑을 담당하는 JPA의 입장에서 혼한을 주게 된다.

즉, 게시글에서 게시판을 수정할 때 FK를 수정할지, 게시판에서 게시글을 수정할 때 FK를 수정할 지를 결정하기 어려운 것이다.

그렇기 때문에 두 객체 사이의 연관 관계의 주인을 정하여 명확하게 게시글에서 게시판을 수정할 때만 FK를 수정하겠다! 라고 정하는 것이다.


흠.. 어렵다 어려워...

다중성에 관한 내용은 연관 관계를 좀 더 공부하고 다음번에 다루어보자!

profile
쓰러지면어때일어나면그만인걸
post-custom-banner

0개의 댓글