ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring JPA(4) 연관관계 매핑
    Spring 2020. 1. 30. 17:44

    참고 : https://dotheright.tistory.com/267?category=777106

            https://victorydntmd.tistory.com/208

     

    연관관계 매핑

    객체의 참조와 테이블의 외래키 매핑을 의미한다.

    JPA에서는 JDBC( Mybatis ) 를 사용했을 때와 달리 연관 관계에 있는 상대 테이블의 PK를 멤버변수로 갖지 않고, 엔티티 객체 자체를 통째로 참조한다.

    1. 방향

    단방향 관계 : 두 엔티티가 관계를 맺을 때, 한 쪽의 엔티티만 참조하고 있는 것을 의미한다.

    양방향 관계 : 두 엔티티가 관계를 맺을 때, 양 쪽이 서로 참조하고 있는 것을 의미한다.

     

    관계가 있는 엔티티는 다음 중 하나의 관계를 가지게 된다.

    Many To One - ( N : 1 ) 다대일

    One To Many - ( 1 : N ) 일대다

    One to One - ( 1: 1  ) 일대일

    Many to Many - ( N : N ) 다대다

     

    어떤 엔티티의 관점으로 보는것의 따라 다중성이 달라진다.

    →  예로 구기종목에는 축구및 여러가지의 스포츠가 포함되어 있다. 구기종목 입장에서는 축구와 일대다 관계이지만,

         축구 입장에서는 구기종목과 다대일 관계가 된다.

    2. 단방향 연관관계

    2. (1) 단방향 매핑

      → 데이터 모델링에서는 관계를 맺어주기만 하면 자동으로 양방향 관계가 되어 서로 참조하는 반면 객체지향 모델링에서는

          자신이 원하는 구현방식의 서비스를 사용이 가능하다.

      → 굳이 양방향 매핑을 사용할 필요는 없다. ( 단방향 매핑만으로도 이미 연관관계 매핑은 완료된 것이기 때문이다. )

     

    3. 양방향 연관관계

    FK로 엮인 DB 테이블 끼리는 JOIN을 통하여 서로의 데이터를 쉽게 조회가 가능하지만 Entity가 테이블처럼 동작하기 위해서는 별도의 작업이 필요하다. ( 객체는 가급적 단방향 매핑을 사용하는것이 좋다. )

    mappedBy는 연관관계의 주인을 설정하는 용도로 사용이 된다. ( 연관관계 주인만이 외래키를 관리한다. )

    주인은 mappedBy를 사용하지 않으며 주인은 외래키가 있는 곳으로 지정하는 것이 좋다.

    주인이 아닌쪽은 mappedBy를 사용하며 주인이 누구인지 지정을 해주어야 한다.

    N : 1 관계에서는 N쪽이 연관관계의 주인이 된다.

     

    3. (1) 양방향 매핑 주의상황

     → 연관관계의 주인만이 외래 키의 값을 변경할 수 있다. ( 순수한 객체 관계를 고려한 경우 양쪽 모두에 값을 넣어주는게 안전하다. )

     → 양방향 매핑 무한루프

         - toString(), lombok : 자동완성이 아닌 필요에 의해 직접 만들어 사용하기

         - JSON 생성 라이브러리 : 컨트롤러에서 엔티티를 반환하면 안된다.

     → 연관관계 편의 메소드 활용

         - 연관관계 주인에 연관관계 주인이 아닌 것을 넣을 때 주인이 아닌 곳에 add()를 이용하면 된다.

            주인 : Member 에 Team, 주인아님 : Team ( Member.getTeam().add(Team) )

     

     

    'Spring' 카테고리의 다른 글

    Spring JPA(5) 게시판  (0) 2020.02.18
    Spring Boot HikariCP  (0) 2020.02.04
    Spring JPA(3) CRUD 기본 예제  (0) 2020.01.30
    Spring JPA(2) - 엔티티 매핑  (0) 2020.01.29
    Spring JPA(1) ORM, Hibernate(JPA), 영속성  (0) 2020.01.22

    댓글

Designed by Tistory.