[개발일지] TODO API - 25.09

PR 링크


🎯 프로젝트 목표

Cloud 서버에 올리는 MSA기반 간단한 Todo API 개발

=> 간단한 Todo 관리를 위한 마이크로서비스 아키텍처 기반 API 서버를 개발하고 있다. 학습 목적이기도 하지만, 실제 운영 가능한 수준의 구조로 만들어보고 싶어서 MSA를 선택했다.

🏗️ 아키텍처 구성

  • 모듈 구조 : Core + 3개의 서비스 (Todo, User, Notification)
  • 인프라 : Docker Compose 기반 컨테이너
  • 데이터베이스 : MySQL 8.0 (통합 DB)
  • 캐시 : Redis Master-Slave 구성
  • 메시징 : Apache Kafka (이벤트 기반 서비스 통신용)

📂 프로젝트 구조

todolist/
├── apps/
│   ├── core/           # 공통 라이브러리 (JWT, 인증, 유틸리티 등)
│   ├── todo/           # Todo CRUD (포트: 18081)
│   ├── user/           # 사용자 관리 (포트: 18082)
│   └── noti/           # 알림 처리 (포트: 18083, Batch 포함)
├── config/             # 서비스별 설정 파일
├── docker-compose.yml  # 인프라 구성
└── build.gradle        # Gradle 멀티프로젝트 설정

🚀 개발 진행 상황

1) 프로젝트 초기 설정 (완료)

  • Gradle 멀티프로젝트 구조 구성
  • Docker Compose 인프라 설정 (MySQL, Redis, Kafka)
  • Spring Boot 3.5.5 + Java 21 환경 구축

=> 처음엔 단순하게 시작하려고 했는데.... 어차피 할 거면 제대로 해보자는 생각으로 멀티모듈 구조를 선택했다.

2) Core 모듈 개발 (지속적으로 추가 예정)

  • 공통 라이브러리 모듈 구성
  • 기본 유틸리티 및 설정 클래스 개발

=> 각 서비스에서 중복 코드가 생기는게 번잡해서 공통으로 사용할 기능들을 Core 모듈에 모았다.

3) JWT 인증 개발 (완료)

  • JWT Token Provider 구현
  • Spring Security 설정
  • 토큰 기반 인증 필터 구성

=> 보안은 처음부터 제대로 하고 싶어서 JWT 기반으로 구현했다.

현재 구현된 인증 흐름

  1. 로그인 시 AES로 암호화된 비밀번호 수신
  2. 복호화 후 BCrypt로 검증
  3. JWT Access Token 발급
  4. 이후 API 호출 시 토큰 검증
// AuthController.java
@PostMapping("/login")
public String login(@Valid @RequestBody AuthUserDto.Request request) throws Exception {
    String password = request.getPassword();
    String decrypt = aesUtil.decrypt(password);  // AES 복호화
    request.setPassword(decrypt);

    return authService.login(request);  // JWT 발급
}

4) 회원가입/로그인 및 JWT 통합 (완료)


주요 구현 사항

  1. 인증 시스템 완성
    • AuthUser 엔티티: ULID 기반 사용자 관리
    • AuthController: 로그인 API (AES 암호화 지원)
    • JwtTokenProvider: Access Token 생성 및 검증
    • SecurityConfig: Spring Security 통합 설정
  2. DB 설계
    • 사용자 테이블 (user)
    • 로그인 이력 테이블 (auth_login_history)
    • JPA Auditing 적용 (생성/수정 시간 자동 관리)
  3. 보안 강화
    • AES 암호화를 통한 비밀번호 전송 보안
    • JWT 기반 무상태 인증
    • ULID를 통한 예측 불가능한 사용자 ID 생성
  4. 개발 편의성 향상
    • P6Spy를 통한 SQL 쿼리 로깅
    • MapStruct 기반 DTO 매핑
    • QueryDSL 통합 (컴파일 타임 타입 안전성)
    • Caffeine 캐시 적용 준비

🛠️ 기술 스택

Backend

  • Spring Boot 3.5.5, Spring Security, Spring Data JPA
  • QueryDSL (타입 안전한 쿼리용)
  • MapStruct (DTO 매핑 자동화)

DB & Cache

  • MySQL 8.0 (메인 DB)
  • Redis 7.0 (Master-Slave로 구성)

Message Queue

  • Apache Kafka 3.5.1 (KRaft 모드)

기타

  • JWT (JJWT 0.12.6)
  • P6Spy (SQL 로깅)
  • Docker Compose

설계하면서 고민한 것들

1. 토큰 관리 방식

Access Token + Refresh Token 구조는 이미 구현했는데, 아직 개선할 부분들이 있다.

현재 구현된 것

  • Access Token + Refresh Token 분리 발급
  • Refresh Token은 HttpOnly 쿠키로 저장
  • 설정에서 Refresh Token TTL: 7200초 (2시간)

아직 부족한 부분

  • Refresh Token으로 새 토큰 발급하는 API가 없음
  • RTR(Refresh Token Rotation) 미적용
  • 토큰 재사용 감지 로직 없음

개선 예정

  • /auth/refresh 엔드포인트 추가
  • 토큰 갱신 시 기존 RT 무효화 (RTR 패턴)
  • Redis를 활용한 토큰 블랙리스트 관리(의미가 있으려나..?)

2. 서비스간 통신 방식

고민 중인 시나리오

  • 회원가입 → 환영 알림 발송
  • Todo 생성 → 리마인더 알림 등록
  • 회원 탈퇴 → 관련 데이터 정리

해결책으로 생각하는 것

  • Kafka Event-Driven 방식으로 비동기 처리
  • 각 서비스에서 도메인 이벤트 발행/구독

3. 데이터 일관성

Saga Pattern 고려 중

  1. User 삭제
  2. User 삭제 이벤트 발행
  3. Todo 서비스에서 관련 데이터 삭제
  4. Notification 서비스에서 관련 데이터 삭제

📋 현재 진행 상황

기능 상태 비고
프로젝트 구조 멀티모듈 + Docker 환경
Core 모듈 JWT, 공통 유틸리티
인증 시스템 로그인, 토큰 발급
User 서비스 🔄 40% 회원가입만 완료, 나머지 기능 개발 중
Todo 서비스  
Notification 서비스  

🚀 다음에 할 일

우선순위 높음

  1. Todo 서비스 기본 CRUD - 핵심 기능이니까 먼저
  2. User 프로필 관리 - 기본적인 사용자 기능 완성
  3. 토큰 갱신 API - Refresh Token 활용

우선순위 보통

  1. Notification 서비스 - 이벤트 기반 알림
  2. API 문서화 - SpringDoc으로 Swagger 생성
  3. 테스트 코드 - 지금까지 미뤄둔 부분

나중에

  1. 모니터링 - 로그 수집, 메트릭
  2. 배포 자동화 - CI/CD 파이프라인
  3. 성능 최적화 - 캐싱 전략, 쿼리 튜닝

'Devlog > 코드 톺아보기' 카테고리의 다른 글

콘서트 좌석 예약 시스템 문서  (0) 2025.09.20