본문으로 건너뛰기

영향 분석

코드 변경을 수행하기 전에 파급 효과를 이해합니다.

영향 분석이란?

영향 분석은 다음 질문에 답합니다: "이 파일을 변경하면 다른 무엇이 영향을 받을까?"

이것은 다음을 도와줍니다:

  • 변경 사항을 더 신중하게 계획
  • 필요한 테스트 식별
  • 예상치 못한 오류 방지
  • 변경에 필요한 작업량 추정

영향 분석 실행

웹 인터페이스

  1. 프로젝트 선택
  2. 시각화에서 파일 클릭
  3. 영향 분석 클릭

CLI

> /analyze src/services/user.ts

API

curl -X POST https://api.archicore.io/api/v1/projects/:id/analyze \
-H "Authorization: Bearer 귀하의_API_KEY" \
-d '{"path": "src/services/user.ts"}'

결과 이해하기

src/services/user.ts 영향 분석

╭─────────────────────────────────────────╮
│ 직접 종속성 (5) │
├─────────────────────────────────────────┤
│ → src/utils/crypto.ts │
│ → src/db/models/user.ts │
│ → src/config/auth.ts │
│ → src/types/user.ts │
│ → src/utils/validation.ts │
╰─────────────────────────────────────────╯

╭─────────────────────────────────────────╮
│ 의존자 - 영향을 받음 (8) │
├─────────────────────────────────────────┤
│ ← src/controllers/auth.ts │
│ ← src/controllers/profile.ts │
│ ← src/controllers/admin.ts │
│ ← src/middleware/auth.ts │
│ ← src/services/session.ts │
│ ← src/api/routes/users.ts │
│ ← tests/user.test.ts │
│ ← tests/auth.test.ts │
╰─────────────────────────────────────────╯

위험 수준: 중간
영향받는 테스트: 2

영향 수준

수준설명조치
낮음의존자 적음, 격리된 변경표준 리뷰로 진행
중간여러 의존자, 보통 위험철저한 테스트 권장
높음많은 의존자, 핵심 모듈광범위한 테스트, 단계적 배포 고려
심각핵심 경로에 영향추가 리뷰, 기능 플래그 권장

변경 시뮬레이션

제안된 변경의 영향 미리보기:

> /simulate
변경 사항 설명: UserService.getUser()에 새 매개변수 추가

시뮬레이션 결과:

업데이트가 필요한 파일:
1. src/controllers/auth.ts:34 - getUser() 호출
2. src/controllers/profile.ts:12 - getUser() 호출
3. src/services/session.ts:45 - getUser() 호출

업데이트가 필요한 테스트:
1. tests/user.test.ts - 5개 테스트 케이스가 getUser() 호출
2. tests/auth.test.ts - 3개 테스트 케이스가 getUser() 호출

예상 작업량: 중간 (8개 파일, 15개 호출 위치)

모범 사례

변경하기 전에

  1. 영향 분석 실행 수정 계획인 파일에 대해
  2. 종속성 체인 검토 - 영향 범위 이해
  3. 영향받는 테스트 식별 - 업데이트되었는지 확인
  4. 순환 종속성 확인 - 영향을 증폭시킴

영향 줄이기

  1. 인터페이스 사용 - 추상화에 의존
  2. SOLID 원칙 적용 - 단일 책임이 영향 제한
  3. 모듈 분리 - 직접 종속성 줄이기
  4. 파사드 레이어 작성 - 구현 세부사항 숨기기

예시: 안전한 리팩토링

// 이전: 직접 종속성
// User 변경이 모든 소비자에게 영향
class UserController {
constructor(private userService: UserService) {}
}

// 이후: 인터페이스 종속성
// UserService 구현 변경이 소비자에게 영향 없음
interface IUserService {
getUser(id: string): Promise<User>;
}

class UserController {
constructor(private userService: IUserService) {}
}

CI/CD 통합

파이프라인에 영향 분석 추가:

# .gitlab-ci.yml
impact-analysis:
script:
- archicore analyze --changed-files
- if [ $IMPACT_LEVEL == "critical" ]; then
echo "심각한 영향 감지 - 추가 리뷰 필요";
exit 1;
fi