목적은 검색을 했을때
검색 빈도수가 높은것으로부터 상위 10개를 출력하게 하는것으로 수정할 것인데,
Service의 BlogService를 통해서 수정을 할 것이다.
BlogService에 소괄호를 추가해서 사이에 val word를 입력하면 Repository뜨는것을 클릭해서 작성해준다.

result 결과(검색한 결과들 전체 가져온것)중 검색순위가 높은걸 처리해야하는데,
우선 lowQuery를 선언을 했다.

그런데, . 부분에 빨간줄이 뜬것을 볼수있는데 이유는 blogDto에서 query를 ?를 적으면서 Null을 허용을 해줬기 때문에 lowQuery의 값에서 query가 Null일 경우에대한 처리를 해줘야 하기 때문이다.

"query값에 Null이 들어오지 않는다" 라는것을 보장해주는 !!를 붙혀주면 오류가 발생하지 않는다.

소문자 처리한 것들의 갯수를 세야해서 word라는 변수를 추가해줬는데 word.cnt++ 에서 에러가 발생한다.

이유는 Entity에서 cnt를 val로 선언을 해줘서인데, 이 변수타입을 var로 변경해주면 해결된다.

내용을 요약하자면 Dto의 query값을 소문자로 처리하고, 처리한 값들을 wordRepository에서 찾고 없다면 저장소를 만든다 > 발견될때마다 cnt 를 1씩더하고 word에 담긴 내용을 wordRepository에 저장한다.

val lowQuery: String = blogDto.query!!.lowercase() //Dto Query에 있는 값을 소문자로 처리
val word: Wordcount = wordRepository.findById(lowQuery).orElse(Wordcount(lowQuery)) // wordRepository에서 소문자로 변환한 것들을 검색해서, 만약 없다면 인스턴스를 만들어서 저장하게한다.
word.cnt++ // 발견된 것들, repository에 저장할때마다 1을 더한다.
wordRepository.save(word) // word 에 담겨있는 내용을 wordRepository에 저장한다.
이제 repository(wordRepository.save(word) )에 저장을 했으니 이 저장된 값들을 사용자에게 제공하려면 UI 를 작성해줘야한다.
repository에서 저장된 word중 상위 10개의 워드를 조회하는 function을 추가하고, 다시 Service에 돌아가서 Repository를 부를수 있는 함수를 만들어줘야한다.

Service 결과 밑 중괄호 사이에 wordRepository에 작성했던 함수를 불러온다.

그리고 controller로 돌아와서 저장된 값을 사용할수있게 endpoint를 불러온다.
@GetMapping("/rank")
fun searchWordRank(): List<Wordcount> = blogService.searchWordRank()
서버를 실행하고 Postman으로 /rank 에 실제로 저장되는지 확인한다.
아까 controller에 /rank를 mapping을 해줬는데 사용자(요청자)가 Get 요청을 하는데 /rank를 뒤에 붙이면 아까 작성했던 wordRepository가 출력되게 설정해둔것이다.
서버를 실행한 이후 api/blog를 통해서 GET 요청을 하지 않았으므로 wordRepository에 저장된 것이 없어 공백으로 출력되야한다.

wordRepository에 저장시키기 위해
강철의 연금술사를 2번 진격의 거인을 주제로 3번
GET요청을 해보겠다.


그러고 나서 /rank에 GET요청을 보내면

아래와 같이 word와 몇번 입력됐는지 cnt까지 출력이 되는것을 확인할수있다.

추가 마무리
val lowQuery: String = blogDto.query!!.lowercase()
아까 BlogService에서 작성했던 lowQuery부분에서 query에 Null값이 들어오지 않는다! 라는것을 보장해주는 !!방식을 사용했었는데,
실제로 Dto를 확인해보면 val query: String? 으로 선언하여 Null 을 허용한다는 선언을 했지만 실제로 filed:NotBlank로 체크를하여 query에는 Null이 들어올수 없게된다.

그래서 요청을 할때 들어온 query를 _query에 담아주고,

밑에 val query를 작성해주는데, String으로만 들어오고 호출(GET) 요청이 들어올 경우에 _query에 Null이 절대로 들어갈수 없다 = !! 방식을 사용해서 보장을 해주면

BlogService에서 !!를 삭제해줘도 에러가 발생하지 않는다.

마무리 확인
수정을 한 다음 rank에 get요청을 하면 당연히 db에 저장된것이 없기에 공백으로 출력이된다.
왜냐하면 서버는 재시작될때마다 DB를 삭제하고 다시 생성하기 때문

블리치 3, 강연금 2 번 요청을 하고 다시 /rank로 요청을 하면 아래와 같이 출력이 되는것을 보며 동작에 이상이 없음을 확인했다.
