Skip to content

Conversation

@DDINGJOO
Copy link
Owner

@DDINGJOO DDINGJOO commented Oct 16, 2025

목적

신고 시스템 구현에 앞서 필수적인 공통 인프라를 구축합니다.

  • 분산 환경에서 안전한 고유 ID 생성 메커니즘 확보
  • 도메인별 예외 처리 표준화로 일관된 에러 응답 제공
  • 향후 신고 API 구현 시 즉시 활용 가능한 기반 마련

변경 요약

1. Snowflake 기반 ID 생성기 구현

파일: report/utils/Snowflake.java, report/utils/IdGenerator.java, report/config/IdConfig.java

필요성:

  • 신고 데이터는 분산 환경에서 동시다발적으로 생성되므로 충돌 없는 고유 ID가 필수
  • DB의 AUTO_INCREMENT는 분산 환경에서 병목 및 충돌 위험 존재
  • Snowflake 알고리즘은 타임스탬프 + 노드ID + 시퀀스로 64bit 정수를 생성하여 시간순 정렬 가능하고 충돌 없음

핵심 구현:

  • Custom Epoch: 2024-01-01 기준으로 비트 공간 효율 극대화
  • 노드 ID 10bit (최대 1024 인스턴스 지원)
  • 시퀀스 12bit (밀리초당 4096개 ID 생성 가능)
  • Clock rollback 방어 로직 포함

2. 도메인 예외 처리 체계 구축

파일: report/exceptions/ErrorCode.java, report/exceptions/ReportException.java, report/handler/GlobalExceptionHandler.java

필요성:

  • 신고 시스템 에러(존재하지 않는 신고, 권한 없음, 중복 신고 등)를 명확히 분류하고 클라이언트에 일관된 형식으로 전달
  • HTTP 상태 코드와 도메인 에러 코드를 체계적으로 매핑하여 디버깅 및 모니터링 용이
  • 향후 에러 코드 확장 시 ErrorCode enum에만 추가하면 되어 유지보수성 향상

핵심 구현:

  • ErrorCode enum: 에러 코드, 메시지, HTTP 상태를 한곳에서 관리
  • ReportException: ErrorCode를 감싸는 비즈니스 예외 클래스
  • GlobalExceptionHandler: @ControllerAdvice로 모든 컨트롤러의 예외를 중앙 집중 처리

3. 테스트 코드 작성

파일: *Test.java (각 컴포넌트별 단위 테스트)

  • SnowflakeTest: 버스트 환경(10,000회)에서 ID 유일성, 증가성, 양수 보장 검증
  • IdConfigTest: Spring Bean 등록 및 정상 동작 확인
  • ReportExceptionTest: 예외 객체의 상태, 코드, 메시지 노출 검증
  • GlobalExceptionHandlerTest: 예외를 올바른 HTTP 응답으로 변환하는지 검증

수용 기준 검증

  • Snowflake ID 생성기가 분산 환경에서 충돌 없이 고유 ID 생성
  • ErrorCode enum으로 에러 정보 중앙 관리
  • GlobalExceptionHandler가 ReportException을 적절한 HTTP 응답으로 변환
  • 모든 컴포넌트에 대한 단위 테스트 작성 및 통과
  • Spring Bean 설정 정상 작동

브레이킹/마이그레이션

  • 없음 (신규 기능 추가로 기존 코드 영향 없음)

테스트

단위 테스트

./gradlew test --tests "com.teambind.supportserver.report.*"
  • SnowflakeTest: ID 유일성, 증가성, 양수 검증 (10,000회 생성)
  • IdConfigTest: Bean 등록 및 동작 확인
  • ReportExceptionTest: 예외 속성 검증
  • GlobalExceptionHandlerTest: 예외 핸들링 로직 검증

수동 검증

신고 API 구현 시:

  1. 신고 생성 시 Snowflake ID가 정상 할당되는지 확인
  2. 존재하지 않는 신고 조회 시 404 + REPORT_NOT_FOUND 응답 확인
  3. 에러 로그에 ErrorCode와 메시지가 명확히 출력되는지 확인

참조


.idea/modules/SupportServer.main.iml: SupportServer 관련 자동 생성 경로 설정 추가
.idea/modules.xml: SupportServer.main 모듈 경로 참조 추가
SupportServer/src/main/java/com/teambind/supportserver/report/exceptions/ErrorCode.java: 예외 코드 정의를 위한 Enum 추가
SupportServer/src/main/java/com/teambind/supportserver/report/exceptions/ReportException.java: 사용자 정의 예외 클래스 추가

참고: 새로운 예외 처리를 위한 기반 구성 추가
SupportServer/src/main/java/com/teambind/supportserver/report/handler/GlobalExceptionHandler.java: 사용자 정의 예외(ReportException) 처리용 글로벌 핸들러 구현

참고: 예외 처리의 일관성을 위한 컨트롤러 공용 핸들러 추가
SupportServer/src/main/java/com/teambind/supportserver/report/config/IdConfig.java: Snowflake 기반 IdGenerator Bean 등록을 위한 설정 클래스 추가
SupportServer/src/main/java/com/teambind/supportserver/report/utils/IdGenerator.java: ID 생성 인터페이스 정의
SupportServer/src/main/java/com/teambind/supportserver/report/utils/Snowflake.java: Snowflake 알고리즘 구현 통한 ID 생성 클래스 추가

참고: 고유 ID 생성 및 분산 시스템 호환성 개선 대비
SupportServer/src/main/java/com/teambind/supportserver/report/exceptions/ErrorCode.java: REPORT_NOT_FOUND 예외 코드 정의 추가

참고: 보고서 미존재 시 명확한 예외 메시지 제공을 위해 추가
SupportServer/src/test/java/com/teambind/supportserver/report/handler/GlobalExceptionHandlerTest.java: ReportException 처리 로직에 대한 단위 테스트 추가
SupportServer/src/test/java/com/teambind/supportserver/report/config/IdConfigTest.java: Snowflake 기반 IdGenerator 설정 및 유효성 검증 테스트 추가
SupportServer/src/test/java/com/teambind/supportserver/report/exceptions/ReportExceptionTest.java: ReportException의 속성 노출 및 예외 메시지 테스트 추가
SupportServer/src/test/java/com/teambind/supportserver/report/utils/SnowflakeTest.java: Snowflake ID 생성 고유성 및 증가성 테스트 추가

참고: ID 생성 로직 검증 및 예외 처리 테스트 보강
@DDINGJOO DDINGJOO merged commit 1fc9cf7 into main Oct 16, 2025
1 check passed
@DDINGJOO DDINGJOO deleted the feature/report/common branch October 16, 2025 02:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants