JAVA/spring

[1028 from 스프링 백기선 JPA] 스프링데이터 Common _ Repository, Interface, null

스프링 데이터 Common Repository
CrudRepository
PagingAndSortingRepository
스프링 데이터 JPA JpaRepository -> PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>
CrudRepository PagingAndSortingRepository -> CrudRepository

<S extends T> S save(S var1);
<S extends T> Iterable<S> saveAll(Iterable<S> var1);
Optional<T> findById(ID var1);
boolean existsById(ID var1);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> var1);
long count();
void deleteById(ID var1);
void delete(T var1);
void deleteAll(Iterable<? extends T> var1);
void deleteAll();
@Rollback(false) 롤백안함
트렌젝션  + 테스트 -->  하이버네이트가 롤백할 커리여서 테스트에서 insert 안나라감.
PagingAndSortingRepository public interface Page<T> extends Slice<T> {
    static <T> Page<T> empty() { 
        return empty(Pageable.unpaged());
    }
    static <T> Page<T> empty(Pageable pageable) {
        return new PageImpl(Collections.emptyList(), pageable, 0L);
    }
    int getTotalPages();
    long getTotalElements();
    <U> Page<U> map(Function<? super T, ? extends U> var1);
}
테스트용 h2 DB설정  1. h2 test 추가. 
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>

2. @DataJpaTest 추가. 
@ExtendWith(SpringExtension.class) 
@DataJpaTest
class DiaryRepositoryTest {
Repository 인터페이스 정의 특정레포지터리 제작
@RepositoryDefinition(domainClass = Study.class, idClass = Integer.class)
public interface PersonalRepository {
    Study save(Study study);
    List<Study> findAll();
}
@NoRepositoryBean @NoRepositoryBean  > 레퍼지토리아님. 상속받아 사용. 
public interface MyRepository<T, ID extends Serializable> extends Repository<T, ID> {    
    <E extends T> E save(E entity);
    
    List<T> findAll();

}
Null 처리  리턴값 1개일떄 
java 8 Optional
<E extends T> Optional<E> findByID(ID id);
spring 5
@NonNullApi, @NonNull, @Nullable.
@Nullable
<E extends T> E save(E entity);     
런타임 체크 지원 함.
JSR 305 애노테이션을 메타 애노테이션으로 가지고 있음. (IDE 및 빌드 툴 지원)
인텔리제이 : Build, Execution, Deployment > Compiler
> Add runtime assertion for notnull-annotated methods and parameters
> Configure annotations 클릭 > 위에박스 + nullable 스프링추가, 아랫박스 NoneNull 추가
 

 >> 반영

 

@NonNullApi
package com.today10sec.diary.repository;;
Optional 단일값 받을 때 추천. .. 최근추세  == null  안씀... 
Optional<Diary> byId= diaryRepository.findById(100);
assertThat(byId).isEmpty();
List의 경우 스프링데이터에서 빈 컬렉션이 나옴
isEmpty(); 체크만. 
 쿼리 만들기 개요.   

Paging and sorting repository , crudRepository

더보기
package com.today10sec.diary.repository;

import com.today10sec.diary.model.Diary;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@ExtendWith(SpringExtension.class)
@DataJpaTest
class DiaryRepositoryTest {

    @Autowired
    DiaryRepository diaryRepository;

    @Test
    @Rollback(false)
    public void crud_Repository(){
        //Given
        Diary diary = new Diary();
        diary.setName("aaaaa");
        assertThat(diary.getId()).isNull();
        //when
        Diary newDiary = diaryRepository.save(diary);
        //then
        assertThat(newDiary.getId()).isNotNull();
        //when
        List<Diary> diaries = diaryRepository.findAll();  //이것만 JPA REpository
        //then
        assertThat(diaries.size()).isEqualTo(1);
        assertThat(diaries).contains(newDiary);

    }

    @Test
    @Rollback(false)
    public void PagingAndSorting_Repository(){
        //Given
        Diary diary = new Diary();
        diary.setName("aaaaa");
        Diary newDiary = diaryRepository.save(diary);
        //when
        Page<Diary> page =diaryRepository.findAll(PageRequest.of(0, 10));
        //then
        assertThat(page.getTotalElements()).isEqualTo(1);
        assertThat(page.getNumber()).isEqualTo(0);
        assertThat(page.getSize()).isEqualTo(10);
        assertThat(page.getNumberOfElements()).isEqualTo(1);

        //when
        page = diaryRepository.findByNameContains("aaaaa", PageRequest.of(0,10));
        //then
        assertThat(page.getTotalElements()).isEqualTo(1);
        assertThat(page.getNumber()).isEqualTo(0);
        assertThat(page.getSize()).isEqualTo(10);
        assertThat(page.getNumberOfElements()).isEqualTo(1);
    }



}