다양한 연관관계 매핑

데일리·2022년 3월 28일

JPA 기초

목록 보기
5/10

1. 다대일(N:1) -> @ManyToOne

  • 가장 많이 사용하는 연관관계
  • 반대는 일대다
  • 양방향으로 한다고 해서 테이블에 영향을 주지 않음
    - Team에 List추가
@ManyToOne //한 팀에 여러개의 회원이 소속 멤버 입장이 many
@JoinColumn(name = "TEAM_ID")
private Team team;

-------------------------------
@OneToMany(mappedBy = "team")
private List<Member> member = new ArrayList();

2.일대다

  • 1대다 주인을 두는 경우
  • 권장하지 않는 모델
  • update 쿼리가 추가로 나감
  • 일대다로 양방향 매핑하려고 가기
@ManyToOne
@JoinColumn(name = "TEAM_ID",insertable = false, updatable = false)
private Team team;

>> 매핑은 하지만 수정, 삽입을 불가하게 읽기 전용으로 만든다

3.일대일

  • 일대일이므로 어디든 외래키를 넣어도 상관이 없다.
  • 반대편은 mappedBy 사용
  • 주인은 Member지만 외래키를 Locker에서 관리하는 것은 불가능
  • 주 테이블에 외래키(개발자랑 DBA랑 협의가 되야함)
    • JPA 매핑 편리
    • 장점: 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
    • 단점: 값이 없으면 외래키에 null 허용
  • 대상 테이블에 외래키
    • 장점: 주 테이블과 대상 테이블의 관계를 일대일에서 일대다로 변경할 때 대상 구조 유지
    • 단점: 프록시 기능의 한계로 지연 로딩으로 설정해도 즉시 로딩됨

4. 다대다 @ManyToMany

  • 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없ㅇ므
  • 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어나가야한다.
  • 객체는 컬렉션을 사용해서 2개로 다대다가 가능
  • 편리해지보이지만 실무에서는 사용 x
    • 연결테이블이 단순히 연결만 하고 끝나지 않음
    • 주문시간, 수량 등 다양한 테이블이 더 들어올 수 있고 추가 정보 삽입이 불가능
    • 쿼리가 이상하게 나갈 수 있음

=> ManyToMany → oneToMany & ManyToOne 으로 변경

profile
하루에 한편 씩 읽기 좋은 테크 로그

0개의 댓글