강의

멘토링

커뮤니티

Inflearn Community Q&A

joooo's profile image
joooo

asked

Practical! Spring Data JPA

Generate queries by method name

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

Written on

·

24

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)

  • 단점:
    이 메서드를 실행하면, project_members 테이블에 user_id, project_id FK가 있음에도 불구하고 users, projects 테이블과 불필요한 left join이 발생했습니다.

  • 실행 SQL:


    select pm1_0.id
    from project_members pm1_0
    left join users u1_0 on u1_0.id = pm1_0.user_id
    left join projects p1_0 on p1_
    0.id = pm1_0.project_id
    where u1_0.id = ? and p1_0.id = ?
    fetch first ? rows only;

 

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

  • 장점:
    이 경우에는 조인 없이 where 절에서 FK 컬럼으로 조회되었습니다.

  • 단점:
    하지만, 이 메서드를 사용하려면 서비스에서 userId, projectId 를 이용하여 User와 Project를 추가로 조회해야 한다는 단점이 있습니다.

  • 실행 SQL:


    select pm1_0.id
    from project_members pm1_0
    where pm1_0.user_id = ? and pm1_0.project_id = ?
    fetch first ? rows only;


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

javaspringspring-bootjpa

Answer 1

0

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

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

1. existsByUserIdAndProjectId(Long userId, Long projectId)

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

2. existsByUserAndProject(User user, Project project)

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

어떤 방법이 적절한가요?

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

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

추가 참고 자료

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

joooo's profile image
joooo

asked

Ask a question