Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions archunit-baseline/05a5820d-39ea-4db6-b8e7-f737ac6a90df
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
Constructor <com.carecode.core.controller.CareFacilityApiController.<init>(com.carecode.core.client.CareFacilityApiService, com.carecode.domain.careFacility.service.CareFacilityService, com.carecode.domain.careFacility.repository.CareFacilityRepository)> has parameter of type <com.carecode.domain.careFacility.repository.CareFacilityRepository> in (CareFacilityApiController.java:0)
Constructor <com.carecode.domain.admin.controller.AdminCommunityController.<init>(com.carecode.domain.community.repository.PostRepository, com.carecode.domain.community.mapper.CommunityMapper)> has parameter of type <com.carecode.domain.community.repository.PostRepository> in (AdminCommunityController.java:0)
Constructor <com.carecode.domain.admin.controller.AdminDashboardController.<init>(com.carecode.domain.user.repository.UserRepository, com.carecode.domain.health.repository.HospitalRepository, com.carecode.domain.policy.repository.PolicyRepository)> has parameter of type <com.carecode.domain.health.repository.HospitalRepository> in (AdminDashboardController.java:0)
Constructor <com.carecode.domain.admin.controller.AdminDashboardController.<init>(com.carecode.domain.user.repository.UserRepository, com.carecode.domain.health.repository.HospitalRepository, com.carecode.domain.policy.repository.PolicyRepository)> has parameter of type <com.carecode.domain.policy.repository.PolicyRepository> in (AdminDashboardController.java:0)
Expand All @@ -10,9 +9,9 @@ Constructor <com.carecode.domain.admin.controller.AdminNotificationController.<i
Constructor <com.carecode.domain.admin.controller.AdminPolicyController.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.domain.admin.service.PolicyAdminService)> has parameter of type <com.carecode.domain.policy.repository.PolicyRepository> in (AdminPolicyController.java:0)
Constructor <com.carecode.domain.admin.controller.AdminPolicyVerificationController.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.core.security.CurrentUserFacade)> has parameter of type <com.carecode.domain.policy.repository.PolicyRepository> in (AdminPolicyVerificationController.java:0)
Constructor <com.carecode.domain.admin.controller.AdminUserController.<init>(com.carecode.domain.user.repository.UserRepository, com.carecode.domain.user.service.UserService)> has parameter of type <com.carecode.domain.user.repository.UserRepository> in (AdminUserController.java:0)
Constructor <com.carecode.domain.careFacility.controller.CareFacilityApiController.<init>(com.carecode.external.publicdata.CareFacilityApiService, com.carecode.domain.careFacility.service.CareFacilityService, com.carecode.domain.careFacility.repository.CareFacilityRepository)> has parameter of type <com.carecode.domain.careFacility.repository.CareFacilityRepository> in (CareFacilityApiController.java:0)
Constructor <com.carecode.domain.notification.controller.NotificationLinkController.<init>(com.carecode.domain.notification.repository.NotificationRepository, com.carecode.core.analytics.EventLogger, com.carecode.core.security.CurrentUserFacade)> has parameter of type <com.carecode.domain.notification.repository.NotificationRepository> in (NotificationLinkController.java:0)
Constructor <com.carecode.domain.policy.controller.BenefitLinkController.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.core.analytics.EventLogger, com.carecode.core.security.CurrentUserFacade)> has parameter of type <com.carecode.domain.policy.repository.PolicyRepository> in (BenefitLinkController.java:0)
Field <com.carecode.core.controller.CareFacilityApiController.careFacilityRepository> has type <com.carecode.domain.careFacility.repository.CareFacilityRepository> in (CareFacilityApiController.java:0)
Field <com.carecode.domain.admin.controller.AdminCommunityController.postRepository> has type <com.carecode.domain.community.repository.PostRepository> in (AdminCommunityController.java:0)
Field <com.carecode.domain.admin.controller.AdminDashboardController.hospitalRepository> has type <com.carecode.domain.health.repository.HospitalRepository> in (AdminDashboardController.java:0)
Field <com.carecode.domain.admin.controller.AdminDashboardController.policyRepository> has type <com.carecode.domain.policy.repository.PolicyRepository> in (AdminDashboardController.java:0)
Expand All @@ -24,11 +23,9 @@ Field <com.carecode.domain.admin.controller.AdminNotificationController.userRepo
Field <com.carecode.domain.admin.controller.AdminPolicyController.policyRepository> has type <com.carecode.domain.policy.repository.PolicyRepository> in (AdminPolicyController.java:0)
Field <com.carecode.domain.admin.controller.AdminPolicyVerificationController.policyRepository> has type <com.carecode.domain.policy.repository.PolicyRepository> in (AdminPolicyVerificationController.java:0)
Field <com.carecode.domain.admin.controller.AdminUserController.userRepository> has type <com.carecode.domain.user.repository.UserRepository> in (AdminUserController.java:0)
Field <com.carecode.domain.careFacility.controller.CareFacilityApiController.careFacilityRepository> has type <com.carecode.domain.careFacility.repository.CareFacilityRepository> in (CareFacilityApiController.java:0)
Field <com.carecode.domain.notification.controller.NotificationLinkController.notificationRepository> has type <com.carecode.domain.notification.repository.NotificationRepository> in (NotificationLinkController.java:0)
Field <com.carecode.domain.policy.controller.BenefitLinkController.policyRepository> has type <com.carecode.domain.policy.repository.PolicyRepository> in (BenefitLinkController.java:0)
Method <com.carecode.core.controller.CareFacilityApiController.syncAllChildcareFacilities(java.lang.String, java.lang.String, int)> calls method <com.carecode.domain.careFacility.repository.CareFacilityRepository.findByFacilityCode(java.lang.String)> in (CareFacilityApiController.java:86)
Method <com.carecode.core.controller.CareFacilityApiController.syncAllChildcareFacilities(java.lang.String, java.lang.String, int)> calls method <com.carecode.domain.careFacility.repository.CareFacilityRepository.save(java.lang.Object)> in (CareFacilityApiController.java:96)
Method <com.carecode.core.controller.CareFacilityApiController.updateCareFacilityFromPublicData(com.carecode.domain.careFacility.entity.CareFacility, java.util.Map)> calls method <com.carecode.domain.careFacility.repository.CareFacilityRepository.save(java.lang.Object)> in (CareFacilityApiController.java:266)
Method <com.carecode.domain.admin.controller.AdminCommunityController.delete(java.lang.Long)> calls method <com.carecode.domain.community.repository.PostRepository.delete(java.lang.Object)> in (AdminCommunityController.java:46)
Method <com.carecode.domain.admin.controller.AdminCommunityController.findPost(java.lang.Long)> calls method <com.carecode.domain.community.repository.PostRepository.findById(java.lang.Object)> in (AdminCommunityController.java:51)
Method <com.carecode.domain.admin.controller.AdminCommunityController.list(org.springframework.data.domain.Pageable)> calls method <com.carecode.domain.community.repository.PostRepository.findAll(org.springframework.data.domain.Pageable)> in (AdminCommunityController.java:33)
Expand Down Expand Up @@ -61,6 +58,9 @@ Method <com.carecode.domain.admin.controller.AdminUserController.delete(java.lan
Method <com.carecode.domain.admin.controller.AdminUserController.findUser(java.lang.Long)> calls method <com.carecode.domain.user.repository.UserRepository.findById(java.lang.Object)> in (AdminUserController.java:177)
Method <com.carecode.domain.admin.controller.AdminUserController.list(org.springframework.data.domain.Pageable)> calls method <com.carecode.domain.user.repository.UserRepository.findAll(org.springframework.data.domain.Pageable)> in (AdminUserController.java:56)
Method <com.carecode.domain.admin.controller.AdminUserController.update(java.lang.Long, com.carecode.domain.admin.dto.AdminUserUpdateRequest)> calls method <com.carecode.domain.user.repository.UserRepository.save(java.lang.Object)> in (AdminUserController.java:134)
Method <com.carecode.domain.careFacility.controller.CareFacilityApiController.syncAllChildcareFacilities(java.lang.String, java.lang.String, int)> calls method <com.carecode.domain.careFacility.repository.CareFacilityRepository.findByFacilityCode(java.lang.String)> in (CareFacilityApiController.java:86)
Method <com.carecode.domain.careFacility.controller.CareFacilityApiController.syncAllChildcareFacilities(java.lang.String, java.lang.String, int)> calls method <com.carecode.domain.careFacility.repository.CareFacilityRepository.save(java.lang.Object)> in (CareFacilityApiController.java:96)
Method <com.carecode.domain.careFacility.controller.CareFacilityApiController.updateCareFacilityFromPublicData(com.carecode.domain.careFacility.entity.CareFacility, java.util.Map)> calls method <com.carecode.domain.careFacility.repository.CareFacilityRepository.save(java.lang.Object)> in (CareFacilityApiController.java:266)
Method <com.carecode.domain.notification.controller.NotificationLinkController.open(java.lang.Long, java.lang.String, java.lang.String)> calls method <com.carecode.domain.notification.repository.NotificationRepository.findById(java.lang.Object)> in (NotificationLinkController.java:56)
Method <com.carecode.domain.notification.controller.NotificationLinkController.open(java.lang.Long, java.lang.String, java.lang.String)> calls method <com.carecode.domain.notification.repository.NotificationRepository.save(java.lang.Object)> in (NotificationLinkController.java:64)
Method <com.carecode.domain.policy.controller.BenefitLinkController.apply(java.lang.Long)> calls method <com.carecode.domain.policy.repository.PolicyRepository.findById(java.lang.Object)> in (BenefitLinkController.java:43)
2 changes: 2 additions & 0 deletions archunit-baseline/05a7a88e-9a95-451a-b96f-4a8eb9be6c1e
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.app.CareFacilityFacade)
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.controller.CareFacilityApiController)
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.controller.CareFacilityController)
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.controller.FacilityWaitlistController)
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.controller.PublicDataController)
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.dto.request.CareFacilityAdminBookingSearchRequest$CareFacilityAdminBookingSearchRequestBuilder)
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.dto.request.CareFacilityAdminBookingSearchRequest)
도메인 패키지 이름이 소문자가 아니다: careFacility (com.carecode.domain.careFacility.dto.request.CareFacilityAdminStatusUpdateRequest$CareFacilityAdminStatusUpdateRequestBuilder)
Expand Down
2 changes: 1 addition & 1 deletion archunit-baseline/a6b21c55-f3df-4514-8faa-c32628f81448
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ policy → user 리포지토리: Constructor <com.carecode.domain.policy.service
policy → user 리포지토리: Constructor <com.carecode.domain.policy.service.PolicyDeadlineNotifier.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.domain.policy.repository.PolicyDeadlineNoticeRepository, com.carecode.domain.user.repository.UserRepository, com.carecode.domain.user.repository.ChildRepository, com.carecode.domain.notification.repository.NotificationRepository, com.carecode.domain.notification.sender.NotificationDispatcher, com.carecode.core.analytics.EventLogger)> has parameter of type <com.carecode.domain.user.repository.UserRepository> in (PolicyDeadlineNotifier.java:0)
policy → user 리포지토리: Constructor <com.carecode.domain.policy.service.PolicyRecommendationService.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.domain.user.repository.ChildRepository, com.carecode.domain.policy.mapper.PolicyMapper, com.carecode.core.security.CurrentUserFacade, com.carecode.core.analytics.EventLogger)> has parameter of type <com.carecode.domain.user.repository.ChildRepository> in (PolicyRecommendationService.java:0)
policy → user 리포지토리: Constructor <com.carecode.domain.policy.service.PolicyService.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.domain.policy.repository.PolicyBookmarkRepository, com.carecode.domain.user.repository.UserRepository, com.carecode.domain.policy.mapper.PolicyMapper)> has parameter of type <com.carecode.domain.user.repository.UserRepository> in (PolicyService.java:0)
policy → user 리포지토리: Constructor <com.carecode.domain.policy.service.RegionalBenefitComparisonService.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.domain.user.repository.ChildRepository, com.carecode.core.security.CurrentUserFacade, com.carecode.core.analytics.EventLogger, com.carecode.core.benefit.BenefitProjectionCalculator)> has parameter of type <com.carecode.domain.user.repository.ChildRepository> in (RegionalBenefitComparisonService.java:0)
policy → user 리포지토리: Constructor <com.carecode.domain.policy.service.RegionalBenefitComparisonService.<init>(com.carecode.domain.policy.repository.PolicyRepository, com.carecode.domain.user.repository.ChildRepository, com.carecode.core.security.CurrentUserFacade, com.carecode.core.analytics.EventLogger, com.carecode.domain.policy.benefit.BenefitProjectionCalculator)> has parameter of type <com.carecode.domain.user.repository.ChildRepository> in (RegionalBenefitComparisonService.java:0)
policy → user 리포지토리: Field <com.carecode.domain.policy.service.BenefitReportSolicitor.childRepository> has type <com.carecode.domain.user.repository.ChildRepository> in (BenefitReportSolicitor.java:0)
policy → user 리포지토리: Field <com.carecode.domain.policy.service.BenefitReportSolicitor.userRepository> has type <com.carecode.domain.user.repository.UserRepository> in (BenefitReportSolicitor.java:0)
policy → user 리포지토리: Field <com.carecode.domain.policy.service.MissedBenefitService.childRepository> has type <com.carecode.domain.user.repository.ChildRepository> in (MissedBenefitService.java:0)
Expand Down
2 changes: 0 additions & 2 deletions archunit-baseline/ab7a1eba-4dd5-499e-95ed-0c71f0b6f61f
Original file line number Diff line number Diff line change
@@ -1,2 +0,0 @@
Class <com.carecode.core.client.controller.PublicDataController> is annotated with @RestController in (PublicDataController.java:0)
Class <com.carecode.core.controller.CareFacilityApiController> is annotated with @RestController in (CareFacilityApiController.java:0)
2 changes: 1 addition & 1 deletion docs/architecture/system-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ graph TB
|------|--------|------|
| 진입 | `core.security`, `core.RateLimitInterceptor`, `core.handler` | 인증·인가, 호출 제한, 예외의 상태코드 변환 |
| 표현 | `domain.*.controller` | HTTP 계약. 비즈니스 판단은 하지 않음 |
| 조합 | `domain.*.facade` | 여러 서비스를 묶어 화면 단위 응답을 만듦 |
| 조합 | `domain.*.app` | 여러 서비스를 묶어 화면 단위 응답을 만듦 (클래스 이름은 `*Facade`) |
| 도메인 | `domain.*.service` | 판단과 계산. 대부분의 설계 결정이 여기 있음 |
| 수집 | `core.client` | 공공데이터 공급자 추상화와 동기화 |
| 지표 | `core.analytics` | 행동 이벤트 적재와 퍼널·리텐션 집계 |
Expand Down
48 changes: 41 additions & 7 deletions docs/quality/architecture-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,54 @@ ArchUnit 의 `FreezingArchRule` 을 씁니다.

