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배
.
.
이런식으로 선호도에 따른 추첨확률이 계산되도록.
'Kotlin' 카테고리의 다른 글
[Kotlin] 유용한 함수 with / run (0) | 2022.11.15 |
---|---|
[Kotlin] 데이터클래스 / 컬렉션 (0) | 2022.11.14 |
[Kotlin] 예외처리 / 람다 / 클래스 (0) | 2022.11.14 |
[Kotlin] 조건문 / 반복문 (0) | 2022.11.14 |
[Kotlin] 함수 / 변수 / 자료형 / 배열 (0) | 2022.10.24 |