-
스프링 데이터 Common - 1 (스프링 데이터 JPA - 4)Programming/Spring Data JPA 2021. 1. 1. 15:47728x90
1. Repository
- 기본적으로 제공하는 기능 테스트
@RunWith(SpringRunner.class) @DataJpaTest class PostRepositoryTest { public static final String STRING = "31"; @Autowired PostRepository postRepository; @Test @Rollback(false) public void curdRepository() { // Given Post post = new Post(); post.setTitle("Title1"); assertThat(post.getId()).isNull(); // When Post newPost = postRepository.save(post); // Then assertThat(newPost.getId()).isNotNull(); // When List<Post> posts = postRepository.findAll(); // Then assertThat(posts.size()).isEqualTo(1); assertThat(posts.contains(newPost)); // When Page<Post> page = postRepository.findAll(PageRequest.of(0, 10)); // Then assertThat(page.getTotalElements()).isEqualTo(1); assertThat(page.getNumberOfElements()).isEqualTo(1); } }
2. 인터페이스 정의하기
JpaRepository를 사용하면 모든 기능을 제공받을 수 있음.
- 직접 기능을 구현하는 방법
필요한 기능만 직접 추가하여 사용 가능
스프링 데이터 JPA가 우리가 정의한 메소드의 구현체만을 제공하게 됨
@RepositoryDefinition(domainClass = Comment.class, idClass = Long.class) public interface CommentRepository { Comment save(Comment comment); List<Comment> findAll(); }
3. Null 처리
*콜렉션은 NULL을 리턴하지 않고, 비어있는 콜렉션을 리턴한다*
Optional
Optional<Comment> findById(Long id);
@RunWith(SpringRunner.class) @DataJpaTest class CommentRepositoryTest { @Autowired CommentRepository repository; @Test public void crud() { Optional<Comment> byId = repository.findById(10l); assertThat(byId).isEmpty(); // Comment comment = byId.orElse(new Comment()); // Comment comment1 = byId.orElseThrow(); } }
@NonNullApi, @NonNull, @Nullable
- 런타임 체크를 지원함
- 해당 메소드 또는 매개변수에 작성
4. 쿼리 만들기
세 가지 전략이 있음
1. 메소드 이름을 분석해서 쿼리 만들기
2. 미리 정의해 둔 쿼리 찾아 사용하기 (@Query - PSQL, Native Query 둘 다 사용 가능)
3. 미리 정의한 쿼리 찾아보고 없으면 메소드 이름으로 만들기 (기본전략)
- 쿼리 만드는 방법
@팁
먼저 메소드를 이용해서 쿼리를 만들 수 있는지 확인하기
-> 확인하는 법 : 1. 일단 돌려보기(만들 수 없으면 런타임 에러) / 2. 테스트 코드를 통해서 쿼리를 확인
이후 메소드 이름으로 쿼리를 표현하기 힘든 경우에 쿼리를 직접 만들어 사용
public interface CommentRepository extends JpaRepository<Comment, Long> { // List<Comment> findByCommentContainsIgnoreCase(String comment); List<Comment> findByCommentContainsIgnoreCaseAndLikeCountGreaterThan(String comment, int likeCount); List<Comment> findByCommentContainsIgnoreCaseOrderByLikeCountDesc(String comment); // Page<Comment> findByCommentContainsIgnoreCase(String comment, Pageable pageable); // Stream<Comment> findByCommentContainsIgnoreCase(String comment, Pageable pageable); @Async Future<Comment> findByCommentContainsIgnoreCase(String comment, Pageable pageable); }
@RunWith(SpringRunner.class) @DataJpaTest class CommentRepositoryTest { @Autowired CommentRepository repository; @Test public void crud() { this.createComment("spring jpa1", 100); this.createComment("spring jpa2", 44); List<Comment> comments = repository.findByCommentContainsIgnoreCaseOrderByLikeCountDesc("Spring"); assertThat(comments.size()).isEqualTo(2); assertThat(comments).first().hasFieldOrPropertyWithValue("likeCount", 100); } private void createComment(String comm, int likeCount) { Comment comment = new Comment(); comment.setComment(comm); comment.setLikeCount(likeCount); repository.save(comment); } }
인프런 백기선님 '스프링 데이터 JPA’ 강의를 듣고 정리한 내용입니다.
728x90'Programming > Spring Data JPA' 카테고리의 다른 글
스프링 데이터 Common - Web (스프링 데이터 JPA - 6) (0) 2021.01.01 스프링 데이터 Common - 2 (스프링 데이터 JPA - 5) (0) 2021.01.01 JPA 프로그래밍 - 2 (스프링 데이터 JPA - 3) (0) 2021.01.01 JPA 프로그래밍 - 1 (스프링 데이터 JPA - 2) (0) 2020.04.30 관계형 데이터베이스와 ORM (스프링 데이터 JPA - 1) (0) 2020.04.30