Develop/spring-data

JPA 테스트 코드로 알아보자!

에디개발자 2020. 11. 5. 13:24
반응형

JPA 설정 및 테스트 코드 작성은 이전글에 작성하였습니다. 

이번글에서 다루는 소스코드는 github에 있습니다. 

JPA 저장 후 조회

@Test
void entity저장후조회() {
    //given
    final Long id = 1L;
    final String storeName = "스토어1";
    final String storeAddress = "주소1";

    Store store = Store.builder()
            .id(id)
            .name(storeName)
            .address(storeAddress)
            .build();
    storeRepository.save(store);

    //when
    Store resultStore = storeRepository.findByName(storeName);

    //then
    Assertions.assertEquals(resultStore.getName(), storeName);
}
  • 저장
    • Entity Store객체를 Builder를 통해 생성한다.
    • storeRepository를 통해 저장한다.
  • 조회
    • storeRepository에서 name으로 조회
    • 저장한 데이터와 조회된 데이터 비교한다.

Repository

Repository interface에 메소드를 생성할 수 있습니다.

  • findBy{Column}({value})
select * from {entity} where {column} =  {value}
  • findBy{Column1}And{Column2}({value1}, {value2})
select * from {entity} where {column1} = {value1} and {column2} = {value2}
  • findBy{Column1}And{Column2}({value1}, {value2}) 
select * from {entity} where {column1} = {value1} and {column2} = {value2}

 

수정

@Test
@DisplayName("초기 테스트 시 entity저장후조회 테스트 먼저 진행 후 테스트.")
void entity수정() {
    //given
    final Long id = 1L;
    final String storeName = "스토어2";
    final String storeAddress = "주소2";
    Store store = Store.builder()
            .id(id)     // id 가 같으면 수정처리함
            .name(storeName)
            .address(storeAddress)
            .build();

    //when
    Store udpateStore = storeRepository.save(store);

    //then
    Assertions.assertEquals(udpateStore.getName(), storeName);
}

 

Entity 저장 후 조회 응용

@Test
@DisplayName("Store, Staff entity 저장")
void entity저장() {
    //given
    final Long storeId = 2L;
    final String storeName = "store1234";
    final String storeAddress = "storeAddress";

    final Long staffId = 1L;
    final String staffName = "staff1234";
    final Integer staffAge = 30;

    Staff staff = Staff.builder()
            .id(staffId)
            .name(staffName)
            .age(staffAge)
            .build();

    Store store = Store.builder()
            .id(storeId)
            .name(storeName)
            .address(storeAddress)
            .staff(Arrays.asList(staff))
            .build();

    //when
    storeRepository.save(store);
    Store resultStore = storeRepository.findByName(storeName);
    
    //then
    Assertions.assertEquals(resultStore.getName(), storeName);
    
    Collection<Staff> staff1 = resultStore.getStaff();
    Iterator<Staff> iterator = staff1.iterator();
    Staff next = iterator.next();
    Assertions.assertEquals(next.getName(), staffName);
}
  • 저장
    • 일 대 다 관계인 Store : Staff 의 데이터 저장 방법이다.
    • Staff 객체를 생성 후 Store 객체에 넣어 생성 후 Repository를 이용하여 저장하면 Store, Staff 테이블에 데이터가 적재된다.
  • 조회
    • Store 데이터를 repository에서 조회한다.
    • 결과값 Store에서 Staff값을 조회한다. result.getStaff()
    • Entity에서 LAZY, EAGER 설정에 따라 조회해오는 방식이 다르다.
      • LAZY : result.getStaff() 를 호출하는 순간 store에 매핑되는 staff 객체 리스트를 조회한다.
      • EAGER : repository에서 store를 조회하는 순간 staff 객체 리스트까지 모두 조회한다.
      • 상황에 맞게 설정해야하지만 전 LAZY를 많이 쓰는 편입니다. EAGER로 했을 때 필요하지 않는 객체 리스트를 얻어올 수 있기 때문에 비용 절약에서 LAZY를 씁니다.
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "store_id")
private Collection<Staff> staff;

 

다음 글에서는 QueryDsl을 적용해보겠습니다

 

반응형