마지막 두 줄이 0 인 것이 중요합니다 — **층 구조 자체는 맞습니다.** 문제는 같은 층 안에서 경계를 지키지 않는 쪽입니다.

## 규칙 대상이 아닌 것
## core 를 이름이 뜻을 말하는 자리로 쪼갰다 (1단계)

`core/scheduler` · `core/client` · `core/devtools` · `core/geocoding` · `core/benefit` 은
공공데이터 동기화와 배치처럼 **여러 도메인을 조합하는 코드** 입니다. 도메인을 아는 게 본질이라
"기반은 도메인을 모른다" 규칙의 대상이 아닙니다.
`core` 라는 한 패키지에 성격이 다른 셋이 섞여 있었습니다.

다만 그 코드가 "공통 기반" 자리에 있는 것이 혼란의 원인입니다. 조합 계층으로 따로 옮기는 것은
다음 단계에서 다룹니다.
| 성격 | 내용 | 도메인을 아는가 |
|------|------|-----------------|
| 기반 | 보안·웹·설정·저장소·유틸·예외·모니터링 | 몰라야 한다 |
| 조합 | 공공데이터 연동·배치·지오코딩 | **아는 게 본질이다** (도메인 참조 47건) |
| 도메인 | 시설 공개 API 컨트롤러 2개, 지원금 계산기 | 도메인이다 |

