Kotlin

[Kotlin] 목록에서 랜덤으로 1개만 가져오기 (response : objectDTO)

sian han 2022. 11. 22. 16:17

DB 에 저장된 찌개 목록중에서 랜덤으로 1가지만 가져오는 메서드 getRandomJjigae() 를 만들어보겠다.

 

1. 모든 찌개 정보 가져오기

2. 찌개의 Id만 List 에 담기

3. List 에 담긴 id 중 랜덤으로 1개 고르기 (random())

4. 랜덤으로 선택 된 id 의 객체 가져오기 

 


 

JpaRepository 클래스의 findAll() 메서드를 사용하면 Iterable<T> 의 형태로 반환된다.

List<Object> 형태로 반환받기 위해서 Repository 인터페이스에서 쿼리를 작성한다.

 

 

가져온 List<Object> 를

for 문을 돌려서 Object.id 만 List 에 담아줄거다.

 

Kotlin 에서 List 는 읽기 전용이다. 때문에 값을 변경하기위한 List 인 mutableList 를 사용할거다.

선언을 먼저 하고 값을 나중에 추가할건데, 이를 위해서는 선언과 동시에 초기화를 해주어야 한다.

val jjigae = jjigaeRepository.getAllJjigae()
val range = mutableListOf<Int>()

 

 

Kotlin 은 indices 를 제공하기 때문에,  in 절에다가 써주면 단순 for 문 처럼 돌아간다

indices : for 문에서 위치를 나타내는 index 값을 나타날 때 indices 프로퍼티 사용

 for(idx in jjigae.indices){ 
            range.add(jjigae[idx].id)
}

 

이렇게 DB 에 저장된 객체들의 id 만 들어있는 List<id : Int> 를 반환하는 makeRange 메서드를 만들었다.

전체 코드는 아래와 같다.

//저장된 id List 리턴
    fun makeRange(): List<Int> {
        val jjigae = jjigaeRepository.getAllJjigae()
        val range = mutableListOf<Int>()
        for(idx in jjigae.indices){ //indices : for 문에서 위치를 나타내는 index 값을 나타날 때 indices 프로퍼티 사용
            range.add(jjigae[idx].id)
        }
        println(range)
        return range
    }

 

 

가져온 id List 에서 랜덤으로 찌개 정보를 가져와보겠다.

먼저 random() 을 통해 List 에서 무작위로 id 1개를 가져와 random 변수에 할당한다.

val range = makeRange()
val random = range.random()

 

 

그리고 만들어둔 getJjigae(id) 메서드를 이용해

랜덤으로 선택된 숫자를 id 로 가지고 있는 객체를 가져 올 건데, getJjige() 메서드는 아래와 같다

return getJjigae(random)
   override fun getJjigae(id: Int): JjigaeDTO {
        val optionalJjigae = jjigaeRepository.findById(id)
        val jjigae = optionalJjigae.orElseThrow{JjigaeException("Jjigae with id $id is not present")}
        return jjigaeMapper.fromEntity(jjigae)
    }

 

 

이렇게 DB 에 저장된 찌개 목록중에서 랜덤으로 1가지만 가져오는 메서드 getRandomJjigae() 가 완성됐다.

   override fun getRandomJjigae(): JjigaeDTO {
        val range = makeRange()
        val random = range.random()
        return getJjigae(random)
    }

 

 

++ 선호도가 높은 찌개는 랜덤추첨 확률을 높이고싶다면 ?

선호도 4.0 이상인 찌개는 List 에 한번 더 추가해주는 if 구문을 추가한다.

추가된 전체 코드는 아래와 같다.

 

 

++ 흠.. 위 코드로는 추첨 확률이 선호도에 따라 명확하게 분배되지 않는다. 

정확한 추첨확률을 만들기 위해 코드를 수정했다.

선호도 1 => 추첨확률 1배

선호도 2 => 추첨확률 2배

선호도 3 => 추첨확률 3배

.

.

이런식으로 선호도에 따른 추첨확률이 계산되도록.