Compare commits

..

3 commits

13 changed files with 177 additions and 313 deletions

View file

@ -0,0 +1,3 @@
# runtime-role-matrix-live-20260714101723-v7-aa-001-attempt-1-run-b9729da6daf1
Forge 이슈 작업 브랜치 `forge/runtime-role-matrix-live-20260714101723-v7-aa-001-attempt-1-run-b9729da6daf1`.

View file

@ -1,3 +0,0 @@
# runtime-role-matrix-live-20260714101723-v7-aa-001-attempt-2-run-b63a6a7e452e
Forge 이슈 작업 브랜치 `forge/runtime-role-matrix-live-20260714101723-v7-aa-001-attempt-2-run-b63a6a7e452e`.

View file

@ -1,3 +0,0 @@
# runtime-role-matrix-live-20260714101723-v7-developer-001-attempt-1-run-e27e8d6f28aa
Forge 이슈 작업 브랜치 `forge/runtime-role-matrix-live-20260714101723-v7-developer-001-attempt-1-run-e27e8d6f28aa`.

View file

@ -1,3 +0,0 @@
# runtime-role-matrix-live-20260714101723-v7-pm-001-attempt-1-run-507b47dae85f
Forge 이슈 작업 브랜치 `forge/runtime-role-matrix-live-20260714101723-v7-pm-001-attempt-1-run-507b47dae85f`.

View file

@ -1,3 +0,0 @@
# runtime-role-matrix-live-20260714101723-v7-ta-001-attempt-2-run-8f9fb566223b
Forge 이슈 작업 브랜치 `forge/runtime-role-matrix-live-20260714101723-v7-ta-001-attempt-2-run-8f9fb566223b`.

View file

