300===Dev Framework/Spring

Spring Data JDBC: JPA보다 가벼운 ORM의 대안 🚀

블로글러 2024. 11. 14. 12:39

안녕하세요! 오늘은 Spring Data JDBC에 대해 알아보겠습니다. JPA가 너무 무겁게 느껴지시나요? Spring Data JDBC가 좋은 대안이 될 수 있습니다.

Spring Data JDBC가 뭔가요? 🤔

Spring Data JDBC는 마치 미니멀한 ORM이라고 생각하시면 됩니다:

  • JPA처럼 객체와 DB를 매핑해주지만
  • 훨씬 단순하고 가벼운 방식으로 동작합니다
  • 영속성 컨텍스트(Persistence Context)가 없어요!

왜 Spring Data JDBC를 사용해야 할까요? 🌟

1. 단순함의 미학

@Table("users")
public class User {
    @Id
    private Long id;
    private String name;
    private String email;
}
  • 간단한 애노테이션으로 매핑 완성
  • JPA처럼 복잡한 설정이 필요 없음

2. 예측 가능한 SQL

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    List<User> findByEmail(String email);
}
  • 모든 SQL이 직접적으로 실행됨
  • N+1 문제가 발생할 걱정 없음
  • 캐싱이나 지연 로딩 없음

어떻게 동작하나요? 🎯

1. 기본 설정

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver

2. 엔티티 설정

@Table("orders")
public class Order {
    @Id
    private Long id;

    private String orderNumber;

    @MappedCollection(idColumn = "order_id")
    private List<OrderItem> items;
}

3. 리포지토리 생성

public interface OrderRepository extends CrudRepository<Order, Long> {
    // 기본 CRUD 메소드 자동 제공

    // 커스텀 쿼리 메소드
    List<Order> findByOrderNumber(String orderNumber);
}

주요 특징 💫

1. 간단한 Aggregate 매핑

@Table("customers")
public class Customer {
    @Id
    private Long id;

    // 값 객체는 같은 테이블에 저장
    private Address address;

    // 1:N 관계는 별도 테이블로 저장
    @MappedCollection(idColumn = "customer_id")
    private List<Order> orders;
}

2. 명시적인 저장

@Service
@Transactional
public class OrderService {

    private final OrderRepository repository;

    public Order createOrder(Order order) {
        // 저장 시점이 명확함
        return repository.save(order);
    }
}

실제 사용 예시 📱

1. 간단한 CRUD

// 생성
Customer customer = new Customer("John", "john@email.com");
repository.save(customer);

// 조회
Optional<Customer> found = repository.findById(1L);

// 수정
customer.setName("John Doe");
repository.save(customer);

// 삭제
repository.delete(customer);

2. 커스텀 쿼리

public interface CustomerRepository extends CrudRepository<Customer, Long> {

    // 메소드 이름으로 쿼리 생성
    List<Customer> findByEmailContaining(String email);

    // SQL 직접 작성
    @Query("SELECT * FROM customers WHERE active = true")
    List<Customer> findActiveCustomers();
}

주의사항 ⚠️

  1. 복잡한 관계는 피하세요

    • 단순한 1:N 관계까지만 권장
    • 복잡한 관계는 JPA가 더 적합
  2. 대량의 데이터 처리

    • 페이징 처리가 필요한 경우 주의
    • 커스텀 SQL을 고려하세요

결론 🎁

Spring Data JDBC는:

  • 단순하고 예측 가능한 ORM이 필요할 때
  • JPA의 복잡성을 피하고 싶을 때
  • SQL을 직접 제어하고 싶을 때
    최고의 선택이 될 수 있습니다!

References:

728x90