inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 데이터 JPA

메소드 이름으로 쿼리 생성

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

64

치즈볼

작성한 질문수 8

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.
=============================

안녕하세요.
Spring Data JPA에서 연관관계 필드에 대한 exists 메서드 사용 시, 아래 두 방식 중 어떤 방식이 더 적절한지 궁금합니다.

ProjectMember 엔티티는 아래처럼 Project, User와 연관되어 있습니다.

public class ProjectMember {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "project_id", nullable = false)
    private Project project;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}


사용자가 특정 프로젝트에 포함되어 있는지 확인하려고 할 때, 아래 두 가지 방식을 테스트해봤습니다.

1. 식별자 사용: boolean existsByUserIdAndProjectId(Long userId, Long projectId)

 

2. 엔티티 사용: boolean existsByUserAndProject(User user, Project project)


결론: 이 경우 두 방식 중 어떤 것을 사용하는 것이 더 좋은 선택인가요?

java spring spring-boot jpa

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 치즈볼님.

Spring Data JPA를 사용할 때 연관관계 필드를 기준으로 존재 여부를 확인하는 방법에 대한 질문을 주셨네요. 두 가지 방법 중 각각의 이점과 단점을 이미 잘 정리해주셨습니다. 이에 대해 조금 더 설명드리겠습니다.

1. existsByUserIdAndProjectId(Long userId, Long projectId)

  • 장점: 단순히 ID 값만 사용하기 때문에 성능적으로 유리하며, 코드가 깔끔하게 유지될 수 있습니다.
  • 단점: 말씀하신 대로 JPA의 내부에서 발생하는 불필요한 조인이 성능을 저하시킬 수 있습니다.

2. existsByUserAndProject(User user, Project project)

  • 장점: 불필요한 조인을 피할 수 있어 성능 최적화에 도움이 됩니다.
  • 단점: 하지만, 각 엔티티를 먼저 조회해야 하므로 다른 방식 혹은 ORM에서 제공하는 캐싱 등의 기능을 잘 활용하면 도움이 될 수 있지만 비용이 발생합니다.

어떤 방법이 적절한가요?

일반적으로 “충분히 ID만으로도 조작이 가능하고 성능 이슈가 중요하지 않다면 ID로 처리하는 방법”이 선호됩니다. 그러나 여러분의 시스템에서 성능이 중요한 이슈라면 두 번째 방법을 통해 조인 없이 데이터를 가져오는 것이 더 나을 수 있습니다.

만약 자주 호출되는 기능이고, 특히 성능이 중요한 곳이라면 프로젝트, 사용자 엔티티를 캐시로 가져오기 등의 방식을 도입해 볼 수도 있습니다. 이러한 전략은 선택 사항이며, 이를 통해 성능과 유지보수의 균형을 맞출 수 있습니다.

추가 참고 자료

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

existsByUserIdAndProjectId vs existsByUserAndProject 중 어떤 방식이 적절할까요?

0

99

3

MemberRepository 구현체

0

54

1

pdf 표현 질문드립니다.

0

59

1

로그가 남지 않는 문제.

0

78

1

테스트 라이브러리가 강의는 junit4가 맞나요??

0

67

2

pdf 파일과 차이점이 있는 것같은데 문제 없나요?

0

68

2

@PrePersist, @PreUpdate 호출 시점 질문드립니다.

0

87

2

Sort 인터페이스는 잘 사용 안하나요?

0

50

1

스캔대상 질문드립니다.

0

45

1

하이버네이트6에서의 최적화에 이은 질문

0

81

1

save() vs saveAndFlush DB 통신 횟수

0

50

1

순수 JPA 리포지토리 코드 수정부분

0

85

2

bulk연산 후 flush하는 이유를 모르겠어요

0

147

3

bulk insert 질문입니다.

0

174

2

교만했던 것 같아요.

0

142

1

RESTful 강의는 안하시는 건지 궁금합니다.

0

143

2

동적 테이블에 대한 질문

0

84

1

영속성 전이와 연관관계

0

128

2

강의 10:25 질문

0

71

1

단건 update 질문

0

94

2

엔티티 와 도메인의 경계

0

124

1

UsernameOnlyDto 타입 type mismatch 오류

0

114

1

Projection 개념과 데이터 전달과정에 대해 질문 있습니다.

0

131

1

JUnit4, JUnit5 충돌 문제

0

177

2