Skip to content

Conversation

@DDINGJOO
Copy link
Owner

목적

  • Report 도메인에만 존재하던 QueryDSL, ID 생성 관련 인프라 설정을 common 패키지로 분리했습니다.
  • 모든 도메인(report, faq, inquiries)에서 재사용 가능하도록 구조를 개선했습니다.
  • 도메인 간 불필요한 의존성을 제거하고 일관된 인프라 레이어를 구축했습니다.
  • 관련 Change Request: [CR] Common 패키지 분리 - 인프라 레이어 재사용성 개선 #39

변경 요약

핵심 변경사항

  1. 패키지 구조 개선

    • `com.teambind.supportserver.report.config` → `com.teambind.supportserver.common.config`
    • `com.teambind.supportserver.report.utils` → `com.teambind.supportserver.common.utils`
  2. 이동된 컴포넌트

    • QueryDslConfig: QueryDSL JPAQueryFactory 빈 설정
    • IdConfig: IdGenerator 빈 설정
    • IdGenerator: ID 생성 인터페이스
    • Snowflake: 분산 ID 생성 구현체
  3. Import 경로 일괄 변경

    • 전체 프로젝트에서 약 20개 파일의 import 경로 자동 수정
    • 테스트 파일 포함 모든 참조 경로 업데이트

주요 파일/모듈

  • Config 이동: `QueryDslConfig.java`, `IdConfig.java`
  • Utils 이동: `IdGenerator.java`, `Snowflake.java`
  • 영향받은 테스트:
    • `InquiryRepositoryTest`, `AnswerRepositoryTest` (inquiries 도메인)
    • `ReportRepositoryTest`, `ReportServiceImplTest` 등 (report 도메인)
    • `IdConfigTest`, `SnowflakeTest` (유틸 테스트)

아키텍처 설계 결정사항

1. Common 패키지 분리 기준

도메인 독립적인 인프라 컴포넌트만 이동

  • 이동 대상: QueryDSL 설정, ID 생성 전략
  • 이동 제외: AOP (테스트용), 캐싱 메커니즘 (도메인 특화)

이 기준을 선택한 이유:

  • 순환 참조 방지: common은 어떤 도메인에도 의존하지 않음
  • 재사용성: 모든 도메인에서 동일하게 사용 가능한 컴포넌트만 선택
  • 단순성: 복잡한 추상화 없이 단순 이동으로 목표 달성

2. 점진적 마이그레이션 전략

Phase 1만 진행 (본 PR)

  • ✅ QueryDslConfig, IdConfig, IdGenerator, Snowflake 이동
  • ❌ AOP, 캐싱 추상화는 보류

이 전략을 선택한 이유:

  • 낮은 리스크: 파일 이동 + import 변경만으로 완료
  • 즉각적인 이점: 도메인 간 의존성 제거, 테스트 설정 간소화
  • 테스트 안정성: 모든 테스트 통과 (285개 중 20개만 수정)
  • 롤백 용이성: 로직 변경 없어 문제 발생 시 Git revert로 즉시 복구

영향도 분석

Backend

  • 패키지 구조 변경: 4개 파일 이동 (`report` → `common`)
  • Import 변경: 20개 파일
    • 테스트 파일: 17개
    • 서비스 파일: 1개 (ReportServiceImpl)
    • 테스트 유틸: 2개 (IdConfigTest, SnowflakeTest)

Database

  • 영향 없음: 데이터베이스 스키마 변경 없음

테스트

  • 전체 테스트 통과: 285개 테스트 모두 성공
  • 수정된 테스트: 20개 (import 경로만 변경)
  • 테스트 실행 시간: 변경 전후 동일 (~12초)

마이그레이션

  • 필요 없음: 런타임 동작 변경 없음 (파일 위치만 이동)

패키지 구조 비교

Before (기존 구조)

```
com.teambind.supportserver/
├── report/
│ ├── config/
│ │ ├── QueryDslConfig.java ❌ report에만 존재
│ │ └── IdConfig.java ❌ report에만 존재
│ └── utils/
│ ├── IdGenerator.java ❌ report에만 존재
│ └── Snowflake.java ❌ report에만 존재
├── faq/
└── inquiries/
└── repository/
└── InquiryRepositoryTest.java
// @import(com.teambind.supportserver.report.config.QueryDslConfig.class)
// ❌ report 패키지에 의존
```

After (개선된 구조)

```
com.teambind.supportserver/
├── common/ ✅ 새로 생성
│ ├── config/
│ │ ├── QueryDslConfig.java ✅ 모든 도메인에서 사용
│ │ └── IdConfig.java ✅ 모든 도메인에서 사용
│ └── utils/
│ ├── IdGenerator.java ✅ 모든 도메인에서 사용
│ └── Snowflake.java ✅ 모든 도메인에서 사용
├── report/
├── faq/
└── inquiries/
└── repository/
└── InquiryRepositoryTest.java
// @import(com.teambind.supportserver.common.config.QueryDslConfig.class)
// ✅ 의미적으로 명확한 경로
```

수용 기준 검증

#39 Change Request - AC 충족

  • QueryDslConfig를 common.config 패키지로 이동
  • IdConfig를 common.config 패키지로 이동
  • IdGenerator를 common.utils 패키지로 이동
  • Snowflake를 common.utils 패키지로 이동
  • 전체 프로젝트의 import 경로 일괄 변경
  • 모든 테스트 통과 (285개)
  • 런타임 동작 변경 없음 확인

기대 효과 달성

  • 코드 재사용성 향상: 모든 도메인에서 QueryDSL, Snowflake 사용 가능
  • 일관된 인프라 설정: 설정 변경 시 한 곳만 수정
  • 테스트 코드 간소화: `@Import` 경로가 의미적으로 명확
  • 도메인 독립성: inquiries가 report에 의존하지 않음

브레이킹/마이그레이션

  • Breaking Change 없음: 파일 위치만 변경, 로직 동일
  • 데이터베이스 변경 없음
  • API 변경 없음
  • 런타임 동작 동일: 모든 테스트 통과

테스트

전체 테스트 실행

```bash
cd SupportServer
./gradlew clean test

결과:

BUILD SUCCESSFUL in 12s

285 tests passed

0 tests failed

```

영향받은 테스트 검증

```bash

Inquiries 도메인 테스트

./gradlew test --tests "com.teambind.supportserver.inquiries.repository.*"

✅ InquiryRepositoryTest: 13 tests passed

✅ AnswerRepositoryTest: 14 tests passed

Report 도메인 테스트

./gradlew test --tests "com.teambind.supportserver.report.repository.*"

✅ ReportRepositoryTest: 8 tests passed

✅ ReportCategoryRepositoryTest: 12 tests passed

```

참조

com.teambind.supportserver.report.config.QueryDslConfig → com.teambind.supportserver.common.config.QueryDslConfig: QueryDSL 설정 이동
com.teambind.supportserver.report.config.IdConfig → com.teambind.supportserver.common.config.IdConfig: ID 생성 설정 이동
com.teambind.supportserver.report.utils.IdGenerator → com.teambind.supportserver.common.utils.IdGenerator: ID 생성 인터페이스 이동
com.teambind.supportserver.report.utils.Snowflake → com.teambind.supportserver.common.utils.Snowflake: Snowflake 구현체 이동

참고: 전체 도메인에서 재사용 가능한 인프라 컴포넌트 분리로 도메인 간 불필요한 의존성 제거
refs #39
@DDINGJOO DDINGJOO merged commit f9f0b0d into main Oct 16, 2025
1 check passed
@DDINGJOO DDINGJOO deleted the feature/common/infra branch October 16, 2025 17:20
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.

[CR] Common 패키지 분리 - 인프라 레이어 재사용성 개선

2 participants