[JPA] mappedBy 이해하기

2021. 11. 16. 09:03개발/JPA

샘플 코드를 통해 mappedBy에 대해 이해한다. ( 잘못 설명된 부분 있으면 댓글 달아주세요 )

 

 

테이블 구조


이전 포스팅과 같이 테이블을 설계했다.

테이블

 

물리 테이블 조회

 

 이전 포스팅에서 User Entity의 portfolio 필드에 @OneToOne 옵션을 추가함으로써 사용자 정보 호출시 포트폴리오 정보도 함께 조회할 수 있도록 했다. 이번엔 반대로 포트폴리오 정보 호출시 사용자 정보를 함께 호출 할수 있도록 해보자. 핵심은 TABLE_PORTFOLIO 테이블에 user_id라는 PK 컬럼을 만들지 않는다는 것이다.

이전에 작성한 User Entity

 

 

@OneToOne 추가


 먼저 Portfolio Entity에 User 클래스 타입의 필드를 추가한다. Portfolio Entity와 User Entity는 1대1 관계를 가지므로 @OneToOne 어노테이션을 추가한다.

User 클래스 타입의 필드 추가

 

아래와 같이 실행 코드를 작성했다.

 일단 위 상태에서 실행하면 에러가 발생하는데 에러로그의 쿼리문을 보면 TABLE_PORTFOLIO에 존재하지도 않는 user_user_id라는 컬럼에 데이터를 Insert를 하려다가 에러가 발생했다. 

 

 

hbm2dd.auto를 create로 셋팅하고 실행


추가적인 테스트를 해보자.

 프로그램 실행시 모든 테이블을 드랍하고 필요한 테이블과 컬럼을 직접 생성하도록 하기 위해 persistence.xml에서 Hibernate의 속성중 하나인 hbm2ddl.auto의 value를 create로 설정한다.

persistence.xml

 위 처럼 설정하고 프로그램을 실행하면 물리 테이블이 다음과 같이 생성되는데 TABLE_PORTFOLIO에 전혀 예상치 못한 user_user_id 컬럼이 생성된다. @OneToOne()만 있으면 JPA는 해당 필드를 채우기 위한 컬럼이 물리테이블에 존재한다고 판단한다. 

DDL

 

mappedBy 적용


앞서 봤던 문제를 해결하기 위해서 @OneToOne의 mappedBy 파라미터를 사용해야한다. 

mappedBy는 정의에서도 알수 있듯이 해당 필드의 소유자가 누구인지 알려주기 위한 파라미터다. 

 

 아래와 같이 작성하면 Portfolio Entity에 있는 user 필드의 주인은 반대편(User Entity)의 portfolio 필드라는것을 의미한다. 따라서 Portfolio Entity를 조회할때 TABLE_USER의 외래키인 portfolio_id와 Join을 걸어서 Portfolio Entity의 user 필드를 채운다.

 

다시 코드를 실행해보자.

 

 Portfolio Entity 정보만 조회하는 em.find를 작성했음에도 DB로 날라가는 쿼리를 보면 Join을 통해 사용자 정보를 함께 조회하는 모습을 확인할 수 있다.

 

Account Entity 추가


또다른 테스트를 위해 Account Entity를 하나 만든다. 이것도 좀 이상하긴 하지만 "사용자마다 계좌를 하나씩만 가질 수 있다"고 가정한다.

 

테이블 간의 관계는 다음과 같이 작성될 수 있다.

테이블 관계

 

Account Entity를 작성한다.

Account Entity

User Entity에서 Account Entity 정보를 조회하기 위한 코드를 작성한다. ( Line 16~18 )

User Entity

실행 코드를 작성한다.

정상적으로 실행이된다.

 

 

실수코드 작성하기


 여기서 Portfolio Entity에서 실수로 mappedBy를 portfolio 필드가 아닌 account 필드로 지정하면 어떻게 쿼리가 날라가는지 보자. ( Line 16 )

Portfolio Entity

 

 Portfolio Entity에 있는 user 필드에 데이터를 채우려고 할때 TABLE_USER의 portfolio_id 컬럼으로 Join을 거는게 아닌 TABLE_USER의 account_id컬럼을 Join key로 사용해버린다. 

 

 

 

 

'개발 > JPA' 카테고리의 다른 글

[JPA] @ManyToOne, @OneToMany 이해하기  (0) 2021.11.29
[JPA] 단방향 @OneToOne , @JoinColumn  (0) 2021.11.11