백준 온라인 저지 풀이를 기록하고 다른 사람들과 공유하는 웹 애플리케이션입니다.
| 항목 | 내용 |
|---|---|
| 개발 기간 | 2025.04 ~ 2025.07 |
| 역할 | 백엔드 개발 (1인). 프론트엔드는 생성형 AI를 활용해 Thymeleaf 템플릿 작성 |
| 저장소 | https://github.com/Duskafka/Coding-Mate |
언어 · 프레임워크 Java 17, Spring Boot 3.3.5, Spring Security, Spring Data JPA, QueryDSL, Spring Batch, Thymeleaf
데이터 MySQL 8, Redis
인증 JWT (jjwt)
인프라 Docker, GitHub Actions, AWS EC2, AWS RDS
백준에서 푼 문제의 풀이를 등록하고 목록·상세로 조회하며, 다른 사람의 풀이에 좋아요를 누를 수 있는 서비스입니다. 회원가입은 이메일 인증을 거쳐야 완료되고, 로그인 이후에는 액세스 토큰과 리프레시 토큰을 발급해 인증을 처리합니다. 푼 문제 수 기준 일간 랭킹은 Spring Batch로 매일 정오에 집계해 Redis에 캐싱합니다. GitHub Actions로 빌드와 통합 테스트부터 Docker 이미지 배포, AWS EC2 반영까지 자동화했습니다.
로그인할 때마다 리프레시 토큰을 새로 발급하면서 발급 개수를 확인하지 않아, 한 계정에 토큰이 계속 누적됐습니다. 사용하지 않는 토큰이 유효한 상태로 남는다는 점이 문제였습니다.
Redis에 저장된 해당 계정의 토큰 수를 세어 최대치를 넘으면 RefreshTokenOverMaxException을 발생시키도록 했습니다.
최대 개수는 jwt.redis.max-token 프로퍼티로 외부화해 현재 3개로 두었습니다.
(RefreshTokenService.validateMaxTokenCount)
인증 메일의 HTML을 String.format으로 이어 붙여 만들었습니다.
마크업이 자바 코드 안에 문자열로 박혀 있어 수정이 번거로웠고, 메일을 보낼 때마다 본문 전체를 문자열로 새로 만들어야 했습니다.
본문을 Thymeleaf 템플릿(templates/email/email_verification.html)으로 분리하고
SpringTemplateEngine.process()로 렌더링하도록 바꿔, 마크업 수정과 발송 로직을 분리했습니다.
(EmailSendService.generateHtmlContent)
