-
[Spring JPA] @OneToOne 에서 @MapsId 를 이용해 컬럼갯수를 줄여보자!Back End/Spring Data JPA 2022. 1. 26. 15:11
JPA에서는 연관관계를 맺으면 연관관계를 맺은 두 테이블 중 하나에 FK필드를 디폴트로 생성하게 된다.
@MapsId를 이용해 디폴트로 생성 될 컬럼을 줄이고, 그 값을 PK에 주입할 수 있다.
(그리고 두 테이블은 FK로 연결되어 있지 않다.)
# 엔티티 구조
# 테스트 코드 및 결과
mainEngine의 id=1 은 Car의 PK값인 1을 주입 받은 것이다. (보기좋게 Car의 Id를 직접세팅해줄 걸 그랬다.)
select쿼리를 보면 join 이 없다.
이를 통해 mainEngine의 id는 foriegnKey 설정이 안되있음을 짐작할 수 있다.
(JPA는 FK로 연결된 객체는 join문으로 가져온다.)# DDL-auto 로 생성된 테이블 구조
Hibernate: create table car ( id bigint generated by default as identity, primary key (id) ) Hibernate: create table main_engine ( id bigint not null, engine_info varchar(255), primary key (id) )
역시 foreignKey constaraint 구문이 발생하지 않는다...
# 언제 적용할까?
자동차에는 엔진이 필요하며 @OneToOne 관계이다.
자동차가 생성되기 전까지는 엔진이 생성될 수 없다.
즉, 엔진은 자동차에 종속적이다.
이러한 @OneToOne 관계에서는 FK를 생성할 테이블의 PK를 FK로 설정해도 무방하다.
엔진의 PK 값에 자동차의 PK값을 넣어도 아무 문제가 없다. (Unique 하다.)
만약 엔진이라는 데이터가 자동차가 없어도 생성되는 경우에는 이런식으로 구성할 수 없고, 구성해서도 안된다.
# 의문점
1. join으로 한번의 select를 보내는것이 좋을까? select 2개를 내보내는 것이 좋을까?
무엇이 성능이 좋은지는 추후 공부를 통해 알아보도록 하자 ㅠㅠ..
2. FK로 연결되지 않은 테이블관계는 안전한 것일까?
ERD 공부했던지가 꽤 되어서 이렇게 구성하는게 맞는지도 의문이 든다.
무튼 @MapsId는 id주입에 초점이 맞춰져있고
FK설정은 내가 나중에 따로 해도 되니 @MapsId의 기능만 익혀두자.728x90'Back End > Spring Data JPA' 카테고리의 다른 글
[Spring JPA] Interface-Based Projection doesn't work. (0) 2022.01.28 [Spring JPA] 복합키(PK)의 성능을 알아보자! (0) 2022.01.26 [Spring JPA] @OneToMany 에서 @MapsId 사용하기 (2) 2022.01.24 [Spring JPA] referencedColumnName 사용시 주의점 (Feat. 프록시) (0) 2022.01.21 [Spring JPA] 상속관계 매핑의 문제점 (@Inheritance) (0) 2022.01.19