본문 바로가기

SW 공부

[JPA] OneToOne 테이블 설계와 JPA 매핑

테이블 설계

주어진 테이블은 사람테이블, 주소테이블 이고 사람테이블이 접근을 많이 하는 테이블이다. 현재는 1:1 관계이지만 사람:주소=1:N 으로 확장될 가능성이 존재한다.

1:1 로 매핑되는 테이블에서 FK를 어디에 둘것인가?

참고 https://ict-nroo.tistory.com/126

JPA 매핑

일반적인 경우와 마찬가지로 FK를 가지고 있는 연관관계의 주인 엔티티에서 OneToOne 단방향 매핑을 할 수 있다.
매핑된 테이블에서 mappedBy 를 이용하여 양방향 매핑도 가능하다.

지연로딩

FK를 가진 곳에서는 FK에 값이 있으면 연관관계 멤버에 프록시객체를 넣어주고 없으면 null을 넣어줄수 있지만
FK가 없는 반대 엔티티에서는 DB를 조회해야지만 알수 있기때문에 초기값 세팅을 위해 항상 DB를 조회해야한다. 그래서 null 을 넣을지 프록시객체를 넣을지 자체를 위해서라도 DB 조회를 해야하므로 항상 즉시로딩된다.

// 엔티티 코드 (사람 테이블에 주소id(FK) 가 있는 경우)
// 사람테이블
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "주소id")
var v주소: 주소? = null

// 주소테이블
@OneToOne(fetch = FetchType.LAZY, mappedBy = "v주소")
var v사람: 사람? = null

// 조회 코드1
var v사람 = 사람repository.findById(1)
println("-------")
println(v사람.v주소)

// 결과1
// select from 사람 where 사람id = 1
// ------
// select from 주소 where 주소id = ?
// 주소정보

// 조회 코드2
var v주소 = 주소repository.findById(1)
println("-------")
println(v주소.v사람)

// 결과2
// select from 주소 where 주소id = 1
// select from 사람 where 사람id = ?
// ------
// 사람정보

해결방법

단방향매핑만 사용
OneToMany로 매핑해서 1개 row 만 사용

bytecode enchanement 참고 https://kwonnam.pe.kr/wiki/java/hibernate/lazy_to_one