PreRegistration
사전 예약 기능 문서화
목적
사전 예약 기능은 서비스 런칭 전 사용자들의 관심도를 파악하고, 초기 사용자 풀을 확보하기 위한 목적으로 구현되었습니다. 주요 기능은 다음과 같습니다:
사전 예약 정보 수집: 전화번호와 SNS URL을 통한 사용자 정보 수집
실시간 알림: 사전 예약 등록 시 슬랙을 통한 즉시 알림 전송
콘솔 조회 지원: 관리자가 콘솔에서 사전 예약 정보를 조회할 수 있도록 약관 타입 추가
먼저 반성해야할 점:
당연한 내용들인데, 급하게 개발을 하느라 고려하지 못한 내용은 다음과 같습니다.
데이터 검증: 서버에서 입력 데이터에 대한 철저한 검증 로직 (개발은 해놨는데 어노테이션을 뺴먹음)
전화번호 암호화: 개인정보인 전화번호를 암호화하여 저장하여 개인정보보호법 준수 및 데이터 유출시 피해 최소화
작업 내용
1. 데이터 무결성 보장
전화번호 유니크 인덱스: 동일한 전화번호로 중복 등록을 방지하기 위해 데이터베이스 레벨에서 유니크 제약 조건을 설정했습니다. 이는 애플리케이션 레벨의 중복 체크와 함께 이중 방어 메커니즘을 제공합니다.
2. 입력 데이터 검증
전화번호 형식 검증: 한국 휴대폰 번호 형식(01X-XXXX-XXXX)에 맞는 정규식을 사용하여 유효한 전화번호만 수집하도록 했습니다.
SNS URL 길이 제한: 최대 200자로 제한하여 데이터베이스 스키마와 일치시켰습니다.
3. 개인정보 처리 동의
동의 필수 체크:
@AssertTrue어노테이션을 사용하여 개인정보 수집 및 이용에 대한 동의를 필수로 받도록 구현했습니다.
4. 중복 등록 방지 로직
사전 중복 체크: 저장 전에
existsByPhoneNumber메서드를 통해 중복 여부를 확인하여 사용자에게 명확한 에러 메시지를 제공하고, 불필요한 데이터베이스 작업을 방지합니다.
5. 슬랙 알림 기능
누적 건수 포함: 슬랙 메시지에 누적 등록 건수를 포함하여 실시간으로 사전 예약 현황을 파악할 수 있도록 했습니다.
조건부 빈 생성:
@ConditionalOnProperty를 사용하여 슬랙 웹훅 설정이 없을 경우 빈이 생성되지 않도록 하여 로컬 환경에서의 오류를 방지.
슬랙 웹훅 설정
슬랙 알림 기능을 위해 다음과 같은 설정이 필요합니다:
환경 변수 설정 (
api.properties):헬름차트 환경 변수 설정: 각 서비스의
values.yaml파일 (dev/prod 환경 모두)에 다음 환경 변수를 추가했습니다:이 설정은 다음 서비스들의 dev/prod 환경에 적용되었습니다:
homeknockzone-console-apihomeknockzone-around-apihomeknockzone-around-biz-apihomeknockzone-batchhomeknockzone-event
이를 통해 각 환경에서 슬랙 알림이 정상적으로 동작하도록 구성했습니다.
6. 콘솔 조회를 위한 약관 타입 추가
약관 카테고리 추가: 콘솔에서 사전 등록 시 사용되는 약관을 조회할 수 있도록
PRE_REGISTRATION카테고리를 추가했습니다.
7. 엔티티 생성 패턴
팩토리 메서드 패턴:
companion object의create메서드를 통해 엔티티 생성을 캡슐화로 향후 엔티티 생성 로직 변경 시 유지보수성을 높입니다.
8. 성능 이슈 가능성
전체 조회 후 카운트: 현재는 기존 메서드
findAll().size를 재사용하여 전체 건수를 조회하고 있습니다. 이는 데이터가 많아질 경우 성능 문제를 야기할 수 있습니다만 행복한 고민이겠죠!!
시간이 있으면 고도화할 수 있는 방안들과 각각의 장단점
1. 성능 최적화: count() 메서드 사용
방안: findAll().size 대신 count() 메서드를 사용
장점:
데이터베이스에서 직접 COUNT 쿼리를 실행하여 메모리 사용량 감소
대용량 데이터에서도 빠른 응답 시간 보장
네트워크 트래픽 감소
단점:
구현 변경이 필요 (현재는 단순하지만)
2. 슬랙 알림 실패 처리
방안: 슬랙 알림 전송 실패 시 재시도 로직 또는 큐를 통한 비동기 처리
장점:
일시적인 네트워크 오류에 대한 복원력 향상
알림 실패로 인한 데이터 손실 방지
사용자 경험 개선 (알림 실패가 등록 실패로 이어지지 않음)
단점:
구현 복잡도 증가
추가 인프라 필요 (메시지 큐 등)
재시도 로직 관리 필요
구현 방안:
Spring의
@Async를 활용한 비동기 처리RabbitMQ, Kafka 등의 메시지 큐 활용
실패 시 로깅 및 모니터링 강화
3. 전화번호 암호화
방안: 개인정보인 전화번호를 암호화하여 저장
장점:
개인정보보호법 준수 강화
데이터 유출 시 피해 최소화
보안 수준 향상
단점:
암호화/복호화 오버헤드(Minor)
키 관리 복잡도 증가
검색 및 조회 시 성능 저하 가능성
기존 데이터 마이그레이션 필요
구현 방안:
JPA의
@Convert어노테이션을 활용한 자동 암호화/복호화AES-256 등 강력한 암호화 알고리즘 사용
4. 등록 제한 기능
방안: IP 주소 또는 디바이스 기반 등록 제한 (예: 1일 1회 제한)
장점:
악의적인 대량 등록 방지 (다른 사람의 번호로 신청할 수 있음)
데이터 품질 향상
서버 부하 감소
단점:
구현 복잡도 증가
공유 IP 환경에서의 정당한 사용자 제한 가능성
추가 저장소 필요 (Redis 등)
구현 방안:
Redis를 활용한 IP/디바이스 기반 제한
Rate Limiting 라이브러리 활용
5. 데이터 만료 및 정리
방안: 일정 기간(예: 1년) 경과 후 자동으로 데이터 삭제 또는 보관
장점:
개인정보 보관 기간 준수
데이터베이스 용량 관리
법적 요구사항 준수
단점:
배치 작업 구현 필요
데이터 복구 불가능
비즈니스 요구사항과의 충돌 가능성
구현 방안:
Spring Batch를 활용한 주기적 정리 작업
createdAt기준으로 만료된 데이터 삭제
6. 통계 및 대시보드
방안: 사전 예약 통계를 제공하는 API 및 대시보드 구현
장점:
실시간 현황 파악
데이터 기반 의사결정 지원
비즈니스 인사이트 도출
단점:
추가 개발 리소스 필요
성능 최적화 필요 (집계 쿼리 등)
구현 방안:
일별/주별/월별 통계 API 제공
결론
현재 구현된 사전 예약 기능은 기본적인 요구사항을 충족하며, 데이터 무결성과 개인정보 보호를 고려한 설계가 되어 있습니다. 특히 다음과 같은 점이 잘 구현되었습니다:
중복 방지: 데이터베이스 레벨과 애플리케이션 레벨의 이중 방어
개인정보 보호: 동의 필수 체크 및 적절한 데이터 구조
실시간 알림: 슬랙을 통한 즉시 알림 기능
만약, 고도화를 하게된다면 다음과 같은 개선이 필요합니다:
즉시 개선 필요:
findAll().size를count()로 변경하여 성능 최적화단기 개선: 전화번호 정규화 및 슬랙 알림 실패 처리
중장기 개선: 전화번호 암호화, 등록 제한, 데이터 만료 정리, 통계 기능
Last updated