시스템 개요

S-CORE(기자 지면 기여도 평가 시스템)는 서울경제신문 기자들의 지면 기사 실적을 자동으로 집계하고, 객관적인 점수 산출과 정성 평가를 지원하는 웹 기반 시스템입니다.

데이터 기간

2025년 12월 1일 ~ 현재
(매일 오전 6시 자동 동기화)

등록 사용자

총 248명
(관리자 1명, 부장 32명, 기자 215명)

집계 기사

총 3,145건 (169명 기자)
지면 기사만 집계 (온라인 제외)

S-CORE의 핵심 기능

자동 처리 (정량 평가)
  • 지면 기사 자동 필터링: XML의 paperNumber ≥ 1인 기사만 집계
  • 톱기사 자동 분류: XML paragraph="TOP" 자동 인식
  • 기자별 통계 자동 계산: 기사수, 글자수, 면별 분포
  • 공동 취재 분리 집계: 여러 기자가 작성한 기사 각각 집계
  • 점수 자동 산출: 면 가중치 × 분량 가중치 × 10 + 품질 가점
수동 입력 (정성 평가)
  • 위치: 톱, 사이드(좌/우), 하단, 박스, 기타
  • 취재유형: 특종, 단독, 기획발굴, 현장취재, 단순발생, 보도자료, 인용외신
  • 기사성격: 탐사심층, 해설분석, 인터뷰, 르포스케치, 스트레이트, 가십미담
  • 임팩트 등급: S, A, B, C, D (5단계)
  • 소명 관리: 기자 이의제기 접수 및 처리
S-CORE 명칭의 의미
S-CORE는 "Score"(점수)와 "Core"(핵심)의 합성어로, 기자 평가의 핵심 시스템이라는 의미를 담고 있습니다.

시스템 아키텍처

S-CORE 시스템은 AWS 서버리스 아키텍처를 기반으로 구축되어 있습니다. 별도의 서버 관리 없이 자동으로 확장되며, 비용 효율적으로 운영됩니다.

자동 처리
수동 입력
데이터 소스
S3 XML Storage
sedaily-news-xml-storage
기존 시스템
Amazon S3
XML 원본 저장
자동
데이터 처리
kpi-sync-data
XML 파싱
kpi-evaluation-api
평가 저장
kpi-users-api
사원 관리
데이터 저장
data.json
S3 정적 파일
evaluations.json
평가 데이터
users.json
248명 계정
서비스 & 인증
Route 53
kpi.sedaily.ai
CloudFront
CDN
로그인 시스템
권한 기반
admin 1
manager 32
reporter 215
권한별 기능
Admin 전용
대시보드
사원 관리
공통 기능
기자 목록
기자 상세
정성평가 입력
admin/manager만
수동 입력

구성 요소 상세

구성 요소AWS 서비스역할자동/수동
XML 저장소 S3 (sedaily-news-xml-storage) 기존 시스템에서 생성된 XML 원본 저장 기존 시스템
데이터 동기화 Lambda (kpi-sync-data) XML 파싱 → 정량 점수 계산 → data.json 생성 자동 (매일 6시)
평가 저장 Lambda (kpi-evaluation-api) 정성평가 데이터 저장/조회 수동 입력
사원 관리 Lambda (kpi-users-api) 사원 정보 변경 → S3 저장 + 캐시 무효화 수동 입력
웹 호스팅 S3 + CloudFront 정적 웹사이트 호스팅 및 CDN 배포 자동
DNS Route 53 kpi.sedaily.ai 도메인 관리 자동
서버리스 아키텍처의 장점
서버 관리 불필요, 사용량 기반 과금, 자동 확장, 고가용성 보장

로그인

S-CORE는 권한 기반 접근 제어를 사용합니다. 사번과 비밀번호로 로그인하면 권한에 따라 적절한 페이지로 자동 이동합니다.

로그인 절차
사이트 접속

https://kpi.sedaily.ai 접속

아이디 입력

본인의 사번을 입력합니다
예: 80486, 211010

비밀번호 입력

초기 비밀번호: 1234
(모든 계정 동일)

자동 페이지 이동

권한에 따라 해당 페이지로 자동 이동

권한별 로그인 후 이동 페이지
권한로그인 후 이동접근 범위
관리자 대시보드 (home.html) 전체 기능
부장 부서 대시보드 소속 부서만
기자 본인 상세 페이지 본인만
세션 유지 시간
로그인 후 24시간이 지나면 자동 로그아웃됩니다. 다시 로그인해주세요.
테스트 계정
권한아이디비밀번호이름부서
관리자 admin 1234 관리자 전체
부장 80486 1234 서일범 경제부
기자 211010 1234 주재현 경제부

관리자 (Admin) 가이드

관리자는 시스템의 모든 기능에 접근할 수 있습니다. 전체 대시보드 조회, 모든 부서/기자 평가, 가중치 설정, 사원 관리가 가능합니다.

관리자 전용 기능
전체 대시보드

전체 기자 통계, 부서별 현황, 기간별 추이를 한눈에 확인합니다.

가중치 설정

면 가중치, 분량 가중치, 품질 가점 등 점수 산출 기준을 조정합니다.

사원 관리

사원의 부서, 직급, 권한을 변경하고 신규 사원을 추가합니다.

전체 평가

모든 부서의 모든 기자에 대해 정성평가를 입력/수정합니다.

관리자 주요 업무
일일 현황 확인

대시보드에서 전체 기사 현황, 부서별 실적, 상위 기자 확인

평가 진행 상황 모니터링

각 부서별 평가 완료율 확인, 미평가 기사 파악

소명 처리

기자들의 이의제기 검토 및 승인/반려 처리

사원 정보 관리

인사이동 시 부서 변경, 신규 입사자 추가, 퇴사자 처리

부장 (Manager) 가이드

부장은 소속 부서의 기자들만 조회하고 평가할 수 있습니다. 다른 부서 기자 페이지에는 접근할 수 없습니다.

부장 접근 가능 기능
부서 대시보드

소속 부서의 통계만 표시됩니다. 다른 부서 탭은 보이지 않습니다.

기자 목록

소속 부서 기자만 목록에 표시됩니다.

기사 평가

소속 부서 기자의 기사만 평가할 수 있습니다.

소명 관리

소속 부서 기자의 소명만 처리할 수 있습니다.

부장 평가 업무 흐름
로그인

사번으로 로그인하면 자동으로 부서 대시보드로 이동합니다.

부서 현황 확인

부서 대시보드에서 기사수, 기자 순위, 일별 추이를 확인합니다.

기사 평가 페이지 이동

"기사 평가" 메뉴를 클릭하여 평가 페이지로 이동합니다.

기자 선택

평가할 기자를 선택하면 해당 기자의 기사 목록이 표시됩니다.

정성평가 입력

각 기사별로 위치, 취재유형, 기사성격, 임팩트 등급을 입력합니다.

저장

"저장" 버튼을 클릭하여 평가 내용을 서버에 저장합니다.

부서 제한 안내
부장 계정은 본인 소속 부서의 기자만 조회/평가할 수 있습니다. 다른 부서 기자 페이지에 직접 URL로 접근해도 "접근 권한이 없습니다" 메시지가 표시됩니다.

기자 (Reporter) 가이드

기자는 본인의 실적만 조회할 수 있습니다. 평가 입력 기능은 제공되지 않습니다.

기자 화면 구성
조회 가능 항목
  • 본인 기사 목록 (제목, 날짜, 면, 글자수)
  • 기간별 통계 (기사수, 총 글자수, 평균 글자수)
  • 면별 기사 분포 차트
  • 본인 기사 점수 (자동 산출 점수)
  • 소명 신청 내역 및 처리 결과
접근 불가 항목
  • 평가 입력 드롭다운 (위치, 취재유형 등)
  • 평가 저장 버튼
  • 다른 기자 페이지
  • 부서 대시보드
  • 가중치 설정, 사원 관리
기자 주요 기능
내 기사 확인

로그인하면 자동으로 본인 상세 페이지로 이동합니다. 기간 필터를 변경하여 일별/주별/월별 실적을 확인할 수 있습니다.

소명 신청

평가 결과에 이의가 있을 경우 소명을 신청할 수 있습니다. 부장/관리자가 검토 후 승인/반려 처리합니다.

대시보드 (home.html)

대시보드는 관리자 전용 페이지로, 전체 시스템 현황을 한눈에 파악할 수 있습니다.

대시보드 구성 요소
요약 카드 (4개)

전체 기자수, 총 기사수, 평균 기사수, 데이터 기간을 카드 형태로 표시합니다.

부서별 통계 테이블

각 부서별 기자수, 기사수, 평균 기사수를 테이블로 비교합니다.

상위 기자 TOP 10

기사수 기준 상위 10명의 기자를 순위와 함께 표시합니다.

일별 기사수 추이

