Skip to content

Commit

Permalink
[docs] 이벤트 로직 관련 설명 보강, 추첨 이벤트 설명 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
blaxsior authored Aug 26, 2024
1 parent 3e9252d commit 0272b91
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,35 @@

### 주요 로직 다이어그램

이벤트 관리
#### 이벤트 관리
![image](https://github.com/user-attachments/assets/2d548809-1053-46c3-8acd-cc59f74e6715)

현재 기획에 따르면 이벤트는 추첨 / 선착순 2종류만 존재합니다. 그러나 장기적으로 더 많은 이벤트 타입이 등장할 수 있으며, 백엔드 시스템은 새로운 이벤트 타입이 등장하더라도 큰 변경 없이 확장에 대응할 수 있어야 합니다. 모든 이벤트에 대해 공통된 로직에 대한 책임은 EventService에 맡기고, 특정 이벤트에 대한 작업은 EventFieldMapper 인터페이스로 분리하여 특정 이벤트 타입에 대한 구현체가 담당할 수 있게 구성했습니다.

이러한 설계를 통해 차후 새로운 이벤트 타입이 등장하더라도, 해당 이벤트 타입에 대한 EventFieldMapper을 구현하고 bean으로 등록함으로써 기존 시스템에서 확장할 수 있게 되었습니다.

1. EventService에서 이벤트 공통 로직(event_metadata 관련) 처리
2. EventFieldMapperMatcher에게 구체적 이벤트에 대한 핸들러 요청
3. 이벤트 타입에 대응되는 핸들러를 이용하여 구체적 이벤트 타입 관련 작업을 처리

#### 추첨 이벤트
![image](https://github.com/user-attachments/assets/563f655a-cac3-475c-9058-0de171d10861)

현재 기획에 따르면, 이벤트 유저는 추첨 이벤트에 대해 특정 액션(기대평 작성, 이벤트 참여)을 수행하면 대응되는 가산점을 받습니다. 이 기획을 구현하는 가장 간단한 방법은 코드 수준에서 특정 액션을 수행할 때 가산점을 받도록 구현하는 것입니다. 예를 들어, 댓글 작성 API를 호출하면 유저의 점수를 5점 높이도록 구현하는 방식이 있습니다.

하지만 액션과 가산점을 코드 수준에서 매핑하게 되면 둘이 지나치게 의존하여, 가산점에 관여하지 않는 액션은 수행할 수 없게 됩니다. 앞서 언급한 댓글 작성 API는 다른 이벤트에서 단순히 댓글 작성 용도로 사용하고 싶더라도, 코드 레벨에서 점수에 의존하므로 가산점 증가 없이 사용할 수 없습니다.

따라서, 미래의 확장성을 고려하면 액션과 점수 도메인을 명확하게 분리할 필요가 있습니다. 댓글은 유저와 관계 없이 작성할 수 있어야 하고, 유저 정보 없이도 URL을 공유할 수 있어야 합니다. 이렇듯 액션과 점수 도메인을 디커플링하기 위해, 저희 팀은 ScoreCalculator 객체를 도입하여 모든 액션에 대한 가산점 계산을 책임지도록 구성했습니다. 현재 당첨자를 뽑는 로직에는 누적합 알고리즘이 이용되고 있는데, 추후 다른 추첨 방식이나 더 좋은 방식이 등장할 수 있으므로 WinnerPicker 객체를 인터페이스로 지정하여 확장 가능하게 만들었습니다.

동작 방식은 다음과 같습니다.

1. 관리자는 추첨 api를 호출한다.
2. DrawEventService는 이벤트 추첨 관련 검증을 마친 후, DrawEventDrawMachine을 이용하여 추첨을 진행한다. 추첨은 비동기로 처리된다.
3. DrawEventDrawMachine은 ScoreCalculator에게 점수 계산을 요청한다.
4. ScoreCalculator은 현재 추첨 이벤트의 정책(액션 - 점수 매핑)에 따라 세부 ActionHandler에게 점수 계산을 요청하고, 결과 점수를 반환한다.
5. DrawEventDrawMachine은 반환된 점수를 WinnerPicker에게 넘겨 추첨을 진행하고, 당첨자 정보를 DB에 저장한다.


## 📥 Installation

1. 레포지토리를 클론하세요.
Expand Down

0 comments on commit 0272b91

Please sign in to comment.