JAVA & SPRING/JPA

JPA0 기본편(다양한 연관관계 매핑1, 다대일 & 일대다)

눈오는1월 2024. 3. 11. 21:48
728x90

본 내용은 인프런 김영한 강사님 JPA 기본 편 강의를 듣고 정리한 내용입니다.

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런

저는 야생형이 아니라 학자형인가봐요^^ 활용편 넘어갔다 30% 정도 듣고 도저히 답답해서 기본편을 들어버렸네요^^. 한주 한주 김영한님 강의 들으니 렙업되는 모습을 스스로 느낍니다. 특히 실

www.inflearn.com

 

연관관계 매핑 시 고려사항은 3가지가 존재한다.

  1. 다중성
  2. 단방향, 양방향
  3. 연관관계 주인

 

1. 다중성

다대일 : @ManyToOone

일대다 : @OneToMany

일대일 : @OneToOne

다대다 : @ManyToMany

 

JPA는 위 4가지 어노테이션을 제공한다.

 

2. 단방향, 양방향

테이블 관점과 객체 관점에서 생각을 해야 한다.

테이블

  • 외래 키 하나로 양쪽 조인이 가능하다.
  • 방향이라는 개념이 존재하지 않는다.

객체

  • 참조 필드가 있는 곳으로만 참조가 가능하다.
  • 한쪽으로 참조하게 될 경우 단방향, 양쪽이 서로 참조하면 양방향이다.(ex MappedBy)

 

3. 연관관계 주인

외래키를 관리하는 참조가 연관관계 주인이다.

반대편이 주인이 아니다. 외래 키에 영향을 주지 않고, 단순한 참조만 가능하다.

 

 

다대일

 

다대일 단방향

다대일 단방향 관계

테이블 관점에서는 多에 외래키가 존재해야 한다 -> 여러 명을 한 팀에 넣을 때 Member에 팀만 넣어주면 된다. 팀에 외래키가 존재하면 여러 개 INSERT 하는 경우가 생긴다.

 

다대일 양방향

다대일 양방향 관계

테이블 관점에서는 다대일 단방향 관계와 동일하다.

객체 관계에서는 Team에 속해 있는 Member를 가져올 때 연관관계 주인과 종속하는 것을 설정해서 Team에서는 Member를 단순 참조만 가능하다.

 

일대다

 

일대다 단방향

실무에서는 권장하지 않는 방식(추천하지 않는다.)

다대일 단방향 관계

예를 들어 만약 Member에서는 자신이 속해 있는 팀은 몰라도 되고 Team에서는 해당 팀에 속해있는 Member가 몇 명이 있고 누군지 알고 싶을 때 이용한다.

그럼 이때는 테이블에서는 무조건 多쪽이 외래키를 가지게 되는 거고 객체는 Team에서 외래키를 관리하게 되는 것이다.

 

코드로 한번 구현을 해보면

Member 엔티티
Team 엔티티

위 설계처럼 이렇게 2개의 엔티티가 존재한다.

일대다 단방향 예시
일대다 단방향 예시 결과

위 코드와 실행결과를 봤을 때, update쿼리가 날아가는 것을 볼 수 있다.

왜 update 쿼리가 날아가게 되냐면 이 코드에서 team.getMember().add(member);를 하게 됐을 때, Member에 외래키가 존재하므로, 결국 Member 테이블을 업데이트를 해줘야 한다. 그래서 업데이트 쿼리가 날라가게 되는 것을 알 수 있다.

이렇게 됐을 때 성능에 문제점이 존재하고 또한 만약 Member를 저장하는 부분이 다른 함수에서 되어있을 경우 JPA를 제대로 알지 못하면 왜 업데이트 쿼리가 날아가는지 알 수가 없다.(실무에서는 수십 개의 테이블이 사용되니까..)

 

 

일대다 양방향

 

억지성이 존재한다(공식적으로 존재하지 않는다.)

주인이 아닌 곳에 @JoinColumn(insertable=false, updatable=false) -> 읽기 전용 필드를 사용해서 양방향처럼 사용하는 방법

 

그래서 결론!

일대다는 사용하지 말자!

만약 필요할 경우 다대일에서 MappedBy를 이용해서 데이터를 가져오자!

728x90