최근 14일간의 일별 기사수를 막대 차트로 표시합니다.

데이터 동기화 버튼

대시보드 상단의 "데이터 동기화" 버튼을 클릭하면 최신 XML 데이터를 즉시 동기화할 수 있습니다.

자동 동기화
데이터는 매일 오전 6시에 자동으로 동기화됩니다. 수동 동기화는 긴급한 경우에만 사용하세요.

부서 대시보드 (score-dashboard.html)

부서 대시보드는 부서별 상세 통계를 제공합니다. 관리자는 모든 부서를 조회할 수 있고, 부장은 소속 부서만 조회할 수 있습니다.

부서 탭 기능

상단의 부서 탭을 클릭하면 해당 부서의 통계로 즉시 전환됩니다. 각 탭에는 부서명과 소속 기자 수가 표시됩니다.

전체 경제부 (8명) 정치부 (14명) 금융부 (11명) 사회부 (23명) 산업부 (10명) 문화부 (6명) 국제부 (12명) ...
부서 대시보드 구성 요소
총 기사 수

선택한 부서의 총 기사 수입니다. 공동 취재 기사는 중복 제거됩니다.

부서 기자 수

해당 부서에 소속된 기자 수입니다.

평균 글자수

기사당 평균 글자수입니다.

부서 총점

점수 공식에 따라 산출된 부서 전체 총점입니다.

부서 기사수 TOP 10

선택한 부서 내에서 기사수가 많은 상위 10명의 기자를 표시합니다. 기자명을 클릭하면 해당 기자의 상세 페이지로 이동합니다.

최근 일별 기사수

최근 12일간의 일별 기사수와 전일 대비 증감을 테이블로 표시합니다. 일요일은 회색 배경으로 구분됩니다.

일별 기사수 추이 차트

최근 14일간의 일별 기사수를 막대 차트로 시각화합니다. 일요일은 회색 막대로 표시됩니다.

권한별 접근 범위
관리자: "전체" 탭 + 모든 부서 탭 표시
부장: 소속 부서 탭만 표시 (다른 부서 조회 불가)

기자 목록 (list.html)

기자 목록 페이지에서는 기자별 실적을 한눈에 비교하고, 평가가 필요한 기자를 빠르게 찾을 수 있습니다.

필터링 및 검색
필터 옵션
  • 부서 필터: 특정 부서 기자만 표시
  • 기간 필터: 일별/주별/월별/분기별/반기별
  • 정렬: 기사수/글자수/이름 순
검색
  • 기자 이름으로 검색
  • 실시간 필터링 (입력 즉시 반영)
목록 컬럼 설명
컬럼설명계산 방식
기자명기자 이름 (클릭 시 상세 페이지)users.json 기준
부서소속 부서users.json 기준
기사수선택 기간 내 기사 수지면 기사만 (paperNumber ≥ 1)
글자수선택 기간 내 총 글자수기사 본문 글자수 합계
총점점수 공식에 따른 총점면 가중치 × 분량 가중치 × 10 + 품질 가점

기사 평가 (score-eval.html)

기사 평가 페이지에서는 각 기사에 대한 품질 가점을 버튼 토글 방식으로 입력합니다. 관리자와 부장만 평가를 입력할 수 있습니다.

품질 가점 버튼
버튼색상가점설명
면톱 노란색 +2점 해당 면의 메인 기사. XML 자동 감지 시 자동 라벨 표시
단독 빨간색 +5점 타 매체보다 먼저 보도한 독자적 기사
기획 보라색 +5점 기자가 직접 기획하고 발굴한 기사
S등급 초록색 +3점 사회적 파급력이 큰 최우수 기사
A등급 파란색 +2점 우수한 품질의 기사
면톱(자동) 기능
XML 자동 감지

XML 데이터에서 is_auto_top=true인 기사는 자동으로 면톱이 활성화됩니다.

  • 자동 감지된 기사에는 면톱 버튼 왼쪽에 자동 라벨이 표시됩니다
  • 면톱 버튼은 기본 ON 상태이지만, 부장이 클릭하여 수동으로 해제할 수 있습니다
  • 해제된 경우 기자 화면에서 톱(자동해제) 배지로 표시됩니다
  • 해제 후 다시 클릭하면 면톱이 재활성화됩니다
평가 입력 절차
기사 목록 확인

부서/날짜/기자 필터로 평가할 기사를 조회합니다.

품질 가점 입력

각 기사의 품질 가점 버튼(면톱, 단독, 기획, S등급, A등급)을 클릭하여 토글합니다. 클릭 즉시 자동 저장됩니다.

확정

평가가 완료되면 체크박스 선택 후 "선택 확정" 또는 "전체 확정"으로 잠급니다.

자동 저장
품질 가점 버튼을 클릭하면 즉시 자동 저장됩니다. 별도의 저장 버튼을 누르지 않아도 됩니다.

확정 기능

기사 평가가 완료되면 확정하여 더 이상 수정되지 않도록 잠글 수 있습니다.

확정 상태
상태설명수정 가능표시
미확정 (PENDING) 아직 평가가 확정되지 않음 ✓ 가능 미확정
확정 (CONFIRMED) 평가가 확정되어 잠김 ✗ 불가 확정
확정 방법
선택 확정

체크박스로 선택한 기사들만 확정합니다. 개별 기사를 선택적으로 확정할 때 사용합니다.

전체 확정

현재 필터된 미확정 기사를 모두 확정합니다. 월말 마감 시 사용합니다.

확정 후 수정
확정된 기사는 수정할 수 없습니다
확정된 기사의 품질 가점 버튼은 비활성화됩니다. 수정이 필요한 경우 관리자(Admin)만 확정을 취소할 수 있습니다.
확정 취소 (Admin 전용)

관리자는 확정된 기사의 확정을 취소하고 다시 수정할 수 있습니다. 취소 시 사유 입력이 필요합니다.

가감점 관리 (score-penalties.html)

가감점 관리 페이지에서는 기자에게 가점(+) 또는 감점(-)을 등록하고 관리할 수 있습니다. 등록된 점수는 최종 점수 산출 시 실제로 반영됩니다.

감점 예시 항목
유형감점적용 기간설명
시말서(부서) -2점 1개월 부서 단위 시말서
시말서(반복) -5점 1개월 동일 사안 2회 이상 반복 시
편집국장 -5점 6개월 편집국장 감점, 6개월간 매월 감점
가점 예시 항목
유형가점적용 기간설명
우수기사 선정 +3점 1개월 우수기사로 선정된 경우
특종 보도 +5점 1개월 특종 보도 성과
기획기사 우수 +3점 1개월 기획기사 우수 평가
가감점 등록 절차
  1. 가감점 관리 페이지 접속
  2. 감점 등록 또는 가점 등록 버튼 클릭
  3. 대상 기자 선택 (부장은 자기 부서 기자만 선택 가능)
  4. 항목명 직접 입력 (또는 예시 항목 클릭)
  5. 점수 직접 입력
  6. 적용 기간(개월) 선택
  7. 사유 입력 후 등록
가감점 적용 규칙
권한별 기능
역할가감점 등록가감점 조회가감점 삭제
Admin ✅ 전체 기자 ✅ 전체
Manager (부장) ✅ 자기 부서만 ✅ 자기 부서만 ✅ 자기 부서만
Reporter (기자) ✅ 본인만 (내 점수 페이지)
가감점 삭제 시 주의
삭제된 항목은 점수 계산에서 제외됩니다. 삭제 후에는 복구할 수 없으니 신중하게 처리하세요.

소명 관리 (score-appeals.html)

소명 관리 페이지에서는 기자들의 평가 이의제기를 확인하고 처리할 수 있습니다.

소명 요청 유형
유형아이콘가점설명
면톱 인정 요청🏅+2점해당 면의 메인 기사임을 인정 요청
단독/특종 인정 요청+5점독자적 취재 기사임을 인정 요청
기획 기사 인정 요청💡+5점기획 발굴 기사임을 인정 요청
S등급 인정 요청🏆+3점최우수 기사임을 인정 요청
A등급 인정 요청🅰️+2점우수 기사임을 인정 요청
소명 처리 절차
소명 접수

기자가 "내 점수" 페이지에서 기사별 "검토요청" 버튼을 클릭하여 소명을 신청합니다.

내용 검토

부장/관리자가 소명 내용과 해당 기사를 확인합니다.

처리 결정

승인(가점 반영) 또는 반려(기존 유지)를 결정합니다.

점수 재계산

승인 시 자동으로 점수가 재계산되어 반영됩니다.

소명 상태
상태설명표시
대기중 아직 처리되지 않은 소명 대기중
승인 소명이 인정되어 가점이 반영됨 승인
반려 소명이 기각됨 반려
소명 승인 시 자동 점수 재계산
소명이 승인되면 해당 품질 가점이 자동으로 반영되고, 기사 점수가 즉시 재계산됩니다.

