2024. 10. 19. 17:50ㆍSpring 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 |