궁금한 점
- 연관 관계가 있는 엔티티의 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);
}
}
댓글