🧩 Custom Repository

정의

Custom RepositorySpring Data JPA의 기본 Repository 기능에 사용자 정의 조회 로직을 추가하는 확장 방식이다. JpaRepository에 직접 넣기 어려운 복잡한 쿼리나 특수 로직을 별도 구현체로 분리할 때 사용한다.

기본 CRUD는 JpaRepository가 맡고, 추가 조회나 복잡한 조건은 Custom Repository가 담당하는 구조로 많이 사용한다.

🧩 역할

  • 기본 Repository 기능을 확장한다
  • 복잡한 조회 로직을 분리한다
  • Querydsl, JPQL, Native Query를 함께 사용할 수 있다
  • 서비스 계층을 단순하게 유지하는 데 도움이 된다

🛠 구현 방법

커스텀 인터페이스 정의

public interface CustomUserRepository {
    List<User> findActiveUsers();
}

구현 클래스 작성

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.stereotype.Repository;
import java.util.List;
import static com.example.domain.QUser.user;

@Repository
public class CustomUserRepositoryImpl implements CustomUserRepository {

    private final JPAQueryFactory queryFactory;

    public CustomUserRepositoryImpl(JPAQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    @Override
    public List<User> findActiveUsers() {
        return queryFactory.selectFrom(user)
                .where(user.isActive.eq(true))
                .fetch();
    }
}

JpaRepository와 결합

public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
}

🧩 특징

  • 구현 클래스는 보통 인터페이스 이름 뒤에 Impl을 붙인다.
  • Spring Data JPA가 자동으로 구현체를 연결한다.
  • Querydsl과 함께 쓰면 동적 조회를 깔끔하게 분리할 수 있다.
  • 기본 CRUD와 커스텀 조회를 한 Repository에서 함께 사용할 수 있다.

⚠️ 주의사항

  • 구현 클래스 이름 규칙을 맞춰야 자동 연결된다.
  • 커스텀 로직이 지나치게 많아지면 Repository 책임이 커질 수 있다.
  • 조회 로직과 비즈니스 로직은 가능한 한 분리하는 것이 좋다.
  • 단순 조회는 굳이 Custom Repository로 분리하지 않아도 된다.

📌 정리

  • Custom Repository는 Spring Data JPA의 Repository를 확장하는 방식이다.
  • 복잡한 조회나 Querydsl 기반 로직을 분리할 때 유용하다.
  • JpaRepository와 함께 사용하면 기본 기능과 확장 기능을 같이 가져갈 수 있다.

연결문서

댓글남기기