실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기

Ch04. 요구사항 추가(책 통계, QueryDSL) - 책 통계 요구사항 추가

webmaster 2022. 11. 7. 20:46
728x90

책 통계
대출 중인 권 수 API 스펙
분야별 등록된 책의 권수 API 스펙

  • 현재 대여 중인 책이 몇 권인지 보여준다.
  • 분야별로 도서관에 등록되어 있는 책이 각각 몇 권인지 보여준다.
  • count가 0이면, 반환 리스트에 존재하지 않아도 된다

현재 대여 중인 책의 권수 API

Controller

@GetMapping("/book/loan")
fun countLoanedBook(): Int{
    return bookService.countLoanedBook()
}
  • 현재 대여 중인 책의 권수를 반환하는 API이다.
  • 현재 대여 중인 책의 권수를 반환한다.

Service

@Transactional(readOnly = true)
fun countLoanedBook(): Int {
    return userLoanHistoryRepository.findByStatus(UserLoanStatus.LOANED).size
}
  • UserLoanStatus 가 LOANED인 상태인 List를 가지고와 사이즈를 반환한다.

Repository

interface UserLoanHistoryRepository : JpaRepository<UserLoanHistory, Long> {
    //...
    fun findByStatus(status: UserLoanStatus): List<UserLoanHistory>
}
  • UserLoanStatus 가 LOANED인 상태인 List를 반환한다

분야별로 등록되어 있는 책의 권수 API

Controller

@GetMapping("/book/stat")
fun getBookStatistics(): List<BookStatResponse>{
    return bookService.getBookStatistics()
}
  • 분야별로 등록되어 있는 책의 권수를 반환하는 API이다.
  • 분야별로 등록되어 있는 책의 타입, 책의 권수(타입의 값이 없으면 0)를 반환한다

BookStatResponse

data class BookStatResponse(
    val type: BookType,
    var count: Int,
) {
    fun plusOne() {
        count++
    }
}
  • BookType과 Count를 가지는 BookStatResponse
  • type이 존재할 때 호출되는 plusOne() 함수도 있다(Count 값을 증가시켜준다)

Service

@Transactional(readOnly = true)
fun getBookStatistics(): List<BookStatResponse> {
    val results = mutableListOf<BookStatResponse>()
    val books = bookRepository.findAll()
    for (book in books) {
        /*
        val targetDto = results.firstOrNull { dto -> book.type == dto.type }
        if (targetDto == null) {
            results.add(BookStatResponse(book.type, 1))
        }else{
            targetDto.plusOne()
        }
         */
        results.firstOrNull { dto -> book.type == dto.type }?.plusOne()
            ?: results.add(BookStatResponse(book.type, 1))
    }
    return results
}
  • books에는 모든 책 정보를 조회한다.
  • 만약 책 type이 존재한다면 dto의 plusOne 함수를 호출해 해당 Count 값을 증가시킨다.
  • 존재하지 않는다면, dto의 BookStatReponse 타입을 생성해 주고, Count에 1을 저장한다
  • 엘비스 연산자와 null처리 연산자를 사용하면 좀 더 간결하게 코드를 작성할 수 있다

 

728x90