DBML
Table user_tb { id bigint [increment, pk] username varchar(255) github_id varchar(255) avatar_url varchar(255) github_url varchar(255) bio varchar(50) jandi_rating double role enum [not null] region enum region_authentication_at timestamp available_join_count int avaiable_like_count int github_pk bigint signup_yn tinyint achievement_id bigint repository_url varchar(255) created_at timestamp deleted_at timestamp } Table user_achievement_tb { id bigint [increment, pk] user_id bigint achievement_id bigint completed boolean achieved_at timestamp } Table achievement_tb { id bigint [increment, pk] title varchar description varchar img_url varchar progress_level int Requirement_type enum ('sequence','count') requirement_value int activity_type } Table user_activity_tb { id bigint [increment, pk] user_id bigint activity_type activity_date timestamp } Ref: user_tb.id > user_event_tb.user_id Ref: user_tb.id > user_achievement_tb.user_id Ref: user_tb.achievement_id > user_achievement_tb.achievement_id Ref: user_achievement_tb.achievement_id > achievement_tb.id { id bigint [increment, pk] title varchar description varchar img_url varchar progress_level int sequence_yn tinyint status enum('PROGRESS, COMPLETED') now_grade int }
업적 타입 →
achievement_type
- 한 번에 달성 가능한 업적인지
- 점진적으로 달성 가능한 업적인지
@Getter public enum AchievementType { ONCE(1), THIRD(3), FIFTH(5), TENTH(10) private final int level; AchievementType(int level) { this.level = level; } public static AchievementType getByLevel(int level) { for (AchievementType type : Achievement.values()) { if (type.getLevel() == level) { return type; } } return null; } }
업적의 연속성 →
sequence_yn
- (연속성의 기준은 ‘하루’로 가정)
true
: 연속 3일동안 프로젝트 매칭을 진행
false
: 연속성, 기한 상관없이 3회동안 프로젝트 매칭을 진행
연속성의 기준을
하루
로만 가져갈 것인지?
예1) 하루동안 ‘찔러보기’ 요청 3회 달성 시
예2) 일주일동안 ‘프로젝트’ 매칭을 모든 서비스 지역에서 수행했을 시- (연속성의 기준을 자유롭게 가정)
sequence_yn
- boolean으로 관리
- true : 연속성을 가짐
- false : 연속성을 가지지 않음
- deadline : null or ZERO(0)
deadline
→ 확장성을 고려, but 필요없을듯!- enum으로 관리
- ONCE(1)
- SEVENTH(7)
sequence_yn | deadline | achievement_type | description |
true | 0 | 3 | 연속 3일동안 매칭 |
true | 1 | 3 | 하루동안 연속 3번 매칭 |
false | 7 | 5 | 7일동안 5번 달성 |
false | 0 | 1 | 최초 1번 달성 |
false | 0 | 3 | 기간 상관없이 3번 달성 |
false | 1 | 3 | 하루동안 3번 매칭 |
업적의 연속성 체크
- 연속성 업적에 대한 별도의 테이블을 분리?
- 이벤트 히스토리를 남기기
- 레코드를 생성하면서, 해당 업적의
sequence_yn
/achievement_type
을 바탕으로 연속체크 쿼리 수행 event_date
를 기준으로 하루 전날 이벤트 히스토리를 추적
별도로
event
테이블을 두어서 연속성 업적 조건을 관리하는 방법
예) 연속성을 고려한 업적의 경우, (연속 3일 프로젝트 매칭 완료) 업적을 위한 작업을 수행했을 때 event
테이블에서
오늘 날짜를 기준으로 전날 이벤트 히스토리를 조회
- 히스토리가 존재하는 경우 grade
+= 1
- 히스토리가 존재하지 않는 경우 grade
= 0
- grade
== achievement_type
조건 만족 시, completed!create table user_event_tb { id bigint auto_increment primary key, user_id bigint not null, achievement_id bigint not null, event_date timestamp // 연속성 업적 이벤트 수행일 }
event
테이블을 두지 않고 user_achievement
와 매칭 히스토리 project
/ matching
로 관리 고려
예) 연속성을 고려한 업적의 경우, (연속 3일 프로젝트 매칭 완료) 업적을 위한 작업을 수행했을 때 매칭 히스토리를
통해서 해당 사용자가 전날 프로젝트 제안자, 참여자로써 매칭이 완료된 내역이 있는지 확인
- 내역이 있을 경우 grade
+= 1
- 내역이 없을 경우 grade
= 0
- grade
== achievement_type
조건 만족 시, completed!
업적 최초 달성일, 점진적 달성일
- 한 번에 달성 가능한 업적의 경우 → 최초 달성일 O, 수정일
null
- 점진적으로 달성 가능한 업적의 경우
- 연속성을 가지지 않는 업적의 경우 → 최초 달성일 O, 수정일 O
- 연속성을 갖는 업적의 경우 → 연속성을 모두 만족하는 최초 달성일 O, 수정일
null
연속성을 다룬다면 최초 생성일이 필요한지? 점진적으로 달성할 때마다 달성일이 필요한지?
업적에 대한 이벤트 처리
- 특정 업적과 관련된 이벤트 (예: 프로젝트 매칭 완료) 가 발생 시, 어떻게 해당 업적에 처리를 할 것인가!
- 노가다,,,?