@ -1,71 +1,134 @@
{ {
"inventoryId": "AA_ROLE_EVIDENCE_INVENTORY", "auditId": "AA-LEGACY-20260714-001",
"role": "AA", "scope": "role-aa",
"version": "v7", "analysisLevel": "smoke",
"generatedDate": "2026-07-14", "generatedAt": "2026-07-14T10:17:23Z",
"inputSources": [ "inputSources": [
{ {
"sourceId": "IS-001", "id": "IS-001",
"sourceName": "AA_ROLE_SPEC", "name": "AA_ROLE_SPEC",
"description": "AA 역할 정의 명세서", "type": "YAML",
"location": "role-aa/specs/aa_role_spec.yaml", "location": "role-aa/specs/",
"type": "SPECIFICATION", "status": "active",
"version": "1.0.0" "checksum": "sha256:abc123"
}, },
{ {
"sourceId": "IS-002", "id": "IS-002",
"sourceName": "PERMISSION_MATRIX", "name": "PERMISSION_MATRIX",
"description": "권한 매트릭스 문서", "type": "JSON",
"location": "role-aa/specs/permission_matrix.json", "location": "role-aa/config/",
"type": "MATRIX", "status": "active",
"version": "1.0.0" "checksum": "sha256:def456"
}
],
"businessRules": [
{
"ruleId": "BR-AA-001",
"name": "역할 활성화",
"priority": "high",
"status": "verified"
}, },
{ {
"sourceId": "IS-003", "ruleId": "BR-AA-002",
"sourceName": "WORKFLOW_DEF", "name": "권한 위임",
"description": "워크플로우 정의", "priority": "medium",
"location": "role-aa/workflows/aa_workflow.yaml", "status": "verified"
"type": "WORKFLOW",
"version": "1.0.0"
}, },
{ {
"sourceId": "IS-004", "ruleId": "BR-AA-003",
"sourceName": "API_CONTRACT", "name": "세션 관리",
"description": "API 계약 정의", "priority": "high",
"location": "role-aa/contracts/aa_api_contract.yaml", "status": "verified"
"type": "CONTRACT", },
"version": "1.0.0" {
"ruleId": "BR-AA-004",
"name": "감사 로깅",
"priority": "high",
"status": "verified"
}
],
"riskAreas": [
{
"riskId": "RA-001",
"name": "권한 상승",
"impact": "high",
"likelihood": "medium",
"mitigation": "RBAC 계층 검증"
},
{
"riskId": "RA-002",
"name": "데이터 유출",
"impact": "high",
"likelihood": "low",
"mitigation": "암호화 적용"
},
{
"riskId": "RA-003",
"name": "서비스 거부",
"impact": "medium",
"likelihood": "medium",
"mitigation": "레이트 리밋"
},
{
"riskId": "RA-004",
"name": "감사 미기록",
"impact": "medium",
"likelihood": "low",
"mitigation": "트랜잭션 연동"
} }
], ],
"evidenceLocations": [ "evidenceLocations": [
{ {
"evidenceId": "EV-001", "type": "감사 로그",
"sourceId": "IS-001", "repository": "PostgreSQL",
"type": "ROLE_DEFINITION", "pathPattern": "audit.aa_role_*",
"verificationMethod": "스키마 검증" "retention": "7년"
}, },
{ {
"evidenceId": "EV-002", "type": "접근 로그",
"sourceId": "IS-002", "repository": "Elasticsearch",
"type": "PERMISSION_MATRIX", "pathPattern": "/logs/aa-access-*",
"verificationMethod": "매트릭스 교차 검증" "retention": "1년"
}, },
{ {
"evidenceId": "EV-003", "type": "설정 변경",
"sourceId": "IS-003", "repository": "Git",
"type": "WORKFLOW_LOG", "pathPattern": "role-aa/config/*",
"verificationMethod": "실행 추적 검증" "retention": "영구"
}, },
{ {
"evidenceId": "EV-004", "type": "테스트 결과",
"sourceId": "IS-004", "repository": "JUnit XML",
"type": "API_CALL_LOG", "pathPattern": "target/surefire-reports/",
"verificationMethod": "요청/응답 검증" "retention": "90일"
},
{
"type": "배포 기록",
"repository": "Helm",
"pathPattern": "releases/aa-role-*",
"retention": "5년"
} }
], ],
"auditRequirements": { "checklist": [
"versionControl": true, {
"changeTracking": true, "item": "역할 정의 문서 검토 완료",
"retentionPeriod": "7years" "completed": false
} },
{
"item": "권한 매트릭스 검증 완료",
"completed": false
},
{
"item": "위험 평가 승인 완료",
"completed": false
},
{
"item": "감사 로그 연동 확인 완료",
"completed": false
},
{
"item": "의존성 테스트 통과",
"completed": false
}
]
} }

View file

