-
jpa(hibernate) OneToMany 연결의 기본값이 JoinTable 인 이유는?AI 와의 대화 2025. 3. 26. 16:20728x90
jpa 에서 두 테이블간 1:M 연관관계를 정의할때, 연결정보를 저장하는 방법이 2가지가 있습니다.
- JoinColumn: 자식 테이블에 외래키(FK)를 두는 방식. (
@JoinColumn
사용) - JoinTable: 별도의 중간 테이블을 만들고 거기에 외래키(FK)를 두는 방식. (
@JoinTable
사용)
일반적으로 자식 테이블에 외래키를 두는 JoinColumn 방식을 많이 사용합니다. 그런데 jpa 에서는 기본값이 JoinTable 방식으로 지정되어 있습니다.
jpa 1:M 연관관계를 관련 설정법을 웹 검색해보면, 거의 대부분, 기본값인 JoinTable 방식의 문제점을 지적하면서 JoinColumn 방식으로 변경하는 방법을 알려줍니다.
저는 여기서 의문이 생겼습니다. 일반적으로 알고 있는 것도 JoinColumn 방식이고, 대부분의 개발자가 JoinTable 의 단점에 대해서 이야기 하며, JoinColumn 방식을 선호합니다. jpa 스팩 개발자들도 그걸 모르지 않을텐데, 왜 굳이 JoinTable 방식을 기본으로 지정했을까요? 이와 관련된 질문을 chatGPT 에게 물어본 결과를 요약해 봅니다.
먼저, 이번에 확인해본 결과, 정확하게 말하면 OneToMany 단방향 연결에만 JoinTable 이 기본입니다. 그외에 ManyToOne 단방향이나 양방향(OneToMany + ManyToOne) 연결은 JoinColumn 이 기본입니다.
질문1: hibernate 에서 OneToMany 단방향 관계를 정의할때, 대부분 선호하는 JoinColumn 방식을 사용하지 않고, JoinTable 방식을 기본으로 사용할까?
OneToMany 단방향이란, 부모테이블은 자식테이블에 대해서 알고 있지만, 자식 테이블은 부모 테이블에 대해서 알필요가 없는 상태를 말합니다. 그런데 JoinColumn 방식은 자식 테이블에 외래키(FK) 칼럼을 추가해야 하기때문에 단방향이라는 조건과 어울리지 않게 됩니다.
JoinTable 방식은 조인 정보를 별도의 테이블에서 관리하므로, 부모와 자식 테이블의 스키마가 서로 독립적으로 유지됩니다. 이렇게 되면 부모는 자식을 참조하지만 자식은 부모를 참조하지 않아야 하는 OneToMany 단방향 이라는 스팩을 제대로 구현할 수 있게 됩니다.
즉 단방향관계라는 jpa 명세를 충실하게 구현하기 위해 JoinTable 을 기본 방식으로 사용했다고 할 수 있습니다. 단방향이라도 JoinColumn 방식을 지정할 수는 있지만 명시적으로는 권장하지 않습니다.
질문2: JoinTable 과 JoinColumn 두 방식의 퍼포먼스는 어떤 차이가 있을까?
JoinTable 방식은 중간 테이블을 한번 더 조인(join)해야 하기 때문에 단순 외래키(FK) 접근 방식인 JoinColumn 방식보다 추가적인 탐색비용이 발생합니다. 쓰기 작업또한 중간테이블에 삽입, 삭제 작업이 추가로 발생하므로 더 복잡해 집니다.
질문3: 위의 답변을 고려할때 너가 추천하는 테이블간 연관관계 매핑방법은 어떤거야?
단방향, 양방향 관계 일반적인 추천
가능하면 ManyToOne 단방향 + JoinColumn 을 기본으로 하고, 필요하면 OneToMany 양방향을 추가하는 방식이 가장 효율적인 선택입니다. OneToMany 단방향 + JoinTable 관계는 가급적 피하는 것이 좋습니다.
양방향 관계를 사용할 경우 불필요한 fetch 를 막기 위해
FetchType.LAZY
를 명시적으로 설정하는것이 유리합니다.전체 대화 기록: https://chatgpt.com/share/67e24fb7-4688-8001-b0dc-5612c565b2f1
- JoinColumn: 자식 테이블에 외래키(FK)를 두는 방식. (