
Spring Data JPA 완전 정복 가이드 - 입문자를 위한 실무 중심 설명
Spring Data JPA는 복잡한 SQL 없이도 데이터베이스 연동을 추상화할 수 있도록 도와주는 모듈입니다. JPA(Java Persistence API) 위에 구축된 스프링의 강력한 기능으로, 생산성과 유지보수성을 크게 향상시킵니다. 이 글에서는 입문자를 위한 JPA 개념부터 JpaRepository 실전 사용법까지 차근히 설명합니다.
1. JPA와 Spring Data JPA 차이
- JPA: Java 진영의 ORM(Object-Relational Mapping) 표준
- Hibernate: JPA 구현체 (실제로 사용하는 라이브러리)
- Spring Data JPA: JPA 위에서 CRUD 로직을 자동화해주는 Spring 확장 프레임워크
2. 기본 구성 요소
@Entity: 테이블과 매핑되는 도메인 클래스@Id: 기본 키 식별자@Repository: JPA 인터페이스 정의JpaRepository: CRUD 메서드 자동 제공
3. Entity 클래스 예제
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
}
4. JpaRepository 사용 예
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name);
List<User> findByAgeGreaterThan(int age);
}
findBy, findBy...And..., findTop3By...와 같이 메서드 이름만으로 쿼리를 생성할 수 있는 것이 큰 장점입니다.
5. 기본 CRUD 메서드
save(): 삽입 또는 수정findById(),findAll()deleteById()count(),existsById()
6. JPQL & Native Query
복잡한 쿼리는 직접 작성할 수도 있습니다.
@Query("SELECT u FROM User u WHERE u.age > :age")
List<User> findUsersOverAge(@Param("age") int age);
네이티브 SQL도 사용할 수 있습니다:
@Query(value = "SELECT * FROM user WHERE name = ?", nativeQuery = true)
List<User> nativeQueryExample(String name);
7. 트랜잭션 처리
Spring Data JPA는 @Transactional을 통해 데이터 변경 시 트랜잭션을 보장합니다. @Repository에 자동 적용되며, 서비스 계층에서 직접 지정하는 것이 일반적입니다.
8. 실무 팁
fetch join을 활용해 N+1 문제 해결@Modifying+@Query로 벌크 연산 처리- Entity는 Setter를 최소화하고, 생성자/Builder 사용 권장
- DTO 변환 시
Projection또는QueryDSL검토
9. 결론
Spring Data JPA는 반복적인 CRUD 코드 없이 데이터베이스 작업을 효율적으로 처리할 수 있게 해주는 매우 강력한 도구입니다. Entity 설계부터 Repository 구성, 쿼리 작성까지 하나의 패턴으로 통일할 수 있어 생산성이 향상되고 유지보수도 쉬워집니다. 실무에 적용하기 위해서는 기본 규칙과 쿼리 구조를 철저히 이해하는 것이 중요합니다.