가중치 설정 (score-config.html)

가중치 설정 페이지는 관리자 전용입니다. 점수 산출에 사용되는 가중치를 조정할 수 있습니다.

설정 가능 항목
면 가중치

면 범위(시작면~끝면)와 가중치를 행 단위로 자유롭게 추가/삭제할 수 있습니다. 기본: 1면, 2~3면, 4~5면, 6~10면, 11~20면, 21~32면

분량 가중치

글자수 범위(최소~최대)와 가중치를 행 단위로 자유롭게 추가/삭제할 수 있습니다. 최대값에 ∞ 입력 시 "이상" 처리됩니다.

품질 가점

품질 가점 항목(면톱, 단독, 기획 등)을 자유롭게 추가/삭제할 수 있습니다. 항목명과 가점을 직접 입력합니다.

기본 설정

기본 점수(10), 가점 상한(10), 최대 점수(20)를 설정합니다.

v2.6 동적 가중치 설정
면 범위, 글자수 범위, 품질 가점 항목을 자유롭게 추가·삭제할 수 있습니다. 변경 시 점수 매트릭스 미리보기가 실시간으로 업데이트됩니다.
문제 발생 시 score-config.html?reset=1로 접속하면 설정이 기본값으로 초기화됩니다.
변경 이력

가중치 변경 시 변경 사유를 입력해야 하며, 모든 변경 내역이 이력으로 저장됩니다.

가중치 변경 시 주의
가중치를 변경하면 모든 기사의 점수가 재계산됩니다. 변경 전 충분히 검토하시기 바랍니다.

Feature Flags (점수 공개 정책)

Feature Flags를 통해 기자에게 공개되는 정보의 범위를 단계적으로 조절할 수 있습니다. 관리자 전용 기능입니다.

v2.1 업데이트
Feature Flags가 기자 상세 페이지(reporter.html)에도 적용되었습니다. 관리자가 설정한 값이 기자 로그인 시 즉시 반영됩니다.
설정 항목
Flag기본값설명적용 페이지
SHOW_MY_SCORE ON 기자 본인의 점수 표시 여부
OFF 시 점수가 "-"로 표시됨
reporter.html, score-my.html
SHOW_PREVIOUS_MONTH ON 전월 대비 증감 표시 여부 score-my.html
SHOW_DEPT_AVERAGE OFF 부서 평균 점수 표시 여부
ON 시 부서 평균 카드 표시
reporter.html, score-my.html
SHOW_DEPT_RANKING OFF 부서 내 순위 표시 여부
ON 시 "N위/M명" 형태로 표시
reporter.html, score-my.html
Flag별 화면 변화
FlagON 상태OFF 상태
SHOW_MY_SCORE 점수 숫자 표시 (예: 8.5점) "-" 표시 (회색)
SHOW_DEPT_AVERAGE 부서 평균 카드 표시 카드 숨김
SHOW_DEPT_RANKING 순위 카드 표시 (예: 3위/12명) 카드 숨김
단계별 오픈 계획
단계공개 범위Flag 설정
Phase 1 (현재) 본인 점수 + 전월 대비 SHOW_DEPT_AVERAGE: OFF
Phase 2 Phase 1 + 부서 평균 SHOW_DEPT_AVERAGE: ON
Phase 3 Phase 2 + 부서 내 순위 SHOW_DEPT_RANKING: ON
설정 방법
가중치 설정 페이지 접속

관리자로 로그인 후 "가중치 설정" 메뉴로 이동합니다.

Feature Flags 섹션 확인

페이지 하단의 "Feature Flags (점수 공개 정책)" 섹션을 찾습니다.

토글 스위치 변경

원하는 항목의 토글 스위치를 ON/OFF로 변경합니다.

Flag 저장

"Flag 저장" 버튼을 클릭하여 설정을 저장합니다.

실시간 반영
Feature Flags 설정은 저장 즉시 모든 기자의 페이지에 반영됩니다. 기자가 새로고침하면 변경된 설정이 적용됩니다.
운영 팁
평가 기간 중에는 SHOW_MY_SCORE를 OFF로 설정하여 점수를 숨기고, 평가 완료 후 ON으로 변경하여 공개하는 방식으로 운영할 수 있습니다.

사원 관리 (admin.html)

사원 관리 페이지는 관리자 전용입니다. 사원의 부서, 직급, 권한을 변경하고, 신규 사원 추가 및 퇴사 처리를 할 수 있습니다.

사원 관리 기능
검색/필터

이름/사번 검색, 부서/권한별 필터링

부서 변경 (이력 자동 기록)

사원의 소속 부서 변경. 변경 시 dept_history에 이력이 자동 기록되어 기사 게재일 기준 부서 추적 가능

직급/권한 변경

사원의 직급 및 admin/manager/reporter 권한 변경

사원 추가/퇴사

신규 사원 추가 (초기 비밀번호 1234) 및 퇴사 처리 (기사 데이터 유지)

사원 정보 변경 절차
사원 검색

이름 또는 사번으로 검색하거나, 부서/권한 필터로 찾습니다.

수정 버튼 클릭

해당 사원 행의 버튼을 클릭하면 수정 모달이 열립니다.

정보 수정

부서, 직급, 권한을 드롭다운에서 선택합니다. 부서 변경 시 이동 이력이 자동 기록됩니다.

변경사항 저장

모달에서 "저장" 후, 상단의 "변경사항 저장" 버튼을 클릭하여 서버(S3)에 반영합니다.

캐시 갱신 대기

CloudFront 캐시 무효화로 약 10초 후 반영됩니다.

부서 이동 이력 관리 (dept_history)
자동 이력 기록 시스템

사원관리에서 부서를 변경하면 dept_history 배열에 이력이 자동으로 기록됩니다. 이를 통해 기사가 작성된 시점의 부서를 정확히 추적할 수 있습니다.

예를 들어, 홍길동 기자가 2025년 12월부터 경제부에 있다가 2026년 2월 11일에 금융부로 이동한 경우:

// users.json 내 dept_history 예시
{
  "id": "211010",
  "name": "홍길동",
  "department": "금융부", // 현재 부서
  "dept_history": [
    { "dept": "경제부", "from": "2025-12-01" },
    { "dept": "금융부", "from": "2026-02-11" }
  ]
}
부서 이동 이력이 반영되는 페이지
페이지반영 방식사용 함수
기자 목록 (list.html) 부서 필터 시 해당 부서에서 작성한 기사만 집계. 이전 부서 기사는 이전 부서에 남음 SCore.getDeptAtDate()
부서 대시보드 (score-dashboard.html) 기사 게재일 기준으로 부서를 판별하여 정확히 분리 집계 SCore.getArticleDept()
기사 평가 (score-eval.html) 기사별 부서를 게재일 기준으로 표시 SCore.getArticleDept()
동작 원리
SCore.getDeptAtDate(user, date) 함수는 dept_history 배열에서 해당 날짜 기준으로 소속 부서를 찾습니다. 예: 2026-01-15 기사 → 경제부, 2026-02-15 기사 → 금융부. dept_history가 없는 기존 사원은 현재 department 값을 그대로 사용합니다.
신규 사원 추가
"사원 추가" 버튼 클릭

사원 목록 상단의 초록색 "사원 추가" 버튼을 클릭합니다.

정보 입력

사번(6자리 숫자), 이름, 부서, 직급, 권한, 이메일을 입력합니다. 초기 비밀번호는 1234로 자동 설정됩니다.

추가 후 저장

"추가" 버튼 클릭 후, 반드시 "변경사항 저장"을 눌러 서버에 반영합니다.

퇴사 처리
퇴사 처리 시 주의사항
• 퇴사 처리된 사원은 로그인할 수 없게 됩니다
• 기존 기사 데이터는 유지됩니다 (삭제되지 않음)
• 기본 admin 계정은 삭제할 수 없습니다
• 퇴사 처리 후 반드시 "변경사항 저장"을 눌러야 반영됩니다

부서 관리 (dept-manage.html)

부서 관리 페이지는 관리자 전용입니다. 부서의 추가, 수정, 삭제 및 부서 구조를 관리할 수 있습니다.

부서 관리 기능
부서 추가

새로운 부서를 생성합니다. 부서명과 부서 코드를 입력합니다.

부서 수정

기존 부서의 이름이나 정보를 수정합니다.

부서 삭제

더 이상 사용하지 않는 부서를 삭제합니다. 소속 기자가 있는 부서는 삭제할 수 없습니다.

부서 목록 조회

전체 부서 목록과 각 부서별 소속 기자 수를 확인합니다.

부서 삭제 시 주의
소속 기자가 있는 부서는 삭제할 수 없습니다. 먼저 사원 관리에서 해당 기자들의 부서를 변경한 후 삭제하세요.

점수 산출 공식

