Defining Repository Interfaces

2024. 10. 19. 17:50Spring Boot/Spring Data JPA

📌 Spring Data JPA Repository 인터페이스 정의 및 활용 정리

Spring Data에서는 Repository 인터페이스를 정의하여 데이터 액세스 로직을 쉽게 관리할 수 있습니다.
아래에서 CRUD 인터페이스의 종류와 활용법, 다중 모듈 사용 시 유의할 점 등을 정리해보겠습니다. 🚀

🎯 1. Repository 인터페이스 정의

Repository 인터페이스는 특정 도메인 엔티티와 ID 타입을 지정해야 합니다.

🔹 ✅ 기본 Repository 인터페이스

interface UserRepository extends Repository<User, Long> { }

위와 같이 Repository<T, ID> 를 확장하면 CRUD 기능이 기본적으로 제공되지 않습니다.
→ 만약 CRUD 기능을 제공하려면 CrudRepository 또는 JpaRepository 등을 사용해야 합니다.

🎯 2. Repository 인터페이스 확장 방법

Spring Data에서 제공하는 다양한 Repository 인터페이스를 선택할 수 있습니다.

🔹 ✅ 기본 CRUD 인터페이스

인터페이스 설명
CrudRepository Create, Read, Update, Delete 기능 제공
ListCrudRepository CrudRepository와 동일하지만, 여러 개의 엔티티 반환 시 List<T> 타입을 사용
ReactiveCrudRepository 리액티브 프로그래밍 지원
RxJava3CrudRepository RxJava3 기반 비동기 지원
CoroutineCrudRepository Kotlin의 Coroutines 지원
PagingAndSortingRepository 페이징 및 정렬 기능 추가
ReactiveSortingRepository 리액티브 정렬 기능 추가

🎯 3. ✅ Repository 예제

🔹 CrudRepository 사용 예시

interface UserRepository extends CrudRepository<User, Long> {
    User findByEmailAddress(EmailAddress emailAddress);
}

위처럼 CrudRepository<User, Long>을 확장하면 기본적인 CRUD 메서드를 사용할 수 있습니다.
→ 추가적으로 findByEmailAddress(EmailAddress emailAddress) 같은 쿼리 메서드를 추가할 수도 있습니다.

🎯 4. ✅ 특정 CRUD 메서드만 선택적으로 노출하기

모든 CRUD 메서드를 제공하지 않고, 특정 메서드만 노출하고 싶을 때 활용할 수 있습니다.

🔹 ✅ @NoRepositoryBean 사용 예제

@NoRepositoryBean
interface MyBaseRepository<T, ID> extends Repository<T, ID> {
    Optional<T> findById(ID id);
    <S extends T> S save(S entity);
}
interface UserRepository extends MyBaseRepository<User, Long> {
    User findByEmailAddress(EmailAddress emailAddress);
}
  • @NoRepositoryBean을 사용하면 Spring Data가 직접 인스턴스를 생성하지 않음
  • findById(…), save(…) 만 사용하고, 불필요한 메서드는 제외 가능

🎯 5. ✅ 여러 개의 Spring Data 모듈 사용

하나의 애플리케이션에서 여러 개의 Spring Data 모듈을 사용할 경우
어떤 모듈에 속하는지 명확히 구분해야 함! 🚨

위 설명에 대한 이해를 얻기 위해서 다음을 참고하세요!

https://sundaland.tistory.com/718

 

Spring Data

✅ Spring Data가 지원하는 기술Spring Data는 ORM (JPA) 뿐만 아니라 NoSQL 데이터베이스도 지원합니다.즉, 관계형 데이터베이스(RDBMS)와 비관계형 데이터베이스(NoSQL)를 모두 쉽게 사용할 수 있도록 해줍

sundaland.tistory.com

 

🔹 📌 모듈을 구분하는 방법

1. 특정 모듈의 Repository 인터페이스 확장

interface MyRepository extends JpaRepository<User, Long> { }

2. 도메인 클래스에 특정 모듈의 어노테이션 추가

@Entity
class Person { … }

@Document
class User { … }

3. Repository 스캔 범위 설정

@EnableJpaRepositories(basePackages = "com.example.jpa")
@EnableMongoRepositories(basePackages = "com.example.mongo")
class AppConfig { }

🎯 6. ✅ 다중 모듈 사용 시 발생하는 문제 및 해결

⚠️ 잘못된 예시: 동일한 엔티티가 여러 모듈의 어노테이션을 가질 때

@Entity
@Document
class Person { … }

interface JpaPersonRepository extends Repository<Person, Long> { … }
interface MongoDBPersonRepository extends Repository<Person, Long> { … }

→ JPA와 MongoDB에서 동시에 사용하려 하면 충돌 발생 💥
해결책: 엔티티를 분리하거나, @EnableJpaRepositories@EnableMongoRepositories로 패키지를 나누기

🎯 7. ✅ Summary

✅ 주요 내용 ✅ 설명
Repository 인터페이스 정의 Repository<T, ID>를 확장하여 기본 저장소 생성
CrudRepository 사용 CRUD 메서드 자동 생성
ListCrudRepository 사용 Iterable<T> 대신 List<T> 반환
ReactiveCrudRepository 사용 리액티브 프로그래밍 지원
@NoRepositoryBean 활용 특정 메서드만 노출하는 기본 Repository 생성 가능
다중 모듈 사용 JpaRepository, @Entity, @Document 등을 명확히 지정해야 함
다중 모듈 충돌 해결 @EnableJpaRepositories, @EnableMongoRepositories 활용

👉 Spring Data Repository를 적절히 확장하고 구성하면, 데이터 접근 로직을 효율적으로 관리할 수 있습니다! 🚀

'Spring Boot > Spring Data JPA' 카테고리의 다른 글

Persisting Entities  (0) 2024.10.19
Configuration  (3) 2024.10.19
Core concepts  (0) 2024.10.19
Getting Started  (0) 2024.10.19
Query Hint  (0) 2023.06.06