JPA를 사용하여 데이터베이스에서 데이터를 조회하고 저장하는데 사용되는 인터페이스입니다. Spring Data JPA는 해당 인터페이스를 제공하며, 개발자가 JPA와 데이터베이스를 상호작용하는 코드를 더 직관적으로 작성할 수 있도록 유도합니다.
JPA Repository 인터페이스는 데이터 액세스 계층에서 사용되며, 개발자가 데이터베이스에 액세스하기 위해 작성해야 할 코드 가이드라인을 제공하여 반복적인 코드를 줄여줍니다. JPA Entity를 기반으로 동적 쿼리를 생성하여 자동으로 데이터베이스 작업을 수행할 수 있어 개발자가 직접 SQL 쿼리를 작성하지 않아도 됩니다.
Spring Data JPA는 다양한 종류의 JPA Repository 메서드를 제공합니다. 기본 CRUD(Create, Read, Update, Delete) 메서드를 제공하며 다양한 쿼리 조건을 사용하는 메서드도 제공합니다.
예시
void getAllTest() {
repository.findAll().forEach(System.out::println);
System.err.println(repository.getReferenceById(1L));
UserData data = repository.findById(1L).orElse(null);
System.out.println(data);
}
repository에 저장된 리스트를 전부 가져올수도, 값 하나를 찾을 수도 있습니다.
JPA Repository는 JPA와 Spring Framework를 함께 사용하여 데이터베이스와 상호작용하는데 유용합니다. 또한 다양한 Query Methods를 사용하여 여러가지 쿼리를 작성할 수 있습니다. 이로인해 개발자는 보다 간결하고 효율적인 코드를 작성할 수 있어 유지보수 및 생산성이 증가를 할 수 있습니다.
1. 복잡한 쿼리의 제약
JPA Repository는 기본적으로 단순한 쿼리를 작성하기에 용이합니다. 데이터베이스가 복잡한 구조 및 비즈니스로직을 쿼리로 작성하려면 어려울 수 있습니다. 이러한 경우 Native Query, QueryDSL 등을 사용하여 복잡한 쿼리를 작성해야 합니다.
2. 예외 처리의 제약
JPA Repository를 사용할 때 발생할 수 있는 예외는 다양합니다. 하지만 해당 예외들에 대한 일관성 있는 처리는 어렵습니다. 예를 들면 데이터베이스에 데이터가 없는 경우에 대한 처리를 일관성 있게 하려면 개발자가 직접 구현해야 합니다.
3. 트랜잭션의 제약
해당 클래스에서 트랜잭션 처리를 위해 @Transactional 어노테이션을 사용합니다. 하지만 해당 어노테이션을 사용하면 어떠한 상황에서 트랜잭션이 시작과 끝을 정확하게 파악하기 어려울 수 있습니다. 이러한 경우 개발자가 직접 트랜잭션 처리를 구현해야 합니다.