Spring으로 프로젝트 중,
N:1 매핑을 어떻게 처리 해야하나 고민이 들어서 양방향 매핑과 단방향 매핑에 대해서 알아보았습니다.
단방향 매핑이란 무엇인가?
위 DB Table을 보면 BOOK에서 bookinfo_id(외래키)로 BOOKINFO를 조회 할 수 있습니다.
그리고, BOOKINFO에서도 bookinf_id로 BOOK을 조회 할 수 있습니다.
그래서, DB Table을 양방향 관계라고 합니다.
DB Table이 아닌 객체 관계에서 보면 BOOK와 BOOKINFO가 서로에 대해서 참조하게 되면 양방향. BOOK 한 쪽에만 넣어주면 단방향입니다.
스프링부트에서 BOOK Entity에 위와 같이 @ManyToOne로 설정합니다.
@JoinColumn(name)은 현재 엔티티(테이블)에서 조인의 대상으로 사용할 컬럼의 이름을 지정하는 어노테이션입니다. 이는 생략이 가능한데, 생략 시 (필드명)_(참조하는 테이블의 컬럼명)으로 설정됩니다.
스프링에서는 양방향 매핑을 단방향 매핑 2개로 구현합니다.
이 처럼 BOOKINFO Entity에서 @OneToMany로 Book과 연결시키면 N:1 양방향 매핑이 완성됩니다.
양방향 연관관계에서는 주인이라는 개념이 있습니다.
N:1 관계에서는 N이 주인이 됩니다. 즉, 여기서는 BOOK이 주인입니다.
관계에서 주인이 있어야 하는 이유는 간단합니다.
BOOK에는 외래키가 있기 때문에, BOOK에 TEAM을 추가하는 것은 BOOKINFO 객체에 영향을 주지 않습니다. 하지만, BOOKINFO에서 BOOK을 추가하려면 BOOK의 정보가 수정됩니다.
이러면, BOOKINFO Entity로 BOOKINFO Table 뿐 아니라 BOOK Table의 값도 수정되므로 오류가 날 가능성이 많아집니다. 그래서 JPA에서는 이러한 문법이 불가능합니다.
그리하여 양방향 관계에서 주인을 정해서 한 쪽에서만 외래키를 관리 할 수 있도록 한 것입니다.
여기서 mappedBy로 주인을 정하고, 외래 키 컬럼과 연결된 BOOK 객체의 필드명을 등록합니다. 즉, BOOK Entity에서 bookInfo라는 이름으로 외래 키를 쓰고 있기 때문에, mappedBy = "bookInfo"로 설정하는 것입니다.