My Project

Flutter로컬커머스) 이메일 도메인 리팩토링 작업

조충희 2025. 9. 2. 19:17

◇ 이메일 도메인 리팩토링

내부적으로 더 유연하고 확장 가능한 구조 확보, 외부적으로는 사용자의 계정 보안과 편의성을 크게 높이는 필수 기능들을 확보했음.

EmailService 비동기 처리:

개요: 메인 애플리케이션에 @EnableAsync를 선언하고, EmailService sendEmail 메서드에 @Async를 적용했음.

목표: 이메일 발송처럼 시간이 걸리는 네트워크 작업을 백그라운드 스레드에서 처리하게 바꿨음. 덕분에 API 응답 시간이 짧아지고 서버 자원 효율이 높아져서, 전체적인 시스템 성능과 사용자 경험 향상.

인증 코드 저장소 추상화:

작업: 기존의 VerificationCodeManager 역할을 VerificationCodeStore라는 인터페이스로 추상화하고, 기존 로직은 InMemoryVerificationCodeStore라는 메모리 기반 구현체로 분리했음.

목표: EmailVerificationService가 구체적인 저장 방식(ConcurrentHashMap)이 아니라 추상적인 역할(인터페이스)에만 의존하게 바꿈. 나중에 인증 코드 저장소를 Redis 데이터베이스로 교체해야 할 때, 상위 서비스 코드를 바꿀 필요 없이 구현체만 교체하면 되는 유연하고 확장 가능한 구조를 확보.

EmailVerificationService 역할 명확화:

개요: 목적별로 나뉘어 있던 여러 send...Code 메서드를, 인증 목적(VerificationPurpose)을 파라미터로 받는 단일 sendCode 메서드로 통합했음.

목표: 코드 중복을 없애고, 서비스의 책임을 "어떤 목적이든, 요청받은 인증 코드를 만들고 보내는 것"으로 명확히 해서 유지보수성 향상.

작업절차:

VerificationPurpose.java (신규 생성) REGISTER, RESET_PASSWORD, FIND_ID 등 이메일 인증의 목적을 정의하는 열거형을 새로 만들었음.

 

VerificationCodeManager.java (수정) storeCode와 verifyCode 메서드가 VerificationPurpose를 파라미터로 받도록 수정해서, 여러 목적의 인증 코드를 충돌 없이 관리할 수 있도록 개선했음.

 

EmailVerificationService.java (리팩토링 및 수정) 이메일 중복 확인 같은 비즈니스 로직을 제거하고, "요청받은 목적의 이메일을 발송"하는 역할에만 집중하도록 리팩토링했음.

 

EmailVerificationController.java (수정) 리팩토링된 EmailVerificationService의 새로운 메서드를 호출하도록 수정하고, 회원가입용 API 엔드포인트를 더 명확하게 변경했음.

 

MemberAuthService.java (수정) EmailVerificationService에서 제거된 이메일 중복 확인 로직을 이 서비스로 가져와서, 비즈니스 규칙 검증의 책임을 명확하게 했음.

email
├── VerificationPurpose.java
├── controllers
│   ├── AccountIdFinderController.java
│   ├── EmailVerificationController.java
│   └── PasswordResetController.java
├── dtos
│   ├── ConfirmVerificationRequest.java
│   ├── FindIdResponse.java
│   ├── PasswordResetRequest.java
│   ├── PasswordResetTokenResponse.java
│   ├── SendPasswordResetCodeRequest.java
│   └── SendVerificationRequest.java
└── services
    ├── EmailService.java
    ├── InMemoryVerificationCodeStore.java
    ├── VerificationCodeStore.java
    └── EmailVerificationService.java