Notice
Recent Posts
Recent Comments
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

개발지식 먹는 하마 님의 블로그

[내일배움캠프 74일차] 문제풀이 링크 발송하기 본문

TIL

[내일배움캠프 74일차] 문제풀이 링크 발송하기

devhippo 2025. 6. 5. 21:06

인증코드 발송 구현을 마쳤으니 이제 프로젝트 구독자에게 발송할 문제풀이 링크를 구현해야 했다.

프로젝트 기획 기반 문제풀이 링크 설정

CS25 프로젝트와 다른 프로젝트의 차별점은 회원가입을 좋아하지 않는 유저들의 접근성을 위해
로그인을 하지 않아도 문제를 풀 수 있도록 했다는 것이다.
대신 로그인한 유저에게는 마이페이지 기반 취약점 분석 등의 부가 기능을 제공한다.

따라서, 사용자 정보는 비로그인 유저와 로그인 유저 모두를 관리하는 Subscription과
로그인 유저를 관리하는 User 두 개의 테이블로 관리한다.

비로그인 유저 식별하기

위와 같은 기획대로 로그인하지 않은 유저가 메일로 받은 문제풀이 링크를 통해
문제풀이 페이지에 접근하여 문제를 푼 기록을 남길 때, 어떤 사람이 풀었는지를 어떻게 식별할 것인가?
를 구현 초기 단계에서 고민하였다.

그 결과 메일로 발송하는 문제풀이 링크 주소에 SubscriptionId와 QuizId를 Parameter로 함께 기입하기로 하였다.

문제풀이 링크 이메일 폼

그렇게 완성된 이메일 폼

1. 문제 풀러 가기 버튼을 누르면, SubscriptionId와 QuizId 정보가 함께 넘어간다.

2. 사용자의 브라우저가 자동으로 문제 조회 API를 호출한다.

3. Thymeleaf가 QuizId에 따라 동적으로 웹 페이지를 렌더링한다.
(문제가 100개라고 할 때, 100개의 웹 페이지가 아닌 1개의 Html만 있으면 되는 것!)

문제풀이 페이지

4. SubscriptionId는 보안을 위해 쿠키에 담기고, 위와 같은 페이지에서 문제를 풀고 답안 제출을 눌렀을 때,
값이 Header로 넘어가며 누가 문제를 풀었는지를 식별하게 된다.


순서도

실제로 어떻게 문제풀이 링크가 사용자에게 도달하는지까지의 과정을 정리해보겠다.

매일 정해진 시간에 Spring Batch를 활성화하면 다음과 같은 업무를 수행한다.

  1. 해당 요일에 문제를 받기로 한 구독 정보를 모두 조회한다.
  2. 각 구독 정보에 대하여 구독 시작일과 오늘 날짜의 차이를 계산한다.
  3. 그 값을 기반으로 슬라이딩 인덱스 알고리즘으로 DB에 저장되어있는 문제들 중 하나를 출제한다.
    (추후 더 보완할 예정)
  4. 구독 정보와 문제를 기반으로 메일 내용을 구성 및 발송한다.

 

개선 사항

💡 MessageQueue 적용의 필요성

현재 프로젝트의 흐름은 동기로 처리되고 있다.

1000개의 메일을 보낼 때, 위와 같은 순서로 1000번이 진행되는 것이다.

만약 526번째 메일을 보내다가 중간에 서버가 다운된다면?
나머지 메일은 보내지지 않을 것이다.

따라서, MessageQueue를 적용하여 유실율 감소 및 정확성을 높일 필요가 있다.

관련된 내용은 다음 글에서 다루도록 하겠다.