본문 바로가기
Spring/Spring Data JPA

[Spring Data JPA] JPA Query Methods - QuickStart 5 (End)

by 임채훈 2021. 12. 12.

2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] Fetch Join (N + 1 Issue) - QuickStart 4

2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] 연관 관계 자식(하위) Entity 작성 - QuickStart 3

2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] JPA Entity, Repository, Service 클래스 작성 (조회 및 저장) - QuickStart 2

2021.12.12 - [Spring/Spring Data JPA] - [Spring Data JPA] 예제 프로젝트 생성 및 초기 환경 구성 - QuickStart 1

 

이전글의 내용을 이어서 작성합니다.

 

# 해당 시리즈 게시글은 Notion에서 작성된 내용을 그대로 옮겨오는 과정에서 서식의 깨짐 및 부자연스러움이 발생할 수 있습니다. 

 

JPA Query Methods

Spring Data JPA는 간편하게 Repository 인터페이스에서의 Method Naming 만으로 간단한 SQL문을 수행해줍니다. 이를 Query Methods라고 합니다.

Query Methods는 이미 정해진 단어 및 SQL 예약어에 따라 메소드의 Naming Rule이 존재합니다. 자세한 설명은 아래 공식 문서를 통해 확인할 수 있습니다.

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

그렇다면 예시로 게시글의 제목이 특정 키워드를 포함하는 게시글의 목록을 조회하는 쿼리를 수행하는 로직을 작성해봅니다.

  • io.starter.jpatutorial.domain.repository.PostMariaRepository
@Repository
public interface PostMariaRepository extends JpaRepository<PostJpo, Long> {
    List<PostJpo> findByTitleContains(String keyword);
}
  • io.starter.jpatutorial.service.PostListService
@Service
@RequiredArgsConstructor
public class PostListService {
    private final PostMariaRepository postMariaRepository;

    @Transactional(readOnly = true)
    public List<Post> fetchByContains(String title) {
        return postMariaRepository.findByTitleContains(title)
                .stream()
                .map(Post::jpoOf)
                .collect(Collectors.toList());
    }
}
  • io.starter.jpatutorial.JpaTutorialApplicationTests
package io.starter.jpatutorial;

import io.starter.jpatutorial.domain.model.Post;
import io.starter.jpatutorial.service.CommentService;
import io.starter.jpatutorial.service.PostListService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class JpaTutorialApplicationTests {
    @Autowired
    private PostListService postListService;

    @ParameterizedTest
    @ValueSource(strings = "1")
    @DisplayName("게시글의 제목이 특정 키워드를 포함 목록 조회 테스트")
    void fetch(String keyword) {
        List<Post> posts = postListService.fetchByContains(keyword);
        Assertions.assertNotEquals(posts.size(), 0);
        System.out.println("Posts --> " + posts);
    }

}

테스트 코드는 게시글 제목에 숫자 1이 포함되는 게시글의 목록을 조회하는것으로 수행합니다.

테스트 코드 수행시 아래와 같이 임의의 Where Like 구문이 수행되는것을 알 수 있고 결과 데이터도 1이 포함되 있는 데이터 1건이 조회되는것을 알 수 있습니다.

 

End

기본적인 가이드는 여기서 마무리하고자 합니다.

실제 Spring Data JPA를 기반으로 실제 서비스를 운영하고 복잡한 비즈니스 로직을 개발하다보면 다양한 문제점이 많이 발생할 수 있습니다.

또한 중요한 개념적 정립이 필요한 사항들도 있습니다.

하지만 잘 작성된 레퍼런스를 참고한다면 문제의 해결하는것이 어렵지만은 않을것 같습니다.


프로젝트 전체 소스 코드는 아래 Github에서 참고 가능합니다.

Github Source Code

 

GitHub - youspend8/spring-data-jpa-tutorial

Contribute to youspend8/spring-data-jpa-tutorial development by creating an account on GitHub.

github.com

댓글