Programming/Spring Data JPA
스프링 데이터 Common - 1 (스프링 데이터 JPA - 4)
흠냐아뤼
2021. 1. 1. 15:47
728x90
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