빈쿵바라기
좌충우돌 개발자의 기록
빈쿵바라기
전체 방문자
오늘
어제
  • 분류 전체보기 (53)
    • Programming (25)
      • JAVA (12)
      • Spring Boot (6)
      • JPA (7)
      • Python (0)
    • Database (12)
      • RDBMS (4)
      • NoSQL (7)
    • Server (11)
    • Elasticsearch (3)
    • ETC (2)

블로그 메뉴

    공지사항

    인기 글

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    빈쿵바라기
    Programming/JPA

    [Spring Data JPA] JPA 연관관계 매핑(JOIN)

    [Spring Data JPA] JPA 연관관계 매핑(JOIN)
    Programming/JPA

    [Spring Data JPA] JPA 연관관계 매핑(JOIN)

    2022. 8. 2. 19:16

    연관관계 매핑이 필요한 이유

    팀(Team)과 회원(Member)가 일대다의 관계를 가지는 연관관계일 때 예시 코드

     

    팀과 회원의 객체 클래스 코드

    @Entity
    public class Team {
    
      @Id @GeneratedValue
      private Long id;
      private String name;
    
    }
      
    @Entity
    public class Member {
    
      @Id @GeneratedValue
      private Long id;
    
      private String name;
    
      @Column(name = "team_id")
      private Long teamId;
      
      }

    팀과 회원을 조회하는 코드

    // 1번 ID를 가지는 회원 찾기
    Member member = em.findById(1);
    
    // 회원의 TeamId로 팀 찾기
    Long teamId = member.getTeamId();
    Team team = em.findById(teamId);

    위처럼 연관관계가 없다면, 회원과 팀을 찾을 때마다 회원의 TeamId로 계속 팀을 찾아와야하는 번거로움과 비용이 발생합니다.


    테이블의 연관관계와 객체 연관관계(객체 참조)의 차이점

    • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾습니다.
      • 따라서 데이터베이스는 단방향이니 양방향이니 나눌 필요가 없습니다.
    • 객체 참조를 사용해서 연관된 객체를 찾습니다.
      • 객체는 참조용 필드가 있는 객체만 다른 객체를 참조하는 것이 가능합니다.
      • 두 객체 사이에 하나의 객체만 참조용 필드를 갖고 참조하면 단방향 관계
      • 두 객체 모두가 각각 참조용 필드를 갖고 참조하면 양방향 관계
    • 테이블과 객체 사이에는 이런 큰 간격이 있습니다.

    연관 관계 정의 규칙

    관 관계를 매핑할때는 크게 3가지를 생각해보아야합니다.

    • 방향 : 단방향, 양방향 (객체 참조)
    • 연관 관계의 주인 : 양방향일 때, 연관 관계에서 관리하는 주체
    • 다중성 : 다대일, 일대다, 일대일, 다대다

    단방향과 양방향 선택

    비즈니스 로직에서 두 객체가 참조가 필요한지 여부로 선택
    • 위에 팀(Team)과 회원(Member)의 예시에서
      • team.getMembers()처럼 참조가 필요하다면 Team → Member 단방향 참조
      • member.getTeam()처럼 참조가 필요하다면 Member → Team 단방향 참조
    • 양방향은 객체 참조에서는 복잡도가 증가하므로 되도록 피하며, 양방향 객체 참조가 필요할 때 만 사용할 것

    연관 관계의 주인

    양방향 연관 관계일 때 외래키가 있는 객체에 연관관계의 주인으로 지정
    • 연관 관계의 주인이 아닌 객체에서 mappeBy 속성을 사용하여 주인을 지정

    다중성

    두 객체간의 관계를 나타낼 때 데이터베이스를 기준으로 다중성을 결정
    • @ManyToOne : 다대일(N:1)
    • @ManyToMany : 다대다(N:N)
    • @OneToMany : 일대다(1:N)
    • @OneToOne : 일대일(1:1)

    다대일(N:1) 예제 코드

    일반적으로 많이 사용하는 다대일(N:1) 연관관계를 연습해보겠습니다. 위에 회원(Member)와 팀(Team) 관계로 예를 들겠습니다.

    시나리오
    1. 하나의 팀에는 여러 회원이 포함될 수 있습니다.
    2. 한명의 회원은 하나의 팀에만 소속될 수 있습니다.
    • 데이터베이스를 기준으로 회원(N) : 팀(1) 연관관계를 가집니다. 
    • 외래키는 회원 테이블이 가지고 있습니다.(대부분 다(N)쪽이 외래키를 갖습니다.)

    다대일(N:1) 단방향

    @Entity
    public class Team {
    
      @Id @GeneratedValue
      private Long id;
      private String name;
    
    }
      
    @Entity
    public class Member {
    
      @Id @GeneratedValue
      private Long id;
    
      private String name;
    
      // 다대일 조인
      @ManyToOne
      @JoinColumn(name="team_id")
      private Team team;
      
      }

    회원(Member)에 @ManyToOne로 다대일 연관관계를 알리고, @JoinColumn으로 외래키 컬럼명을 지정하였습니다.

     

    다대일(N:1) 양방향

    @Entity
    public class Team {
    
      @Id @GeneratedValue
      private Long id;
      private String name;
      
      // 양방향
      @OneToMany(mappedBy="team")
      List<Member> members;
    
    }
      
    @Entity
    public class Member {
    
      @Id @GeneratedValue
      private Long id;
    
      private String name;
    
      // 다대일 조인
      @ManyToOne
      @JoinColumn(name="team_id")
      private Team team;
      
      }

    양방향으로 객체참조를 하려면 다대일 관계속 일(1)인 팀(Team)에 @OneToMany를 추가하고 연관관계의 주인인 mappedBy를 지정해줬습니다. mappedBy에 들어가는 값은 관계 대상이 되는 변수명을 작성하시면 됩니다.

    저작자표시 (새창열림)

    'Programming > JPA' 카테고리의 다른 글

    [Spring Data JPA] Query를 사용하는 여러가지 방법  (0) 2022.08.11
    [Spring Data JPA] FetchType - 즉시 로딩(EAGER)과 지연 로딩(LAZY)  (0) 2022.08.04
    [Spring Data JPA] 양방향 순환참조 문제 및 해결방법  (0) 2022.08.03
    [Spring Data JPA] JPA 주요 어노테이션(Annotation)  (0) 2022.07.31
    [Spring Data JPA] JPA란? JPA기본 예제  (0) 2022.07.25
      'Programming/JPA' 카테고리의 다른 글
      • [Spring Data JPA] FetchType - 즉시 로딩(EAGER)과 지연 로딩(LAZY)
      • [Spring Data JPA] 양방향 순환참조 문제 및 해결방법
      • [Spring Data JPA] JPA 주요 어노테이션(Annotation)
      • [Spring Data JPA] JPA란? JPA기본 예제
      빈쿵바라기
      빈쿵바라기
      삽질하는 개발자의 좌충우돌 개발기

      티스토리툴바

      단축키

      내 블로그

      내 블로그 - 관리자 홈 전환
      Q
      Q
      새 글 쓰기
      W
      W

      블로그 게시글

      글 수정 (권한 있는 경우)
      E
      E
      댓글 영역으로 이동
      C
      C

      모든 영역

      이 페이지의 URL 복사
      S
      S
      맨 위로 이동
      T
      T
      티스토리 홈 이동
      H
      H
      단축키 안내
      Shift + /
      ⇧ + /

      * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.