티스토리의 작심삼주이벤트를 백엔드 개발자가 고민한다면

 

 

 

 

요구사항


 

티스토리에서는 2024.11.07 - 11.27까지 21일 동안의 작심삼주 오블완 챌린지를 진행한다.

 

작심삼주 오블완 챌린지

오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.

www.tistory.com

 

가장 핵심적인 이벤트 진행 조건은 '매일 특정 태시태그를 단 연속된 21개의 포스팅 기록이 충족되는 것' 이다.

더불어 이벤트 공지 내 하단의 확인 및 참여기준을 보면 여러 제한조건이 있는데, 이걸 백엔드 개발자가 보고 구현해야한다면 무엇을 고려해야했을까?

 

 

요구사항 추출 및 구현 상세화


1. "한국 시간 기준"에 따른 시간 검증

한국 시간 기준 00시부터 23시 59분

요구사항에 따르면 모든 게시글의 작성 및 발행 시간이 한국 표준시(KST) 기준으로 계산되어야 한다. 따라서 서버는 UTC 시간을 기준으로 동작한다고 쳤을 때 UTC+9로 변환하여 한국 시간에 맞게 확인해야하는데, 일반적으로 created_at 필드가 있었다면 여기에 UTC 시간을 저장하고 요청 시 KST로 변환할 수도 있겠다. 

더불어 해외 사용자도 참여가 가능할 것이니 시차를 고려하여 '발행 시간 검증은 서버에서만 수행'하는 것이 일관성 유지를 위한 필수다.

 

2. 예약 발행 또는 당일 미작성 글 제외 로직

예약 발행된 글 또는 당일 작성되지 않은 글은 인정되지 않습니다.

예약 발행된 글이라면, 기존에 '예약일시', '발행일시'를 관리하는 필드가 존재한다고 치자, 그러면 이 두 Column을 비교하여 예약 발행된 글인지 확인할 수 있고, 이를 참여 글에서 제외시킨다. 그리고 여기에 '생성일시'가 이벤트 당일이라면 무조건 제외한다는 등의 로직을 취하면 된다. 

참여 인정된 글이더라도 챌린지 기간 동안 참여글을 삭제하거나 참여 조건에 맞지 않게 수정하면 해당 글은 챌린지 참여가 인정되지 않습니다. 특히, 당일 이후 챌린지 조건에 맞지 않게 수정•삭제하여 참여글에서 제외된 경우, 다시 조건에 맞게 재수정하더라도 참여로 인정되지 않으니 주의해 주세요.

 

이 또한 기본적으로 내용이나 삭제여부 column 비교를 통해 해결 가능할 것인데, 필요하다면 배치를 통해 주기적이거나 최종적인 확인 로직을 수행해도 될 것이다.

 

3. 태그 조건 검증

#오블완 및 #티스토리챌린지 태그를 모두 포함한 글만 참여로 인정되며, 글은 반드시 공개 설정과 홈주제 설정이 완료되어야 합니다.

 

이 같은 경우, 태그 저장 구조자체는 글에 대해 N:M 관계로 설계해놓고, 특정 태그 포함 여부를 쿼리로 간단히 확인해보는 간단한 방법이 있다. 쿼리는 간단히 아래와 같을 수 있다.

SELECT COUNT(*) FROM post_tags WHERE post_id = ? AND tag_name IN ('#오블완', '#티스토리챌린지');

두 태그가 모두 없으면 이벤트 참여 제외인 것이다. 

 

그리고 공개 설정과 홈주제에 대해서는, visibility 필드를 둘 수 있는데 좀 세부화하자면 int 값을 통해 0, 1, 2(비공개, 공개, 공개(보호))로 표시할 수도 있다. category에 대해서는 not null 을 확인해보기도 하고.

 

효율적으로 하기 위해서는 태그에 대해서는 검색을 위한 인덱스를 적용하거나 앞선 내용을 통 틀어서 간편하게 조회하기 위한 뷰 테이블을 생성시키는 방법도 있다.

 

 

4. "내용 조건" 검증

// 참여 인정이 되지 않는 경우

동일 내용 복사/붙여넣기
자동화된 수단을 통한 발행
도배나 스팸 행위로 간주되는 글
타인 콘텐츠 그대로 복사 등

 

위와 같은 조건에 대해서는 아래와 같은 검증이 필요할 것이다

  • 텍스트의 길이(content Column)가 일정 길이 이상인지 확인한다
  • 게시글 내용에 반복적인 패턴이나 일정 길이 이상의 텍스틑가 포함되어 있다면 제외시킨다
  • 스크립트 봇과 같이 자동화된 수단 사용 여부 판독을 위한 로그 분석과 종합적 판단 로직 수행한다 (혹은 사전에 CAPCHA나 로그인 인증 강화)

 

5. 일 단위 체크

하루에 여러 개의 글을 작성하더라도 챌린지 조건에 맞게 발행된 첫 번째 글만 참여로 인정됩니다. (예: 하루 동안 10개의 글을 발행하더라도 1일 참여로 집계)

 

하루에 한 개만 인정한다면, 날짜별로 유일한 게시글인지 확인하면 된다. '생성일시' 컬럼에 대해 하루 단위로 그룹화 하는 방식으로, 21일 동안 매일 1개 이상 누락된 날짜가 없는지 확인하기 위한 날짜 간격 계산 로직이 방법 중 하나다. SQL로 치자면 DATEDIFF나 프로그래밍 상에서의 날짜 객체, 함수(LocalDate)를 응용하면 된다.

 

 

6. 통계 및 실시간 피드백

사용자에게 본인의 참여 현황, 예를 들어 '현재 21일 중 몇 일 째 도전'등을 보여주는 실시간 상태를 제공해야한다. 이를 위해서는 사용자 별 데이터를 캐싱하거나 비동기 작업을 수행하도록 하여 효율성을 유지하며 분석 데이터 수집/집계 내용을 표기하게 될 것이다.

 

 

7. 확장성 및 안정성

 

마지막으로 간단히 살펴보면 이런 고민도 있겠다.

고트래픽 처리

이벤트 기간 동안 게시글 작성이 증가할 가능성이 높으므로, 읽기/쓰기 트래픽을 분리하거나 데이터베이스를 분산 처리해볼까?

 

실시간 검증의 효율성

이벤트 조건 검증 로직을 API 호출 시점에 수행할지, 배치 프로세스로 처리할 지 생각해볼까?

 

 

 

 

... 등등의 고민이 있겠다.