S-CORE는 객관적이고 투명한 점수 산출을 위해 다음 공식을 사용합니다. "Max-Auto, Min-Manual" 철학에 따라 대부분의 점수는 자동 계산되고, 품질 가점만 부장이 수동 입력합니다.

기사 점수 = (면 가중치 × 분량 가중치 × 10) + 품질 가점
최대 점수: 20점 | 최저 점수: 1.7점 | 품질 가점 상한: 10점
점수 구성 요소
구성 요소설명범위입력 방식
기본 점수 기사 1건당 기준 점수 10점 (고정) 자동
면 가중치 기사가 실린 지면 번호에 따른 가중치 0.30 ~ 1.00 자동 (XML)
분량 가중치 기사 글자수에 따른 가중치 0.55 ~ 1.00 자동 (XML)
품질 가점 면톱, 단독, 기획, S등급, A등급에 따른 추가 점수 0 ~ 10점 (상한) 수동 (부장)
점수 계산 예시
// 예시 1: 1면 톱기사, 2100자, 단독+기획
면 가중치 = 1.00 (1면)
분량 가중치 = 1.00 (2000자 이상)
기본 점수 = 1.00 × 1.00 × 10 = 10.0

품질 가점:
  면톱 = +2
  단독 = +5
  기획 = +5
  합계 = 12 → 10 (상한 적용)

최종 점수 = 10.0 + 10 = 20.0점 (최대)
// 예시 2: 15면 기사, 1000자, 가점 없음
면 가중치 = 0.40 (11~20면)
분량 가중치 = 0.55 (600~1199자)
기본 점수 = 0.40 × 0.55 × 10 = 2.2
품질 가점 = 0

최종 점수 = 2.2 + 0 = 2.2점
Max-Auto, Min-Manual 철학
대부분의 기사는 자동 점수 그대로 확정됩니다. 특별한 가치가 있는 기사(단독, 기획, S등급, A등급)만 부장이 가점 버튼을 눌러주세요.

면 가중치 (Page Weight)

기사가 실린 지면 번호에 따라 가중치가 적용됩니다. 1면에 가까울수록 높은 가중치가 부여됩니다.

면 범위가중치설명비고
1면 1.00 신문의 얼굴, 최고 주목도 1면 톱, 1면 사이드
2~3면 0.85 주요 뉴스 연장면 정치, 경제 주요 기사
4~5면 0.70 핵심 뉴스면 주요 섹션 기사
6~10면 0.55 주요 섹션면 사회, 문화 기사
11~20면 0.40 일반 뉴스면 증권, 부동산
21~32면 0.30 후면부 스포츠, 연예
면 번호 자동 인식
면 번호는 XML의 paperNumber 필드에서 자동으로 추출됩니다. 수동 입력이 필요 없습니다.

분량 가중치 (Length Weight)

기사의 글자수에 따라 가중치가 적용됩니다. 긴 기사일수록 높은 가중치가 부여됩니다.

글자수 범위등급가중치기사 유형
2,000자 이상 L 1.00 심층 분석, 기획, 인터뷰
1,200 ~ 1,999자 M 0.70 일반 스트레이트
600 ~ 1,199자 S 0.55 짧은 리포트
600자 미만 XS 0.55 단신, 브리프
글자수 자동 계산
글자수는 XML의 charCount 필드에서 자동으로 추출됩니다. 기사 본문의 순수 글자수만 계산됩니다.

품질 가점 (Quality Bonus)

품질 가점은 부장이 체크박스로 입력합니다. 모든 항목은 중복 체크 가능하며, 합계가 10점을 초과하면 10점으로 제한됩니다.

항목아이콘가점설명판정 주체
면톱 🏅 +2점 해당 면의 메인 기사. XML 자동 감지 시 기본 ON (수동 해제 가능) 자동 감지 + 부장 토글
단독/특종 +5점 타 매체보다 먼저 보도한 독자적 기사 부장 체크
기획 💡 +5점 기자가 직접 기획하고 발굴한 기사 부장 체크
S등급 🏆 +3점 사회적 파급력이 큰 최우수 기사 부장 체크
A등급 🅰️ +2점 우수한 품질의 기사 부장 체크
품질 가점 상한: 10점
단독(5) + 기획(5) + S등급(3) + A등급(2) = 15점이지만, 상한 적용으로 10점만 반영됩니다.
최대 점수는 기본 10점 + 품질 가점 10점 = 20점입니다.

점수 매트릭스 (검증용)

면 가중치와 분량 가중치 조합에 따른 기본 점수표입니다. (품질 가점 제외)

면 \ 글자수 2,000자↑
(L: 1.00)
1,200~1,999자
(M: 0.70)
600~1,199자
(S: 0.55)
600자↓
(XS: 0.55)
1면 (1.00) 10.0 7.0 5.5 5.5
2~3면 (0.85) 8.5 6.0 4.7 4.7
4~5면 (0.70) 7.0 4.9 3.9 3.9
6~10면 (0.55) 5.5 3.9 3.0 3.0
11~20면 (0.40) 4.0 2.8 2.2 2.2
21~32면 (0.30) 3.0 2.1 1.7 1.7
테스트 케이스 (검증 완료)
케이스글자수면톱단독기획S등급A등급예상 점수상태
TC-0112,100YYYYN20.0
TC-0212,000YYNNN17.0
TC-0331,500YNYNN13.0
TC-0451,500YNNNN6.9
TC-05101,300NNNNN3.9
TC-06151,000NNNNN2.2
TC-0730400NNNNN1.7

AWS 리소스

S-CORE 시스템은 AWS 서버리스 아키텍처를 기반으로 구축되어 있습니다.

시스템 아키텍처 다이어그램
전체 시스템 구조를 시각적으로 확인하려면 아키텍처 페이지를 참조하세요.
서비스리소스명용도리전
S3 sedaily-news-xml-storage XML 원본 저장 (daily-xml/) us-east-1
S3 kpi.sedaily.ai 웹 호스팅 (HTML, JSON, JS) us-east-1
Lambda kpi-sync-data XML 파싱 및 data.json 생성 us-east-1
Lambda kpi-evaluation-api 평가 데이터 저장/조회 us-east-1
Lambda kpi-users-api 사원 정보 관리 us-east-1
CloudFront E1DJQD9MHS4VRO CDN 배포, HTTPS Global
Route 53 kpi.sedaily.ai 도메인 관리 Global
주요 파일 경로
파일S3 경로설명
data.jsons3://kpi.sedaily.ai/data.json기자별 기사 데이터
users.jsons3://kpi.sedaily.ai/users.json사원 계정 정보
evaluations.jsons3://kpi.sedaily.ai/evaluations.json평가 데이터
score-config.jsons3://kpi.sedaily.ai/score-config.json가중치 설정

데이터 동기화

S-CORE의 데이터는 두 가지 동기화 체계로 운영됩니다.

① XML 기사 데이터 동기화 (자동)

지면 기사 원본 데이터는 XML → Lambda → data.json 파이프라인으로 자동 처리됩니다.

시간 (KST)작업목적
매일 오전 6시 kpi-sync-data Lambda 실행 전날 밤 업로드된 지면 기사 반영

긴급한 경우 대시보드의 "데이터 동기화" 버튼을 클릭하여 즉시 동기화할 수 있습니다.

② 평가 데이터 서버 동기화 (실시간)

평가, 가감점, 소명, 설정 등 모든 사용자 입력 데이터는 kpi-evaluation-api Lambda를 통해 서버(S3)에 실시간 동기화됩니다. 이를 통해 서로 다른 브라우저/기기에서도 동일한 데이터를 공유할 수 있습니다.

데이터 타입S3 파일동기화 방식설명
기사 평가 evaluations.json 병합 (merge) 품질 가점, 확정 상태 등. 기존 데이터에 새 데이터를 병합
가감점 penalties.json 전체 교체 가점/감점/정보보고 등록·삭제
소명 appeals.json 전체 교체 소명 제출·처리
가중치 설정 score_config.json 전체 교체 면/분량/품질 가중치 설정값
Feature Flags feature_flags.json 전체 교체 기능 ON/OFF 설정
부서 가중치 dept_groups.json 전체 교체 가군/나군 부서 분류 및 가중치
동기화 동작 원리
각 페이지 로드 시 ScoreDataStore.loadAllFromServer()가 호출되어 서버의 최신 데이터를 가져와 localStorage와 병합합니다. 데이터 저장 시에는 자동으로 서버에 동기화됩니다. 네트워크 오류 시 실패한 동기화는 score_pending_sync에 저장되어 나중에 재시도됩니다.
XML 데이터 흐름
XML 생성

기존 시스템에서 지면 기사 XML 파일 생성

S3 업로드

XML 파일이 sedaily-news-xml-storage 버킷에 업로드

Lambda 파싱

kpi-sync-data Lambda가 XML을 파싱하여 기자별 데이터 추출

data.json 생성

