https://github.com/samubozo/samubozo-backend
1. 업무/인사관리 플랫폼 MVP 프로젝트 기획서
일시: 2025-06-20
프로젝트명: 업무와 인사를 보조하는 플랫폼, 사무보조(SAMUBOZO)
수행기간: 2025년 06월 20일 – 2025년 08월 12일
장소: 플레이데이터 서초캠퍼스
투입공수: 5M / M
수동으로 인사 정보를 관리하거나 여러 시스템에 분산된 경우,
데이터 입력 오류 발생 위험
정보 탐색 및 통합에 과도한 시간 소요
→ 사무보조 플랫폼 으로 한곳에 통합 관리하여
인사 업무 효율성·정확성 제고
투명한 인력 관리 기반 전략적 의사결정 지원
조직 생산성 향상 및 직원 만족도 증대
다양한 업종에 적용 가능한 핵심 인사관리 기능 제공
MVP 버전: 1개월 내 핵심 기능 구현·배포 완료 및 발표
착수
분석
설계
개발
검수
구현
완료 (유지보수)
단계
산출물
서비스 기획
프로젝트 기획서·요구사항 정의서·시스템 아키텍처·ERD·WBS·화면 설계서
데이터 셋
수집 데이터·API 명세서
프론트엔드 구현
SPA 사이트·UI 테스트 케이스·스토리보드·소스 코드
백엔드 설계
인터페이스 설계서·테스트 케이스·테스트 결과서·백엔드 개발 소스코드
시험/인도
프로젝트 테스트 결과서·CI/CD 계획서
구성원
역할
신현국
PM, 근태관리·전자결재 서비스 개발
이호영
쪽지/알림·일정관리 서비스 개발
김예은
인사관리·인증 서비스 개발
주영찬
급여관리·설정 서비스 개발
위험 요소(기술·인적·환경) 식별 및 문서화
영향도·발생 확률 평가 → 등급(낮음·중간·높음) 분류
관리 전략 수립 및 지속 모니터링
대응 계획 실행 및 개선
일관된 코드 스타일·네이밍·주석
TDD 기반 단위 테스트 작성
코드 리뷰 및 피드백 공유
자동 빌드·테스트·배포 파이프라인
성능 모니터링 및 지속 개선
AWS 인프라: ECR → EKS 백엔드, S3 정적 호스팅 프론트엔드
CI/CD: Jenkins 파이프라인 자동화
도메인: Route 53 연결
보안: IAM 최소 권한 원칙 준수
사용자 유형
기능/권한
인사 담당자/책임
전체 기능, 계정 생성·권한 수정, 직원 승인, 인사 정보 CRUD, 연차 부여, 급여 관리, 전자결재 승인 등
사원/선임
출퇴근 기록, 연차 신청, 조직도 열람, 쪽지 사용, 대시보드 조회
도메인
서비스명
책임 범위
인증 서비스
auth-service
로그인·JWT 발급, 인증·인가
게이트웨이
gateway-service
요청 라우팅
설정 서비스
config-service
공통 설정 관리
인사관리
hr-service
직원·조직·권한 관리
근태관리
attendance-service
출퇴근·지각·출장 등 상태 기록
급여관리
payroll-service
급여 항목·이력 관리
일정관리
schedule-service
연차·출장·교육 일정 뷰
쪽지/알림
message-service
메시지·알림 기능
전자결재
approval-service
신청·승인·반려, 결재선·이력 관리
15. WBS (Work Breakdown Structure)
WBS 번호
작업명
담당자
기간
산출물
비고
1
기획 및 분석
전체
6/20~6/27
프로젝트 기획서·요구사항 정의서·시스템 아키텍처·ERD·화면 설계서
1주차
2
기능 개발 및 단위 테스트
전체
6/30~7/18
서비스별 코드·API 명세서·SPA 사이트·단위 테스트 결과서
2~5주차
2.1
└ hr-service 개발
김예은
6/30~7/18
직원 서비스 코드·MySQL DDL
2.2
└ auth-service 개발
김예은
6/30~7/18
인증/JWT 모듈
2.3
└ message-service 개발
이호영
6/30~7/18
쪽지/알림 서비스 코드
2.4
└ schedule-service 개발
이호영
6/30~7/18
일정관리 서비스 코드
2.5
└ attendance-service 개발
신현국
6/30~7/18
출퇴근 관리 서비스 코드
2.6
└ approval-service 개발
신현국
6/30~7/18
전자결재 서비스 코드
2.7
└ payroll-service 개발
주영찬
6/30~7/18
급여관리 서비스 코드
2.8
└ config-service 개발
주영찬
6/30~7/18
공통 설정 서비스 코드
2.9
└ 프론트엔드 SPA 구현
전체
6/30~7/18
React SPA·UI 테스트케이스·스토리보드·소스코드
2.10
└ 단위 테스트 실행
QA팀
6/30~7/18
JUnit·React 단위 테스트 결과서
3
통합 테스트 및 피드백 반영
전체
7/21~8/1
통합 테스트 결과서·이슈 목록·개선 문서
6~7주차
4
최종 배포 및 시연 준비·발표
전체·DevOps팀
8/4~8/13
CI/CD 계획서·배포본(AWS EKS/S3)·운영환경 점검 보고서·발표자료
8~9주차
Samubozo HR System API 명세서
인증 API
인사관리 API
급여관리 API
근태관리 API
결재관리 API
연차관리 API
챗봇 API
증명서 API
메시지 API
알림 API
조직도 API
일정관리 API
권한 관리 API
인센티브 관리 API
공통 응답 형식
인증 요구사항
에러 코드
API명 : 신규 사용자 회원가입
HTTP 메서드 : POST
엔드포인트 : /auth/signup
설명 : 신규 사용자 회원가입
요청 파라미터 : 없음
요청 Body :
{
"email" : " user@sample.com" ,
"password" : " pw123" ,
"name" : " 홍길동"
}
{
"success" : true ,
"userId" : 1
}
API명 : 아이디/비밀번호로 로그인 및 토큰 발급
HTTP 메서드 : POST
엔드포인트 : /auth/login
설명 : 아이디/비밀번호로 로그인 및 토큰 발급
요청 파라미터 : 없음
요청 Body :
{
"email" : " user@sample.com" ,
"password" : " pw123"
}
{
"token" : " ..." ,
"refreshToken" : " ..."
}
상태 코드 : 200
비고 : JWT/Refresh 토큰
API명 : 이메일(아이디) 중복 여부 확인
HTTP 메서드 : POST
엔드포인트 : /auth/check-email
설명 : 이메일(아이디) 중복 여부 확인
요청 파라미터 : 없음
요청 Body :
{
"email" : " user@sample.com"
}
API명 : 이메일로 인증번호 발송
HTTP 메서드 : POST
엔드포인트 : /auth/email-valid
설명 : 이메일로 인증번호 발송
요청 파라미터 : 없음
요청 Body :
{
"email" : " user@sample.com"
}
API명 : 이메일 인증번호 확인
HTTP 메서드 : POST
엔드포인트 : /auth/verify
설명 : 이메일 인증번호 확인
요청 파라미터 : 없음
요청 Body :
{
"email" : " user@sample.com" ,
"code" : " 123456"
}
API명 : 이메일 인증/코드 확인/비밀번호 변경을 단계별로 처리
HTTP 메서드 : POST
엔드포인트 : /api/auth/find-password
설명 : 이메일 인증/코드 확인/비밀번호 변경을 단계별로 처리
요청 파라미터 : 없음
요청 Body :
// Step 1: EMAIL
{
"step" : " EMAIL" ,
"email" : " user@sample.com"
}
// Step 2: CODE
{
"step" : " CODE" ,
"email" : " user@sample.com" ,
"code" : " 123456"
}
// Step 3: RESET
{
"step" : " RESET" ,
"email" : " user@sample.com" ,
"code" : " 123456" ,
"newPassword" : " pw456"
}
// Step 1 응답
{
"message" : " 코드 전송 완료"
}
// Step 2 응답
{
"verified" : true
}
// Step 3 응답
{
"reset" : true
}
상태 코드 : 200/400
비고 : step: EMAIL, CODE, RESET
API명 : JWT/세션 만료 및 로그아웃
HTTP 메서드 : POST
엔드포인트 : /auth/logout
설명 : JWT/세션 만료 및 로그아웃
요청 파라미터 : 없음
요청 Body :
API명 : 전체 사용자(사원) 목록 조회
HTTP 메서드 : GET
엔드포인트 : /hr/users
설명 : 전체 사용자(사원) 목록 조회
요청 파라미터 : page, size, search 등
요청 Body : 없음
응답 형식 :
{
"users" : [... ],
"total" : 20
}
API명 : 특정 사용자 상세정보 조회
HTTP 메서드 : GET
엔드포인트 : /hr/users/{id}
설명 : 특정 사용자 상세정보 조회
요청 파라미터 : id (path variable)
요청 Body : 없음
응답 형식 :
{
"id" : 1 ,
"name" : " 홍길동" ,
...
}
API명 : 신규 사용자 등록
HTTP 메서드 : POST
엔드포인트 : /hr/users
설명 : 신규 사용자 등록
요청 파라미터 : 없음
요청 Body :
{
"id" : 1 ,
"created" : true
}
API명 : 사용자 정보 수정
HTTP 메서드 : PATCH
엔드포인트 : /hr/users/{id}
설명 : 사용자 정보 수정
요청 파라미터 : id (path variable)
요청 Body :
API명 : 사용자 삭제(또는 퇴직처리)
HTTP 메서드 : DELETE
엔드포인트 : /hr/users/{id}
설명 : 사용자 삭제(또는 퇴직처리)
요청 파라미터 : id (path variable)
요청 Body : 없음
응답 형식 :
API명 : 전체 직책 목록 조회
HTTP 메서드 : GET
엔드포인트 : /hr/positions
설명 : 전체 직책 목록 조회
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
API명 : 직책 신규등록 및 수정
HTTP 메서드 : POST
엔드포인트 : /hr/positions
설명 : 직책 신규등록 및 수정
요청 파라미터 : 없음
요청 Body :
{
"name" : " 팀장" ,
"priority" : 1
}
{
"created" : true ,
"positionId" : 2
}
API명 : 증명서 신청 이력 전체 조회
HTTP 메서드 : GET
엔드포인트 : /hr/certificates
설명 : 증명서 신청 이력 전체 조회
요청 파라미터 : userId 등
요청 Body : 없음
응답 형식 :
{
"certificates" : [... ]
}
상태 코드 : 200
비고 : 사용자별, 기간별 등
API명 : 증명서 신규 신청
HTTP 메서드 : POST
엔드포인트 : /hr/certificates
설명 : 증명서 신규 신청
요청 파라미터 : 없음
요청 Body :
{
"userId" : 1 ,
"type" : " 재직" ,
...
}
{
"applied" : true ,
"certificateId" : 1
}
상태 코드 : 201
비고 : 결재자/관리자 권한 필요
API명 : 증명서 상태(전자결재) 변경
HTTP 메서드 : PUT
엔드포인트 : /hr/certificates/{id}
설명 : 증명서 상태(전자결재) 변경
요청 파라미터 : id (path variable)
요청 Body :
상태 코드 : 200
비고 : 결재자/관리자 권한 필요
API명 : 증명서 신청 내역 삭제
HTTP 메서드 : DELETE
엔드포인트 : /hr/certificates/{id}
설명 : 증명서 신청 내역 삭제
요청 파라미터 : id (path variable)
요청 Body : 없음
응답 형식 :
API명 : 급여 정보 등록
HTTP 메서드 : POST
엔드포인트 : /api/payroll
설명 : 급여 정보 등록
요청 파라미터 : 없음
요청 Body :
{
"userId" : 1003 ,
"basePayroll" : 400000 ,
"positionAllowance" : 300000 ,
"mealAllowance" : 50000
}
{
"payrollId" : 3 ,
"userId" : 1003 ,
"basePayroll" : 400000 ,
"positionAllowance" : 300000 ,
"mealAllowance" : 50000 ,
"updatedAt" : " 2025-07-03T15:14:50.275373"
}
API명 : 특정 사용자 급여 정보 조회
HTTP 메서드 : GET
엔드포인트 : /api/payroll/{id}
설명 : 특정 사용자 급여 정보 조회
요청 파라미터 : id (path variable)
요청 Body : 없음
응답 형식 :
{
"payrollId" : 3 ,
"userId" : 1003 ,
"basePayroll" : 400000 ,
"positionAllowance" : 300000 ,
"mealAllowance" : 50000 ,
"updatedAt" : " 2025-07-03T15:14:50.275373"
}
API명 : 특정 사용자 급여 정보 수정
HTTP 메서드 : PUT
엔드포인트 : /api/payroll
설명 : 특정 사용자 급여 정보 수정
요청 파라미터 : 없음
요청 Body :
{
"userId" : 1003 ,
"basePayroll" : 400000 ,
"positionAllowance" : 300000 ,
"mealAllowance" : 50000
}
{
"payrollId" : 3 ,
"userId" : 1003 ,
"basePayroll" : 400000 ,
"positionAllowance" : 300000 ,
"mealAllowance" : 50000 ,
"updatedAt" : " 2025-07-03T15:14:50.275373"
}
API명 : 특정 사용자 급여 정보 삭제
HTTP 메서드 : DELETE
엔드포인트 : /api/payroll/{id}
설명 : 특정 사용자 급여 정보 삭제
요청 파라미터 : id (path variable)
요청 Body : 없음
응답 형식 :
{
"statusCode" : 200 ,
"statusMessage" : " 급여 정보 삭제 성공!" ,
"result" : null
}
API명 : 로그인한 사용자 급여 정보 조회
HTTP 메서드 : GET
엔드포인트 : /api/payroll/me
설명 : 로그인한 사용자 급여 정보 조회
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
{
"payrollId" : 3 ,
"userId" : 2 ,
"basePayroll" : 400000 ,
"positionAllowance" : 300000 ,
"mealAllowance" : 50000 ,
"updatedAt" : " 2025-07-03T15:14:50.275373"
}
API명 : 출근 기록
HTTP 메서드 : POST
엔드포인트 : /attendance/check-in
설명 : 사용자의 출근을 기록합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
{
"status" : 200 ,
"message" : " 출근 기록 성공" ,
"result" : {
"id" : 1 ,
"employeeNo" : " EMP001" ,
"checkInTime" : " 2024-01-15T09:00:00" ,
"checkOutTime" : null ,
"ipAddress" : " 192.168.1.100"
}
}
상태 코드 :
200: 성공
400: 이미 출근 기록이 존재하는 경우
500: 서버 오류
비고 : 클라이언트 IP 주소를 자동으로 기록
API명 : 퇴근 기록
HTTP 메서드 : POST
엔드포인트 : /attendance/check-out
설명 : 사용자의 퇴근을 기록합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
{
"status" : 200 ,
"message" : " 퇴근 기록 성공" ,
"result" : {
"id" : 1 ,
"employeeNo" : " EMP001" ,
"checkInTime" : " 2024-01-15T09:00:00" ,
"checkOutTime" : " 2024-01-15T18:00:00" ,
"ipAddress" : " 192.168.1.100"
}
}
상태 코드 :
200: 성공
400: 출근 기록이 없거나 이미 퇴근 기록이 된 경우
500: 서버 오류
비고 : 출근 기록이 있어야 퇴근 기록 가능
API명 : 월별 근태 조회
HTTP 메서드 : GET
엔드포인트 : /attendance/monthly/{year}/{month}
설명 : 특정 사용자의 월별 근태 기록을 조회합니다.
요청 파라미터 :
year (path): 조회할 연도
month (path): 조회할 월
요청 Body : 없음
응답 형식 :
{
"status" : 200 ,
"message" : " 월별 근태 조회 성공" ,
"result" : [
{
"id" : 1 ,
"employeeNo" : " EMP001" ,
"checkInTime" : " 2024-01-15T09:00:00" ,
"checkOutTime" : " 2024-01-15T18:00:00" ,
"ipAddress" : " 192.168.1.100"
}
]
}
상태 코드 :
비고 : 인증된 사용자의 근태 기록만 조회
API명 : 외출 기록
HTTP 메서드 : PUT
엔드포인트 : /attendance/go-out
설명 : 사용자의 외출을 기록합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
{
"status" : 200 ,
"message" : " 외출 기록 성공" ,
"result" : {
"id" : 1 ,
"employeeNo" : " EMP001" ,
"checkInTime" : " 2024-01-15T09:00:00" ,
"goOutTime" : " 2024-01-15T12:00:00"
}
}
상태 코드 :
200: 성공
400: 출근 기록이 없거나 이미 외출 중인 경우
500: 서버 오류
비고 : 출근 후 외출 기록 가능
API명 : 복귀 기록
HTTP 메서드 : PUT
엔드포인트 : /attendance/return
설명 : 사용자의 외출 복귀를 기록합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
{
"status" : 200 ,
"message" : " 복귀 기록 성공" ,
"result" : {
"id" : 1 ,
"employeeNo" : " EMP001" ,
"checkInTime" : " 2024-01-15T09:00:00" ,
"goOutTime" : " 2024-01-15T12:00:00" ,
"returnTime" : " 2024-01-15T13:00:00"
}
}
상태 코드 :
200: 성공
400: 외출 기록이 없거나 이미 복귀한 경우
500: 서버 오류
비고 : 외출 후 복귀 기록 가능
API명 : 결재 요청 생성
HTTP 메서드 : POST
엔드포인트 : /api/v1/approvals
설명 : 새로운 결재 요청을 생성합니다.
요청 파라미터 : 없음
요청 Body :
{
"title" : " 휴가 신청" ,
"content" : " 연차 신청합니다." ,
"approverId" : 2 ,
"requestType" : " VACATION"
}
{
"id" : 1 ,
"title" : " 휴가 신청" ,
"content" : " 연차 신청합니다." ,
"status" : " PENDING" ,
"requestType" : " VACATION" ,
"requesterId" : 1 ,
"approverId" : 2 ,
"createdAt" : " 2024-01-15T10:00:00"
}
상태 코드 :
201: 생성 성공
400: 잘못된 요청
500: 서버 오류
비고 : 인증된 사용자가 요청자로 자동 설정
API명 : 결재 요청 조회
HTTP 메서드 : GET
엔드포인트 : /api/v1/approvals/{id}
설명 : 특정 ID를 가진 결재 요청을 조회합니다.
요청 파라미터 :
요청 Body : 없음
응답 형식 :
{
"id" : 1 ,
"title" : " 휴가 신청" ,
"content" : " 연차 신청합니다." ,
"status" : " PENDING" ,
"requestType" : " VACATION" ,
"requesterId" : 1 ,
"approverId" : 2 ,
"createdAt" : " 2024-01-15T10:00:00"
}
상태 코드 :
200: 성공
404: 해당 ID의 결재 요청을 찾을 수 없음
500: 서버 오류
API명 : 결재 승인
HTTP 메서드 : PUT
엔드포인트 : /api/v1/approvals/{id}/approve
설명 : 특정 결재 요청을 승인 처리합니다.
요청 파라미터 :
id (path): 승인할 결재 요청의 ID
approverId (query): 승인자의 ID
요청 Body : 없음
응답 형식 :
{
"id" : 1 ,
"title" : " 휴가 신청" ,
"content" : " 연차 신청합니다." ,
"status" : " APPROVED" ,
"requestType" : " VACATION" ,
"requesterId" : 1 ,
"approverId" : 2 ,
"approvedAt" : " 2024-01-15T11:00:00"
}
상태 코드 :
200: 성공
400: 잘못된 요청
404: 해당 ID의 결재 요청을 찾을 수 없음
500: 서버 오류
비고 : 승인 권한이 있는 사용자만 가능
API명 : 결재 반려
HTTP 메서드 : PUT
엔드포인트 : /api/v1/approvals/{id}/reject
설명 : 특정 결재 요청을 반려 처리합니다.
요청 파라미터 :
id (path): 반려할 결재 요청의 ID
approverId (query): 반려자의 ID
요청 Body : 없음
응답 형식 :
{
"id" : 1 ,
"title" : " 휴가 신청" ,
"content" : " 연차 신청합니다." ,
"status" : " REJECTED" ,
"requestType" : " VACATION" ,
"requesterId" : 1 ,
"approverId" : 2 ,
"rejectedAt" : " 2024-01-15T11:00:00"
}
상태 코드 :
200: 성공
400: 잘못된 요청
404: 해당 ID의 결재 요청을 찾을 수 없음
500: 서버 오류
비고 : 반려 권한이 있는 사용자만 가능
API명 : 연차 신청
HTTP 메서드 : POST
엔드포인트 : /api/v1/vacations/requestVacation
설명 : 새로운 연차 신청을 등록합니다.
요청 파라미터 : 없음
요청 Body :
{
"startDate" : " 2024-01-20" ,
"endDate" : " 2024-01-22" ,
"vacationType" : " ANNUAL" ,
"reason" : " 개인 연차"
}
상태 코드 :
201: 생성 성공
400: 잘못된 요청 (연차 일수 초과, 중복 신청 등)
500: 서버 오류
비고 : 인증된 사용자가 신청자로 자동 설정
API명 : 챗봇과 대화
HTTP 메서드 : POST
엔드포인트 : /chatbot/chat
설명 : 챗봇과 대화를 진행합니다. 욕설 필터링과 업무 관련 키워드 필터링이 적용됩니다.
요청 파라미터 : 없음
요청 Body :
{
"message" : " 연차 신청 방법을 알려주세요" ,
"conversationId" : " uuid-string"
}
{
"message" : " 챗봇 응답 메시지" ,
"conversationId" : " uuid-string"
}
상태 코드 : 200
비고 :
욕설 필터링 적용
업무 관련 키워드만 허용
JWT 토큰 인증 필요
API명 : 챗봇 대화 기록 조회
HTTP 메서드 : GET
엔드포인트 : /chatbot/history
설명 : 사용자의 챗봇 대화 기록을 조회합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
[
{
"id" : 1 ,
"employeeNo" : 1001 ,
"message" : " 사용자 메시지" ,
"response" : " 챗봇 응답" ,
"createdAt" : " 2024-01-15T10:00:00"
}
]
상태 코드 : 200
비고 : JWT 토큰 인증 필요
API명 : 챗봇 헬로
HTTP 메서드 : GET
엔드포인트 : /chatbot/hello
설명 : 챗봇 서비스 상태 확인
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
API명 : 증명서 발급 신청
HTTP 메서드 : POST
엔드포인트 : /certificate/application
설명 : 새로운 증명서 발급을 신청합니다.
요청 파라미터 : 없음
요청 Body :
{
"certificateType" : " 재직증명서" ,
"purpose" : " 대출" ,
"requestDate" : " 2024-01-15"
}
{
"status" : 200 ,
"message" : " 증명서 신청이 완료되었습니다."
}
API명 : 증명서 목록 조회
HTTP 메서드 : GET
엔드포인트 : /certificate/certificate/list
설명 : 증명서 신청 목록을 페이징하여 조회합니다.
요청 파라미터 :
page: 페이지 번호 (기본값: 0)
size: 페이지 크기 (기본값: 5)
sort: 정렬 기준 (기본값: certificateId)
요청 Body : 없음
응답 형식 :
{
"statusCode" : 200 ,
"statusMessage" : " Success" ,
"result" : {
"content" : [
{
"certificateId" : 1 ,
"certificateType" : " 재직증명서" ,
"status" : " 승인대기" ,
"requestDate" : " 2024-01-15"
}
],
"totalElements" : 10 ,
"totalPages" : 2
}
}
API명 : 증명서 수정
HTTP 메서드 : PUT
엔드포인트 : /certificate/certificate/{id}
설명 : 특정 증명서 신청을 수정합니다.
요청 파라미터 : id (path variable)
요청 Body :
{
"certificateType" : " 재직증명서" ,
"purpose" : " 대출" ,
"requestDate" : " 2024-01-15"
}
{
"statusCode" : 200 ,
"statusMessage" : " 수정 완료되었습니다." ,
"result" : null
}
API명 : 증명서 삭제
HTTP 메서드 : DELETE
엔드포인트 : /certificate/delete/{id}
설명 : 특정 증명서 신청을 삭제합니다.
요청 파라미터 : id (path variable)
요청 Body : 없음
응답 형식 :
{
"statusCode" : 200 ,
"statusMessage" : " 삭제 완료되었습니다." ,
"result" : 1
}
API명 : 쪽지 전송
HTTP 메서드 : POST
엔드포인트 : /messages
설명 : 다른 사용자에게 쪽지를 전송합니다. 첨부파일 포함 가능.
요청 파라미터 : 없음
요청 Body : multipart/form-data
request: JSON 형태의 메시지 정보
attachment: 첨부파일 (선택사항)
{
"receiverId" : 1002 ,
"subject" : " 쪽지 제목" ,
"content" : " 쪽지 내용"
}
{
"messageId" : 1 ,
"senderId" : 1001 ,
"receiverId" : 1002 ,
"subject" : " 쪽지 제목" ,
"content" : " 쪽지 내용" ,
"sentAt" : " 2024-01-15T10:00:00"
}
상태 코드 : 201
비고 : JWT 토큰 인증 필요, 첨부파일 지원
API명 : 받은 쪽지함 조회
HTTP 메서드 : GET
엔드포인트 : /messages/received
설명 : 받은 쪽지 목록을 검색, 필터, 페이징하여 조회합니다.
요청 파라미터 :
page: 페이지 번호 (기본값: 0)
size: 페이지 크기 (기본값: 10)
period: 기간 필터 (기본값: all)
searchType: 검색 타입
searchValue: 검색 값
unreadOnly: 읽지 않은 쪽지만 조회 (기본값: false)
요청 Body : 없음
응답 형식 :
{
"content" : [
{
"messageId" : 1 ,
"senderId" : 1001 ,
"receiverId" : 1002 ,
"subject" : " 쪽지 제목" ,
"content" : " 쪽지 내용" ,
"isRead" : false ,
"sentAt" : " 2024-01-15T10:00:00"
}
],
"totalElements" : 10 ,
"totalPages" : 1
}
API명 : 보낸 쪽지함 조회
HTTP 메서드 : GET
엔드포인트 : /messages/sent
설명 : 보낸 쪽지 목록을 검색, 필터, 페이징하여 조회합니다.
요청 파라미터 :
page: 페이지 번호 (기본값: 0)
size: 페이지 크기 (기본값: 10)
period: 기간 필터 (기본값: all)
searchType: 검색 타입
searchValue: 검색 값
요청 Body : 없음
응답 형식 :
{
"content" : [
{
"messageId" : 1 ,
"senderId" : 1001 ,
"receiverId" : 1002 ,
"subject" : " 쪽지 제목" ,
"content" : " 쪽지 내용" ,
"isRead" : true ,
"sentAt" : " 2024-01-15T10:00:00"
}
],
"totalElements" : 5 ,
"totalPages" : 1
}
API명 : 쪽지 읽기
HTTP 메서드 : GET
엔드포인트 : /messages/{messageId}
설명 : 특정 쪽지를 읽고 읽음 처리를 합니다.
요청 파라미터 : messageId (path variable)
요청 Body : 없음
응답 형식 :
{
"messageId" : 1 ,
"senderId" : 1001 ,
"receiverId" : 1002 ,
"subject" : " 쪽지 제목" ,
"content" : " 쪽지 내용" ,
"isRead" : true ,
"readAt" : " 2024-01-15T11:00:00" ,
"sentAt" : " 2024-01-15T10:00:00"
}
API명 : 읽지 않은 쪽지 개수 조회
HTTP 메서드 : GET
엔드포인트 : /messages/unread/count
설명 : 읽지 않은 쪽지 개수를 조회합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
API명 : 쪽지 삭제
HTTP 메서드 : DELETE
엔드포인트 : /messages/{messageId}
설명 : 특정 쪽지를 삭제합니다.
요청 파라미터 : messageId (path variable)
요청 Body : 없음
응답 형식 : 없음
상태 코드 : 204
API명 : 쪽지 발신 취소
HTTP 메서드 : DELETE
엔드포인트 : /messages/{messageId}/recall
설명 : 읽지 않은 쪽지를 발신 취소합니다.
요청 파라미터 : messageId (path variable)
요청 Body : 없음
응답 형식 : 없음
상태 코드 : 204
API명 : SSE 구독
HTTP 메서드 : GET
엔드포인트 : /notifications/subscribe
설명 : Server-Sent Events를 통해 실시간 알림을 구독합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 : text/event-stream
상태 코드 : 200
비고 : JWT 토큰 인증 필요
API명 : 알림 읽음 처리
HTTP 메서드 : PATCH
엔드포인트 : /notifications/{notificationId}/read
설명 : 특정 알림을 읽음 상태로 변경합니다.
요청 파라미터 : notificationId (path variable)
요청 Body : 없음
응답 형식 :
{
"notificationId" : 1 ,
"title" : " 알림 제목" ,
"content" : " 알림 내용" ,
"isRead" : true ,
"createdAt" : " 2024-01-15T10:00:00"
}
API명 : 알림 목록 조회
HTTP 메서드 : GET
엔드포인트 : /notifications
설명 : 사용자의 알림 목록을 조회합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
[
{
"notificationId" : 1 ,
"title" : " 알림 제목" ,
"content" : " 알림 내용" ,
"isRead" : false ,
"createdAt" : " 2024-01-15T10:00:00"
}
]
API명 : 읽지 않은 알림 개수 조회
HTTP 메서드 : GET
엔드포인트 : /notifications/unread/count
설명 : 읽지 않은 알림 개수를 조회합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
API명 : 조직도 조회
HTTP 메서드 : GET
엔드포인트 : /org/chart
설명 : 회사 전체 조직도를 조회합니다.
요청 파라미터 :
departmentId: 특정 부서 조회 (선택사항)
요청 Body : 없음
응답 형식 :
{
"departments" : [
{
"departmentId" : 1 ,
"departmentName" : " 개발팀" ,
"managerId" : 1001 ,
"managerName" : " 김팀장" ,
"employeeCount" : 5 ,
"subDepartments" : [
{
"departmentId" : 2 ,
"departmentName" : " 프론트엔드팀" ,
"managerId" : 1002 ,
"managerName" : " 이팀장" ,
"employeeCount" : 3
}
]
}
]
}
API명 : 부서별 인원 현황 조회
HTTP 메서드 : GET
엔드포인트 : /org/employees
설명 : 부서별 인원 현황을 조회합니다.
요청 파라미터 :
departmentId: 특정 부서 조회 (선택사항)
includeInactive: 퇴직자 포함 여부 (기본값: false)
요청 Body : 없음
응답 형식 :
{
"totalEmployees" : 50 ,
"activeEmployees" : 45 ,
"departments" : [
{
"departmentId" : 1 ,
"departmentName" : " 개발팀" ,
"employeeCount" : 15 ,
"activeCount" : 14 ,
"employees" : [
{
"employeeId" : 1001 ,
"name" : " 김개발" ,
"position" : " 팀장" ,
"status" : " 재직"
}
]
}
]
}
API명 : 일정 등록
HTTP 메서드 : POST
엔드포인트 : /schedule
설명 : 새로운 일정을 등록합니다.
요청 파라미터 : 없음
요청 Body :
{
"title" : " 팀 미팅" ,
"description" : " 주간 업무 회의" ,
"startDate" : " 2024-01-20T09:00:00" ,
"endDate" : " 2024-01-20T10:00:00" ,
"type" : " MEETING" ,
"location" : " 회의실 A" ,
"attendees" : [1001 , 1002 , 1003 ],
"isPublic" : true
}
{
"scheduleId" : 1 ,
"title" : " 팀 미팅" ,
"status" : " CREATED"
}
API명 : 일정 목록 조회
HTTP 메서드 : GET
엔드포인트 : /schedule
설명 : 일정 목록을 조회합니다.
요청 파라미터 :
startDate: 시작일
endDate: 종료일
type: 일정 타입 (MEETING, VACATION, BUSINESS_TRIP, EDUCATION)
departmentId: 부서별 조회 (선택사항)
요청 Body : 없음
응답 형식 :
{
"schedules" : [
{
"scheduleId" : 1 ,
"title" : " 팀 미팅" ,
"description" : " 주간 업무 회의" ,
"startDate" : " 2024-01-20T09:00:00" ,
"endDate" : " 2024-01-20T10:00:00" ,
"type" : " MEETING" ,
"location" : " 회의실 A" ,
"createdBy" : 1001 ,
"attendees" : [1001 , 1002 , 1003 ]
}
],
"total" : 10
}
API명 : 일정 상세 조회
HTTP 메서드 : GET
엔드포인트 : /schedule/{scheduleId}
설명 : 특정 일정의 상세 정보를 조회합니다.
요청 파라미터 : scheduleId (path variable)
요청 Body : 없음
응답 형식 :
{
"scheduleId" : 1 ,
"title" : " 팀 미팅" ,
"description" : " 주간 업무 회의" ,
"startDate" : " 2024-01-20T09:00:00" ,
"endDate" : " 2024-01-20T10:00:00" ,
"type" : " MEETING" ,
"location" : " 회의실 A" ,
"createdBy" : 1001 ,
"attendees" : [
{
"employeeId" : 1001 ,
"name" : " 김개발" ,
"status" : " CONFIRMED"
}
]
}
API명 : 일정 수정
HTTP 메서드 : PUT
엔드포인트 : /schedule/{scheduleId}
설명 : 특정 일정을 수정합니다.
요청 파라미터 : scheduleId (path variable)
요청 Body :
{
"title" : " 팀 미팅 (수정)" ,
"description" : " 주간 업무 회의" ,
"startDate" : " 2024-01-20T09:00:00" ,
"endDate" : " 2024-01-20T10:00:00" ,
"type" : " MEETING" ,
"location" : " 회의실 B" ,
"attendees" : [1001 , 1002 , 1003 ]
}
{
"scheduleId" : 1 ,
"status" : " UPDATED"
}
API명 : 일정 삭제
HTTP 메서드 : DELETE
엔드포인트 : /schedule/{scheduleId}
설명 : 특정 일정을 삭제합니다.
요청 파라미터 : scheduleId (path variable)
요청 Body : 없음
응답 형식 : 없음
상태 코드 : 204
API명 : 사용자 역할 조회
HTTP 메서드 : GET
엔드포인트 : /auth/roles
설명 : 현재 사용자의 역할과 권한을 조회합니다.
요청 파라미터 : 없음
요청 Body : 없음
응답 형식 :
{
"userId" : 1001 ,
"roles" : [" EMPLOYEE" , " TEAM_LEADER" ],
"permissions" : [
" READ_EMPLOYEE_INFO" ,
" WRITE_ATTENDANCE" ,
" READ_PAYROLL" ,
" MANAGE_TEAM"
]
}
API명 : 역할별 사용자 목록 조회
HTTP 메서드 : GET
엔드포인트 : /auth/users/by-role
설명 : 특정 역할을 가진 사용자 목록을 조회합니다.
요청 파라미터 :
role: 역할명 (EMPLOYEE, TEAM_LEADER, HR_MANAGER, ADMIN)
요청 Body : 없음
응답 형식 :
{
"users" : [
{
"userId" : 1001 ,
"name" : " 김개발" ,
"email" : " kim@company.com" ,
"roles" : [" EMPLOYEE" , " TEAM_LEADER" ],
"department" : " 개발팀"
}
],
"total" : 5
}
API명 : 사용자 역할 변경
HTTP 메서드 : PUT
엔드포인트 : /auth/users/{userId}/roles
설명 : 특정 사용자의 역할을 변경합니다.
요청 파라미터 : userId (path variable)
요청 Body :
{
"roles" : [" EMPLOYEE" , " TEAM_LEADER" ]
}
{
"userId" : 1001 ,
"roles" : [" EMPLOYEE" , " TEAM_LEADER" ],
"updated" : true
}
API명 : 인센티브 등록
HTTP 메서드 : POST
엔드포인트 : /payroll/incentives
설명 : 특정 직원에게 인센티브를 등록합니다.
요청 파라미터 : 없음
요청 Body :
{
"employeeId" : 1001 ,
"incentiveType" : " PERFORMANCE" ,
"amount" : 500000 ,
"description" : " 우수 성과 인센티브" ,
"effectiveDate" : " 2024-01-15" ,
"expiryDate" : " 2024-12-31"
}
{
"incentiveId" : 1 ,
"employeeId" : 1001 ,
"incentiveType" : " PERFORMANCE" ,
"amount" : 500000 ,
"status" : " ACTIVE"
}
API명 : 인센티브 목록 조회
HTTP 메서드 : GET
엔드포인트 : /payroll/incentives
설명 : 인센티브 목록을 조회합니다.
요청 파라미터 :
employeeId: 특정 직원 조회 (선택사항)
type: 인센티브 타입 (선택사항)
status: 상태 (ACTIVE, EXPIRED, CANCELLED)
요청 Body : 없음
응답 형식 :
{
"incentives" : [
{
"incentiveId" : 1 ,
"employeeId" : 1001 ,
"employeeName" : " 김개발" ,
"incentiveType" : " PERFORMANCE" ,
"amount" : 500000 ,
"description" : " 우수 성과 인센티브" ,
"effectiveDate" : " 2024-01-15" ,
"expiryDate" : " 2024-12-31" ,
"status" : " ACTIVE"
}
],
"total" : 10
}
API명 : 인센티브 수정
HTTP 메서드 : PUT
엔드포인트 : /payroll/incentives/{incentiveId}
설명 : 특정 인센티브를 수정합니다.
요청 파라미터 : incentiveId (path variable)
요청 Body :
{
"amount" : 600000 ,
"description" : " 우수 성과 인센티브 (수정)" ,
"expiryDate" : " 2024-12-31"
}
{
"incentiveId" : 1 ,
"status" : " UPDATED"
}
API명 : 인센티브 삭제
HTTP 메서드 : DELETE
엔드포인트 : /payroll/incentives/{incentiveId}
설명 : 특정 인센티브를 삭제합니다.
요청 파라미터 : incentiveId (path variable)
요청 Body : 없음
응답 형식 : 없음
상태 코드 : 204
API명 : 야근수당 등록
HTTP 메서드 : POST
엔드포인트 : /payroll/overtime
설명 : 야근수당을 등록합니다.
요청 파라미터 : 없음
요청 Body :
{
"employeeId" : 1001 ,
"date" : " 2024-01-15" ,
"startTime" : " 18:00" ,
"endTime" : " 21:00" ,
"hours" : 3 ,
"rate" : 1.5 ,
"amount" : 45000 ,
"reason" : " 프로젝트 마감"
}
{
"overtimeId" : 1 ,
"employeeId" : 1001 ,
"date" : " 2024-01-15" ,
"hours" : 3 ,
"amount" : 45000 ,
"status" : " APPROVED"
}
{
"status" : 200 ,
"message" : " 성공 메시지" ,
"result" : {
// 응답 데이터
}
}
{
"status" : 400 ,
"message" : " 오류 메시지" ,
"result" : null
}
모든 API는 JWT 토큰을 통한 인증이 필요합니다. 요청 헤더에 다음을 포함해야 합니다:
Authorization: Bearer {JWT_TOKEN}
400 : 잘못된 요청 (Bad Request)
401 : 인증 실패 (Unauthorized)
403 : 권한 없음 (Forbidden)
404 : 리소스를 찾을 수 없음 (Not Found)
500 : 서버 내부 오류 (Internal Server Error)
사원 기본 및 상세 정보를 체계적으로 관리하여, 필요한 정보를 신속하게 조회하고 활용할 수 있어야 한다.
직원의 출/퇴근 및 근무 시간을 정확하게 기록하고 관리하여, 급여 산정 및 근무 현황 파악의 기반을 마련해야 한다. (로그인한 시간을 기준으로 출근 시간 확인)
연차 사용 이력을 근태 기록에서 확인할 수 있어야 하며, 별도 연차 산정 로직은 포함하지 않는다.
직원의 급여 정보를 관리하고, 기본 급여 및 수당 정보를 입력할 수 있는 기반을 제공하여 정확한 급여 산정 프로세스를 지원해야 한다.
직원의 주요 업무 일정(근무, 출장 등)을 달력 형태로 시각화하여, 개인 및 팀의 일정을 쉽게 파악할 수 있도록 해야 한다.
사용자(직원, 인사 담당자)는 안전하게 로그인하고 자신의 역할에 맞는 기능에 접근할 수 있어야 한다.
모든 민감한 개인 정보(급여, 주민번호 등)는 암호화하여 저장하고, 접근 권한에 따라 통제되어야 한다.
직관적이고 사용자 친화적인 UI/UX를 제공하여, 누구나 쉽게 시스템을 이용할 수 있어야 한다.
일반적인 사용자 수와 데이터 양에서 응답 시간이 지연되지 않아야 한다.
향후 기능 추가 및 사용자 수 증가에 대비하여 유연한 아키텍처로 설계되어야 한다.
PC 환경에 최적화된 반응형 웹 애플리케이션으로 개발되어야 한다.
18.Samubozo HR System 데이터 구조 명세서
개요
공통 데이터 구조
서비스별 API 엔드포인트
도메인별 데이터 모델
상태 관리 구조
설정 파일 구조
페이지별 데이터 구조
에러 처리 및 보안
챗봇 필터링 기능
이 문서는 Samubozo HR System 에서 사용하는 데이터 구조와 모델을 정의합니다.
구분
형식
설명
성공 응답
json<br>{<br> "status": 200,<br> "message": "성공 메시지",<br> "result": {<br> // 실제 데이터<br> }<br>}
정상 처리된 응답
오류 응답
json<br>{<br> "status": 400,<br> "message": "오류 메시지",<br> "result": null<br>}
에러 발생 시 응답
저장소
데이터 키
설명
SessionStorage
ACCESS_TOKEN
JWT 액세스 토큰
USER_ID
사용자 ID
USER_ROLE
사용자 권한
USER_EMAIL
사용자 이메일
USER_NAME
사용자 이름
USER_DEPARTMENT
부서명
USER_POSITION
직책명
USER_EMPLOYEE_NO
사원번호
PROVIDER
로그인 제공자
LocalStorage
REFRESH_TOKEN
JWT 리프레시 토큰
3.1 인증 서비스 (auth-service)
기능
HTTP 메서드
엔드포인트
설명
로그인
POST
/auth-service/auth/login
사용자 로그인
회원가입
POST
/auth-service/auth/signup
신규 사용자 회원가입
이메일 중복확인
POST
/auth-service/auth/check-email
이메일 중복 확인
인증번호 발송
POST
/auth-service/auth/email-valid
이메일 인증번호 발송
인증번호 확인
POST
/auth-service/auth/verify
이메일 인증번호 확인
비밀번호 재설정
POST
/auth-service/auth/find-password
비밀번호 찾기/재설정
토큰 갱신
POST
/auth-service/auth/refresh
JWT 토큰 갱신
기능
HTTP 메서드
엔드포인트
설명
사용자 상세정보 조회
GET
/hr-service/hr/users/detail
사용자 상세정보 조회
사용자 검색
GET
/hr-service/hr/users/search
사용자 검색
회원가입
POST
/hr-service/hr/users/signup
사용자 회원가입
부서 목록 조회
GET
/hr-service/hr/departments
부서 목록 조회
직급 목록 조회
GET
/hr-service/hr/positions
직급 목록 조회
3.3 근태 서비스 (attendance-service)
기능
HTTP 메서드
엔드포인트
설명
출근 기록
POST
/attendance-service/attendance/check-in
출근 처리
퇴근 기록
POST
/attendance-service/attendance/check-out
퇴근 처리
외출 기록
PUT
/attendance-service/attendance/go-out
외출 처리
복귀 기록
PUT
/attendance-service/attendance/return
복귀 처리
남은 근무시간 조회
GET
/attendance-service/attendance/remaining-work-time
남은 근무시간 조회
월별 근태 조회
GET
/attendance-service/attendance/monthly/{year}/{month}
월별 근태 조회
3.4 챗봇 서비스 (chatbot-service)
기능
HTTP 메서드
엔드포인트
설명
챗봇 대화
POST
/chatbot-service/chatbot/chat
챗봇과 대화
대화 이력 조회
GET
/chatbot-service/chatbot/history
챗봇 대화 이력 조회
챗봇 헬로
GET
/chatbot-service/chatbot/hello
챗봇 서비스 상태 확인
3.5 메시지 서비스 (message-service)
기능
HTTP 메서드
엔드포인트
설명
쪽지 전송
POST
/message-service/messages
쪽지 전송
받은쪽지 목록 조회
GET
/message-service/messages/received
받은쪽지 목록 조회
보낸쪽지 목록 조회
GET
/message-service/messages/sent
보낸쪽지 목록 조회
쪽지 상세 조회
GET
/message-service/messages/{messageId}
쪽지 상세 조회
쪽지 회수
PUT
/message-service/messages/{messageId}/recall
쪽지 회수
3.6 알림 서비스 (message-service)
기능
HTTP 메서드
엔드포인트
설명
알림 목록 조회
GET
/message-service/notifications
알림 목록 조회
알림 읽음 처리
PATCH
/message-service/notifications/{notificationId}/read
알림 읽음 처리
알림 구독
GET
/message-service/notifications/subscribe
SSE 알림 구독
3.7 급여 서비스 (payroll-service)
기능
HTTP 메서드
엔드포인트
설명
내 급여 조회
GET
/payroll/me
사용자 본인 급여 조회
데이터 유형
구조
설명
로그인 요청
json<br>{<br> "email": "user@sample.com",<br> "password": "pw123"<br>}
로그인 시 전송하는 데이터
로그인 응답
json<br>{<br> "token": "jwt_access_token",<br> "refreshToken": "jwt_refresh_token",<br> "id": 1,<br> "role": "USER",<br> "provider": "LOCAL"<br>}
로그인 성공 시 받는 데이터
사용자 상세정보
json<br>{<br> "email": "user@sample.com",<br> "userName": "홍길동",<br> "departmentName": "개발팀",<br> "positionName": "사원",<br> "employeeNo": "EMP001",<br> "hrRole": "USER"<br>}
사용자 상세 정보
데이터 유형
구조
설명
출근 기록
json<br>{<br> "checkInTime": "2024-01-01T09:00:00"<br>}
출근 시간 기록
퇴근 기록
json<br>{<br> "checkOutTime": "2024-01-01T18:00:00"<br>}
퇴근 시간 기록
외출 기록
json<br>{<br> "goOutTime": "2024-01-01T12:00:00"<br>}
외출 시간 기록
복귀 기록
json<br>{<br> "returnTime": "2024-01-01T13:00:00"<br>}
복귀 시간 기록
월별 근태 조회
json<br>[{<br> "attendanceDate": "2024-01-01",<br> "checkInTime": "09:00:00",<br> "checkOutTime": "18:00:00",<br> "goOutTime": "12:00:00",<br> "returnTime": "13:00:00"<br>}]
월별 근태 데이터
남은 근무시간
json<br>{<br> "remainingWorkTime": "08:30:00"<br>}
남은 근무 시간
근무시간 데이터
json<br>{<br> "remainingHours": "08:30",<br> "workedHours": "01:30"<br>}
근무 시간 상세 정보
데이터 유형
구조
설명
챗봇 메시지 요청
json<br>{<br> "message": "사용자 입력 메시지"<br>}
챗봇에게 보내는 메시지
챗봇 메시지 응답
json<br>{<br> "responseMessage": "봇 응답 메시지",<br> "result": {<br> "reply": "봇 응답",<br> "conversationId": "uuid"<br> }<br>}
챗봇 응답 데이터
챗봇 대화 이력
json<br>[{<br> "senderType": "USER/BOT",<br> "messageContent": "메시지 내용",<br> "conversationId": "uuid"<br>}]
대화 이력 데이터
챗봇 메시지 상태
json<br>{<br> "from": "user/bot",<br> "text": "메시지 내용"<br>}
UI에서 사용하는 메시지 상태
데이터 유형
구조
설명
쪽지 전송 요청
json<br>{<br> "receivers": ["user1@email.com", "user2@email.com"],<br> "subject": "쪽지 제목",<br> "content": "쪽지 내용",<br> "files": [File1, File2]<br>}
쪽지 전송 시 데이터
쪽지 목록 조회
json<br>[{<br> "messageId": 1,<br> "senderName": "홍길동",<br> "subject": "쪽지 제목",<br> "createdAt": "2024-01-01T10:00:00",<br> "isRead": false<br>}]
쪽지 목록 데이터
쪽지 상세 조회
json<br>{<br> "messageId": 1,<br> "senderName": "홍길동",<br> "subject": "쪽지 제목",<br> "content": "쪽지 내용",<br> "files": [File1, File2],<br> "createdAt": "2024-01-01T10:00:00"<br>}
쪽지 상세 정보
데이터 유형
구조
설명
알림 목록
json<br>[{<br> "notificationId": 1,<br> "type": "message",<br> "message": "새로운 쪽지가 도착했습니다",<br> "createdAt": "2024-01-01T10:00:00",<br> "isRead": false<br>}]
알림 목록 데이터
SSE 알림
json<br>{<br> "type": "MESSAGE",<br> "message": "새로운 쪽지가 도착했습니다",<br> "senderName": "홍길동",<br> "senderDepartment": "개발팀"<br>}
Server-Sent Events 알림
데이터 유형
구조
설명
사용자 정보
json<br>{<br> "email": "user@sample.com",<br> "employeeNo": "EMP001",<br> "hrRole": "USER"<br>}
기본 사용자 정보
사용자 검색 결과
json<br>[{<br> "employeeNo": "EMP001",<br> "userName": "홍길동",<br> "departmentName": "개발팀",<br> "positionName": "사원"<br>}]
사용자 검색 결과
인증 상태
json<br>{<br> "isLoggedIn": true,<br> "userRole": "USER",<br> "isInit": true<br>}
인증 상태 정보
4.7 근태 상태 관리 (Attendance Context)
데이터 유형
구조
설명
근태 상태
json<br>{<br> "isCheckedIn": true,<br> "checkInTime": "09:00:00",<br> "checkOutTime": null,<br> "todayAttendance": {...},<br> "monthlyAttendance": [...]<br>}
현재 근태 상태
로딩 상태
json<br>{<br> "loading": false,<br> "error": "오류 메시지"<br>}
로딩 및 에러 상태
{
// 인증 상태
isLoggedIn : boolean ,
userRole : string ,
isInit : boolean ,
// 인증 함수
onLogin : function ( loginData ) ,
onLogout : function ( ) ,
// 사용자 정보
user : {
email : string ,
employeeNo : string ,
hrRole : string
}
}
{
// 근태 상태
attendanceStatus : {
isCheckedIn : boolean ,
checkInTime : string ,
checkOutTime : string ,
todayAttendance : object ,
monthlyAttendance : array
} ,
// 로딩 상태
loading : boolean ,
error : string ,
// 근태 함수
handleCheckIn : function ( ) ,
handleCheckOut : function ( ) ,
getMonthlyAttendance : function ( year , month ) ,
checkTodayAttendance : function ( )
}
// API 기본 URL 설정
export const API_BASE_URL = "http://localhost:8000" ;
// 서비스별 엔드포인트
export const AUTH = "/auth-service/auth" ;
export const HR = "/hr-service/hr" ;
export const ATTENDANCE = "/attendance-service/attendance" ;
export const CHATBOT = "/chatbot-service/chatbot" ;
export const MESSAGE = "/message-service/messages" ;
export const NOTIFICATION = "/message-service/notifications" ;
// Axios 인스턴스 설정
const axiosInstance = axios . create ( {
baseURL : API_BASE_URL ,
timeout : 10000 ,
headers : {
'Content-Type' : 'application/json' ,
'Authorization' : `Bearer ${ token } `
}
} ) ;
// 요청 인터셉터
axiosInstance . interceptors . request . use (
( config ) => {
const token = sessionStorage . getItem ( 'ACCESS_TOKEN' ) ;
if ( token ) {
config . headers . Authorization = `Bearer ${ token } ` ;
}
return config ;
}
) ;
// 응답 인터셉터 (토큰 갱신)
axiosInstance . interceptors . response . use (
( response ) => response ,
async ( error ) => {
if ( error . response . status === 401 ) {
// 토큰 갱신 로직
}
return Promise . reject ( error ) ;
}
) ;
사용자 정보 표시 : 로그인한 사용자의 기본 정보
근태 상태 표시 : 현재 출근/퇴근 상태
알림 목록 표시 : 최근 알림 메시지
출근/퇴근 상태 관리 : 실시간 근태 상태 업데이트
월별 근태 조회 : 달력 형태의 근태 기록
휴가/부재 신청 : 휴가 및 부재 등록 기능
쪽지 전송/수신 : 사용자 간 쪽지 교환
쪽지 목록 조회 : 받은쪽지/보낸쪽지 목록
쪽지 상세 조회 : 쪽지 내용 및 첨부파일 확인
7.4 조직도 (Organization Chart)
사용자 검색 : 이름/부서별 사용자 검색
부서별 조직도 표시 : 계층 구조의 조직도
급여 정보 조회 : 개인 급여 정보 확인
급여 명세서 : 상세 급여 내역
직원 목록 조회 : 전체 직원 목록
직원 상세 정보 : 개별 직원 상세 정보
결재 요청 목록 : 승인 대기 중인 결재
결재 처리 : 결재 승인/반려 처리
일정 등록/조회 : 개인/팀 일정 관리
일정 관리 : 일정 수정/삭제
상태 코드
의미
처리 방법
200
성공
정상 처리
400
잘못된 요청
입력값 검증
401
인증 실패
토큰 갱신 또는 재로그인
403
권한 없음
권한 확인
404
리소스 없음
경로 확인
500
서버 오류
서버 상태 확인
// axios interceptor를 통한 자동 토큰 갱신
axiosInstance . interceptors . response . use (
( response ) => response ,
async ( error ) => {
if ( error . response . status === 401 ) {
const refreshToken = localStorage . getItem ( 'REFRESH_TOKEN' ) ;
const newAccessToken = await refreshAccessToken ( refreshToken ) ;
sessionStorage . setItem ( 'ACCESS_TOKEN' , newAccessToken ) ;
return axiosInstance ( originalRequest ) ;
}
return Promise . reject ( error ) ;
}
) ;
Access Token : SessionStorage에 저장 (브라우저 종료 시 삭제)
Refresh Token : LocalStorage에 저장 (장기 보관)
토큰 만료 시 : 자동 갱신 로직 구현
Authorization 헤더 : 모든 API 요청에 포함
HTTPS 사용 : 프로덕션 환경에서 필수
CORS 설정 : 적절한 도메인 설정
민감한 정보 : 암호화하여 전송
개인정보 : 최소한으로 수집
데이터 삭제 : 완전 삭제 보장
욕설 필터링 : 부적절한 언어 사용 방지
업무 관련 키워드 필터링 : 업무 관련 질문으로 제한
카테고리
키워드 예시
일반 업무 및 경영
가이드, 결재, 계약, 고객, 관리, 기획, 보고서, 업무, 영업, 예산, 조직, 프로젝트, 회의록
근태 및 휴가
근무, 근태, 연차, 휴가, 병가, 출산휴가, 육아휴직
인사 및 채용
인사, 채용, 이력서, 입사, 직급, 직무, 직원, 면접, 승진
급여 및 보상
수당, 성과급, 연봉, 월급, 상여금, 퇴직금
교육 및 개발
교육, 직무교육, OJT, 멘토링, 코칭
노무 및 관계
노사, 단체협약, 징계, 취업규칙
IT 및 시스템
메신저, 메일, 채팅, 인트라넷, 그룹웨어
법률 및 규제
근로기준법, 산업안전보건법, 개인정보보호법
기능
구현 방식
데이터 구조
오늘의 출근 상태 조회
SessionStorage 기반
json<br>{<br> "checkInTime": "09:00:00",<br> "checkOutTime": "18:00:00",<br> "goOutTime": "12:00:00",<br> "returnTime": "13:00:00"<br>}
휴가 신청
프론트엔드 임시 처리
json<br>{<br> "vacationId": 1704067200000,<br> "startDate": "2024-01-01",<br> "endDate": "2024-01-03",<br> "reason": "연차 사용"<br>}
부재 등록
프론트엔드 임시 처리
json<br>{<br> "absenceId": 1704067200000,<br> "absenceType": "외출",<br> "startTime": "12:00:00",<br> "endTime": "13:00:00",<br> "reason": "점심 외출"<br>}
근태 통계 조회
프론트엔드 임시 처리
json<br>{<br> "totalWorkDays": 22,<br> "presentDays": 20,<br> "absentDays": 2,<br> "lateDays": 1,<br> "earlyLeaveDays": 0,<br> "overtimeHours": 8.5,<br> "vacationDays": 3,<br> "remainingVacationDays": 9<br>}
항목
설명
링크
SPA 사이트
HTML/CSS 및 React 기반으로 구현된 Single Page Application 화면입니다.
바로가기
UI 테스트케이스
화면별 동작 조건 및 UI 요소 확인을 위한 테스트케이스 시트입니다.
바로가기
스토리보드
주요 화면 및 사용자 흐름(UX)을 시각적으로 설계한 자료입니다.
바로가기
소스코드
React 기반의 SPA 프론트엔드 소스코드 (GitHub Repository)입니다.
바로가기