DEV/Spring

[JPA] @JoinColumns 두 개 이상의 조인 컬럼 설정하기

2023. 8. 6. 19:12
목차
  1. 1. 구현
  2. 2. 실행
  3. 3. 추가
  4. 4. 참고 문서

Entity 연관 관계 설정을 하다보면,

두 개 이상의 조인 관계를 나타내야하는 경우가 있다.

 

 

만약에 서비스 사용자(Member)와 게시글(Board) Entity가 존재하고,

게시글은 사용자의 고유 아이다(id)와 이름(name) 을 외래키(foreign key)로 가지고 있다고 해보자.

 

Member와 Board는 1:N 의 관계를 가질때,

Entity 는 아래와 같이 구성할 수 있을 것이다.

 

 

1. 구현

[Entity] Member.class

@Entity
@NoArgsConstructor
@Getter
@ToString
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column
    private String name;
    @Column
    private Integer age;

    @Builder
    public Member(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

 

[Entity] Board.class

@Entity
@NoArgsConstructor
@Getter
@ToString
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column
    private String title;
    @Column
    private String content;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name = "member_id", referencedColumnName = "id"),
            @JoinColumn(name = "member_name", referencedColumnName = "name")
    })
    private Member member;


    @Builder
    public Board(Long id, String title, String content, Member member) {
        this.id = id;
        this.title = title;
        this.content = content;
        this.member = member;
    }
}

 

Board 클래스에 Member 클래스의 연관관계를 표기할 때,

@JoinColumns() 어노테이션을 이용하면 두 가지 이상의 컬럼을 연결 할수있다.

  • name : board 테이블에 표기될 member 테이블 컬럼 이름을 표기
  • referencedColumnName : member 테이블에 정의된 컬럼 이름

 

 

2. 실행

애플리케이션을 실행 시켜 DB에 스키마 생성(create) 시키면,

아래 이미지처럼 2개의 컬럼이 FK 로 연결된 걸 볼 수 있다.

 

 

저장된 데이터를 조회 시,

Board 테이블 조회와 같이 join table로 Member 테이블의 id와 name 값을 기준으로 조회하는 것을 볼 수 있다.

 

 

 

3. 추가

구현 상 어려운 점은 없을 건데....

 

여기서 드는 궁금증!

'FetchType을 Lazy로 Member 조회 없이 가져오는가?' 였다.

 

그래서 Fetch Type 을 Lazy 로 바꾸고 조회를 진행해 보았다.

 

 

진행 결과,

FetchType.Lazy 로 설정하여도 Member의 name 컬럼을 찾아야하기에,

한번 더 Member를 select 하는 쿼리가 나가는 것을 볼 수있었다.

 

만약 컬럼이 하나만 연결되었다면

(If, Member id 컬럼)

 

해당 객체를 호출하지 않는 이상 Member를 조회하지 않았겠지만

연결된 컬럼이 name 도 포함되어있기에 함께 조회되는 것을 볼 수 있었다.

 

 

Jpa 연관관계 설계 상,

디폴트 값이 아래와 같이 설정 되어 있다.

 

ToOne 은 Fetch Eager

ToMany 는 Fetch Lazy

 

 

굳이 ManyToOne 에서 Lazy 를 하는 경우가 아니라면 조회에 문제는 없겠지만

 

혹시 여러 컬럼을 연결하고,

Lazy 로 설정하여 쿼리가 두번 나가고 있지는 않는지 점검해보는건 어떨까한다.

 

 

4. 참고 문서

https://stackoverflow.com/questions/56327228/avoid-jpa-fetch-eager-with-join-table

 

Avoid jpa fetch eager with join table

I have the next classes: A class User: @Entity @JsonRootName(value = "user") @Table(name = "web_users", schema = "t_dw_comercial") public class User { @Id private int userId; private S...

stackoverflow.com

 

728x90

'DEV > Spring' 카테고리의 다른 글

[Spring] WebClient 란?  (0) 2023.08.30
[Spring] Data Rest Event 사용하기  (0) 2023.08.22
[Spring] 간편로그인 구현하기 (feat. 구글, 카카오)  (2) 2023.07.28
[Spring] Spring Security 란?  (1) 2023.07.26
[Spring] Exception Handler (with. Spring Data Rest)  (1) 2023.07.12
  1. 1. 구현
  2. 2. 실행
  3. 3. 추가
  4. 4. 참고 문서
'DEV/Spring' 카테고리의 다른 글
  • [Spring] WebClient 란?
  • [Spring] Data Rest Event 사용하기
  • [Spring] 간편로그인 구현하기 (feat. 구글, 카카오)
  • [Spring] Spring Security 란?
l-eazzy
l-eazzy
귀찮고 귀찮은데 귀찮기 싫어서 개발하는 귀찮은 개발자.
l-eazzy
귀찮은 개발자의 블로그
l-eazzy
전체
오늘
어제
  • 분류 전체보기 (86)
    • DEV (66)
      • Language (3)
      • Spring (22)
      • Node (4)
      • Flutter (1)
      • Container (7)
      • Cloud (5)
      • DataBase (2)
      • Airflow (2)
      • On-premise (1)
      • ErorrBox (8)
      • Etc (11)
    • REVIEW (7)
      • IT (7)
    • Daily (10)
      • 출사 (1)
      • 그냥 (1)
      • 오늘의 점심 (7)
    • 아무거나 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오블완
  • QueryDSL
  • 강남
  • Spring
  • JPA
  • 티스토리챌린지
  • Airflow
  • AWS
  • springboot
  • docker

최근 댓글

최근 글

hELLO · Designed By 정상우.
l-eazzy
[JPA] @JoinColumns 두 개 이상의 조인 컬럼 설정하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.