스프링 공부/게시판 프로젝트 만들기

[스프링] 25. 조회에 대한 서비스 로직 만들어 테스트하기...?

장아장 2023. 2. 7. 21:30

사실 검색에 대한 테스트코드를 만드는 것은 간단하다. 

리포지토리 테스트코드에서, 기능들을 그대로 가져다 쓰는 것과 동일하다 .

@BeforeEach
void createData() {
    for(int index = 0; index < 10; index++){
        RegisterRequestDto registerRequestDto = RegisterRequestDto.builder()
                .username("testUser" + index)
                .nickname("test" + index)
                .email("test" + index + "@test.com")
                .password("password" + index)
                .passwordCheck("password" + index)
                .build();
        memberService.registerNewMember(registerRequestDto);
    }
}

@Test
@DisplayName("전부 다 null값으로 검색하면 예외처리된다. ")
public void searchWithAllNull() throws Exception{
    //given

    //when
    SearchMemberDto searchMemberDto = new SearchMemberDto(null, null, null);
    //then
    assertThatThrownBy(()-> memberService.search(searchMemberDto))
            .isInstanceOf(NeedToAddSearchConditionException.class);
}

위의 메서드는 모든 데이터를 테스트전에 추가해주고, 

아래의 메서드는 모두다 null일 경우를 구현한 것이다. 

총 8가지 경우에 대한 테스트코드를 작성했다. 

 

테스트를 만들었으니, 기능을 만들어야 하는데 진짜 별게 없다. 

@Transactional(readOnly = true)
public List<SearchMemberDto> search(SearchMemberDto searchMemberDto){
    return memberRepository.search(searchMemberDto);
}

(이럴려고 리포지토리에 더 갈아넣은거지~)

 

사실 자바로 구현한다고 해보면, 전체를 불러온 다음에, null이 아니면 입력변수와 같은 객체만 따로 뽑아 리스트로 반환하게 된다. 

그렇게 하는 것 보단, 이게 더 깔끔하니까? 그리고 이게 서버의 메모리를 덜 쓰게 된다.

DB에서도 모든 멤버를 불러오는 것이 아니니, 데이터베이스에서도 시간을 덜 쓰게 된다. 

 

이렇게 만든 코드의 테스트를 동작시켜보았다. 

이렇게 테스트가 정상적으로 동작한다!

이렇게, 조회의 기능을 만들어보았다. 

이제, 로그인 기능을 구현해야 하는데, 이를 또 다시 2개로 나눠야 할 것 같다.