파싱된 데이터를 data.json으로 저장

캐시 무효화

CloudFront 캐시를 무효화하여 최신 데이터 반영

평가 데이터 흐름
페이지 로드

loadAllFromServer()로 서버 6개 타입 데이터를 한번에 가져와 localStorage에 병합

사용자 입력

품질 가점 토글, 가감점 등록, 소명 제출, 설정 변경 등

localStorage 저장

즉시 localStorage에 저장하여 화면에 반영

서버 동기화

비동기로 Lambda API에 POST하여 S3에 저장. 실패 시 pending 큐에 보관

문제 해결

자주 발생하는 문제와 해결 방법입니다.

로그인 문제
증상원인해결 방법
로그인이 안 됨 사번 또는 비밀번호 오류 사번 확인, 초기 비밀번호 1234 사용
로그인 후 빈 화면 세션 만료 또는 캐시 문제 브라우저 캐시 삭제 후 재로그인
권한 없음 메시지 해당 페이지 접근 권한 없음 관리자에게 권한 요청
데이터 문제
증상원인해결 방법
기사가 표시되지 않음 동기화 미완료 "데이터 동기화" 버튼 클릭
기자가 목록에 없음 users.json에 미등록 관리자에게 사원 추가 요청
점수가 0으로 표시 평가 미입력 정성평가 입력 필요
기타 문제
증상원인해결 방법
페이지 로딩 느림 네트워크 또는 서버 문제 잠시 후 재시도, 새로고침
차트가 표시되지 않음 JavaScript 오류 브라우저 콘솔 확인, 새로고침
저장이 안 됨 Lambda API 오류 잠시 후 재시도, 관리자 문의
문의처
시스템 관련 문의는 관리자에게 연락해주세요.

자주 묻는 질문 (FAQ)

Q1. 비밀번호는 어디서 변경하나요?
현재 비밀번호 변경 기능은 미구현 상태입니다

모든 계정의 초기 비밀번호는 1234이며, 현재 사용자가 직접 비밀번호를 변경하는 기능은 제공되지 않습니다.

  • 비밀번호 변경이 필요한 경우: 로그인 페이지 하단의 '비밀번호 변경' 링크를 클릭하여 직접 변경할 수 있습니다. 사번과 현재 비밀번호 확인 후 새 비밀번호(4자리 이상)를 설정합니다.
  • 보안 참고: 로그인 및 비밀번호 변경은 서버(Lambda)에서 처리되며, 비밀번호가 브라우저에 노출되지 않습니다.
Q2. 기자 또는 부장이 부서가 바뀌면 어떻게 되나요?
부서 이동 처리 절차

관리자(Admin) → 사원관리 → 해당 사원 "수정" → 부서 변경 → 변경사항 저장

부서를 변경하면 시스템이 자동으로 부서 이동 이력(dept_history)을 기록합니다. 이를 통해 기사가 작성된 시점의 부서를 정확히 추적합니다.

부서 이동 시 시스템 내부 동작
// 예: 홍길동 기자가 경제부 → 금융부로 이동

// 1. 사원관리에서 부서 변경 시 자동 기록
dept_history: [
  { "dept": "경제부", "from": "2025-12-01" }, // 최초 이력
  { "dept": "금융부", "from": "2026-02-11" } // 이동 이력
]

// 2. 기사 게재일 기준 부서 판별
SCore.getDeptAtDate(user, "2026-01-15") → "경제부"
SCore.getDeptAtDate(user, "2026-02-15") → "금융부"
부서 이동 이력 자동 관리
사원관리에서 부서를 변경하면 users.json에 dept_history 배열이 자동 생성됩니다. 예: 경제부(12/1~) → 금융부(2/11~). 기사 평가, 기자 목록, 부서 대시보드 등에서 기사 게재일 기준으로 해당 시점의 부서를 자동 판별합니다.
각 페이지별 부서 이동 후 동작
항목부서 이동 후 동작예시
기자 목록 새 부서 목록에 표시됨. 부서 필터 시 해당 부서에서 작성한 기사만 집계 (이전 부서 기사는 이전 부서에 남음) 경제부 필터 → 1월 기사 5건 표시
금융부 필터 → 2월 기사 3건 표시
부서 대시보드 기사 게재일 기준으로 부서를 판별하여 정확히 분리 집계. 이전 부서 기사는 이전 부서에, 새 부서 기사는 새 부서에 표시 경제부 탭 → 1월 기사 통계 포함
금융부 탭 → 2월 기사 통계 포함
기사 평가 기사별 평가(품질 가점, 확정)는 기사 ID(nsid) 기준이므로 유지됨. 부서 필터 시 기사 게재일 기준 부서로 표시 1월 기사의 단독/기획 가점 → 그대로 유지
가감점 이미 등록된 가감점은 등록 시점의 부서로 기록되어 변하지 않음. 새로 등록하면 새 부서로 기록 1월 감점 → 경제부로 기록됨
2월 가점 → 금융부로 기록됨
소명 제출 시점의 부서로 기록됨. 부장 이동 시 이전 부서 미처리 소명은 새 부장이 처리 -
점수 계산 기사별 점수는 기사 ID 기준이므로 부서 이동과 무관하게 유지. 부서별 합산 시에만 게재일 기준 분리 경제부 총점: 1월 기사 점수 합
금융부 총점: 2월 기사 점수 합
부장(Manager) 부서 이동 시 주의사항
① 부서 변경 후 반드시 로그아웃 → 재로그인 필요 (세션에 부서 정보가 저장되어 있음)
② 이전 부서의 미처리 소명이 있다면 처리 후 이동하거나, 새 부장에게 인수인계
③ 이전 부서의 미확정 기사 평가도 새 부장이 이어서 처리해야 함
권장 부서 이동 절차
① 이동 전: 해당 기자의 미처리 소명/미확정 평가를 모두 처리
② 관리자가 사원관리에서 부서 변경 (이력 자동 기록)
③ 해당 사용자 로그아웃 → 재로그인
④ 확인: 기자 목록/부서 대시보드에서 기사가 올바른 부서에 집계되는지 확인
기존 사원 (dept_history 없는 경우)

dept_history가 없는 기존 사원은 현재 department 값을 모든 기간에 대해 그대로 사용합니다. 부서 이동이 발생하면 그 시점부터 이력이 자동 생성되므로, 기존 데이터에 영향을 주지 않습니다.

변경 이력 (Changelog)

S-CORE 시스템의 주요 변경 사항을 기록합니다.

v3.8 (2026년 2월 18일)
권한 검증 강화 + 세션 만료 통합
  • 세션 검증 공통 함수: common.js에 validateSession() 함수 추가. 로그인 체크 + 24시간 세션 만료를 한 번에 처리하여 모든 페이지에서 일관된 세션 관리
  • 전 페이지 세션 만료 적용: 기존에 세션 만료 체크가 누락되었던 score-dashboard, score-eval, score-penalties, score-appeals, score-config, dept-manage, score-my 7개 페이지에 24시간 만료 체크 추가
  • home.html admin-only 수정: 네비게이션 메뉴에 admin-only 클래스 + IIFE 스크립트 추가. URL 직접 접근 시에도 admin 전용 메뉴가 비로그인 사용자에게 노출되지 않도록 방지
  • score-my.html admin-only 추가: admin-only CSS + IIFE 스크립트 추가하여 다른 페이지와 동일한 패턴으로 통일
  • list.html manager URL 우회 방지: manager가 URL 파라미터(?dept=다른부서)로 타 부서 접근 시도 시 자기 부서로 강제 변경 + URL 히스토리 교체
  • 부서 접근 검증 함수: common.js에 validateDeptAccess() 함수 추가. manager 부서 격리를 공통으로 처리할 수 있는 유틸리티
변경 파일
  • common.js - validateSession(), validateDeptAccess() 공통 함수 추가
  • score-my.html - admin-only CSS/IIFE 추가, validateSession() 적용
  • home.html - admin-only 클래스 + IIFE 추가
  • list.html - manager URL 파라미터 우회 방지
  • score-dashboard.html, score-eval.html, score-penalties.html, score-appeals.html, score-config.html, dept-manage.html - validateSession() 적용
v3.7 (2026년 2월 18일)
동기화 자동 재시도 + UI 시각 개선
  • 동기화 자동 재시도 시스템: 네트워크 오류로 실패한 동기화를 자동으로 재시도. 페이지 로드 1초 후 즉시 재시도, 30초 주기 자동 재시도(pending 있을 때만), 온라인 복귀 시 즉시 재시도. 최대 3회 실패 시 해당 항목 자동 폐기
  • 편집 셀 시각적 피드백: 부서 대시보드에서 점수 편집 후 저장 중 파란색(saving), 저장 완료 시 초록색 플래시(saved) 애니메이션으로 저장 상태를 시각적으로 확인 가능
  • 등급 배지 디자인 개선: S/A+/A/B+/B 등급 배지에 그라데이션 배경, 그림자 효과 추가. 호버 시 확대 + 빛 반사 애니메이션
  • 통계 카드 디자인 개선: 상단 파란색 악센트 바 추가, 호버 시 부드러운 상승 효과 + 그림자 강화
  • 저장 완료 토스트: 자동 저장(셀 편집 후 800ms) 및 수동 저장(저장 버튼) 시 성공 토스트 메시지 표시
  • 모바일 테이블 스크롤 인디케이터: 768px 이하에서 테이블 우측에 그라데이션 스크롤 힌트 표시
