본문 바로가기
개발/Junit

④Junit Service 테스트 -2 Service book List, Search

by 외노자개발 2022. 10. 19.
반응형

책 등록에 이어서 서비스 코드에 대해서 알아보도록 하자.

아직 테스트 까지 못갔다는게 안 비밀.. 

우선 본 코드는 이전 게시물에 있으니 참조

 

 

2. Book리스트 

	//2. book list
	public List<BookRespDto> bookList() {
		List<BookRespDto> dtos = bookRepository.findAll().stream()
				//.map((bookPS) -> bookPS.toDto())
			    .map(Book::toDto)
				.collect(Collectors.toList());
		
		return dtos;
	}

이번에는 stream()메서드가 출현을 하였다.. 

여기 코드를 해석해보자면, 

bookRepository에서 findAll()메서드를 사용해서 전체 데이터를 가져오고 stream을 이용해서 데이터를 흘려보낸다. 

Stream 이기 때문에 map()형식으로 만들어진다 그렇기 때문에 흘러간 데이터 중 map에 데이터를 

toDto를 실행해서 Dto형태로 만들어준 후 다시 흘르게 한다. 

그것을 collect라는 그물로 데이터를 걸러 toList()를 이용해서 map형태의데이터를 다시 리스트로 만들어서 dtos변수에 담는다. 

 

참고로, .map(Book::toDto) == .map((bookPS) -> bookPS.toDto()) 입니다. 

람다식을 메서드참조식으로 간단히 표현 한 것! 

 

 

3. book 검색하기 

//3. book 詳細 search
	public BookRespDto booksSearch(Long id) {
		Optional<Book> bookOP = bookRepository.findById(id);
		if(bookOP.isPresent()) {
			Book bookPS = bookOP.get();
			return bookPS.toDto();
		} else {
			throw new RuntimeException("IDが見つかりません");
		}
	}

이 코드를 해석해보자면, findById(id); 는 Optional을 꼭 사용해야 하기 때문에 변수명도 Optional인 bookOP로 지정 되어있고, bookOP의 변수가 isPresent() 즉 내용이 있으면 

bookPS에 리포지토리에서 가져온 값을 리턴 한다 .

하지만 영속화 된 데이터는 toDto를 이용해야 하기 때문에 toDto를 이용해서 반환해준다. 

만약 값이 없으면 throw new runtimeException으로 에러내용을 전달해준다. 

 

** Optional을 사용하는 이유는 Null을 담을 수 있는 객체이기 때문,, 

 

bookDelete는 특별한 것이 없기 때문에 pass 바로 수정으로 가겠습니다.

 

5. book수정

//5. book 修正
	@Transactional(rollbackFor = RuntimeException.class)
	public BookRespDto bookCollection(Long id, BookSaveReqDto dto) {
		Optional<Book> bookOP = bookRepository.findById(id);
		if(bookOP.isPresent()) {
			Book bookPS = bookOP.get();
			bookPS.update(dto.getTitle(), dto.getAuthor());
			return bookPS.toDto();
		} else {
			throw new RuntimeException("IDが見つかりません");
		}
	}

위 코드 해석해보자면, 파라메타로 id와 BookSaveReqDto에서 값을 받는다. id와 dto따로 받는 것은 

id는 검색, dto는 안의 값을 변경하기 위해서 이다. id는 변경하지 않아도 되니...

Optional bookOP에 findById에서 id를 불러옵니다.

isPresent로 null이 아닌지를 확인하고 방금 검색한 bookOP를 bookPS에 담습니다. 

그것을 update해주는 데 인자 값으로 dto가 들고있는 값으로 변경을 진행해주고

Book타입을 toDto를 이용해서 dto로 변경! 

만약 null일경우는 런타임을 발생 시켜 준다.

 

 

이상 Service 였습니다. 이제 junit을 이용한 serviceTest 를 공부해 보겠습니다.

반응형

댓글