본문으로 건너뛰기
Advertisement

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 쿼리를 매우 효율적으로 날립니다.

이러한 직관적이고 강력한 패턴 덕분에 백엔드 개발 생산성이 배가됩니다.

Advertisement