조합 코드가 "공통 기반" 자리에 있으면, 규칙을 세울 수도 없고(도메인 참조가 정상이므로)
새로 온 사람은 "core 는 뭐든 넣는 곳" 으로 읽습니다. 그래서 이름이 뜻을 말하도록 옮겼습니다.

| 전 | 후 | 무엇인가 |
|----|----|----------|
| `core/client` | `external/publicdata` | 외부 공공데이터 연동·동기화 |
| `core/geocoding` | `external/geocoding` | 외부 좌표 변환 |
| `core/scheduler` | `batch` | 주기 작업 |
| `core/devtools` | `devtools` | 개발용 샘플 데이터 |
| `core/benefit` | `domain/policy/benefit` | policy 만 쓰는 도메인 로직이었다 |
| `core/controller/CareFacilityApiController` | `domain/careFacility/controller` | 373줄짜리 시설 공개 API |
| `core/client/controller/PublicDataController` | `domain/careFacility/controller` | 같은 성격 |
| `core/controller/BaseController` | `core/web` | 패키지 해체 |

`integration` 이라는 이름은 쓰지 않았습니다. 테스트 쪽에서 이미 "통합 테스트" 뜻으로 쓰고 있어
같은 이름이 두 뜻으로 읽힙니다.

### 총 위반은 줄지 않았다 (489 → 489)

