01. 연관관계 매핑 시 고려사항 3가지
다중성
다대일 @ManyToOne
일대다 @OneToMany
일대일 @OneToOne
다대다 @ManyToMany
단방향, 양방향
테이블은 외래 키 하나로 양쪽에서 조인이 가능하다.
객체는 참조용 필드가 있는 쪽으로만 참조가 가능하다. 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이라고 생각하면 된다. 사실 단방향, 양방향이라는 말은 우리가 이해하기 쉽게 사용하는 용어이다.
연관관계의 주인
테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다.
객체 양방향 관계는 참조가 2군데이다. (A에서 B로 참조하는 것 하나, B에서 A로 참조하는 것 하나) 객체 양항뱡 관계는 참조가 2군데 있으므로 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 한다. 연관관계의 주인은 외래 키를 관리하는 참조이다. @JoinColumn
으로 조인 할 컬럼명을 지정해야 한다. 연관관계의 주인이 아니면 외래 키에 영향을 주지 않으며 단순 조회만 가능하다. List 형이면 관례상으로 new로 null pointer exception이 발생하지 않게 해줘야 한다. mappedBy 속성으로 주인을 지정해준다.
02. 다대일
다대일 단방향
가장 많이 사용하는 연관관계이다. 다대일의 반대는 일대다이다.
다대일 양방향
외래키가 있는 쪽이 연관관계의 주인이다. 양쪽을 서로 참조하도록 개발해야 한다.
03. 일대다
일대다 단방향
객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조이다. 그래서 연관관계 관리를 위해 추가로 UPDATE SQL을 실행힌다. @JoinColumn
을 꼭 사용해야 한다. 그렇지 않으면 조인 테이블 방식을 사용한다.
일대다 보다는 다대일을 사용하자.
일대다 양방향
이런 매핑은 공식적으로 존재하지는 않는다.@JoinColumn(insertable = false, updatable = false)
와 같이 읽기 전용 필드를 사용해서 양방향처럼 사용하는 방법이다.
04. 일대일
일대일 관계
일대일 관계는 그 반대도 일대일이다. 주 테이블이나 대상 테이블 중에 외래 키를 어디에 놓을지 선택이 가능하다. 외래 키에 데이터베이스 유니크 제약 조건을 추가하면 된다.
주 테이블에 외래 키 단방향
다대일(@ManyToOne
) 단방향 매핑과 유사하다.
주 테이블에 외래 키 양방향
다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계 주인이다. 반대편에서는 mappedBy
로 주인을 명시한다.
대상 테이블에 외래 키 단방향
단방향 관계는 JPA를 지원하지 않는다. 양방향 관계는 지원한다.
대상 테이블에 외래 키 단방향
일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같다.
05. 다대다
관계형 데이터베이스와 객체의 차이
관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 따라서 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 한다. 반면 객체는 컬렉션을 이용해서 객체 2개로 다대다 관계를 표현할 수 있다.
다대다@ManyToMany
를 사용하고, @JoinTable
로 연결 테이블을 지정해야 한다. 다대다 매핑은 단방향, 양방향 모두 가능하다.
다대다 매핑의 한계
편리해 보이지만 실무에서 사용하지는 않는다. 연결 테이블이 단순한 연결에서 끝나는 것이 아니다. 추가적인 데이터가 들어올 수 있다.
다대다 한계 극복
연결 테이블용 엔티티를 추가한다. 즉, 연결 테이블을 엔티티로 승격시키면 된다.
@ManyToMany
대신@OneToMany
와 @ManyToOne
를 사용하면 된다. 예를 들어, Member - MemberProduct - Product 가 될 수 있겠다.
'JPA' 카테고리의 다른 글
@MappedSuperclass - 매핑 정보 상속 (0) | 2024.01.11 |
---|---|
상속관계 매핑 (0) | 2024.01.08 |
양방향 연관관계와 연관관계의 주인 (2) | 2024.01.06 |
단방향 연관관계 (2) | 2024.01.06 |
필드와 컬럼 매핑 (0) | 2024.01.06 |