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
'개발지식 > Backend Engineering' 카테고리의 다른 글
| 전략 패턴 + AOP로 정책 로직을 분리한 설계 (0) | 2025.12.28 |
|---|---|
| 🌿 Spring Data JPA – 반환 타입 정리 (0) | 2025.11.13 |
| Kotlin 기본 구조(예시 코드) (8) | 2025.08.14 |
| Kotlin 기본 함수(예시 코드) (7) | 2025.08.12 |
| Kotlin 기본 문법(예시 코드) (5) | 2025.08.11 |