Skip to content

Commit 35b9e33

Browse files
committed
docs: write README
1 parent db903ec commit 35b9e33

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

README.md

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# 카드 랜덤 뽑기
2+
3+
## 구현 상세
4+
5+
![img.png](img.png)
6+
7+
1:N 구조를 나타내는 `card_random_draw_range_by_grade` 에는 별개 PK 가 존재하지 않는다.
8+
9+
`card_random_draw_range_by_grade` 1 row 로서는 비즈니스적으로 아무런 가치를 지니지 않고,
10+
`card_random_draw` 와 함께 다 같이 조회되었을 때 실질적으로 가치를 지니므로,
11+
생명주기를 `card_random_draw` 와 함께한다는 의미로 `@ElementCollection`, `@CollectionTable` 을 활용했다.
12+
13+
> `@ElementCollection`, `@CollectionTable` 에 대해서는 아래 글을 참고하자.
14+
> https://github.com/Hyeon9mak/WIL/blob/2e7a35895b85107b664fa44e5c3b9e57e85d51f9/jpa/jpa-value-type.md#%EA%B0%92-%ED%83%80%EC%9E%85-%EC%BB%AC%EB%A0%89%EC%85%98
15+
16+
또 하나 살펴볼 점은 `CardRandomDrawRangeByGrade` 에서 `@Embeddable` 어노테이션을 사용중인데,
17+
이 이유는 No-arg compiler-plugin 의 지원을 받기 위해서다.
18+
19+
<br>
20+
21+
## 동작
22+
23+
구체적으로 확률별 랜덤한 등급을 뽑기 코드는 아래와 같이 동작한다.
24+
25+
```kotlin
26+
fun randomDrawGrade(): CardGrade {
27+
val randomValue = (1..100).random()
28+
return ranges.first { it.isInRange(randomValue) }.grade
29+
}
30+
```
31+
32+
1. 1~100 사이의 난수를 뽑는다.
33+
2. 카드 랜덤 뽑기에 존재하는 확률 범위 중에서 난수에 해당되는 등급을 뽑아낸다.
34+
35+
```kotlin
36+
val cardGrade = cardRandomDraw.randomDrawGrade()
37+
val drewCards = cardRepository.findByGrade(grade = cardGrade)
38+
val drewCard = drewCards.random()
39+
return drewCard
40+
```
41+
42+
1. 뽑아낸 등급을 기준으로 카드 저장소에서 같은 등급의 카드들을 모두 찾아낸다.
43+
2. 찾아낸 카드 리스트에서 랜덤한 한 장을 뽑아서 반환한다.
44+
45+
<br>
46+
47+
## 참고할 글
48+
49+
- [랜덤 뽑기(가챠) 시스템 구현하기 - 현구막 기술 블로그](https://hyeon9mak.github.io/lets-make-random-draw-system/)
50+
- [마이 쿠키 서비스 탄생 비화 - 아이들나라 기술블로그](https://i-nara.oopy.io/ab11f099-e3d0-44d1-97a4-f389ace58709)

img.png

294 KB
Loading

0 commit comments

Comments
 (0)