자바/JPA

JPA: 연관관계 매핑 (1:1 , 1:N, N:1, N:M)

류창 2022. 6. 14. 15:34
반응형

 

 

데이터베이스에 테이블은 서로 연관관계를 가질 수 있다.

 

 

그러므로 우리가 Spring에서 다루는  Entity들 사이에서도 서로 연관관계를 명시해줘야한다.

만약, 연관관계를 매핑안하고 사용할경우

 

Team 테이블에 멤버가 하나들어가면, Member테이블에도 하나 더 추가해야하는 번거로움이 발생한다.  

DB는 매핑만해주면 알아서 넣어주기때문에 상관은없지만 객체의 연관관계는 그렇지않다.

 

 

그 관계를 명시해줄 어노테이션 4개를 이번포스팅에 남겨보려고한다.

 

  • @OneToOne
  • @ManyToOne
  • @OneToMany
  • @ManyToMany

 

 

 

@OneToOne

 

1대 1 관계 매핑이다.

1대1 관계매핑
매핑을 당하는 주체 (Delivery)

 

코드에서 보이는것과 같이 연관관계 매핑할시에 @JoinColumn이 사용되는데,  이것은

다른 테이블에 어떤속성과 연관을맺을지 그 이름을 정해주는 속성이다.

 

윗 사진에 예시론, "DELIVERY_ID" 가 이에 해당한다.

 

일대일은 단방향 지원 X

양방향으로 매핑하려면 이와같은 코드를 추가해주면된다.

 

양방향 매핑을 하기위해선,  속성 (mappedBy)를 사용한다

말그대로, "누구에게 매핑 당하느냐" 를 설정해주면된다.  예시로 볼때, delivery 속성명에 의해 매핑당하므로 

그 이름을 따와서 매핑을해준다.

 

 

@ManyToOne

 

다 대 1 , (N:1)관계다.

기본 내용은 OneToOne과 다를바없다.  

 

여기서, fetch= FetchType.LAZY 인  지연로딩을 꼭 해주는게 좋다.

 

로딩은 2종류가있다.

FetchType.EAGER

FetchType.LAZY

 

EAGER은  테이블의 속성을 쓰던 안쓰던 무조건 조인을 해온다.

모든 연관관계가 EAGER로 되어있다면,

난 그 속성을 안쓸건데 Join이 또 다른 Join을 물어오고 굉장히 효율이 안좋아진다.

 

@OneToOne 과 @ManyToOne은 명시를 안하면 디폴트값으로 EAGER를 지원하기때문에,

꼭 지연로딩을 해주자.

 

지연로딩을 사용할경우, 테이블의 속성 즉, member를 사용할때만 테이블 조인이 일어나고,

member속성을 사용안하면 테이블 조인을 해주지않는다.

 

 

 

@OneToMany

 

1대 다 (1:N) 관계다.

 

양방향 시스템을 만들때만 거의 사용한다

 

이 어노테이션은 주로, @ManyToOne의 양방향시스템을 만들때만 사용한다.

 

굳이, @OneToMany로 단방향시스템을 만들순 있기야하겟지만,  개발자들 사이에 단점도 많으며

 

*/단점

  • 엔티티가 관리하는 외래 키가 다른 테이블에 있음
  • 연관관계 관리를 위해 추가로 UPDATE SQL 실행

/*

1 대 다 관계일경우 @ManyToOne으로 단방향시스템을 만드는게 이론적으로 더 어울리고 관리가 편하다라고 결론이났다.

 

@OneToMany에선  fetchType을 적지않았는데,  그 이유가 디폴트로 지연로딩을 해주기때문이다.

@OneToMany , @ManyToMany는 디폴트가 지연로딩이다.

 

 

@ManyToMany

 

다대다 관계 (N:M)이다.

 

 

결론부터 말하자면, 안쓰는게좋다.

 

@ManyToMany를 -> @ManyToOne , @OneToMany로 분리하는게 유지보수 측면에서 좋다.

윗 그림은 ManyToMany를  1대다 다대1로 분리한 모습이다.

이와같이 분리를 해두면 좋은점은, Member와 Product사이에서 발생하는 새로운 속성  

ORDERAMOUNT, ORDERDATE가 필요할수가있다.  분리를해두면 편리하게 넣을수있지만..

 

분리를 안해두면 불가능하다.

반응형

'자바 > JPA' 카테고리의 다른 글

JPA 값타입  (0) 2022.06.27
JPA : 상속관계 매핑  (0) 2022.06.15
JPA: 엔티티(Entity) 매핑  (0) 2022.06.14
JPA 의 기초(CRUD) 다루어보기  (0) 2022.01.07
스프링: 왜 JPA를 쓰는가?  (0) 2022.01.05