Spring/Spring Data JPA

[Spring Data JPA] 3-3. Custom Repository Implementations

noahkim_ 2024. 8. 2. 17:56

1. Customizing

Interface: Custom Repository 

interface CustomizedUserRepository {
  void someCustomMethod(User user);
}

 

Implements: Custom Repository Interface (High Priority)

  • postfix: Impl
class CustomizedUserRepositoryImpl implements CustomizedUserRepository {

  @Override
  public void someCustomMethod(User user) {
    // 사용자 정의 구현 내용
  }
}

 

Extends: CrudRepository

interface UserRepository extends CrudRepository<User, Long>, CustomizedUserRepository {
  // 기본 CRUD 메서드와 사용자 정의 메서드 선언
}

 

Extends: SimpleJpaRepository

  • 기본 클래스로 작동
  • JpaEntityinformation, EntityManager 사용 가능
class MyRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> {

  private final EntityManager entityManager;

  MyRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager entityManager) {
    super(entityInformation, entityManager);
    this.entityManager = entityManager;
  }

  @Transactional
  public <S extends T> S save(S entity) {
    // 커스텀 구현 내용
    return super.save(entity); // 예시로 기본 save 메서드 호출
  }
}

 

JpaContext

  • 도메인 타입을 관리하는 EntityManager 얻음
class UserRepositoryImpl implements UserRepositoryCustom {

  private final EntityManager em;

  @Autowired
  public UserRepositoryImpl(JpaContext context) {
    this.em = context.getEntityManagerByManagedType(User.class);
  }

  // 커스텀 메서드 구현
}

 

2. Setting

자동 감지

@EnableJpaRepositories(
    repositoryImplementationPostfix = "MyPostfix",
    repositoryBaseClass=MyRepositoryImpl.class
)
class Configuration { ... }
  • (attribute) repositoryImplementationPostfix: Custom Repository Impl 감지
  • (attribute) repositoryBaseClass: Custom Repository 기본 클래스 감지

 

수동 배선

@Qualifier
class MyClass {
  MyClass(@Qualifier("userRepositoryImpl") UserRepository userRepository) {
    ...
  }
}

 


출처