Post

관계 매핑(Relationship Mapping)



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

    DB 테이블은 외래 키(Foreign key)하나로 조인(Join)을 사용해서 양방향으로 쿼리가 가능

    따라서 DB에는 방향의 개념이 없습니다.

    그러나 객체의 경우, 참조용 필드를 가지고 있는 객체

    연관된 객체를 조회할 수 있으므로 방향의 개념이 존재합니다.

    객체 관계에서 한 쪽만 반대쪽을 참조하는 관계를 단방향,

    양 쪽 모두 서로를 참조하는 관계를 양방향이라고 합니다.



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

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

    즉 연관관계를 관리하는 포인트는 외래 키 하나입니다.

    반면 객체에서는 양방향 관계로 매핑하면 A -> B, B -> A,

    두 곳에서 서로를 참조하므로 연관관계를 관리하는 포인트는 두 곳이 됩니다.

    따라서 JPA는 두 객체 중 하나를 정해서 외래 키를 관리하게 만들어야 하는데,

    여기서 외래 키를 관리하는 객체를 연관관계의 주인이라고 합니다.

    보통 외래 키를 가진 테이블과 매핑되는 엔티티가 외래 키를 관리하는 것이 효율적이므로,

    연관관계의 주인이 됩니다.

    주의할 점은 외래 키를 관리하는 연관관계의 주인만이 외래 키를 변경할 수 있으며,

    주인이 아닌 곳은 읽기만 가능하다는 것입니다.



  • 다중성 :다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)

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

    • 다대일(N:1) : 단방향, 양방향 image

    다대일 단방향에서는 다 쪽에서 @ManyToOne 만 추가해줌

    반대로 일쪽에서는 참조하지 않습니다. (단방향이기 때문)

    다대일 양방향으로 만드려면 일쪽에 @OneToMany 를 추가하고

    양방향 매핑을 사용했으니 연관 관계의 주인을 mappedBy 로 지정해줍니다.

    mappedBy로 지정할 때 값은 대상이 되는 변수명을 따라 지정하면 됨


  • 일대다(1:N) : 단방향, 양방향

    일대다의 기준은 연관관계의 주인을 일(1)쪽에 둔 것

    데이터베이스에서는 무조건 다(N)쪽에서 외래키를 관리함

    일대다는 일쪽 객체에서 다(N) 쪽 객체를 조작(생성,수정,삭제)하는 방법임

    image 실무에서는 일대다(1:N) 단방향은 거의 쓰지 않음

    → 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다는 점(관리어려움)

    → 연관관계처리를 위해 UPDATE SQL을 추가로 발생시킴

    단, 일대다 단방향 매핑 하나만 사용하는 경우는 드물고,

    다대일 단방향 매핑을 먼저 한 후에 필요한 경우,

    일대다 단방향 매핑을 추가해서 양방향 연관 관계를 만드는 것이 일반적

    @OneToMany 와 @JoinColumn을 이용해서 조인을 함

    mappedBy가 없음→ 양방향이 아니기 때문

    일대다 양방향은 쓰지 않음(= 다대일 양방향)

    @JoinColumn(updatable = false, insertable = false) 이지만,

    일대다 양방향을 사용해야할 때는 다대일 양방향 사용하하는게 더 좋음


    image

    일대일 관계는 양쪽이 서로 하나의 관계만을 가짐

    일대일 관계의 반대도 일대일 관계이며,

    일대일 관계는 두 테이블 중 어느곳에서든 외래 키를 가질 수 있음

    주테이블에 외래키
    주 테이블에 외래 키를 두고 대상 테이블을 찾음
    객체지향 개발자 선호
    • 장점
    ◦ 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다.
    • 단점
    ◦ 값이 없으면 외래 키에 NULL을 허용해야 한다.

    일대일(1:1) 단방향 →@OneToOne 와 @JoinColumn을 이용

    일대일(1:1) 양방향→ @OneToOne 와mappedBy 설정

    대상 테이블에 외래키

    • 데이터베이스 개발자들이 선호하는 방식
    • NULL을 허용해야 하는 문제도 없다.

    장점:

    • 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때, 테이블 구조를 유지할 수 있다.

    단점:

    • @OneToOne 양방향 매핑 시 지연 로딩으로 설정하여도 지연 로딩(LAZY)이 동작하지 않고, 즉시 로딩(EAGER)이 동작함.
    • N+1 쿼리가 발생함.
    • 프록시 기능의 한계 때문에 연관관계 주인이 아닌 테이블에서는 프록시로 만들 객체가 null인지 아닌지 알 수 없기 때문에 조회하는 쿼리가 실행됨.

    일대일(1:1) 단방향 → JPA지원 안함

    일대일(1:1) 양방향 →@OneToOne 와mappedBy 설정

    다대다 : 단방향, 양방향 image

    중간에 테이블을 하나 추가해서 두 개의 일대다 관계를 만들어주는 것이 일반적인 방법

This post is licensed under CC BY 4.0 by the author.