Skip to content

Commit d4021fa

Browse files
authored
[refactor/#363] 계정 프로필과 개인화 프로필을 패키지 단위로 분리 (#364)
* test: 유저 프로필 생성 로직 단위 테스트 구현 * refactor: 유저 계정 프로필을 AccountProfile로 네이밍 변경 * refactor: 개인화 프로필 네이밍을 PersonalizationProfile로 변경 * refactor: AccountProfile과 PersonalizationProfile을 패키지 단위로 분리 * docs: 패키지 분리에 따른 문서 최신화 * docs: 도메인 분리에 따른 이슈 템플릿 최신화
1 parent aa00f62 commit d4021fa

112 files changed

Lines changed: 2897 additions & 2605 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/ISSUE_TEMPLATE/기능-개선.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ assignees: ''
1111

1212
<br>
1313

14-
## 🏷️ 도메인 (해당하는 것에 체크)
15-
- [ ] 📝 domain:post (게시글)
16-
- [ ] 👤 domain:user (사용자)
17-
- [ ] 🏢 domain:source (테크블로그 출처)
18-
- [ ] 🔍 domain:search (검색)
19-
- [ ] 🔔 domain:notification (알림)
20-
- [ ] 📊 domain:recommendation (추천)
14+
## 🏷️ 도메인 (해당하는 것에 체크)
15+
- [ ] 📝 domain:post (게시글)
16+
- [ ] 👤 domain:useraccount (사용자 계정)
17+
- [ ] 🧠 domain:personalization (개인화 프로필)
18+
- [ ] 🏢 domain:source (테크블로그 출처)
19+
- [ ] 🔍 domain:search (검색)
20+
- [ ] 🔔 domain:notification (알림)
21+
- [ ] 📊 domain:recommendation (추천)
2122
- [ ] 🎯 domain:activity (사용자 활동)
2223
- [ ] 🔐 domain:auth (인증/보안)
2324
- [ ] 🌐 infra (인프라/배포)
@@ -37,4 +38,4 @@ assignees: ''
3738
## 💡 개선 이유
3839
<!-- 왜 개선이 필요한지 작성해주세요 -->
3940

40-
<br>
41+
<br>

.github/ISSUE_TEMPLATE/기능-구현.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ assignees: ''
1414

1515
<br>
1616

17-
## 🏷️ 도메인 (해당하는 것에 체크)
18-
- [ ] 📝 domain:post (게시글)
19-
- [ ] 👤 domain:user (사용자)
20-
- [ ] 🏢 domain:source (테크블로그 출처)
21-
- [ ] 🔍 domain:search (검색)
22-
- [ ] 🔔 domain:notification (알림)
23-
- [ ] 📊 domain:recommendation (추천)
17+
## 🏷️ 도메인 (해당하는 것에 체크)
18+
- [ ] 📝 domain:post (게시글)
19+
- [ ] 👤 domain:useraccount (사용자 계정)
20+
- [ ] 🧠 domain:personalization (개인화 프로필)
21+
- [ ] 🏢 domain:source (테크블로그 출처)
22+
- [ ] 🔍 domain:search (검색)
23+
- [ ] 🔔 domain:notification (알림)
24+
- [ ] 📊 domain:recommendation (추천)
2425
- [ ] 🎯 domain:activity (사용자 활동)
2526
- [ ] 🔐 domain:auth (인증/보안)
2627
- [ ] 🌐 infra (인프라/배포)
@@ -35,4 +36,4 @@ assignees: ''
3536
## 💡 참고 사항
3637
<!-- 참고할 링크, 이미지 등이 있다면 추가해주세요 -->
3738

38-
<br>
39+
<br>

.github/ISSUE_TEMPLATE/리팩토링.md

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ assignees: ''
1111

1212
<br>
1313

14-
## 🏷️ 도메인 (해당하는 것에 체크)
15-
- [ ] 📝 domain:post (게시글)
16-
- [ ] 👤 domain:user (사용자)
17-
- [ ] 🏢 domain:source (테크블로그 출처)
18-
- [ ] 🔍 domain:search (검색)
19-
- [ ] 🔔 domain:notification (알림)
20-
- [ ] 📊 domain:recommendation (추천)
21-
- [ ] 🌐 infra (인프라/배포)
14+
## 🏷️ 도메인 (해당하는 것에 체크)
15+
- [ ] 📝 domain:post (게시글)
16+
- [ ] 👤 domain:useraccount (사용자 계정)
17+
- [ ] 🧠 domain:personalization (개인화 프로필)
18+
- [ ] 🏢 domain:source (테크블로그 출처)
19+
- [ ] 🔍 domain:search (검색)
20+
- [ ] 🔔 domain:notification (알림)
21+
- [ ] 📊 domain:recommendation (추천)
22+
- [ ] 🎯 domain:activity (사용자 활동)
23+
- [ ] 🔐 domain:auth (인증/보안)
24+
- [ ] 🌐 infra (인프라/배포)
2225

2326
<br>
2427

@@ -39,4 +42,4 @@ assignees: ''
3942
- [ ] 코드 중복 제거
4043
- [ ] 기타:
4144

42-
<br>
45+
<br>

.github/ISSUE_TEMPLATE/버그-수정.md

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ assignees: ''
1212

1313
<br>
1414

15-
## 🏷️ 도메인 (해당하는 것에 체크)
16-
- [ ] 📝 domain:post (게시글)
17-
- [ ] 👤 domain:user (사용자)
18-
- [ ] 🏢 domain:source (테크블로그 출처)
19-
- [ ] 🔍 domain:search (검색)
20-
- [ ] 🔔 domain:notification (알림)
21-
- [ ] 📊 domain:recommendation (추천)
22-
- [ ] 🌐 infra (인프라/배포)
15+
## 🏷️ 도메인 (해당하는 것에 체크)
16+
- [ ] 📝 domain:post (게시글)
17+
- [ ] 👤 domain:useraccount (사용자 계정)
18+
- [ ] 🧠 domain:personalization (개인화 프로필)
19+
- [ ] 🏢 domain:source (테크블로그 출처)
20+
- [ ] 🔍 domain:search (검색)
21+
- [ ] 🔔 domain:notification (알림)
22+
- [ ] 📊 domain:recommendation (추천)
23+
- [ ] 🎯 domain:activity (사용자 활동)
24+
- [ ] 🔐 domain:auth (인증/보안)
25+
- [ ] 🌐 infra (인프라/배포)
2326

2427
<br>
2528

@@ -34,4 +37,4 @@ assignees: ''
3437
## 🎯 예상 원인
3538
<!-- 예상되는 원인이 있다면 작성해주세요 -->
3639

37-
<br>
40+
<br>

.github/ISSUE_TEMPLATE/테스트-작성.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ assignees: ''
1616

1717
## 🏷️ 도메인 (해당하는 것에 체크)
1818
- [ ] 📝 domain:post (게시글)
19-
- [ ] 👤 domain:user (사용자)
19+
- [ ] 👤 domain:useraccount (사용자 계정)
20+
- [ ] 🧠 domain:personalization (개인화 프로필)
2021
- [ ] 🏢 domain:source (테크블로그 출처)
2122
- [ ] 🔍 domain:search (검색)
2223
- [ ] 🔔 domain:notification (알림)

docs/ddd-test-refactoring-roadmap.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ DDD 목표 지도 작성
4747
- 예: `ScrabPost`, `scrap_posts`, `Bookmark`
4848
- 예: `searchWord`, `query`, `keyKeywords`, `PostKeyword`
4949
- 예: 계정 프로필과 개인화 프로필
50-
- Search, Recommendation, Personalization Profile(`UserProfileService`) 쪽은 여러 컨텍스트와 외부 인프라가 얽혀 있어 리팩터링 위험이 크다.
50+
- Search, Recommendation, Personalization Profile(`PersonalizationProfileService`) 쪽은 여러 컨텍스트와 외부 인프라가 얽혀 있어 리팩터링 위험이 크다.
5151

5252
따라서 안전한 전환 전략은 다음이다.
5353

@@ -265,14 +265,14 @@ PostKeyword
265265
| 표준 용어 | 코드상 표현 | 의미 |
266266
|---|---|---|
267267
| 계정 프로필 | `User.nickName`, `description`, `profileImage` | 사용자에게 보이는 기본 프로필 |
268-
| 개인화 프로필 | `UserProfileDocument.profileText`, `profileVector` | 검색/추천에 쓰이는 활동 기반 LLM/임베딩 프로필 |
268+
| 개인화 프로필 | `PersonalizationProfileDocument.profileText`, `profileVector` | 검색/추천에 쓰이는 활동 기반 LLM/임베딩 프로필 |
269269

270270
권장 순서:
271271

272272
```text
273273
1. 문서/API 설명에서 `User Account`와 `Personalization Profile` 경계를 고정
274-
2. UserProfileService 테스트 작성
275-
3. UserProfileDocument의 역할을 Personalization Profile projection으로 명확히 함
274+
2. PersonalizationProfileService 테스트 작성
275+
3. PersonalizationProfileDocument의 역할을 Personalization Profile projection으로 명확히 함
276276
4. 필요하면 패키지/이벤트/포트 분리를 후속 단계에서 진행
277277
```
278278

@@ -458,14 +458,14 @@ InterestCommandServiceTest
458458

459459
```text
460460
Personalization Profile
461-
- UserProfileDocument (개인화 검색/추천용 read model projection)
462-
- UserProfileService (Personalization Profile 생성 서비스로 위치 재정의)
461+
- PersonalizationProfileDocument (개인화 검색/추천용 read model projection)
462+
- PersonalizationProfileService (Personalization Profile 생성 서비스로 위치 재정의)
463463
```
464464

465465
##### 먼저 작성할 테스트
466466

467467
```text
468-
UserProfileServiceTest
468+
PersonalizationProfileServiceTest
469469
- 관심사, 읽은 게시글, 북마크, 검색 기록을 모아 활동 데이터를 구성한다.
470470
- LLM 응답에서 프로필 텍스트와 핵심 키워드를 파싱한다.
471471
- 파싱 실패 시 fallback 정책을 따른다.
@@ -479,7 +479,7 @@ UserProfileServiceTest
479479
현재 Personalization Profile 생성 서비스 의존:
480480

481481
```text
482-
UserProfileService
482+
PersonalizationProfileService
483483
- User 관심사
484484
- ReadPost
485485
- Bookmark
@@ -492,8 +492,8 @@ UserProfileService
492492

493493
정리 방향:
494494

495-
- `UserProfileDocument`를 Personalization Profile projection으로 명확히 한다.
496-
- `UserProfileService`를 User Account 서비스가 아닌 Personalization Profile 생성 서비스로 위치를 재정의한다.
495+
- `PersonalizationProfileDocument`를 Personalization Profile projection으로 명확히 한다.
496+
- `PersonalizationProfileService`를 User Account 서비스가 아닌 Personalization Profile 생성 서비스로 위치를 재정의한다.
497497
- 관심사 변경/온보딩 완료는 장기적으로 `UserInterestsChanged`, `OnboardingCompleted` 이벤트로 분리한다.
498498

499499
분리 후보 (점진적으로 적용):
@@ -514,7 +514,7 @@ PersonalizedProfileRepository
514514
##### 왜 네 번째인가
515515

516516
- 복잡도가 높다.
517-
- Elasticsearch, Personalization Profile(`UserProfileDocument`), Activity, Post에 모두 의존한다.
517+
- Elasticsearch, Personalization Profile(`PersonalizationProfileDocument`), Activity, Post에 모두 의존한다.
518518
- 테스트 없이 건드리면 위험하다.
519519

520520
##### 목표 모델
@@ -587,7 +587,7 @@ SearchServiceImplTest
587587

588588
- Elasticsearch 호출을 adapter로 감싸기
589589
- `PostDocument`를 검색 read model로 명시
590-
- `UserProfileDocument`를 Personalization Profile read model로 명시
590+
- `PersonalizationProfileDocument`를 Personalization Profile read model로 명시
591591
- Activity의 북마크 여부 조회를 query composition으로 유지하되 포트 도입 검토
592592

593593
---
@@ -651,7 +651,7 @@ src/test/java/com/techfork/domain
651651
user
652652
UserTest
653653
InterestCommandServiceTest
654-
UserProfileServiceTest
654+
PersonalizationProfileServiceTest
655655
656656
recommendation
657657
MmrServiceTest
@@ -686,7 +686,7 @@ src/test/java/com/techfork/domain
686686

687687
```text
688688
[ ] P0 테스트가 모두 존재하고 ./gradlew test -PexcludeIntegration 통과
689-
[ ] UserProfileServiceTest로 Personalization Profile 생성 흐름 보호
689+
[ ] PersonalizationProfileServiceTest로 Personalization Profile 생성 흐름 보호
690690
[ ] MmrServiceTest + LlmRecommendationServiceTest로 추천 생성 핵심 흐름 보호
691691
[ ] SearchServiceImplTest로 일반/개인화 검색 회귀 보호
692692
[ ] User Account aggregate 책임과 Personalization Profile 생성 책임이
@@ -737,7 +737,7 @@ TechnicalPostIndexed
737737
4. Post 도메인 테스트 작성
738738
5. Post를 “기술 게시글” 기준으로 정리
739739
6. User 관심사/온보딩 테스트 작성
740-
7. UserProfileService 테스트 작성
740+
7. PersonalizationProfileService 테스트 작성
741741
8. Personalization Profile 책임 분리
742742
9. Recommendation 테스트 작성
743743
10. PersonalizedProfileGenerated 이벤트 도입
@@ -802,8 +802,8 @@ TechnicalPostIndexed
802802
- 핵심 키워드 파싱
803803
804804
리팩터링:
805-
- UserProfileDocument를 Personalization Profile projection으로 명확히 함
806-
- UserProfileService 책임 분리
805+
- PersonalizationProfileDocument를 Personalization Profile projection으로 명확히 함
806+
- PersonalizationProfileService 책임 분리
807807
- PersonalizedProfileGenerated 이벤트 도입 준비
808808
```
809809

@@ -866,19 +866,19 @@ TechnicalPostIndexed
866866

867867
```text
868868
목표:
869-
- UserProfileService를 Personalization Profile 생성 서비스로 테스트로 고정한다.
869+
- PersonalizationProfileService를 Personalization Profile 생성 서비스로 테스트로 고정한다.
870870
871871
선행 테스트:
872872
- 관심사, 읽은 게시글, 북마크, 검색 기록을 활동 데이터로 수집한다.
873873
- LLM 응답에서 profileText와 keyKeywords를 파싱한다.
874874
- 파싱 실패 시 fallback 정책을 따른다.
875-
- profileText를 임베딩하여 UserProfileDocument를 저장한다.
875+
- profileText를 임베딩하여 PersonalizationProfileDocument를 저장한다.
876876
- 개인화 프로필 생성 후 추천 생성을 호출한다.
877877
- 추천 생성 실패가 개인화 프로필 저장을 깨뜨리지 않는다.
878878
879879
리팩터링:
880-
- UserProfileDocument를 Personalization Profile projection으로 명확히 함
881-
- UserProfileService 책임 분리 (PersonalizedProfileGenerated 이벤트 도입 준비)
880+
- PersonalizationProfileDocument를 Personalization Profile projection으로 명확히 함
881+
- PersonalizationProfileService 책임 분리 (PersonalizedProfileGenerated 이벤트 도입 준비)
882882
```
883883

884884
### 5.8 작업 단위 8: 1차 이벤트 도입
@@ -893,11 +893,11 @@ TechnicalPostIndexed
893893
894894
도입 순서:
895895
1. UserInterestsChanged
896-
- InterestCommandService가 UserProfileService를 직접 호출하는 대신 이벤트 발행
896+
- InterestCommandService가 PersonalizationProfileService를 직접 호출하는 대신 이벤트 발행
897897
- 리스너: @TransactionalEventListener(AFTER_COMMIT) + @Async
898898
899899
2. PersonalizedProfileGenerated
900-
- UserProfileService가 LlmRecommendationService를 직접 호출하는 대신 이벤트 발행
900+
- PersonalizationProfileService가 LlmRecommendationService를 직접 호출하는 대신 이벤트 발행
901901
- 리스너: 추천 생성 트리거
902902
903903
3. TechnicalPostIndexed

0 commit comments

Comments
 (0)