변경 파일
  • score-data.js - _addPendingSync에 retryCount 추가, retryPendingSync 3회 제한, _initAutoRetry() 자동 재시도 시스템, DOMContentLoaded 자동 시작
  • common.css - 편집 셀 피드백(.saving/.saved), 등급 배지 그라데이션, 통계 카드 악센트, 모바일 스크롤 인디케이터
  • score-dashboard.html - syncMSToServer() 저장 피드백, saveAll() 저장 완료 피드백
v3.6 (2026년 2월 18일)
전체 코드 검증 및 보안 수정
  • 전체 코드 자동 검증: Claude API 병렬 처리로 8개 영역(네비게이션 일관성, 권한 체크, JS 로드 순서, 데이터 흐름, HTML 접근성, Lambda 보안, 프론트엔드 버그, CSS 반응형) 동시 검증 수행
  • 네비게이션 admin-only 일관성 수정: score-config.html, admin.html, dept-manage.html 3개 admin 전용 페이지에서 대시보드/가중치설정/사원관리/부서관리 메뉴에 admin-only 클래스가 누락되어 있던 문제 수정. IIFE 스크립트 및 CSS도 함께 추가하여 다른 페이지와 동일한 패턴으로 통일
  • JS 로드 순서 수정: dept-manage.html에서 score.js 없이 score-data.js만 로드하던 문제 수정. score-data.js가 score.js의 migrateConfigV2toV3, restoreInfinity, DEFAULT_CONFIG_V3를 참조하므로 정상 로드 순서(common.js → config.js → score.js → score-data.js)로 변경
  • XSS 취약점 수정: score-dashboard.html의 startEd() 함수에서 기자명이 HTML에 직접 삽입되던 XSS 취약점을 safeName 이스케이프 처리로 수정
  • Lambda manager_scores 타입 추가: evaluation_api Lambda의 TYPE_KEY_MAP에 manager_scores 타입이 누락되어 부장 입력 점수가 서버에 저장/조회되지 않던 문제 수정. 병합(merge) 방식 저장 로직도 함께 추가
확인된 개선 필요 사항 (향후 반영)
  • Lambda API 인증 미적용 (URL 기반 보안만 사용 중)
  • 비밀번호 평문 저장 (users.json)
  • 동시 편집 충돌 가능성 (penalties/appeals 배열 전체 교체 방식)
  • retryPendingSync() 자동 호출 미구현 → v3.7에서 구현 완료
  • 인쇄 스타일(@media print) 미적용
변경 파일
  • score-config.html - admin-only 클래스 + IIFE 스크립트 추가
  • admin.html - admin-only 클래스 + IIFE 스크립트 추가
  • dept-manage.html - admin-only 클래스 + IIFE 스크립트 추가, score.js 로드 추가
  • score-dashboard.html - startEd() XSS 수정 (safeName)
  • lambda/evaluation_api/lambda_function.py - manager_scores TYPE_KEY_MAP 추가
v3.5 (2026년 2월 17일)
보안 강화
  • 로그인 서버 인증 전환: 기존에 프론트엔드에서 users.json을 직접 fetch하여 비밀번호를 비교하던 방식을 Lambda 서버 인증으로 전환. 브라우저 개발자도구(Network 탭)에서 비밀번호 목록이 노출되지 않음
  • 비밀번호 변경 서버 처리: 비밀번호 변경도 Lambda에서 검증 및 저장 처리. 프론트엔드에서 users.json 전체를 다운로드하지 않음
  • Lambda users_api 확장: 기존 GET(조회)/POST(저장) 외에 action: 'login'(로그인 인증), action: 'change_password'(비밀번호 변경) 엔드포인트 추가. 기존 사원관리 저장 기능은 그대로 유지
  • 로그인 응답 최소화: 로그인 성공 시 비밀번호를 제외한 사용자 정보(사번, 이름, 권한, 부서, 직급)만 반환
변경 파일
  • lambda/users_api/lambda_function.py - login, change_password 액션 추가
  • login.html - users.json fetch 제거, Lambda POST 로그인으로 전환
  • change-password.html - users.json fetch 제거, Lambda POST 비밀번호 변경으로 전환
v3.4 (2026년 2월 16일)
대시보드 UI 정리
  • 관리자 대시보드(home.html) 불필요 섹션 제거: 기사수 TOP 10 테이블, 일별 기사수 추이 차트 제거. 월 변경 시 2월 데이터만 표시되던 버그가 있었으며, 기자 점수 TOP 10과 정보가 중복되어 삭제
  • 부서 대시보드(score-dashboard.html) 불필요 섹션 제거: 부서 기사수 TOP 10, 최근 일별 기사수 테이블, 일별 기사수 추이 차트 제거. 점수표와 가감점 현황에 집중하도록 간소화
  • Chart.js 의존성 제거: 차트 섹션 제거에 따라 home.html, score-dashboard.html에서 Chart.js CDN 로드 및 관련 변수(dailyChart) 제거. 페이지 로딩 속도 개선
  • 가감점 현황 레이아웃 확장: home.html에서 가감점 현황 카드를 col-md-6에서 col-12(전체 너비)로 변경하여 가독성 향상
변경 파일
  • home.html - 기사수 TOP 10, 일별 기사수 추이 HTML/JS 제거, Chart.js 로드 제거
  • score-dashboard.html - 부서 기사수 TOP 10, 최근 일별 기사수, 일별 기사수 추이 HTML/JS 제거, Chart.js 로드 제거
v3.3 (2026년 2월 12일)
신규 기능 및 개선
  • 비밀번호 변경 기능: 로그인 페이지 하단에 비밀번호 변경 링크 추가. 사번과 현재 비밀번호 확인 후 새 비밀번호 설정 가능. 변경 후 자동 로그아웃되어 재로그인 필요
  • 관리자 대시보드 개편: 기존 기사수 통계만 표시하던 대시보드에 기자 점수 TOP 10, 부서별 평균 점수, 가감점 현황, 평가 완료율 등 점수 관련 정보 추가. 월별 필터 지원
