본문 바로가기
Spring.io

Spring Data JPA(Spring Data Java Persistence API)

by Andrew's Akashic Records 2024. 11. 26.
728x90

Spring Data JPA(Spring Data Java Persistence API)

Spring Data JPA(Spring Data Java Persistence API)는 Spring 프레임워크와 JPA(Java Persistence API)를 통합하여 데이터 액세스 레이어를 쉽게 개발할 수 있도록 해주는 모듈입니다. Spring Data JPA는 개발자가 데이터베이스와의 상호작용을 쉽게 처리하고, SQL 쿼리를 명시적으로 작성하지 않도록 도와주는 도구입니다. 주요 특징과 개념을 아래에 정리해 보겠습니다.

주요 특징

  1. Repository 인터페이스 사용:
    • Spring Data JPA는 Repository라는 인터페이스 기반의 접근 방식을 제공합니다. 개발자는 인터페이스를 정의하고 기본 CRUD(Create, Read, Update, Delete) 기능을 포함한 많은 데이터 액세스 기능을 바로 사용할 수 있습니다.
    • 예: JpaRepository 인터페이스를 상속받아 사용하면 기본적인 데이터베이스 CRUD 작업을 손쉽게 사용할 수 있습니다.
    public interface UserRepository extends JpaRepository<User, Long> {
        // 기본적인 CRUD 메소드들은 이미 제공됩니다.
    }
  2. 메소드 네이밍 규칙으로 쿼리 생성:
    • 쿼리를 작성할 필요 없이 메소드 이름만으로도 복잡한 쿼리를 만들 수 있습니다. 예를 들어, findByUsername(String username)와 같은 메소드를 정의하면, 해당 메소드가 자동으로 적절한 SELECT 쿼리를 실행하도록 만들어집니다.
    List<User> findByLastName(String lastName);
    위의 메소드는 lastName 속성을 기준으로 User 엔티티를 검색하는 쿼리를 자동으로 생성합니다.
  3. JPQL과 @Query 어노테이션 사용:
    • 필요할 경우, @Query 어노테이션을 사용하여 직접 쿼리를 작성할 수 있습니다. JPQL(Java Persistence Query Language)을 사용하여 데이터베이스 질의를 더 세밀하게 컨트롤할 수 있습니다.
    @Query("SELECT u FROM User u WHERE u.age > :age")
    List<User> findUsersOlderThan(@Param("age") int age);
  4. 페이징 및 정렬 기능:
    • PagingAndSortingRepository를 사용하여 간단하게 페이징과 정렬을 구현할 수 있습니다. 메소드에 Pageable 파라미터를 추가하여 페이징과 정렬을 제어할 수 있습니다.
    Page<User> findByLastName(String lastName, Pageable pageable);
  5. Lazy vs Eager Fetching:
    • 엔티티의 관계를 조회할 때 @OneToMany, @ManyToOne 등 JPA 관계 매핑 어노테이션을 사용할 수 있습니다. 이 때 fetch 타입을 설정하여 Lazy(필요할 때 가져오기)와 Eager(즉시 가져오기)를 컨트롤할 수 있습니다.
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Order> orders;
  6. Transaction 관리:
    • Spring Data JPA는 트랜잭션 관리를 자동으로 처리합니다. @Transactional 어노테이션을 사용하여 특정 메소드 또는 클래스에 대해 트랜잭션 경계를 지정할 수 있습니다.
    @Transactional
    public void saveUser(User user) {
        userRepository.save(user);
    }
728x90

장점

  • 간결성: 인터페이스만으로도 데이터 접근 계층을 손쉽게 개발할 수 있어 코드가 매우 간결해집니다.
  • 유연성: 메소드 네이밍 전략이나 JPQL을 사용해 복잡한 쿼리도 쉽게 구현할 수 있습니다.
  • 트랜잭션 관리의 간소화: Spring의 AOP 기반 트랜잭션 관리와 연동되므로 트랜잭션 처리를 간소화할 수 있습니다.

단점

  • 추상화의 비용: 많은 부분이 자동화되어 있지만 복잡한 데이터베이스 구조에서는 자동화된 기능이 모든 상황을 커버하지 못할 수 있습니다. 특정 상황에서는 직접 JPQL 또는 네이티브 쿼리를 사용해야 하는 경우가 발생할 수 있습니다.
  • 학습 곡선: JPA 및 Spring Data의 추상화 레이어를 잘 이해하려면 JPA의 기본 개념 및 SQL을 숙지하고 있어야 합니다.

사용 예시

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String email;

    // Getters and Setters
}

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByUsername(String username);
}

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getUsersByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    public void createUser(User user) {
        userRepository.save(user);
    }
}

위의 예시처럼 Spring Data JPA를 사용하면 리포지토리 인터페이스만으로도 CRUD 기능을 쉽게 구현할 수 있고, 필요시 @Query 어노테이션을 사용해 사용자 정의 쿼리를 작성할 수 있습니다.

728x90

'Spring.io' 카테고리의 다른 글

Spring Data JPA - JpaRepository  (0) 2024.11.26
Spring Data JPA - EntityManager  (0) 2024.11.26
Spring Batch RestAPI to DB  (0) 2023.06.27
Spring boot CLI 명령어와 예시  (0) 2023.06.15
Spring framework 개발 Tip  (0) 2023.05.11