You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Scope Service는 GHG(온실가스) 프로토콜에 따른 Scope 1, 2, 3 탄소배출량 계산 및 관리를 담당하는 마이크로서비스입니다. 기업의 직접배출, 간접배출, 기타간접배출을 체계적으로 관리하며 ESG 경영에 필수적인 탄소발자국 추적 시스템을 제공합니다.
핵심 기능
통합 Scope 관리: Scope 1(직접배출), Scope 2(간접배출-에너지), Scope 3(기타간접배출) 통합 관리
카테고리별 배출량 계산: Scope별 세부 카테고리 기반 정밀 배출량 산정
자재코드 관리 시스템: 협력사 간 자재코드 할당, 매핑, 추적을 통한 공급망 탄소발자국 관리
계층적 자재 할당: TreePath 기반 본사→협력사 자재코드 할당 및 권한 관리
매핑 기반 배출량 추적: 자재코드와 Scope 배출량 연동을 통한 제품별 탄소발자국 추적
권한 기반 데이터 관리: 본사/협력사 계층적 권한으로 조직별 배출량 데이터 관리
실시간 집계: 월별/연별 배출량 통계 및 트렌드 분석
기술 스택
시스템 아키텍처
마이크로서비스 구조
graph TB
subgraph "ESG 플랫폼 생태계"
GW[API 게이트웨이<br/>Gateway Service<br/>:8080] --> SCOPE[탄소배출량 관리<br/>Scope Service<br/>:8082]
GW --> AUTH[인증/권한 관리<br/>Auth Service<br/>:8081]
GW --> CSDDD[CSDDD 규정 준수<br/>CSDDD Service<br/>:8083]
GW --> DART[기업 데이터 연동<br/>DART Service<br/>:8084]
end
subgraph "핵심 인프라스트럭처"
CONFIG[설정 중앙 관리<br/>Config Service<br/>:8888] --> EUREKA[서비스 디스커버리<br/>Discovery Service<br/>:8761]
EUREKA --> GW
EUREKA --> SCOPE
EUREKA --> AUTH
end
subgraph "데이터 계층"
SCOPE --> MYSQL[(MySQL 데이터베이스<br/>배출량 저장소)]
SCOPE -.-> CALCULATOR[배출량 계산 엔진<br/>GHG 프로토콜 기반]
end
subgraph "외부 연동 시스템"
FRONTEND[ESG 대시보드<br/>Next.js 프론트엔드] --> GW
GITHUB[GitHub 설정 저장소<br/>중앙 집중식 설정] --> CONFIG
LCA[LCA 데이터베이스<br/>생명주기 평가 연동] -.-> SCOPE
end
style SCOPE fill:#e8f5e8,stroke:#2e7d32,stroke-width:3px
style MYSQL fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style CALCULATOR fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
Loading
Scope 서비스 내부 구조
graph LR
subgraph "Scope 서비스 아키텍처"
API[REST API 컨트롤러<br/>ScopeEmissionController<br/>ScopeAggregationController<br/>MaterialAssignmentController] --> BIZ[비즈니스 로직 서비스<br/>ScopeEmissionService<br/>ScopeAggregationService<br/>Scope3SpecialAggregationService<br/>MaterialAssignmentService<br/>MaterialDataService]
BIZ --> DATA[데이터 접근 계층<br/>ScopeEmissionRepository<br/>MaterialAssignmentRepository<br/>MaterialMappingRepository<br/>JPA/Hibernate]
BIZ --> CALC[배출량 계산 엔진<br/>집계 알고리즘<br/>특수 집계 로직]
subgraph "도메인 모델"
ENTITY[ScopeEmission<br/>탄소배출량 엔티티<br/>27개 필드]
MATERIAL[MaterialAssignment<br/>자재코드 할당 엔티티<br/>조직/자재/메타정보]
MAPPING[MaterialMapping<br/>자재코드 매핑 엔티티<br/>매핑/연결정보]
TYPE[ScopeType<br/>SCOPE1/SCOPE2/SCOPE3]
CAT1[Scope1Category<br/>직접배출 10개 카테고리]
CAT2[Scope2Category<br/>간접배출 2개 카테고리]
CAT3[Scope3Category<br/>기타간접배출 15개 카테고리]
ENTITY -.-> TYPE
ENTITY -.-> CAT1
ENTITY -.-> CAT2
ENTITY -.-> CAT3
ENTITY -.-> MAPPING
MATERIAL --> MAPPING
end
DATA --> ENTITY
DATA --> MATERIAL
DATA --> MAPPING
CALC --> ENTITY
subgraph "응답 DTO"
RESP1[ScopeEmissionResponse<br/>배출량 조회 응답]
RESP2[CategoryMonthlyEmission<br/>카테고리별 월간 집계]
RESP3[Scope3CombinedEmissionResponse<br/>Scope3 통합 집계]
RESP4[MaterialAssignmentResponse<br/>자재코드 할당 응답]
RESP5[MappedMaterialCodeResponse<br/>매핑된 자재코드 응답]
end
BIZ --> RESP1
BIZ --> RESP2
BIZ --> RESP3
BIZ --> RESP4
BIZ --> RESP5
end
style API fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
style BIZ fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
style DATA fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style CALC fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style ENTITY fill:#ffebee,stroke:#d32f2f,stroke-width:2px
sequenceDiagram
participant 클라이언트 as ESG 대시보드<br/>(프론트엔드)
participant 게이트웨이 as API 게이트웨이<br/>(Gateway Service)
participant 스콥서비스 as 탄소배출량 서비스<br/>(Scope Service)
participant 데이터베이스 as MySQL DB<br/>(배출량 저장소)
participant 계산엔진 as 배출량 계산 엔진<br/>(GHG 프로토콜)
클라이언트->>게이트웨이: 배출량 데이터 등록<br/>POST /api/v1/scope/emissions
Note over 클라이언트,게이트웨이: 요청 데이터: { scopeType, category,<br/>activityAmount, emissionFactor, productCode }
게이트웨이->>스콥서비스: 인증 헤더와 함께 요청 전달<br/>(X-USER-TYPE, X-HEADQUARTERS-ID)
스콥서비스->>스콥서비스: 사용자 권한 검증<br/>(본사/협력사별 데이터 접근)
스콥서비스->>스콥서비스: 기본 필드 유효성 검증<br/>(Scope 타입, 카테고리, 활동량)
alt 제품 코드 매핑 활성화
스콥서비스->>스콥서비스: 제품 코드 검증 (Scope 1,2만 가능)
Note over 스콥서비스: Scope 3는 제품 코드 매핑 불가<br/>비즈니스 룰 적용
end
스콥서비스->>계산엔진: 총 배출량 계산 요청
Note over 계산엔진: 계산 공식:<br/>총배출량 = 활동량 × 배출계수<br/>(단위: tCO2eq)
계산엔진-->>스콥서비스: 계산된 배출량 반환
스콥서비스->>데이터베이스: 배출량 데이터 저장<br/>(27개 필드 포함)
데이터베이스-->>스콥서비스: 저장된 엔티티 반환<br/>(생성일시, ID 포함)
스콥서비스->>게이트웨이: 배출량 응답 데이터<br/>(ScopeEmissionResponse)
게이트웨이->>클라이언트: 등록 성공 응답<br/>(201 Created)
Loading
배출량 조회 시퀀스
sequenceDiagram
participant 클라이언트 as ESG 대시보드<br/>(프론트엔드)
participant 게이트웨이 as API 게이트웨이<br/>(Gateway Service)
participant 스콥서비스 as 탄소배출량 서비스<br/>(Scope Service)
participant 데이터베이스 as MySQL DB<br/>(배출량 저장소)
participant 집계서비스 as 집계 서비스<br/>(Aggregation Service)
클라이언트->>게이트웨이: 배출량 데이터 조회<br/>GET /api/v1/scope/emissions/scope/{scopeType}
Note over 클라이언트,게이트웨이: 쿼리 파라미터: 페이징, 필터링<br/>연도, 월, 카테고리별 조건
게이트웨이->>스콥서비스: 인증 헤더와 함께 요청 전달<br/>(사용자 권한 정보 포함)
스콥서비스->>스콥서비스: 사용자 권한 검증<br/>(데이터 접근 범위 결정)
alt 본사 사용자
스콥서비스->>데이터베이스: 본사 직접 입력 데이터만 조회
Note over 스콥서비스: 조건: partnerId = null<br/>본사가 직접 등록한 배출량만
else 협력사 사용자
스콥서비스->>데이터베이스: 해당 협력사 데이터만 조회
Note over 스콥서비스: 조건: partnerId = user.partnerId<br/>자신의 협력사 배출량만
end
데이터베이스-->>스콥서비스: 배출량 목록 반환<br/>(권한 범위 내 데이터)
opt 집계 요청시
스콥서비스->>집계서비스: 카테고리별 집계 처리<br/>(월별/연별 통계)
집계서비스-->>스콥서비스: 집계 결과 반환<br/>(CategoryMonthlyEmission)
end
스콥서비스->>게이트웨이: 배출량 목록 응답<br/>(List<ScopeEmissionResponse>)
게이트웨이->>클라이언트: 조회 성공 응답<br/>(200 OK + 데이터)
sequenceDiagram
participant 클라이언트 as 대시보드
participant API as Scope Service
participant 특수집계 as Scope3SpecialAggregationService
participant 일반집계 as ScopeAggregationService
participant DB as MySQL Database
클라이언트->>API: Scope3 월별 통합 집계 요청<br/>GET /scope3-combined/{year}/{month}
API->>특수집계: 특수 집계 처리 (Cat.1,2,4,5)
특수집계->>DB: 복합 쿼리 실행 (Scope1+2+3 조합)
DB-->>특수집계: 카테고리별 집계 결과
특수집계-->>API: 특수집계 응답 (4개 카테고리)
API->>일반집계: 일반 카테고리 특정 월 집계<br/>(Cat.3,6,7,8,9,10,11,12,13,14,15)
일반집계->>DB: 일반 카테고리 월별 쿼리
DB-->>일반집계: 일반 카테고리 결과
일반집계-->>API: 일반집계 응답 (11개 카테고리)
API->>API: 특수집계 + 일반집계 통합
API-->>클라이언트: Scope3CombinedEmissionResponse<br/>(총 15개 카테고리 완전 집계)
Note over 클라이언트,DB: 핵심 구현 포인트:<br/>• 특정 월만 조회하는 정밀 필터링<br/>• 복합 카테고리 집계 알고리즘<br/>• 권한 기반 데이터 격리
Loading
자재코드 관리 시스템
Scope Service는 협력사 간 자재코드 할당 및 매핑 관리 시스템을 구현하여 공급망 전체의 탄소발자국 추적을 지원합니다.
sequenceDiagram
participant 협력사 as 협력사<br/>(Partner)
participant API as Material API<br/>(MaterialAssignmentController)
participant 매핑서비스 as MaterialMapping<br/>Service
participant DB as MySQL DB<br/>(material_mapping)
participant 배출량 as ScopeEmission<br/>(연결된 배출량 데이터)
협력사->>API: 자재코드 매핑 요청<br/>POST /scope/material-mapping
Note over 협력사,API: 요청 데이터: { upstreamMaterialCode: "ST001",<br/>internalMaterialCode: "B100", materialName: "철강재" }
API->>매핑서비스: 매핑 생성 요청<br/>(사용자 권한 검증 포함)
매핑서비스->>매핑서비스: 할당 검증<br/>(ST001이 해당 협력사에게 할당되었는지 확인)
alt 할당된 자재코드인 경우
매핑서비스->>DB: MaterialMapping 엔티티 생성<br/>(upstreamMaterialCode, internalMaterialCode 매핑)
DB-->>매핑서비스: 매핑 엔티티 저장 완료
매핑서비스->>매핑서비스: MaterialAssignment.isMapped = true 업데이트<br/>(할당 상태를 매핑됨으로 변경)
opt Scope 배출량 계산 연동
매핑서비스->>배출량: ScopeEmission과 연결<br/>(materialMapping 필드 설정)
배출량-->>매핑서비스: 배출량 데이터 연결 완료
end
매핑서비스-->>API: 매핑 성공 응답<br/>(MaterialMappingResponse)
API-->>협력사: 201 Created<br/>매핑 생성 완료
else 할당되지 않은 자재코드인 경우
매핑서비스-->>API: 권한 오류<br/>(해당 자재코드가 할당되지 않음)
API-->>협력사: 403 Forbidden<br/>매핑 권한 없음
end
Note over 협력사,배출량: 핵심 구현 포인트:<br/>• 할당된 자재코드만 매핑 가능<br/>• TreePath 기반 권한 검증<br/>• Scope 배출량과 자동 연결
Loading
더미 데이터 시스템
MaterialDataService는 현대자동차 기준 자동차 제조업 특화 더미 데이터를 제공합니다.
# 단위 테스트 실행
./gradlew test# 통합 테스트 실행
./gradlew integrationTest
# 배출량 계산 검증 테스트
./gradlew calculationTest
핵심 구현 특징
1. GHG 프로토콜 준수
표준 Scope 분류: GHG 프로토콜 표준에 따른 Scope 1/2/3 분류
카테고리 관리: 각 Scope별 세부 카테고리 체계적 관리
배출계수 적용: 국가 및 국제 표준 배출계수 적용
2. 제품별 탄소발자국 추적
// Scope 1, 2에서만 제품 코드 매핑 지원if (Boolean.TRUE.equals(request.getHasProductMapping())) {
if (request.getScopeType() == ScopeType.SCOPE3) {
thrownewIllegalArgumentException("Scope 3는 제품 코드 매핑을 설정할 수 없습니다");
}
// 제품별 배출량 추적 로직
}
3. 데이터 무결성 보장
@PrePersist@PreUpdateprivatevoidvalidateInputData() {
// 배출량 계산 검증BigDecimalcalculated = activityAmount.multiply(emissionFactor);
if (totalEmission.compareTo(calculated) != 0) {
thrownewIllegalStateException("배출량 계산이 일치하지 않습니다");
}
}