v3.2 (2026년 2월 12일)
신규 기능 및 개선
  • 부서 대시보드 통합 레이아웃: 기존 탭 구조(점수표/가감점/통계)를 제거하고 한 페이지에 점수표 → 가감점 현황 → 통계(TOP10, 일별 기사수, 차트) 순서로 통합 배치
  • 네비게이션 순서 통일: 전체 9개 페이지의 메뉴 순서를 통일 (부서 대시보드 → 가감점 관리 → 기자 목록 → 기사 평가 → 소명 관리)
  • 네비게이션 깜빡임 해결: admin 전용 메뉴가 페이지 로드 시 깜빡이던 현상을 CSS 클래스 + head 인라인 스크립트 방식으로 완전 해결
  • admin 전용 페이지 메뉴 정리: 대시보드, 가중치 설정, 사원 관리, 부서 관리 페이지에서 모든 메뉴를 즉시 표시 (admin만 접근 가능하므로 숨김 불필요)
  • 카드 헤더 색상 통일: 가감점 현황, 통계 카드 헤더를 점수표와 동일한 파란색(#2c5282)으로 통일
  • 정보보고 직접 점수 입력: 가감점 관리의 정보보고 모달에서 등급 선택 외에 점수를 직접 입력할 수 있는 필드 추가
v3.1 (2026년 2월 11일)
신규 기능
  • 전체 데이터 서버 동기화: 기존에 기사 평가만 서버 저장되던 것을 6개 타입 전체로 확장
    • 기사 평가(evals), 가감점(penalties), 소명(appeals), 가중치 설정(config), Feature Flags(flags), 부서 가중치(dept_groups)
    • 서로 다른 브라우저/기기에서 동일한 데이터 공유 가능
  • evaluation_api Lambda 확장: GET ?type=all로 6개 타입 한번에 조회, POST {type, data}로 타입별 저장
  • 자동 병합 로직: 페이지 로드 시 서버 데이터와 로컬 데이터를 타임스탬프 기준으로 자동 병합
  • 실패 재시도 큐: 네트워크 오류 시 pending 큐에 저장, 다음 접속 시 자동 재시도
  • 부서 이동 이력 관리 (dept_history): 사원관리에서 부서 변경 시 이력 자동 기록
    • users.json에 dept_history 배열 자동 생성 (예: [{dept:'경제부', from:'2025-12-01'}, {dept:'금융부', from:'2026-02-11'}])
    • SCore.getDeptAtDate(user, date): 특정 날짜 기준 소속 부서 조회
    • SCore.getArticleDept(name, date, users): 기사 게재일 기준 부서 판별
    • 기자 목록, 부서 대시보드, 기사 평가에서 기사 게재일 기준 부서 분리 집계
변경 파일
  • lambda/evaluation_api/lambda_function.py - 6개 타입 GET/POST 지원
  • score-data.js - _syncType(), loadAllFromServer(), _mergeArrayById() 추가
  • common.js - getDeptAtDate(), getArticleDept() 헬퍼 함수 추가
  • admin.html - saveUserEdit()에서 부서 변경 시 dept_history 자동 기록
  • score-dashboard.html - 기사 게재일 기준 부서 판별로 정확한 부서 집계
  • score-eval.html - 기사별 부서를 게재일 기준으로 표시
  • list.html - 부서 필터 시 dept_history 기반 기사 분리 집계
  • score-eval.html, score-penalties.html, score-appeals.html, score-config.html, score-dashboard.html, score-my.html, reporter.html, list.html, dept-manage.html - loadAllFromServer() 연동
v3.0 (2026년 2월 11일)
신규 기능
  • 절대평가/상대평가 전환: 기자 목록에서 절대점수(입력점수)와 상대점수(표준편차 기반 정규화, 평균 85 / 표준편차 7.5)를 동시에 표시
  • 부서 가중치 (가군/나군): 가중치 설정 페이지에서 부서를 가군(1.0)/나군(1.1)으로 분류, 클릭으로 이동 가능. 최종점수 = 상대점수 × 부서가중치
  • 정량평가 7대 항목 표시: 기자 목록에 조회수, 단독기사, 면톱기사, 기획기사, 서경기자상, 정보보고, 온라인기사수 칸 추가 (데이터 연동 예정)
  • 정보보고 전용 등록: 가감점 관리에 파란색 '정보보고' 버튼 추가, 6단계 등급(10/8/6/4/2점) + 핵심 정보보고 가점(+2점) 전용 모달
  • 가감점 버튼 순서 변경: 가점 등록 → 감점 등록 순서로 변경 (모달 토글 포함)
개선 사항
  • 부장 페이지 깜빡임 수정: 부장 로그인 시 admin 전용 메뉴(대시보드, 가중치설정, 사원관리, 부서관리)가 잠깐 보이는 현상 해결
  • 엑셀 내보내기 강화: 절대점수, 상대점수, 부서가중치(군 표시), 최종점수, 7대 항목 + 평균/표준편차 행 포함
  • 기자 목록 정렬: 최종점수 기준 내림차순 정렬로 변경
변경 파일
  • list.html - 절대/상대점수, 7대 항목, 가중치(군) 표시, 엑셀 강화
  • score-config.html - 부서 가중치(가군/나군) 설정 카드 추가
  • score-penalties.html - 정보보고 버튼/모달, 버튼 순서 변경
  • list/score-eval/score-penalties/score-dashboard/score-appeals.html - nav 깜빡임 수정
v2.6 (2026년 2월 8일)
신규 기능
  • 동적 가중치 설정 (v3 엔진): 가중치 설정 페이지에서 면 범위, 글자수 범위, 품질 가점 항목을 자유롭게 추가/삭제 가능
    • 면 가중치: 시작면~끝면 범위와 가중치를 행 단위로 추가/삭제
    • 분량 가중치: 최소~최대 글자수 범위와 가중치를 행 단위로 추가/삭제
    • 품질 가점: 항목명과 가점을 자유롭게 추가/삭제 (기존 면톱/단독/기획/S등급/A등급 외 커스텀 항목 가능)
  • v2→v3 자동 마이그레이션: 기존 고정 키-값 방식(v2)에서 배열 기반(v3)으로 자동 변환
    • 기존 localStorage 설정 데이터가 자동으로 v3 포맷으로 마이그레이션
    • 마이그레이션 후에도 기존 가중치 값 유지
  • Config 강제 초기화: score-config.html?reset=1 접속 시 설정 데이터 초기화 (문제 발생 시 복구용)
개선 사항
  • 가중치 설정 UI 간소화: 아이콘, ID, CSS 클래스 등 불필요한 필드 제거 → 범위+가중치만 표시
  • 점수 매트릭스 동적 생성: 설정 변경 시 점수 매트릭스 미리보기가 실시간 업데이트
  • Infinity JSON 직렬화 버그 수정: 글자수 범위의 "이상" (∞) 값이 localStorage/서버 저장 시 null로 변환되는 문제 해결
  • 에러 핸들링 강화: 설정 로드 실패 시 기본값으로 자동 폴백, 개별 함수별 try-catch 적용
  • 전체 페이지 동적 품질 가점 적용: 하드코딩된 면톱/단독/기획/S등급/A등급 참조를 getQualityBonusItems() 동적 순회로 교체
적용된 페이지
  • score.js (핵심 계산 모듈) - v3 배열 기반 엔진, restoreInfinity, 동적 헬퍼 함수
  • score-config.html (가중치 설정) - 동적 행 추가/삭제 UI, 에러 핸들링 강화
  • score-data.js (데이터 저장소) - v3 config 지원, Infinity 복원
  • score-eval.html (기사 평가) - 동적 품질 가점 버튼
  • reporter.html (기자 상세) - 동적 품질 가점 버튼
  • list.html (기자 목록) - 동적 품질 가점 점수 계산
  • score-dashboard.html (부서 대시보드) - 동적 품질 가점 점수 계산
  • score-my.html (내 점수) - 동적 품질 가점 배지 표시
v2.5 (2026년 2월 8일)
신규 기능
  • A등급 품질 가점 추가: 기존 S등급 외에 A등급(+2점) 품질 가점 신설
    • 기사 평가 페이지에 A등급 버튼 추가 (파란색)
    • 소명 관리에서 A등급 인정 요청 가능
    • 내 점수 페이지에 A등급 배지 표시
  • 가감점 관리 개편: 기존 고정 3종 감점 → 자유 입력 방식으로 전면 개편
    • 가점(+)과 감점(-) 모두 등록 가능
    • 항목명, 점수, 적용 기간을 부장이 직접 입력
    • 예시 항목 프리셋 제공 (클릭으로 자동 입력)
    • 적용 기간 선택 (1~12개월)
  • 면톱(자동) 기능: XML 자동 감지 면톱 기사의 수동 해제 지원
    • is_auto_top 기사에 자동 라벨 표시
    • 자동 감지된 면톱을 부장이 수동으로 해제 가능 (면톱 버튼 토글)
    • 해제 시 기자 화면에 "톱(자동해제)" 취소선 배지 표시
개선 사항
  • 기사 평가 UI 통일: 기자 상세(reporter.html)의 평가 테이블을 기사 평가(score-eval.html)와 동일한 버튼 토글 방식으로 통일
  • 부서 관리 권한 수정: Manager(부장) 로그인 시 부서 관리 메뉴가 숨겨지도록 수정 (Admin 전용)
  • 가중치 설정 A등급 추가: score-config.html에 A등급 가점 설정 필드 추가
  • 소명 관리 A등급 지원: A등급 인정 요청 유형 추가, 승인 시 자동 점수 재계산
  • 기자 목록/상세 A등급 반영: 점수 계산에 A등급 가점 포함
  • 사용설명서 전면 업데이트: 메뉴 구성 9개 탭으로 확대, 사이드바-본문 순서 일치, A등급 관련 내용 전체 반영
적용된 페이지
  • score-eval.html (기사 평가) - A등급 버튼, 면톱(자동) 라벨 + 수동 해제
  • score-config.html (가중치 설정) - A등급 가점 설정
  • score-penalties.html (가감점 관리) - 자유 입력 방식 개편
  • score-appeals.html (소명 관리) - A등급 소명 유형 추가
  • score-my.html (내 점수) - A등급 배지/가점, 면톱(자동) 배지 표시
  • score-dashboard.html (부서 대시보드) - 면톱(자동) 점수 반영
  • reporter.html (기자 상세) - 평가 UI 버튼 토글 방식 통일, 면톱(자동) 지원
  • list.html (기자 목록) - A등급/면톱(자동) 점수 반영
  • 전체 네비게이션 (8개 페이지) - Manager 부서 관리 메뉴 숨김 처리
  • guide.html (사용설명서) - 전면 업데이트
v2.4 (2026년 2월 5일)
신규 기능
  • 부서 대시보드 월별 필터: 월 선택하여 해당 월 통계만 조회
    • 드롭다운에서 월 선택 (좌우 화살표로 이동 가능)
    • "부서 총점 (2026년 2월)" 형식으로 기간 표시
  • 기자 목록 총점 기간 표시: 선택한 기간에 따라 "총점 (1월)", "총점 (01-05)" 등 표시
  • 기사 평가 상태 개선: 미평가(-), 평가, 확정 3단계로 구분
    • 아무 버튼도 안 누름 → "-" (회색)
    • 면톱/단독/기획/S등급/A등급 중 하나라도 누름 → "평가" (파란색)
    • 확정 버튼 누름 → "확정" (초록색)
  • 사원 추가 기능: 사원관리에서 신규 기자 추가 가능
    • 사번 6자리 입력 (중복 체크)
    • 이름, 부서, 직급, 권한, 이메일 입력
    • 초기 비밀번호: 1234
  • 퇴사 처리 기능: 사원관리에서 퇴사자 삭제 가능
    • 확인 모달로 실수 방지
    • 기본 admin 계정은 삭제 불가
    • 기존 기사 데이터는 유지됨
  • 동기화 자동 캐시 무효화: 동기화 버튼 클릭 시 CloudFront 캐시 자동 무효화
    • Lambda 역할에 CloudFrontFullAccess 권한 추가
    • 동기화 후 즉시 최신 데이터 반영
개선 사항
  • 자동 동기화 스케줄:
    • 오전 6시(KST) 자동 동기화 (kpi-sync-morning)
    • 30분마다 자동 동기화 (kpi-sync-30min, 백업용)
  • 기자 목록 총점 표시: 기자별 점수 합계를 목록에서 바로 확인
  • 총점 색상 구분: 50점↑ 초록색, 30점↑ 파란색으로 시각화
  • 엑셀 총점 포함: 엑셀 내보내기 시 총점 컬럼 자동 포함
적용된 페이지
  • score-dashboard.html (부서 대시보드) - 월별 필터 추가
  • list.html (기자 목록) - 총점 기간 표시
  • score-eval.html (기사 평가) - 상태 3단계 구분
  • admin.html (사원 관리) - 추가/퇴사 기능
v2.3 (2026년 2월 4일)
신규 기능
  • 가감점 관리 시스템: 기자별 가점/감점 등록/관리 기능 추가
    • 시말서(부서): -2점, 1개월간 해당 월 한번만 감점
    • 시말서(반복): -5점, 동일 사안 2회 이상 반복 시, 1개월
    • 편집국장: -5점, 6개월간 매월 감점
  • 가감점 관리 페이지: score-penalties.html 신규 생성
    • 가감점 목록 조회 (부서/구분/상태 필터)
    • 가감점 등록 모달 (기자 선택, 항목명/점수 직접 입력, 사유 입력)
    • 가감점 삭제 기능
    • 통계 대시보드 (감점 건수, 가점 건수, 대상 기자 수, 순 가감점)
  • 내 점수 페이지 가감점 표시: score-my.html에 본인 가감점 내역 표시
  • 월별 점수 계산에 가감점 반영: calculateMonthlyScore() 함수 추가
개선 사항
  • 네비게이션 메뉴 추가: 모든 관련 페이지에 "가감점 관리" 메뉴 추가
  • score-data.js 확장: 가감점 데이터 관리 함수 추가
    • getPenalties(), createPenalty(), updatePenalty(), deletePenalty()
    • calculatePenaltyForMonth() - 월별 가감점 계산
    • getDepartmentPenaltiesForMonth() - 부서별 가감점 조회
  • score.js 확장: 가감점 반영 점수 계산 함수 추가
    • calculateMonthlyScore() - 기사 점수 + 가감점 = 최종 점수
    • hasPenalty() - 가감점 여부 확인
적용된 페이지
  • score-penalties.html (가감점 관리) - 신규
  • score-my.html (내 점수) - 가감점 내역 표시 추가
  • 모든 네비게이션 포함 페이지 - 가감점 관리 메뉴 추가
v2.2 (2026년 2월 4일)
신규 기능
  • 로딩 스피너 추가: 데이터 로드 시 전체 화면 로딩 오버레이 표시
  • 인라인 로딩: 테이블 내 데이터 로딩 시 스피너 표시
  • 버튼 로딩 상태: 저장/확정 버튼 클릭 시 로딩 상태 표시 및 중복 클릭 방지
  • 공통 CSS/JS 모듈화: common.css, common.js 파일 분리
개선 사항
  • 에러 메시지 개선: 기술적 에러를 사용자 친화적 메시지로 변환
    • "Failed to fetch" → "서버에 연결할 수 없습니다. 인터넷 연결을 확인해주세요."
    • "500" → "서버 오류가 발생했습니다. 잠시 후 다시 시도해주세요."
  • 재시도 버튼: 에러 발생 시 "다시 시도" 버튼 제공
  • 모바일 반응형 개선:
    • 768px 이하: 네비게이션 가로 스크롤, 통계 카드 크기 조정
    • 576px 이하: 테이블 컬럼 자동 숨김 (부서, 글자수 등)
    • 버튼/배지 크기 자동 축소
  • 토스트 메시지 통합: SCore.toast() 함수로 일관된 알림 표시
적용된 페이지
  • list.html (기자 목록)
  • admin.html (사원 관리)
  • score-eval.html (기사 평가)
  • score-my.html (내 점수)
  • score-appeals.html (소명 관리)
  • score-dashboard.html (부서 대시보드)
  • score-config.html (가중치 설정)
v2.1 (2026년 2월 3일)
신규 기능
  • 확정 기능 구현: 기사별 PENDING/CONFIRMED 상태 관리, 확정 후 수정 불가
  • 소명 처리 후 점수 재계산: 소명 승인 시 자동으로 가점 반영 및 점수 재계산
  • Feature Flags 기자 페이지 적용: reporter.html에 Feature Flags 완전 적용
    • SHOW_MY_SCORE: OFF 시 점수 "-"로 표시
    • SHOW_DEPT_AVERAGE: ON 시 부서 평균 카드 표시
    • SHOW_DEPT_RANKING: ON 시 부서 내 순위 표시
  • 실시간 동기화 준비: Lambda API 연동 구조 추가 (SYNC_ENABLED 플래그)
  • 부서 평균/순위 실제 계산: 하드코딩 제거, 실제 데이터 기반 계산
개선 사항
  • 확정된 기사 수정 방지: 확정된 기사의 품질 가점 버튼 비활성화
  • 확정 취소 기능: Admin 전용 확정 취소 (사유 입력 필수)
  • 사용설명서 대폭 업데이트: 점수 공식 정확한 수치 반영, 신규 기능 문서화
  • Feature Flags 문서화: 설정 항목별 화면 변화 상세 설명 추가
v2.0 (2026년 2월 1일)
신규 기능
  • S-CORE 점수 산출 시스템: 면 가중치 × 분량 가중치 × 10 + 품질 가점
  • 부서 대시보드 탭 기능: 드롭다운 → 부서별 탭 버튼으로 변경
  • 기사 평가 페이지: 품질 가점 체크박스 (면톱, 단독, 기획, S등급)
  • 소명 관리 페이지: 기자 이의제기 접수 및 처리
  • 가중치 설정 페이지: 면/분량/품질 가중치 조정, 변경 이력 관리
  • 기자 내 점수 페이지: 본인 기사 목록, 점수 확인, 검토 요청
개선 사항
  • 테마 통일: 네이비 블루 그라데이션 (#1a365d → #2c5282 → #2b6cb0)
  • 누락 기자 추가: users.json에 16명 실제 기자 추가 (232명 → 248명)
  • 테스트 케이스 검증: TC-01~TC-07 모두 통과
v1.0 (2026년 1월)
초기 릴리스
  • KPI 시스템 초기 버전
  • 기자별 기사 목록 조회
  • 부서별 통계 대시보드
  • AWS 서버리스 아키텍처 구축
향후 계획
버전예정 기능상태
v2.2 로딩 스피너, 에러 메시지 개선, 모바일 반응형 완료
v2.3 가감점 관리 시스템 (가점/감점 통합, 자유 입력) 완료
v2.4 부서 대시보드 월별 필터, 사원 추가/퇴사 기능 완료
v2.5 A등급 품질 가점, 가감점 관리 자유 입력 개편 완료
v2.6 동적 가중치 설정 (면/글자수/품질 가점 항목 추가·삭제) 완료
v3.0 절대/상대평가 전환, 부서 가중치(가군/나군), 정량평가 7대 항목, 정보보고 등록 완료
v3.1 전체 데이터 서버 동기화 (6개 타입), 자동 병합, 실패 재시도 큐, 부서 이동 이력 관리 (dept_history) 완료
v3.2 부서 대시보드 통합 레이아웃, 네비게이션 통일 및 깜빡임 해결, 정보보고 직접 입력 완료
v3.3 비밀번호 변경 기능, 관리자 대시보드 점수 정보 추가 완료
v4.0 온라인 기사 지표 통합 (조회수, 공유수) 예정