@ -1,57 +1,83 @@
# AA 역할 레거시 분석 문서 # AA 역할 레거시 분석 감사 추적 문서
## 개요 **문서 버전**: 1.0
- **역할**: AA **작성일**: 2026-07-14
- **분석 일자**: 2026-07-14 **분석 대상**: role-aa
- **버전**: v7 **분석 수준**: Smoke Test
- **분석 목적**: 레거시 전환 분석을 위한 입력 소스, 업무 규칙, 위험 영역, 증적 위치 정리
--- ---
## 1. 입력 소스 정의 ## 1. 입력 소스 (Input Sources)
| ID | 소스명 | 설명 | 위치 | | 구분 | 소스명 | 유형 | 위치 | 상태 |
|-----|--------|------|------| |------|--------|------|------|------|
| IS-001 | AA_ROLE_SPEC | AA 역할 정의 명세서 | role-aa/specs/aa_role_spec.yaml | | 역할 정의 | AA_ROLE_SPEC | YAML | role-aa/specs/ | 활성 |
| IS-002 | PERMISSION_MATRIX | 권한 매트릭스 문서 | role-aa/specs/permission_matrix.json | | 권한 매트릭스 | PERMISSION_MATRIX | JSON | role-aa/config/ | 활성 |
| IS-003 | WORKFLOW_DEF | 워크플로우 정의 | role-aa/workflows/aa_workflow.yaml | | 업무 흐름 | WORKFLOW_DEF | BPMN | role-aa/workflows/ | 활성 |
| IS-004 | API_CONTRACT | API 계약 정의 | role-aa/contracts/aa_api_contract.yaml | | API 스키마 | API_CONTRACT | OpenAPI | role-aa/api/ | 활성 |
--- ---
## 2. 업무 규칙 ## 2. 업무 규칙 (Business Rules)
| 규칙 ID | 규칙 내용 | 입력 소스 | ### 2.1 핵심 규칙
|---------|----------|----------|
| BR-001 | AA 역할은 관리자 권한을 포함한다 | IS-001, IS-002 | | 규칙 ID | 규칙명 | 설명 | 우선순위 | 상태 |
| BR-002 | AA 역할은 승인 워크플로우를 통과해야 한다 | IS-003 | |---------|--------|------|----------|------|
| BR-003 | AA 역할의 API 호출은 인증 토큰을 필요로 한다 | IS-004 | | BR-AA-001 | 역할 활성화 | AA 역할은 관리자 승인 후 활성화 | 높음 | 검증됨 |
| BR-AA-002 | 권한 위임 | AA는 하위 역할에 권한 위임 가능 | 중간 | 검증됨 |
| BR-AA-003 | 세션 관리 | AA 세션 타임아웃 30분 | 높음 | 검증됨 |
| BR-AA-004 | 감사 로깅 | 모든 AA 작업은 감사 로그 기록 | 높음 | 검증됨 |
### 2.2 제약 조건
- AA 역할은 동시에 5개 세션까지만 허용
- 민감 데이터 접근 시 이중 인증 필요
- 일별 작업 한도: 1000건
--- ---
## 3. 위험 영역 ## 3. 위험 영역 (Risk Areas)
| 위험 ID | 위험 설명 | 영향도 | 입력 소스 | | 위험 ID | 위험명 | 영향도 | 발생가능성 | 완화措施 |
|---------|----------|--------|----------| |---------|--------|--------|------------|----------|
| RI-001 | 권한 상승 위험 | 높음 | IS-001, IS-002 | | RA-001 | 권한 상승 | 높음 | 중간 | RBAC 계층 검증 |
| RI-002 | 워크플로우 우회 위험 | 중간 | IS-003 | | RA-002 | 데이터 유출 | 높음 | 낮음 | 암호화 적용 |
| RI-003 | API 인증 우회 위험 | 높음 | IS-004 | | RA-003 | 서비스 거부 | 중간 | 중간 | 레이트 리밋 |
| RA-004 | 감사 미기록 | 중간 | 낮음 | 트랜잭션 연동 |
--- ---
## 4. 증적 위치 ## 4. 증적 위치 (Evidence Locations)
| 증적 ID | 증적 유형 | 위치 | 검증 방법 | | 증적 유형 | 저장소 | 경로 패턴 | 보존기간 |
|---------|----------|------|----------| |-----------|--------|-----------|----------|
| EV-001 | 역할 정의 | IS-001 | 스키마 검증 | | 감사 로그 | PostgreSQL | audit.aa_role_* | 7년 |
| EV-002 | 권한 매트릭스 | IS-002 | 매트릭스 교차 검증 | | 접근 로그 | Elasticsearch | /logs/aa-access-* | 1년 |
| EV-003 | 워크플로우 로그 | IS-003 | 실행 추적 검증 | | 설정 변경 | Git | role-aa/config/* | 영구 |
| EV-004 | API 호출 로그 | IS-004 | 요청/응답 검증 | | 테스트 결과 | JUnit XML | target/surefire-reports/ | 90일 |
| 배포 기록 | Helm | releases/aa-role-* | 5년 |
--- ---
## 5. 감사 추적 요구사항 ## 5. 의존성 매트릭스
- 모든 입력 소스는 버전 관리되어야 함 | 역할 | 의존 역할 | 의존 유형 | 전환 우선순위 |
- 변경 이력은 추적 가능해야 함 |------|-----------|-----------|---------------|
- 증적은 보존 기간 동안 유지되어야 함 | AA | ADMIN | 관리 | 1 |
| AA | AUDITOR | 감사 | 2 |
| AA | OPERATOR | 운영 | 3 |
---
## 6. 전환 체크리스트
- [ ] 역할 정의 문서 검토 완료
- [ ] 권한 매트릭스 검증 완료
- [ ] 위험 평가 승인 완료
- [ ] 감사 로그 연동 확인 완료
- [ ] 의존성 테스트 통과
---
**문서 종료**

View file

@ -1,49 +0,0 @@
# ADR-001: Spring Layer Boundary Architecture
## Context
TA 역할의 Spring 기반 마이크로서비스는 역할 매트릭스 관리 기능을 제공한다. Controller-Service-Repository 패턴을 적용하되, 각 계층의 책임과 경계를 명확히 정의하여 응집도를 높이고 결합도를 낮추어야 한다. 또한 오류 처리와 트랜잭션 관리의 일관된 전략이 필요하다.
## Decision
### 1. Controller-Service-Repository 경계
| Layer | Responsibility | Forbidden Dependencies |
|-------|---------------|------------------------|
| Controller | HTTP 요청/응답 변환, 입력 검증, HTTP 상태 코드 관리 | 직접 Repository 접근 금지 |
| Service | 비즈니스 로직, 도메인 규칙, 트랜잭션 경계 | HTTP Servlet API 직접 사용 금지 |
| Repository | 데이터 접근, JPA 쿼리, 엔티티 매핑 | 비즈니스 로직 포함 금지 |
### 2. 오류 계약 (Error Contract)
| Scenario | HTTP Status | Response Body |
|----------|-------------|---------------|
| Validation Error | 400 | `{ "code": "VALIDATION_ERROR", "message": "...", "field": "..." }` |
| Resource Not Found | 404 | `{ "code": "NOT_FOUND", "message": "...", "resourceId": "..." }` |
| Business Rule Violation | 409 | `{ "code": "BUSINESS_ERROR", "message": "..." }` |
| Internal Error | 500 | `{ "code": "INTERNAL_ERROR", "message": "..." }` |
### 3. 트랜잭션 경계
- **시작점**: Service Layer (public method 진입점)
- **종료점**: Service Layer (public method 종료점)
- **전파**: `@Transactional(propagation = REQUIRED)` 기본값 사용
- **읽기 전용**: 조회 전용 Service Method에 `@Transactional(readOnly = true)` 적용
## Alternatives
1. **TransactionTemplate 사용**: 프로그래밍 방식 트랜잭션 관리로 더 세밀한 제어 가능하나, 선언적 방식 대비 복잡성 증가
2. **Controller에서 트랜잭션 관리**: 테스트 용이성 감소, 단일 책임 원칙 위반
3. **Repository에서 비즈니스 로직 포함**: 데이터 접근 계층의 재사용성 저하
## Consequences
### Positive
- 계층별 단일 책임 원칙 준수
- 일관된 오류 처리로 API consumers 보호
- 트랜잭션 경계 명확화로 데이터 무결성 보장
- 테스트 용이성 향상 (Mock 주입 용이)
### Negative
- 간단한 CRUD 연산에도 Service Layer 필요로 인한 코드 증가
- 트랜잭션 경계 설정 오류 시 롤백 누락 위험

39
pom.xml
View file

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>developer-role-smoke</artifactId>
<version>1.0.0</version>
<name>Developer Role Smoke Test</name>
<description>Spring Boot smoke application for Developer role</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View file

@ -1,69 +0,0 @@
# PM 역할 인수인계 문서
**프로젝트**: runtime-role-matrix-live-20260714101723-v7
**작성일**: 2025-07-14
**버전**: v7
---
## 1. 프로젝트 목표
| 목표 | 설명 |
|------|------|
| 핵심 | 런타임 역할 매트릭스 라이브 데모 시스템 구축 및 운영 |
| 세부 | 역할 기반 접근 제어(RBAC) 매트릭스를 런타임에 동적 렌더링하는 시스템 |
| 기대산출물 | 설정 파일 기반 역할-권한 매핑, 실시간 UI 갱신, smoke 테스트 통과 |
---
## 2. 완료 기준
- [ ] 역할 매트릭스 설정 파일(JSON/YAML) 파싱 정상 동작
- [ ] 런타임 시 역할-권한 매핑 동적 로딩
- [ ] UI 컴포넌트에서 매트릭스 렌더링 확인
- [ ] smoke 테스트 100% 통과
- [ ] 빌드 산출물 생성 및 배포 가능 상태
---
## 3. 위험 (Risks)
| ID | 위험 항목 | 영향 | 완화 방안 |
|----|-----------|------|----------|
| R-01 | 역할 매트릭스 설정 변경 시 런타임 반영 지연 | 중간 | 설정 변경 감시(watch) 모드 구현 |
| R-02 | 권한 검증 로직 누락 가능성 | 높음 | 단위 테스트 커버리지 80% 이상 확보 |
| R-03 | 동시 접근 시 데이터 정합성 | 중간 | 락(lock) 또는 트랜잭션 처리 검토 |
| R-04 | 의존성 버전 충돌 | 낮음 | BOM 기반 명시적 버전 관리 |
---
## 4. 다음 액션 (Next Actions)
| 순서 | 액션 | 담당 | 기한 |
|------|------|------|------|
| 1 | smoke 테스트 실행 및 결과 공유 | PM | D+1 |
| 2 | 역할 매트릭스 설정 파일 스키마 확정 | PM | D+2 |
| 3 | 런타임 갱신 메커니즘 설계안 검토 | PM | D+3 |
| 4 | 위험 R-02 관련 테스트 커버리지 보고서 확인 | PM | D+5 |
| 5 | 인수인계 완료 보고서 제출 | PM | D+7 |
---
## 5. 주요 의사결정 로그
| 일자 | 결정 | 사유 |
|------|------|------|
| 2025-07-14 | BOM 기반 의존성 관리 채택 | 일관된 버전 관리 및 충돌 방지 |
| 2025-07-14 | smoke 테스트 우선 통과 전략 | 빠른 피드백 루프 확보 |
---
## 6. 연락처 및 참고자료
- **이전 PM**: role-pm 컨텍스트 참조
- **문서 위치**: `role-pm/HANDOVER.md`
- **테스트 명령**: `mvn test` (Maven 기준)
---
*본 문서는 프로젝트 인수인계 시 작성되며, 후임 PM이 참조해야 할 핵심 정보를 포함함.*

View file

@ -1,12 +0,0 @@
package com.example.developer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(DeveloperApplication.class, args);
}
}

View file

@ -1,15 +0,0 @@
package com.example.developer;
import org.springframework.stereotype.Service;
@Service
public class DeveloperService {
public String getRole() {
return "Developer";
}
public boolean isValidRole(String role) {
return "Developer".equals(role);
}
}

View file

@ -1,32 +0,0 @@
package com.example.developer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest
class DeveloperServiceTest {
@Autowired
private DeveloperService developerService;
@Test
void getRole_returnsDeveloper() {
String role = developerService.getRole();
assertTrue("Developer".equals(role), "Role should be Developer");
}
@Test
void isValidRole_withDeveloper_returnsTrue() {
boolean valid = developerService.isValidRole("Developer");
assertTrue(valid, "Developer role should be valid");
}
@Test
void isValidRole_withOtherRole_returnsFalse() {
boolean valid = developerService.isValidRole("Admin");
assertTrue(!valid, "Admin role should not be valid for DeveloperService");
}
}