솔직하게 적어 둡니다. "core 에 컨트롤러" 2건이 **`careFacility` 네이밍 위반 2건으로 옮겨 간 것**입니다.
옮긴 코드가 이제 도메인 규칙의 대상이 되기 때문입니다. 숫자가 줄어드는 것은 다음 단계
(`careFacility`→`facility`, 98건 일괄)에서 나옵니다.

이 단계의 값은 숫자가 아니라 **규칙을 세울 수 있는 구조가 된 것** 입니다. 조합 코드가 기반에서 빠졌으니
"기반은 도메인을 모른다" 를 예외 없이 적용할 수 있습니다.

### 파일을 옮기면 baseline 을 다시 떠야 한다

위반 설명에 클래스 경로가 들어가므로, 같은 문제라도 파일을 옮기면 **새 위반으로 잡힙니다.**
이동 PR 에서는 `freeze.refreeze=true` 로 한 번 다시 뜨고, 규칙별 숫자가 늘지 않았는지 확인한 뒤
다시 `false` 로 돌려놓습니다(그래야 CI 가 진짜 새 위반을 잡습니다).

## 다음 단계

| 단계 | 내용 | 효과 |
|------|------|------|
| 1. 자리 정리 | `core` 의 도메인 컨트롤러 이동, 조합 계층 분리, `careFacility`→`facility`, 문서의 `facade`↔코드 `app` 통일 | 위반 96+50+2 감소 |
| ~~1a. core 정리~~ | ~~조합 계층 분리, core 의 도메인 코드 이동~~ | **완료** — core 에 컨트롤러 0 |
| 1b. 이름 통일 | `careFacility`→`facility`, 문서의 `facade`↔코드 `app` | 위반 98 감소 |
| 2. 예외 한 체계 | `catch(Exception)` 덮어쓰기 제거, ErrorCode 기반 통합 | 상태 코드 정확해짐 |
| 3. `Map` 응답 → DTO | 24곳. 스펙에 타입이 생겨 프런트 계약 대조가 이 경로까지 본다 | 계약 품질 |
| 4. Child 를 제 자리로 | 엔티티는 `user`, 서비스는 `health` 에 쪼개져 있다 | 결합 1위 해소 |
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.carecode.core.scheduler;
package com.carecode.batch;

import com.carecode.domain.careFacility.entity.CareFacilityBooking;
import com.carecode.domain.careFacility.repository.CareFacilityBookingRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.carecode.core.scheduler;
package com.carecode.batch;

import com.carecode.core.ops.sync.SyncRunRepository;
import com.carecode.domain.user.repository.EmailVerificationTokenRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.carecode.core.scheduler;
package com.carecode.batch;

import com.carecode.core.ops.sync.SyncJob;
import com.carecode.core.ops.sync.SyncRunTracker;
Expand Down
Loading
Loading