강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của joooo
joooo

câu hỏi đã được viết

Thực hành! Dữ liệu Spring JPA

Tạo truy vấn theo tên phương thức

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

Viết

·

46

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

Câu trả lời 1

0

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

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

1. existsByUserIdAndProjectId(Long userId, Long projectId)

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

2. existsByUserAndProject(User user, Project project)

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

어떤 방법이 적절한가요?

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

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

추가 참고 자료

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

Hình ảnh hồ sơ của joooo
joooo

câu hỏi đã được viết

Đặt câu hỏi