개발지식/Backend Engineering

📚 Spring Data JPA Repository 제대로 써보기

우루쾅 2025. 11. 12. 08:45
728x90
반응형
SMALL

효율적인 데이터 접근 계층 설계하기

Spring Data JPA는 JPA 기반 데이터 접근을 한층 더 단순하고 일관성 있게 만들어주는 추상화 레이어입니다.
Repository 인터페이스 선언만으로 CRUD, 페이징, 정렬, 동적 조회를 자연스럽게 처리할 수 있으며, 필요에 따라 명시적인 JPQL / QueryDSL / 네이티브 쿼리로 확장 또한 가능합니다.

해당 글에서는 Repository 정의 방법, 메소드 이름 기반 쿼리, @Query 활용, DTO 조회, 파라미터 바인딩, 테스트 작성 방식을 중심으로 정리합니다.


1. Repository 기본 구조

기본 Repository는 JpaRepository<T, ID>를 상속하여 정의합니다.

public interface MemberRepository extends JpaRepository<Member, Long> {
}

 

JpaRepository가 제공하는 주요 기능:

기능 설명
save(entity) 신규 저장 또는 변경 감지 기반 업데이트
findById(id) 단건 조회
findAll() 전체 조회
delete(entity) 삭제
findAll(Pageable pageable) 페이징/정렬

별도 구현 없이 즉시 사용 가능하며, 트랜잭션 관리는 보통 서비스 계층에서 처리합니다.


2. 메서드 이름 기반 쿼리 생성

Spring Data JPA는 메서드 이름을 분석하여 자동으로 JPQL을 생성합니다.

List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
select m from Member m
where m.username = :username and m.age > :age

 

장점:

  • 별도의 쿼리 작성 불필요
  • 간단한 조건 조회에 적합

단점:

  • 조건이 복잡해질수록 메서드 이름이 비대해짐 → 이 경우 @Query 또는 QueryDSL 권장

3. @Query를 사용하는 명시적 JPQL

조회 조건이 명확하거나 복잡할 때 @Query를 사용합니다.

@Query("select m from Member m where m.username = :username")
List<Member> findMember(@Param("username") String username);
 

@Param 바인딩 요약

방식 예시 비고
위치 기반 ?1, ?2 순서 의존 → 권장 X
이름 기반 :username 가독성 우수 → 권장
@Param @Param("username") 메소드 파라미터 명과 매핑

4. DTO로 직접 조회하기 (Select new)

엔티티가 아니라 화면 또는 API 응답에 필요한 값만 가져오는 경우 유용합니다.

@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) " +
       "from Member m join m.team t")
List<MemberDto> findMemberDto();
 

주의:

  • DTO 생성자의 파라미터 타입 및 순서가 반드시 일치해야 합니다.
  • select new 구문은 패키지명을 포함한 전체 경로(FQCN) 필요합니다.

5. Spring Data JPA Repository Test

Repository 테스트는 @SpringBootTest + @Transactional 조합을 주로 사용합니다.

 
@SpringBootTest
@Transactional
class MemberRepositoryTest {

    @Autowired
    MemberRepository memberRepository;

    @Test
    void saveAndFind() {
        Member member = new Member("test", 20);
        memberRepository.save(member);

        Member findMember = memberRepository.findById(member.getId()).get();
        assertThat(findMember.getUsername()).isEqualTo("test");
    }
}
 

테스트 종료 시 자동 rollback이 적용되므로 DB 상태가 오염되지 않습니다.


6. 정리

내용 핵심 포인트
JpaRepository 상속 CRUD 및 페이징/정렬 기본 제공
메서드 이름 기반 쿼리 단순 조건 조회에 적합
@Query 직접 작성 명시적/복잡 조건 표현 시 사용
DTO 조회 select new 구문으로 필요한 데이터만 조회
Repository Test @SpringBootTest + @Transactional 사용
728x90
반응형
LIST