복잡한뇌구조마냥

[JAVA] Spring Data JPA 본문

BE/JAVA

[JAVA] Spring Data JPA

지금해냥 2025. 8. 19. 23:55

1. Spring Data JPA란?

  • JPA를 더 쉽게 쓰도록 도와주는 Spring 프로젝트
  • 반복적인 DAO/Repository 구현을 자동화
  • 인터페이스만 정의하면 CRUD 메서드를 자동 제공

👉 JPA는 EntityManager를 직접 쓰지만, Spring Data JPA는 Repository 인터페이스 기반으로 훨씬 단순화됩니다.


2. 의존성 추가 (Gradle)

 
dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    runtimeOnly("com.h2database:h2")
}

3. Entity 예제

 
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

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

    @Column(nullable = false, length = 100)
    private String name;
}

 


4. Repository 인터페이스

 
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long> {
    // 기본 CRUD 자동 제공
    // save(), findById(), findAll(), delete() ...
    
    // 쿼리 메서드 추가
    Member findByName(String name);
}
  • JpaRepository<T, ID> 상속 → T=Entity, ID=PK 타입
  • 별도 구현체 작성할 필요 없음

5. Service + Controller 예제

 
@Service
@RequiredArgsConstructor
public class MemberService {
    private final MemberRepository memberRepository;

    public Member create(String name) {
        Member m = new Member();
        m.setName(name);
        return memberRepository.save(m);
    }

    public List<Member> findAll() {
        return memberRepository.findAll();
    }
}
 
@Controller
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
    private final MemberService memberService;

    @PostMapping("/create")
    @ResponseBody
    public String create(@RequestParam String name) {
        memberService.create(name);
        return "저장 완료";
    }

    @GetMapping("/list")
    @ResponseBody
    public List<Member> list() {
        return memberService.findAll();
    }
}

6. 쿼리 메서드 (Method Name Query)

Spring Data JPA는 메서드 이름만으로 쿼리 생성

 
List<Member> findByNameContaining(String keyword);
List<Member> findByNameStartsWith(String prefix);
List<Member> findByNameAndAge(String name, int age);
  • Containing → LIKE 검색
  • StartsWith / EndsWith
  • And, Or 조합 가능

7. @Query (JPQL 직접 작성)

 
public interface MemberRepository extends JpaRepository<Member, Long> {
    @Query("SELECT m FROM Member m WHERE m.name LIKE %:name%")
    List<Member> searchByName(@Param("name") String name);
}

8. 페이징 & 정렬

 
Page<Member> findByName(String name, Pageable pageable);

// 사용 예시
PageRequest pageRequest = PageRequest.of(0, 10, Sort.by("name").descending());
Page<Member> members = memberRepository.findByName("홍길동", pageRequest);

9. 장단점

✅ 장점

  • CRUD 반복 코드 제거 → 생산성 ↑
  • 쿼리 메서드, @Query 지원
  • 페이징, 정렬 내장

❌ 단점

  • 너무 복잡한 쿼리는 한계 → QueryDSL, Native Query 필요
  • 엔티티 설계가 잘못되면 성능 문제 발생

10. 마무리

Spring Data JPA는 JPA를 훨씬 간단하게 사용할 수 있게 해주지만, 내부적으로는 여전히 **JPA(EntityManager)**가 동작합니다.
따라서 JPA 기본기를 먼저 이해한 후 사용하는 것이 중요합니다.

👉 실무에서는 Spring Data JPA + QueryDSL 조합이 가장 많이 사용됩니다.

LIST