스프링부트

[JPA] 관계형 데이터 베이스 매핑 (One To One)

이영재의오른발 2023. 3. 30. 14:42
반응형

JPA를 사용하는 애플리케이션에서 테이블의 연관관계를 엔티티 간의 연관관계로 표현할 수 있습니다. 하지만 객체와 테이블의 성질이 달라 정확한 연관관계를 표현할 수 없기 때문에 이런 제약을 보완하며 연관관계를 매핑하고 사용하는 방법에 대해 알아보겠습니다.

 

 

일대일 단방향 매핑

 

위 그림은 일대일 관계를 만들기 위해 만든 두개의 엔티티 user 테이블과 userinfo 테이블입니다.

 

user 에 대해서는 하나의 userinfo만 매핑되므로 일대일 관계입니다.

 

 

userInfo 엔티티에 OneToOne 애노테이션을 사용해 일대일 관계를 매핑해준 뒤 테스트 코드를 작성해보겠습니다.

 

 

 

 

 

 

 

테스트코드의 실행결과로 위와같은 로그가 찍혔습니다.

 

userInfo를 조회했는데 user 엔티티도 같이 조회가 된 것입니다.

 

엔티티를 조회할 때 연관된 엔티티도 함께 조회되는 것을 즉시 로딩 이라고 합니다.

 

 

 

일대일 양방향 매핑

위에서 일대일 단방향 매핑에 대해 알아보았으니 일대일 양방향 매핑에 대해 알아보겠습니다.

 

 

일대일 양방향 매핑은 일대일 단방향 매핑이 두개 있는 것이라 생각하면됩니다.

 

userInfo 엔티티에서 OneToOne 애노테이션을 적용한 것 처럼 user 엔티티에서 똑같이 OneToOne 애노테이션을 적용합니다. 

 

이후 테스트 코드를 다시 실행해 보면 아래와 같은 로그가 찍힙니다.

 

 

 

처음과 달리 양쪽에서 외래키를 가지고 left outer join 을 두번 하는 것을 볼 수 있습니다. 이는 효율성이 떨어지는 결과를 초래하기 때문에 한쪽 테이블에서만 외래키를 바꿀 수 있도록 적용해야합니다.

 

이 때 사용되는 속성이 mapped by입니다.

 

 

위와같은 설정을 해주면 이제 연관관계의 주인이 userInfo 엔티티가 되는 것 입니다.

 

 

이후 다시 테스트를 실행하면 left outer join 문이 한번만 실행되었습니다.

 

이를통해 user 테이블과 userInfo 테이블 연관관계의 주인이 userInfo 인 것을 알 수 있습니다.

 

 

 

728x90
반응형