연관관계 매핑 2

tyghu77·2023년 8월 10일
0

연관관계 매핑 시 고려해야할 점

  1. 다중성 (1:1, 1:N, N:1, N:M)

    1:1 > @OneToOne
    1:N > @OneToMany
    N:1 > @ManyToOne
    N:M > @ManyToMany(쓰면안됨)
    헷갈릴 때는 반대를 생각해보자

  2. 단방향, 양방향
    테이블과 객체의 차이를 인식하자

    테이블
    외래키 하나로 양쪽 조인이 가능하기 때문에 방향이라는 개념이 없다.
    객체
    참조용 필드가 있는 쪽으로만 참조 가능
    한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향이 된다.
    양방향은 결국 단방향이 2개인 것이다.

  3. 연관관계 주인

    양방향의 경우에 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다. 반면에 객체는 참조가 2개이다. 따라서 둘중 하나에서 외래 키를 관리할 곳을 정해야 한다.
    외래키를 관리하는 참조가 연관관계의 주인이 된다.
    연관관계의 주인은 외래 키에 영향을 주지않고, 단순 조회만 가능하다.

다대일 N:1

단뱡향
다 쪽에 외래키가 있기 때문에 그것과 연관관계를 매핑해서 사용하면 된다.

양방향
객체의 반대쪽에 참조를 넣어주면 된다. 여기서 주의할 점은 테이블의 설계는 바뀌지 않는다는 것이다.
이 경우에는 다(N)가 연관관계의 주인이 되고 일(1)은 외래키에 영향을 주지 않는, 조회만 가능한 상태가 된다.
mappedBy="외래키"

일대다 1:N

권장하지않음 : 엔티티가 관리하는 외래 키가 다른 테이블에 있다.
DB에서는 N에 외래키가 들어가기 때문에 연관관계의 주인 위치와 외래키의 위치가 다르다. 반대편 테이블의 외래키를 관리해야 하는 특이한 구조가 나온다.

단방향
@OneToMany를 쓸때 @JoinColumn을 넣어줘야한다. 그렇지 않으면 조인테이블 방식(중간에 테이블을 하나 추가함)을 사용하게 된다.
연관관계의 주인의 위치와 실제DB 외래키의 위치가 다르기 때문에 저장할 때 어쩔수 없이 다른 테이블을 update해줘야 한다. 따라서 쿼리가 한번 더 나간다.

일대다 단방향 보다는, 다대일 양방향 매핑을 사용하는 것이 좋다.

양방향
공식적으로는 존재하지 않는다.
@JoinColumn(insertable=false, updatable=false)를 통해 읽기 전용 필드로 만들어, 양방향처럼 사용하는 것이다.
그냥 다대일 양방향을 사용하자.

일대일 1:1

DB에서 외래키를 아무곳에나 넣을 수 있다. (주 테이블이나 대상 테이블중 한 곳)
1:1이 되려면 외래 키에 DB 유니크 제약 조건이 들어가야한다.

다대일과 비슷하지만 외래키에 유니크 제약조건이 있다는 것을 기억하자.

다대다 N:M

관계형 DB는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 연결테이블을 추가하여 1:N, N:1로 풀어내야 한다.
객체는 컬렉션을 사용하여 객체 2개로 다대다 관계가 가능하다.
@JoinTable로 연결 테이블 지정 가능
다대다 매핑으로 생기는 중간 테이블에 매핑 정보만 들어가고 추가 정보를 넣을 수 없기 때문에 사용하기가 힘들다.

따라서 N:M을 1:N, N:1로 바꾸고
(@ManyToMany > @OneToMany + @ManyToOne)
중간에 매핑 테이블을 엔티티로 만들어야 한다. (연결 테이블을 엔티티로 승격)

profile
배운것을 기록하자

0개의 댓글