Skip to content

refactor: 같은 일을 하는 엔드포인트 7개를 지운다 - #137

Merged
RosieOh merged 1 commit into
mainfrom
refactor/remove-duplicate-endpoints
Oct 5, 2026
Merged

RosieOh merged 1 commit into
mainfrom
refactor/remove-duplicate-endpoints

Conversation

@RosieOh

@RosieOh RosieOh commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Refs #132 (3a 단계)

Map<String, Object> 응답 24곳을 DTO 로 바꾸려고 하나씩 읽다가, 그중 7곳은 타입을 붙일 값이 아니라는 것을 알았습니다. 이미 같은 일을 하는 엔드포인트가 있었습니다.

지운 것 같은 일을 하는, 남겨 둔 것 왜
POST /api/public/care-facilities/sync-all POST /api/admin/public-data/facilities/sync 지운 쪽은 컨트롤러가 리포지토리에 직접 쓰고 50페이지 루프를 돌렸다. 남긴 쪽은 SyncResult 로 집계하고 신선도 이력에 남긴다
GET /api/public/care-facilities/swagger/sync 같음 위를 GET 으로 한 번 더 노출. GET 이라 브라우저 접속만으로 DB 쓰기가 실행됐다
GET .../swagger/db-facilities GET /facilities success/message 로 한 겹 더 싼 것 말고 차이가 없다
GET .../swagger/stats GET /facilities/statistics 같음
GET /notifications/settings/{userId} GET /notifications/preferences 고정값을 돌려줬다 (이메일 켬, 조용한 시간 22:00–08:00)
PUT /notifications/settings/{userId} PUT /notifications/preferences/... 받은 값을 그대로 돌려주고 저장하지 않았다
GET /notifications/statistics/{userId} GET /notifications/stats 우선순위 분포 HIGH=5, NORMAL=15, LOW=5, 일별 건수 2024-01-15: 3 이 코드에 박혀 있었다

알림 쪽 세 개가 핵심입니다. 응답이 그럴듯하면 프런트는 설정이 저장된다고 읽습니다. 타입을 붙이면 그 거짓이 스펙에 정식으로 올라가므로, 타입화가 아니라 삭제가 맞습니다.

입구가 둘이면 보안 설정도 둘입니다. /api/public/care-facilities/** 가 통째로 permitAll 이어서 그 아래 동기화 트리거까지 열려 있었고, 경로마다 hasRole("ADMIN") 을 덧붙여 막아 둔 상태였습니다. 중복을 지우면서 그 예외도 함께 사라졌습니다.

되살아나지 않게

AccessControlContractTest.duplicateMappingsRemoved 가 일곱 경로를 모두 두드려 404/405 를 확인합니다. 동기화가 ADMIN 전용인지 보던 테스트는 남은 어드민 경로로 옮겼습니다.

숫자

  • OpenAPI 스펙: 237 → 231 경로
  • ArchUnit baseline: 391 → 383 (컨트롤러→리포지토리 66→61, 도메인 경계 271→268)
  • 전체 테스트 607개, 실패 0

프런트 영향

없습니다. CareCode_FE 가 이 일곱 경로를 부르는 곳은 없습니다(/notifications/preferences 와 /facilities 를 씁니다).

Map<String, Object> 응답 24곳을 DTO 로 바꾸려고 하나씩 읽다가, 그중 7곳은
타입을 붙일 값이 아니라는 것을 알았다. 이미 같은 일을 하는 엔드포인트가 있었다.

지운 것 → 남겨 둔 것
- POST /api/public/care-facilities/sync-all
- GET  /api/public/care-facilities/swagger/sync
  → POST /api/admin/public-data/facilities/sync
  지운 쪽은 컨트롤러가 리포지토리에 직접 쓰고 50페이지 루프를 돌렸다. 남긴 쪽은
  SyncResult 로 신규·갱신·실패·제외를 세고 신선도 이력(SyncRunTracker)에 남긴다.
  swagger/sync 는 GET 이라 브라우저 접속이나 크롤러만으로 DB 쓰기가 실행됐다.
- GET /api/public/care-facilities/swagger/db-facilities → GET /facilities
- GET /api/public/care-facilities/swagger/stats        → GET /facilities/statistics
  success/message 로 한 겹 더 싼 것 말고 차이가 없었다.
- GET /notifications/settings/{userId} → GET /notifications/preferences
- PUT /notifications/settings/{userId} → PUT /notifications/preferences/...
- GET /notifications/statistics/{userId} → GET /notifications/stats

알림 쪽 세 개는 값이 코드에 박혀 있었다. 설정 조회는 고정값(이메일 켬, 조용한 시간
22:00-08:00)을 돌려주고, 설정 수정은 받은 값을 그대로 돌려주며 아무것도 저장하지
않았다. 통계는 우선순위 분포 HIGH=5, NORMAL=15, LOW=5 와 일별 건수 2024-01-15: 3 이
박혀 있었다. 응답이 그럴듯하면 프런트는 설정이 저장된다고 읽는다. 타입을 붙이면
그 거짓이 스펙에 정식으로 올라가므로, 타입화가 아니라 삭제가 맞다.

입구가 둘이면 보안 설정도 둘이다. /api/public/care-facilities/** 가 통째로 permitAll
이어서 그 아래 동기화 트리거까지 열려 있었고, 경로마다 hasRole("ADMIN") 을 덧붙여
막아 둔 상태였다. 중복을 지우면서 그 예외도 함께 사라졌다.

되살아나는 것을 막으려고 AccessControlContractTest.duplicateMappingsRemoved 가 일곱
경로를 두드려 404/405 를 확인한다. 동기화가 ADMIN 전용인지 보던 테스트는 남은
어드민 경로로 옮겼다.

- OpenAPI 스펙: 237 → 231 경로
- ArchUnit baseline: 391 → 383 (컨트롤러→리포지토리 66→61, 도메인 경계 271→268)
- 전체 테스트 607개, 실패 0

Refs #132
@RosieOh
RosieOh merged commit f9bf0c3 into main Oct 5, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant