본문 바로가기
Spring Framework/JPA

엔티티 저장 시 연관 엔티티의 아이디로만 연관관계 설정하는 법

by 도쿠니 2022. 7. 15.

궁금한 점

  • 연관 관계가 있는 엔티티의 ID를 알고있고 굳이 그 연관 엔티티의 다른 필드를 사용할 필요가 없는 경우에도 Repository에서 해당 엔티티를 찾아서 넣어줘야 하는걸까?
@RequiredArgsConstructor
public class Example {

    private final TeamRepository teamRepository;
    private final MemberRepository memberRepository;

    public void saveMember() {
	      // 팀 아이디를 이미 알고있고 굳이 팀 내부의 다른 필드를 사용할 이유가 없는 경우
				Long teamId = 1;

				Member member = new Member();
				member.setTeam(???); // 멤버에 팀을 외래키(연관관계)로 설정해주어야 하는데 팀 객체를 레파지토리로 찾아와야하나??

				memberRepository.save(member);
    }
}

문제점

@RequiredArgsConstructor
public class Example {

    private final TeamRepository teamRepository;
    private final MemberRepository memberRepository;

    public void saveMember() {
	      // 팀 아이디를 이미 알고있고 굳이 팀 내부의 다른 필드를 사용할 이유가 없는 경우
				Long teamId = 1;

				Member member = new Member();

				Team team = teamRepository.findById(teamId).get(); // 팀을 직접 찾아와 넣어준다.
				member.setTeam(team); 

				memberRepository.save(member);
    }
}
  • 이럴 경우 , select + insert 쿼리 이렇게 두번 쿼리가 발생합니다.
  • 하지만, 일반적으로 db에서 쿼리를 쏠 땐, 외래키만 알면 insert할 때 외래키만 넣으면 되기 때문에 쿼리가 한번 발생합니다.
  • db에서 처럼 할 수 있는 방법이 없을까 고민해봅시다.

해결방법

getReferenceById() 이용

  • 어떠한 객체의 ID 값이 DB에 반드시 존재하고 ID를 제외한 다른 필드에 접근하지 않을 때 사용
  • getOne()getById()Deprecated 되었기 때문에 이 메소드를 사용해야 합니다.
  • 쿼리가 한번만 발생합니다.
@RequiredArgsConstructor
public class Example {

    private final TeamRepository teamRepository;
    private final MemberRepository memberRepository;

    public void saveMember() {
	      // 팀 아이디를 이미 알고있고 굳이 팀 내부의 다른 필드를 사용할 이유가 없는 경우
				Long teamId = 1;

				Member member = new Member();

				Team team = teamRepository.getReferenceById(teamId)// 팀을 직접 찾아와 넣어준다.
				member.setTeam(team); 

				memberRepository.save(member);
    }
}

'Spring Framework > JPA' 카테고리의 다른 글

@GeneratedValue 로 UUID 사용하기  (0) 2022.06.13
Transaction (트랜잭션)  (0) 2022.06.10
엔티티 매핑  (0) 2022.06.10
영속성 관리  (0) 2022.06.10
데이터베이스 방언 (Dialect)  (0) 2022.06.10

댓글