9.3 JpaRepository와 기본 CRUD
엔티티 매핑을 마쳤다면, 이제 데이터베이스에 이 엔티티를 CRUD(Create, Read, Update, Delete) 할 수 있게 해주는 마법 같은 인터페이스인 JpaRepository 를 소개합니다.
JpaRepository 인터페이스 상속
개발자는 스프링 데이터 JPA가 제공하는 JpaRepository<엔티티 타입, PK 타입> 인터페이스를 상속받는 인터페이스를 선언하기만 하면 됩니다.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
// 클래스가 아니라 인터페이스입니다.
@Repository // 생략 가능합니다.
public interface UserRepository extends JpaRepository<User, Long> {
}
이렇게 짧은 코드만으로 스프링이 런타임에 이 인터페이스의 구현체(프록시 객체)를 직접 만들어 스프링 빈(Bean)으로 등록해 줍니다. 따라서 서비스 계층(Service Layer)에서 이 UserRepository를 주입받아 바로 사용할 수 있습니다.
기본 CRUD 메서드 활용
JpaRepository를 상속받으면 자동으로 아래와 같은 엄청난 메서드들을 무료로 사용할 수 있습니다. SQL을 전혀 알 필요가 없습니다!
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public void testCrud() {
// [C] 생성 및 [U] 수정 (save: 기본 키가 없으면 INSERT, 있으면 UPDATE 수행)
User newUser = new User("admin@test.com", "1234", "admin");
userRepository.save(newUser);
// [R] 단일 조회 (findById: PK를 기준으로 검색, Optional 반환)
Optional<User> foundUser = userRepository.findById(1L);
// [R] 목록 조회 (findAll: 모든 데이터 조회)
List<User> userList = userRepository.findAll();
// [D] 삭제 (delete: 엔티티나 PK를 기준으로 레코드 삭제)
userRepository.deleteById(1L);
}
}
이 메서드들은 실행 시점에 아주 최적화된 SQL(예: SELECT * FROM users WHERE id = ?)로 변환되어 실행됩니다.
쿼리 메서드 (Query Methods)
위의 기본 메서드 외에도 메서드 이름 규칙(Naming Convention)만 지어주면 이름 자체가 쿼리로 변환되는 놀라운 기능이 제공됩니다.
List<User> findByEmail(String email):email필드가 파라미터와 일치하는 유저들을 조회합니다.List<User> findByNicknameContaining(String keyword):nickname중에 특정 키워드가 포함(LIKE)된 데이터를 찾습니다.boolean existsByEmail(String email): 이메일 중복 체크 시SELECT COUNT쿼리를 매우 효율적으로 날립니다.
이러한 직관적이고 강력한 패턴 덕분에 백엔드 개발 생산성이 배가됩니다.