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] 예제 프로젝트 생성 및 초기 환경 구성 - QuickStart 1
이전글의 내용을 이어서 작성합니다.
# 해당 시리즈 게시글은 Notion에서 작성된 내용을 그대로 옮겨오는 과정에서 서식의 깨짐 및 부자연스러움이 발생할 수 있습니다.
JPA Query Methods
Spring Data JPA는 간편하게 Repository 인터페이스에서의 Method Naming 만으로 간단한 SQL문을 수행해줍니다. 이를 Query Methods라고 합니다.
Query Methods는 이미 정해진 단어 및 SQL 예약어에 따라 메소드의 Naming Rule이 존재합니다. 자세한 설명은 아래 공식 문서를 통해 확인할 수 있습니다.
그렇다면 예시로 게시글의 제목이 특정 키워드를 포함하는 게시글의 목록을 조회하는 쿼리를 수행하는 로직을 작성해봅니다.
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에서 참고 가능합니다.
댓글