• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

pk가 아닌 컬럼과 join으로 인한 문제

21.07.30 15:29 작성 조회수 173

1

해당 질문에 대한 답변에 대한 상세 질문 드립니다.

이전질문

https://www.inflearn.com/questions/255380

이전질문 답변

안녕하세요. Mincheol Ji님

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

------------------------------------------------------------------------------------------------

https://drive.google.com/file/d/1UzfBJvvymO-zxou_Ue3SKcLka_i933aZ/view?usp=sharing

샘플 프로젝트를 작성하여 만들었습니다.

1. 해당 스프링 부트를 싱행하여 localhost:8080/save rest api를 통해 데이터가 입력됩니다.

2. localhost:8080/select rest api를 통해 동록된 팀 & 멤버 정보를 조회합니다.

해당 

문제점

 List<Team> teams = teamRepository.findAll();

위의 코드를 통해

team을 쿼리하여 팀 객체에 있는 맴버 객체를 가져올때 batch fetch size 옵션을 통하여 in쿼리를 통해 member쿼리로 member 정보를 가지고 옵니다.

여기까지는 문제가 없으나 member에 대한 in쿼리가 실행되고 member의 team에 대한 쿼리가 각각 실행되는 문제가 있습니다.

@ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)

@JoinColumn(name = "TEAM_ID", referencedColumnName = "TEAM_ID", insertable = false, updatable = false)

private Team team;

member 엔티티에서 조인 컬럼이 pk가 아닌 컬럼과 조인을 하여 양방향을 해주었을때 이러한 문제가 나타나고 있습니다.

pk가 아닌 컬럼과 조인을 해야하는 상황이 있는데 어떻게 해야할까요?

답변 1

답변을 작성해보세요.

2

안녕하세요. Mincheol Ji님

referencedColumnName을 PK가 아닌 곳을 사용하게 되었을 때 한계입니다.

JPA는 PK를 기반으로 영속성 컨텍스트를 관리합니다.

따라서 PK가 아닌 곳을 referencedColumnName으로 사용하게 되면 영속성 컨텍스트를 통한 1차 캐시의 사용이 어렵습니다. 따라서 추가 조회가 발생할 수 있습니다.

감사합니다.