스프링 데이터로 데이터 영속성 구현(1)

김우진·2026년 2월 23일

Spring

목록 보기
16/17
post-thumbnail

[Spring] 14. 스프링 데이터(Spring Data)로 데이터 영속성 구현

스프링 데이터는 반복되는 CRUD 코드를 획기적으로 줄여주고, 다양한 영속성 기술(RDBMS, NoSQL 등)을 공통된 방식으로 다룰 수 있게 해주는 강력한 라이브러리입니다.


1. 스프링 데이터(Spring Data)란?

  • 정의: 영속성 기술에 맞는 구현을 제공하여, 최소한의 코드 작성만으로 리포지터리를 정의할 수 있게 돕는 도구입니다.
  • 다양한 선택지: JDBC를 통한 직접 연결뿐만 아니라 MongoDB, Neo4J 같은 NoSQL이나 하이버네이트(Hibernate) 같은 ORM 프레임워크와도 연동 가능합니다.
  • 구현 단순화 방법:
    1. 공통 추상화: 다양한 기술에 대해 일관된 인터페이스 집합을 제공하여 사용법을 유사하게 유지합니다.
    2. 자동 구현: 사용자가 인터페이스(추상화)만 정의하면, 스프링 데이터가 백그라운드에서 실제 구현체를 생성하여 제공합니다.

2. 스프링 데이터의 작동 방식 및 주요 인터페이스

스프링 데이터는 앱의 영속성 기능을 정의하기 위해 확장(extends)해야 하는 공통 인터페이스 계약을 제공합니다.

  • 주요 인터페이스:
    • Repository: 마커 인터페이스로, 가장 기본적인 계층을 나타냅니다.
    • CrudRepository: 기본적인 생성, 조회, 수정, 삭제(CRUD) 연산을 제공합니다.
    • PagingAndSortingRepository: CRUD 기능에 정렬 및 페이지네이션 기능이 추가됩니다.
    • JpaRepository: 스프링 데이터 JPA 모듈에서 제공하며, 하이버네이트 같은 ORM 전용 연산이 추가된 인터페이스입니다.

3. 스프링 데이터 JDBC 사용 및 모델링

기본 규칙

  • @Id: 어떤 필드가 테이블의 기본 키(Primary Key)인지 표시합니다.
  • 제네릭 타입 설정: 리포지터리 인터페이스 확장 시 두 개의 제네릭 타입을 지정해야 합니다.
    1. 엔티티(Entity): 리포지터리가 관리할 모델 클래스.
    2. ID 타입: 기본 키(@Id) 필드의 데이터 타입.
public class Account {

    @Id
    private long id;

    private String name;
    private BigDecimal amount;

//getter setter 생략
}
public interface AccountRepository 
extends CrudRepository<Account, Long//엔티티, 기본키 타입> {
}

4. 쿼리 생성 전략 (Query Methods)

스프링 데이터는 SQL을 직접 작성하지 않아도 메서드 이름을 해석하여 자동으로 쿼리를 생성해 줍니다.

메서드 이름 해석 규칙 예시: findAccountByName(String name)

  1. List: 결과가 0개 이상일 수 있음을 알리며 리스트로 매핑됩니다.
  2. find: SELECT 절로 변환됩니다.
  3. Accounts: 대상 테이블(FROM account)을 지정합니다.
  4. ByName: 조회 조건(WHERE name = ?)을 지정합니다.
  5. (String name): 매개변수 값이 쿼리의 바인딩 변수가 됩니다.
public interface AccountRepository extends CrudRepository<Account, Long> {

    List<Account> findAccountsByName(String name);
}

@Query 애너테이션 활용

메서드 이름이 지나치게 길어지거나 성능 최적화가 필요한 경우, @Query를 통해 SQL을 직접 명시할 수 있습니다.

  • 특징: 메서드 이름 명명 규칙에서 자유로워집니다.
  • @Modifying: UPDATE, INSERT, DELETE와 같이 데이터를 변경하는 쿼리를 사용할 때는 반드시 이 애너테이션을 함께 추가해야 합니다.
public interface AccountRepository extends CrudRepository<Account, Long> {

    @Query("SELECT * FROM account WHERE name = :name")
    //쿼리의 매개변수 이름은 메서드 매개변수 이름과 동일해야 한다. 
    //콜론(:)과 매개변수 이름 사이에 공백이 없어야 한다.
    List<Account> findAccountsByName(String name);
}
public interface AccountRepository extends CrudRepository<Account, Long> {

  @Query("SELECT * FROM account WHERE name = :name")
  List<Account> findAccountsByName(String name);

  @Modifying //데이터를 변경하는 연산을 정의하는 메서드에 @Modifying 애너테이션을 추가한다.
  @Query("UPDATE account SET amount = :amount WHERE id = :id")
  void changeAmount(long id, BigDecimal amount);
}

🎯 요약

  1. 스프링 데이터는 인터페이스만 정의하면 구현체를 자동으로 생성하여 개발 속도를 높여준다.
  2. CrudRepository 등을 확장하여 필요한 수준의 연산을 선택적으로 사용할 수 있다.
  3. 쿼리 메서드 기능을 통해 메서드 이름만으로 SQL 쿼리를 자동 생성할 수 있다.
  4. 복잡한 쿼리는 @Query를 사용하며, 데이터 변경 시에는 @Modifying을 잊지 말아야 한다.

#Spring #SpringData #SpringDataJDBC #Repository #CrudRepository #QueryMethod #백엔드공부

0개의 댓글