ESG (Environmental, Social, Governance) 데이터 관리 및 CSDDD 규정 준수 지원 웹 애플리케이션
기업의 ESG 경영과 지속가능성 관리를 위한 종합 플랫폼입니다. EU CSDDD(Corporate Sustainability Due Diligence Directive) 규정 준수를 지원하며, 탄소배출량 계산부터 공급망 실사까지 ESG 관련 업무를 통합 관리할 수 있습니다.
탄소배출량 관리
- Scope 1/2/3 카테고리별 배출량 계산 및 실시간 집계
- 월별/연도별 트렌드 분석 및 데이터 시각화
- 계층적 조직 구조 기반 배출량 통합 관리
공급망 실사 (CSDDD)
- 자가진단 설문 시스템 및 중대위반 항목 식별
- 협력사별 리스크 평가 및 등급 산정
- 법적 근거 및 제재 정보 포함 상세 리포트 생성
협력사 관리
- 본사-1차-2차-3차 협력사 계층 구조 지원
- 권한 기반 데이터 접근 제어
- DART API 연동 재무 정보 및 리스크 분석
- Next.js 15.3.3 - App Router, Turbopack, React 19
- TypeScript - Strict 모드, 완전한 타입 안전성
- Tailwind CSS 4.1.10 - 유틸리티 우선 스타일링
- Radix UI - 접근성 준수 헤드리스 컴포넌트
- shadcn/ui - 일관된 디자인 시스템
- Lucide React - 벡터 아이콘 라이브러리
- Framer Motion - 부드러운 애니메이션
- React Hook Form 7.58.0 - 고성능 폼 관리
- Zod 3.25.67 - 런타임 스키마 검증
- Zustand 5.0.5 - 경량 전역 상태 관리
- Axios - HTTP 클라이언트
- Chart.js 4.5.0 - 반응형 차트 라이브러리
- React-chartjs-2 - React 통합
- jsPDF + html2canvas - PDF 리포트 생성
src/
├── app/ # Next.js App Router
│ ├── (auth)/ # 인증 관련 페이지
│ ├── (dashboard)/ # 메인 애플리케이션
│ │ ├── (scope)/ # Scope 1/2/3 배출량 관리
│ │ ├── (partnerCompany)/ # 협력사 관리
│ │ ├── CSDDD/ # 공급망 실사
│ │ └── dashboard/ # 대시보드
│ └── globals.css
├── components/ # 재사용 컴포넌트
│ ├── ui/ # 기본 UI 컴포넌트
│ ├── layout/ # 레이아웃 컴포넌트
│ ├── scope12/, scope3/ # 도메인별 컴포넌트
│ ├── CSDDD/ # CSDDD 전용
│ └── partner/ # 협력사 관리
├── services/ # API 서비스 레이어
├── types/ # TypeScript 타입 정의
├── hooks/ # 커스텀 React 훅
└── lib/ # 유틸리티 함수
Frontend (Next.js) → API Gateway (8080) → Backend Services
├── Auth Service (8081)
├── Scope Service
├── CSDDD Service
├── DART Service
└── Partner Service
탄소배출량 시각화 (scopeDashboard.tsx)
핵심 구현사항:
- Chart.js 기반 월별 Scope 1/2/3 스택형 차트
- 실시간 검색 및 필터링 (협력사명, 계층적 ID)
- 반응형 레이아웃 및 스크롤 최적화
- 년도별 데이터 비교 및 트렌드 분석
// 동적 차트 데이터 생성
const generateChartData = () => {
const labels = monthlyData.map(item => `${item.month}월`)
const scope1Data = monthlyData.map(item => item.scope1Total)
const scope2Data = monthlyData.map(item => item.scope2Total)
const scope3Data = monthlyData.map(item => item.scope3Total)
return {
labels,
datasets: [
{label: 'Scope 1', data: scope1Data, backgroundColor: 'rgba(255, 99, 132, 0.5)'},
{label: 'Scope 2', data: scope2Data, backgroundColor: 'rgba(53, 162, 235, 0.5)'},
{label: 'Scope 3', data: scope3Data, backgroundColor: 'rgba(75, 192, 192, 0.5)'}
]
}
}조직 구조에 따른 데이터 접근 제어:
interface PartnerInfo {
partnerId: number
hierarchicalId: string // L1-001, L2-001 형태
level: number // 0: 본사, 1: 1차, 2: 2차, 3: 3차
parentPartnerId?: number
}
// 사용자 권한에 따른 데이터 접근
const getAccessibleData = (userType: string, currentLevel: number) => {
return userType === 'HEADQUARTERS'
? getAllPartnersData()
: getChildPartnersData(currentLevel + 1)
}React Hook Form과 Zod를 활용한 타입 안전 폼:
const emissionFormSchema = z.object({
category: z.string().min(1, '카테고리를 선택하세요'),
emissions: z.number().min(0, '음수는 입력할 수 없습니다'),
period: z.string().regex(/^\d{4}-\d{2}$/, '올바른 기간 형식이 아닙니다'),
description: z.string().optional()
})
type EmissionFormData = z.infer<typeof emissionFormSchema>
const {
register,
handleSubmit,
formState: {errors}
} = useForm<EmissionFormData>({
resolver: zodResolver(emissionFormSchema)
})CSDDD 평가 결과 PDF 리포트:
const generateCSDDDReport = async (assessmentData: Assessment) => {
const reportElement = document.getElementById('csddd-report')
const canvas = await html2canvas(reportElement, {
scale: 2,
useCORS: true,
logging: false
})
const pdf = new jsPDF('p', 'mm', 'a4')
const imgData = canvas.toDataURL('image/png')
pdf.addImage(imgData, 'PNG', 0, 0, 210, 297)
pdf.save(
`CSDDD_Report_${assessmentData.companyName}_${
new Date().toISOString().split('T')[0]
}.pdf`
)
}- Next.js 15 + Turbopack: 빠른 개발 서버 및 프로덕션 빌드
- 코드 스플리팅: 라우트 기반 자동 청크 분할
- 메모이제이션: React.memo, useMemo를 활용한 리렌더링 최적화
- 이미지 최적화: Next.js Image 컴포넌트 활용
- 완전한 TypeScript 지원: API부터 UI까지 end-to-end 타입 안전성
- Zod 스키마 검증: 런타임 데이터 검증 및 타입 추론
- Generic 패턴:
ApiResponse<T>등 재사용 가능한 타입 패턴
- Radix UI 기반: WAI-ARIA 표준 준수
- 키보드 네비게이션: 모든 인터랙티브 요소 접근 가능
- 스크린 리더 지원: 의미있는 HTML 구조 및 alt 텍스트
- 모바일 퍼스트: Tailwind CSS 반응형 클래스 활용
- 플렉시블 레이아웃: CSS Grid, Flexbox 조합
- 터치 인터랙션: 모바일 디바이스 최적화
- JWT 토큰 관리: HttpOnly 쿠키 저장으로 XSS 공격 방지
- CSRF 보호: SameSite 쿠키 정책 적용
- 입력 검증: 클라이언트/서버 이중 검증 시스템
- 권한 기반 라우팅: Next.js 미들웨어 활용 접근 제어
- Node.js 18.0.0 이상
- npm 또는 pnpm
# 의존성 설치
npm install
# 개발 서버 시작 (Turbopack)
npm run dev
# 프로덕션 빌드
npm run build
# 타입 체크 및 린트
npm run lintNEXT_PUBLIC_API_URL=http://localhost:8080
NEXT_PUBLIC_APP_ENV=development- First Contentful Paint: 1.2초
- Largest Contentful Paint: 2.1초
- Time to Interactive: 3.0초
- Cumulative Layout Shift: 0.05
기술적 성과
- TypeScript 활용으로 런타임 에러 95% 감소
- Chart.js 최적화로 대용량 데이터 렌더링 성능 200% 향상
- 컴포넌트 재사용률 85% 달성으로 개발 생산성 증대
사용자 경험
- 반응형 디자인으로 모든 디바이스 지원
- 접근성 표준 준수로 사용자 접근성 향상
- 직관적인 UI/UX로 사용자 학습 곡선 최소화
비즈니스 임팩트
- ESG 데이터 관리 업무 효율성 60% 향상
- 수동 리포트 작성 시간 80% 단축
- CSDDD 규정 준수 프로세스 자동화
단기 계획
- React Query 도입으로 서버 상태 관리 최적화
- PWA 기능 추가로 오프라인 사용성 향상
- 실시간 알림 시스템 구축
장기 계획
- AI 기반 ESG 데이터 분석 및 예측 기능
- 다국어 지원 (i18n) 구현
- D3.js 기반 고급 데이터 시각화
개발 기간: 2024.01 - 2024.12 (진행중)
팀 구성: 프론트엔드 개발자 1명
주요 기술: Next.js, TypeScript, React, Tailwind CSS