세티스 요약

This commit is contained in:
2026-07-20 11:11:25 +09:00
parent e0369ff336
commit ff6a43ab49
+314 -92
View File
@@ -1,17 +1,23 @@
# (주)삼안 ERP 및 그룹웨어 시스템 (Satis) 하이레벨 아키텍처 (High-Level Architecture) # (주)삼안 ERP 및 그룹웨어 시스템 (Satis) 하이레벨 아키텍처 명세서 v5
본 문서는 (주)삼안의 **ERP 및 그룹웨어 시스템(`saman-statis` / `Satis`)** 프로젝트의 전체 하이레벨 아키텍처(HLA) 명세서입니다. 본 문서는 (주)삼안의 **ERP 및 그룹웨어 시스템(`saman-statis` / `Satis`)** 프로젝트의 전체 하이레벨 아키텍처(HLA) 명세서입니다.
시스템의 전체 개요, 계층 구조, 기술 스택, 업무 도메인뿐만 아니라 **인프라/배포 아키텍처, 보안/인증 아키텍처, 외부 시스템 연동 구조**를 종합적으로 포함합니다. 시스템 개요, 계층 구조, 기술 스택, 업무 도메인, **인프라/배포, 보안/인증, 외부 시스템 연동, 프론트엔드 아키텍처, 개발 운영 구조**를 종합적으로 포함합니다.
*(참고: 압축파일 `*.zip`은 분석에서 제외하였습니다.)* *(압축파일 `*.zip`은 분석에서 제외하였습니다.)*
--- ---
## 1. 프로젝트 개요 (Project Overview) ## 1. 프로젝트 개요 (Project Overview)
* **프로젝트명**: 삼안 ERP / 그룹웨어 (`saman-statis` / `Satis`) | 항목 | 내용 |
* **운영 도메인**: `satis2.samaneng.com`, `erp.samaneng.com` | :--- | :--- |
* **시스템 성격**: 엔지니어링/건설 분야 기업 자원 관리(ERP) 및 통합 그룹웨어 | **프로젝트명** | 삼안 ERP / 그룹웨어 (`saman-statis` / `Satis`) |
* **주요 기능**: 인사/급여, 회계/전표, 프로젝트/현장 공정, 영업/기성, 전자결재, 고정자산, 출장 정산, 경영분석 등 | **운영 도메인** | `satis.samaneng.com`, `erp.samaneng.com` |
| **시스템 성격** | 엔지니어링/건설 분야 기업 자원 관리(ERP) 및 통합 그룹웨어 |
| **회사명** | (주)삼안 |
| **사업자등록번호** | 211-81-25425 |
| **시스템 식별코드** | `SAMAN` |
| **주요 기능** | 인사/급여, 회계/전표, 프로젝트/공정, 영업/기성, 전자결재, 고정자산, 출장정산, 경영분석 |
| **DB 연동** | Oracle(메인 ERP), MS-SQL(더존 iCube ERP), MySQL(사내 인트라넷) |
--- ---
@@ -19,25 +25,32 @@
```mermaid ```mermaid
graph TD graph TD
subgraph Client Tier subgraph "Client Tier"
Browser["Web Browser <br/> (HTML5, jQuery, jqGrid, w2ui)"] Browser["Web Browser<br/>(HTML5, jQuery, jqGrid, w2ui, amCharts)"]
end end
subgraph Web / Presentation Tier subgraph "Web / Presentation Tier"
WebServer["Web Server <br/> (Windows Server / APM_Setup)"] WebServer["Web Server<br/>(Windows Server / APM_Setup / Apache)"]
Smarty["Smarty Template Engine v2.6 <br/> (Smarty/templates/Satis/*.tpl)"] Smarty["Smarty Template Engine v2.6<br/>(Smarty/templates/Satis/*.tpl)"]
end end
subgraph Application Tier subgraph "Application Tier"
Controller["MVC Controllers <br/> (Satis/sys/controller/*)"] Controller["MVC Controllers<br/>(Satis/sys/controller/*)"]
AuthModule["Security & Auth Engine <br/> (AuthClass.php / Session)"] AuthModule["Security & Auth Engine<br/>(AuthClass.php / LoginInfomation.php)"]
BizLogic["Business Models & Utility <br/> (Satis/sys/model/*, OracleClass.php)"] BizLogic["Business Logic Models<br/>(Satis/sys/model/*)"]
CommonUtil["공통 유틸리티<br/>(OracleClass.php / CommonCodeList.php)"]
end end
subgraph Data & Integration Tier subgraph "Data & Integration Tier"
OracleDB[("Main Oracle Database <br/> (OCI Connection)")] OracleDB[("Oracle DB (Main ERP)<br/>TNS: samandb<br/>User: satis")]
iCubeDB[("Douzone iCube ERP <br/> (MS-SQL: DZICUBE)")] iCubeDB[("Douzone iCube ERP<br/>MS-SQL: DZICUBE<br/>192.168.13.50:5539")]
IntranetDB[("Intranet Database <br/> (MySQL: hallaerp)")] IntranetDB[("Intranet MySQL<br/>hallaerp<br/>erp.samaneng.com")]
end
subgraph "External Services"
SMS["SMS 발송 서비스<br/>(sms_controller.php)"]
PDF["PDF 생성 서비스<br/>(pdf_controller.php)"]
OTP["OTP 인증 서비스<br/>(SM_ERPURL_OTP)"]
end end
Browser <-->|HTTPS / HTTP| WebServer Browser <-->|HTTPS / HTTP| WebServer
@@ -45,52 +58,142 @@ graph TD
WebServer <--> Controller WebServer <--> Controller
Controller <--> AuthModule Controller <--> AuthModule
Controller <--> BizLogic Controller <--> BizLogic
BizLogic <-->|OCI Connection| OracleDB BizLogic <--> CommonUtil
BizLogic <-->|MS-SQL Driver| iCubeDB CommonUtil <-->|OCI Connection| OracleDB
BizLogic <-->|MySQL Driver| IntranetDB BizLogic <-->|MS-SQL Port 5539| iCubeDB
BizLogic <-->|MySQL Port 3306| IntranetDB
BizLogic --> SMS
BizLogic --> PDF
CommonUtil <-->|OTP 검증| OTP
``` ```
--- ---
## 3. 계층별 기술 스택 (Layered Tech Stack) ## 3. 계층별 기술 스택 (Layered Tech Stack)
| 계층 (Layer) | 구성 기술 및 디렉토리 | 설명 | | 계층 (Layer) | 구성 기술 및 경로 | 세부 설명 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| **Presentation Tier** | `Smarty 2.6`, `Smarty/templates/Satis/` | Server-Side Rendering (SSR) 뷰 템플릿 엔진 (`.tpl`) | | **Client UI Tier** | `jQuery 1.11.3`, `jqGrid`, `w2ui`, `amCharts 3.20.15`, `dtree` | 대용량 그리드, 팝업 트리, 차트, 달력 처리 |
| **Client UI Tier** | `jQuery`, `jqGrid`, `w2ui`, `Satis/js/` | 엔지니어링/회계 대용량 동적 그리드 및 사용자 인터랙션 처리 | | **Presentation Tier** | `Smarty 2.6`, `Smarty/templates/Satis/` | SSR `.tpl` 기반 뷰 엔진. 각 화면은 `{$변수명}`으로 PHP 데이터 바인딩 |
| **Application Tier** | `PHP 5.x`, `Satis/sys/controller/` | Custom MVC Controller (`ActionMode` 라우팅 파라미터 처리) | | **Application Tier** | `PHP 5.x`, `Satis/sys/controller/` | `ActionMode` 파라미터 분기 라우팅. Controller → Model 1:1 호출 구조 |
| **Security Tier** | `Satis/sys/util/AuthClass.php` | 세션 보안, CSRF Anti-Forgery Token 검증, 접근 권한 통제 | | **Auth / Session** | `AuthClass.php`, `LoginInfomation.php` | 세션 생성, CSRF 토큰, 개인 권한(Certificate) 검증, 세션 만료 리다이렉트 |
| **Persistence Tier** | `OracleClass.php`, `Satis/inc/*.inc` | Oracle OCI, MS-SQL(iCube), MySQL 다중 DB 연결 지원 | | **Business Logic** | `Satis/sys/model/`, `Satis/inc/*.php` | 도메인별 Logic 클래스, 전자결재 함수, 공통 헬퍼 |
| **Data Access** | `OracleClass.php` | Oracle OCI8, Ref Cursor Proc, 다형 출력(`array`/`json`/`jsonchart`/Smarty) |
| **DB / Persistence** | Oracle(`samandb`), MS-SQL(`DZICUBE`), MySQL(`hallaerp`) | 이종 3-DB 동시 운영 |
--- ---
## 4. 인프라 및 배포 아키텍처 (Infrastructure & Deployment Architecture) ## 4. 전체 폴더 구조 (Directory Structure)
```text
d:\41.dev\10.saman\
├── SmartyConfig.php # Smarty 엔진 경로 설정 (절대경로 하드코딩)
├── index.php # 루트 엔트리 → 로그인 화면 리다이렉트
├── Satis/ # 메인 웹 애플리케이션 루트
│ ├── css/ # 전역 CSS 스타일시트
│ ├── fonts/ # 웹 폰트
│ ├── images/ # UI 이미지
│ ├── jqgrid/ # jqGrid 라이브러리
│ ├── js/ # 프론트엔드 JavaScript (88개 파일)
│ │ ├── common.js, common2.js, common3.js # 공통 UI 함수
│ │ ├── common_jqGrid.js (214KB) # jqGrid 공통 래퍼 (주 버전)
│ │ ├── common_bigdata_grid.js (50KB) # 대용량 가상 스크롤 그리드
│ │ ├── SlipTemp.js (182KB) # 전표 작성 전용 클라이언트 로직
│ │ ├── SlipConfirm.js (147KB) # 전표 확정 처리
│ │ ├── ProjectScreen06.js (115KB) # 프로젝트 기성 화면
│ │ ├── ProjectScreen07.js (111KB) # 프로젝트 원가 화면
│ │ ├── GenerateDate.js # 날짜 생성 유틸
│ │ ├── erp_PrintAgent.js # 인쇄 에이전트
│ │ ├── amcharts_3.20.15.free/ # 경영분석 차트 라이브러리
│ │ ├── jqgrid/, jquery/, w2ui/, w2ui-1.5/ # 서드파티 라이브러리
│ │ └── pdfviwer/ # PDF 뷰어
│ ├── layout/
│ │ ├── Layout.html # 단일 프레임 레이아웃
│ │ └── Layout2.html # 분할 프레임 레이아웃
│ └── sys/ # Backend 핵심 디렉토리
│ ├── controller/ # MVC 컨트롤러 (21개 모듈 디렉토리)
│ │ ├── Login/ # 인증, 로그아웃, 메뉴, 즐겨찾기
│ │ ├── Account/ # 회계 (30개 컨트롤러)
│ │ ├── Person/ # 인사/급여 (23개 컨트롤러)
│ │ ├── Project/ # 프로젝트 (15개 컨트롤러)
│ │ ├── Project_work/ # 프로젝트 현장 업무 (16개 컨트롤러)
│ │ ├── Document/ # 전자결재
│ │ ├── Sign/ # 전자서명 문서 (3개 컨트롤러)
│ │ ├── Sale/ # 영업 (9개 컨트롤러)
│ │ ├── Purchase/ # 구매 (4개 컨트롤러)
│ │ ├── Travel/ # 출장
│ │ ├── Asset/ # 자산 (3개 컨트롤러)
│ │ ├── Book/ # 도서 관리
│ │ ├── Association/ # 협회 관리
│ │ ├── Management/ # 코드/권한/알림 관리 (4개 컨트롤러)
│ │ ├── Supervisor/ # 시스템 관리자 기능
│ │ ├── Common/ # 공통 팝업, SMS, PDF, OTP (17개 컨트롤러)
│ │ ├── Jqgrid/ # jqGrid JSON 데이터 응답
│ │ └── Fileupload/ # 파일 업로드 처리
│ ├── model/ # 비즈니스 로직 (모듈별 Logic 클래스)
│ ├── util/ # 시스템 유틸리티 클래스
│ │ ├── OracleClass.php # Oracle OCI 커넥션 핵심 클래스 (1,392라인)
│ │ ├── AuthClass.php # CSRF 토큰 / 세션 보안 (591라인)
│ │ ├── LoginInfomation.php # 로그인 상태 / 개인 권한 검증
│ │ ├── CommonCodeList.php # 공통 코드 인메모리 캐시 (294KB)
│ │ ├── DefaultInformation.php # 시스템 전역 변수 초기화
│ │ ├── GetUserInfo.php # 세션 사용자 정보 초기화
│ │ └── ReportViewExcel.php # Excel 보고서 출력
│ ├── inc/ # 모듈 공통 include 파일 (21개 파일)
│ │ ├── approval_function.php # 전자결재 처리 함수 (1,224라인)
│ │ ├── approval_var.php # 전자결재 상태 상수 정의
│ │ ├── function.php # 공통 헬퍼 함수 (1,093라인)
│ │ ├── function_add.php # 추가 헬퍼 함수 (32KB)
│ │ ├── function_intranet.php # 인트라넷 전용 함수 (33KB)
│ │ ├── dbcon.inc # MySQL 인트라넷 커넥션
│ │ ├── dbcon_security.inc # 보안 DB 커넥션
│ │ └── getNeedDate.php # 날짜 계산 유틸
│ ├── log/ # SQL 실행 로그 (날짜별 txt 파일)
│ └── yeta_data/ # 연말정산 데이터 파일
└── Smarty/ # Smarty 템플릿 엔진 디렉토리
├── templates/
│ ├── Satis/ # 22개 모듈 템플릿 디렉토리
│ │ ├── Login/ # 81개 .tpl (로그인, 메인, 환경설정, 알림)
│ │ ├── Account/ # 회계 화면 템플릿
│ │ ├── Person/ # 인사/급여 화면 템플릿
│ │ └── ... (나머지 모듈)
│ ├── Eis/, Overseas/, spo_mng/ # 타 시스템 템플릿
└── templates_c/ # Smarty 컴파일 캐시 (자동 생성)
```
---
## 5. 인프라 및 배포 아키텍처 (Infrastructure & Deployment Architecture)
```mermaid ```mermaid
graph LR graph LR
subgraph Infrastructure Layout subgraph "서버 인프라"
WebSvr["Web Application Server <br/> (APM_Setup / Windows Server)"] WebSvr["Web App Server<br/>(Windows Server<br/>APM_Setup D:/APM_Setup/htdocs/)"]
OracleSvr[("Oracle Database Server <br/> (Main ERP Data)")] OracleSvr[("Oracle DB Server<br/>TNS: samandb<br/>User: satis")]
iCubeSvr[("Douzone iCube Server <br/> (MS-SQL 192.168.13.50:5539)")] iCubeSvr[("Douzone iCube Server<br/>MS-SQL 192.168.13.50:5539<br/>DB: DZICUBE / User: DZGUEST")]
MySQLSvr[("Intranet MySQL Server <br/> (erp.samaneng.com / hallaerp)")] MySQLSvr[("Intranet MySQL<br/>erp.samaneng.com<br/>DB: hallaerp")]
end end
WebSvr -->|OCI Client| OracleSvr WebSvr -->|OCI8 클라이언트| OracleSvr
WebSvr -->|MS-SQL TCP 5539| iCubeSvr WebSvr -->|TCP 5539 mssql_connect| iCubeSvr
WebSvr -->|MySQL TCP 3306| MySQLSvr WebSvr -->|TCP 3306 mysql_connect| MySQLSvr
``` ```
* **서버 환경**: Windows Server 기반 APM (Apache + PHP + MySQL) 단일/이중화 실행 환경 (`D:/APM_Setup/htdocs/`) | 항목 | 내용 |
* **PHP 실행 옵션**: | :--- | :--- |
* 메모리 제한 해제 (`ini_set("memory_limit", -1)`)를 통한 대용량 프로젝트/연말정산 엑셀 보고서 생성 지원 | **WAS 환경** | Windows Server + APM_Setup (Apache + PHP 5.x + MySQL) |
* 캐시 무효화 헤더 설정 (`Expires: 0`, `Cache-Control: no-cache`)을 통한 세션 및 보안 강화 | **배포 경로** | `D:/APM_Setup/htdocs/` |
* **경로 및 컴파일 구조**: | **Smarty 컴파일 경로** | `D:/APM_Setup/htdocs/Smarty/templates_c/` |
* Smarty 템플릿 컴파일 경로: `D:/APM_Setup/htdocs/Smarty/templates_c` | **PHP 메모리 설정** | `ini_set("memory_limit", -1)` — 대용량 Excel/연말정산 처리용 |
* 템플릿 설정 경로: `SmartyConfig.php` 관리 | **캐시 무효화 헤더** | `Expires: 0`, `Cache-Control: no-cache, must-revalidate` |
| **로그 파일 위치** | `Satis/sys/log/YYYY-MM-DD_{메소드명}.txt` (날짜별 자동 생성) |
| **연말정산 데이터** | `Satis/sys/yeta_data/` (`.425` 확장자 데이터 파일) |
--- ---
## 5. 보안 및 인증 아키텍처 (Security & Authentication Architecture) ## 6. 보안 및 인증 아키텍처 (Security & Authentication Architecture)
```mermaid ```mermaid
sequenceDiagram sequenceDiagram
@@ -98,75 +201,194 @@ sequenceDiagram
actor User as 사용자 actor User as 사용자
participant Controller as Login Controller participant Controller as Login Controller
participant Auth as AuthClass participant Auth as AuthClass
participant LoginInfo as LoginInfomation
participant Session as PHP Session participant Session as PHP Session
participant DB as Oracle DB participant DB as Oracle DB
User->>Controller: 로그인 요청 (ID / Password) User->>Controller: 로그인 요청 (ID / Password)
Controller->>DB: 사용자 정보 및 권한 검증 Controller->>DB: 사용자 정보 및 권한 검증 (Oracle SP)
DB-->>Controller: 인증 성공 반환 DB-->>Controller: 인증 성공 반환 (사번/부서/직급 데이터)
Controller->>Auth: Auth_TokenGenerater() 호출 Controller->>Session: $_SESSION['satis_user_id'] 등 세션 설정
Auth->>Session: Session ID & Token 생성/저장 Controller->>Auth: Auth_TokenGenerater() 호출 (10자리 난수)
Auth->>Session: $_SESSION['Token'] 저장
Session-->>User: Session Cookie 발급 (private) Session-->>User: Session Cookie 발급 (private)
Note over User, Controller: 후속 요청 Token 및 Session 권한 검증 (Auth_TokenChecker) Note over User,Controller: 이후 모든 요청에서 Token 검증 수행
User->>Controller: 기능 요청 (Token 파라미터 포함)
Controller->>Auth: Auth_TokenChecker($Token)
Auth->>Session: $_SESSION['Token'] 비교
alt 일치
Auth-->>Controller: 정상 처리 계속
else 불일치
Auth->>Session: session_destroy() 세션 파기
Auth-->>User: auth_move_page.tpl → 로그인 이동
end
Controller->>LoginInfo: GetLoginStatus() 세션 유효성 확인
alt 세션 만료
LoginInfo-->>User: alert('로그인후 사용하세요 시간만료') + 리다이렉트
end
``` ```
1. **세션 및 인증 관리 (Session Management)** ### 6.1 세션 및 인증 관리 체계
* PHP 세션 생성 (`session_start()`, `session_cache_limiter('private')`)
* 사용자 식별자 관리: `$_SESSION['satis_user_id']`, `$_SESSION['satis_user_deptcode']`, `$_SESSION['satis_user_name']` | 항목 | 내용 |
2. **CSRF 방어 및 난수 토큰 (Token Security)** | :--- | :--- |
* `AuthClass.php` 내 10자리 영문/숫자 난수 토큰 생성기 (`Auth_TokenGenerater`) 및 검증기 (`Auth_TokenChecker`) 탑재 | **세션 방식** | PHP Native Session (`session_start()`, `session_cache_limiter('private')`) |
* 비인가 접근 시 자동 세션 파기 (`session_destroy()`) 및 로그인 페이지 전환 (`auth_move_page.tpl`) | **CSRF 방어** | `AuthClass::Auth_TokenGenerater()` — 62자 문자풀, 10자리 난수 |
3. **역할 기반 권한 통제 (RBAC / Role-Based Access Control)** | **세션 만료 처리** | `LoginInfomation::GetLoginStatus2()` — 세션/쿠키/GET 파라미터 3단계 확인 |
* `AuthClass` `GetUserInfo.php`를 통해 사용자 직급/부서/권한 등급별 메뉴 접근 권한 세분화 | **개인 권한 검증** | `PersonAuthority::GetInfo($memberID, $Item)` `member_tbl.Certificate` 컬럼 기반 |
| **개발자 권한** | `DefaultInformation.php` 화이트리스트 사번 6명 하드코딩 → `auth_page_devYN='Y'` |
| **OTP 인증** | `OracleClass::CheckOTPAuthentication()` — `SM_ERPURL_OTP` 테이블, 유효시간 1분 |
### 6.2 세션 변수 목록
| 세션 키 | 설명 |
| :--- | :--- |
| `$_SESSION['satis_user_id']` | 로그인 사원번호 (예: `"221064"`) |
| `$_SESSION['satis_user_name']` | 사원 성명 |
| `$_SESSION['satis_user_deptcode']` | 부서코드 |
| `$_SESSION['satis_user_deptname']` | 부서명 |
| `$_SESSION['Token']` | CSRF Anti-Forgery Token (10자리) |
| `$_SESSION['account_user_id']` | 계정 사용자 ID (인트라넷 연동용) |
| `$_SESSION['memberID']` | 인트라넷 회원 ID (레거시) |
| `$_SESSION['Title']` | 현재 화면 제목 |
| `$_SESSION['Auth']` | 권한 레벨 |
| `$_SESSION['Type']` | 사용자 유형 |
--- ---
## 6. 외부 시스템 연동 아키텍처 (External System Integration Architecture) ## 7. 외부 시스템 연동 아키텍처 (External System Integration Architecture)
이 시스템은 단일 DB에 의존하지 않고, 사내 타 이종(Heterogeneous) 시스템과 실시간 연결되는 하이브리드 데이터 아키텍처를 가집니다.
```mermaid ```mermaid
graph TD graph TD
SatisCore["Satis ERP Core System"] SatisCore["Satis ERP Core System<br/>(PHP Application Server)"]
SatisCore <-->|OCI Native Connection| OracleSystem["메인 그룹웨어/ERP DB (Oracle)"] SatisCore <-->|OCI Native: oci_connect('satis','SATIS11707808','samandb')| OracleDB["Oracle DB (Main ERP)<br/>그룹웨어, 인사, 회계, 프로젝트, 결재"]
SatisCore <-->|MS-SQL Driver (Port 5539)| iCubeSystem["더존 iCube ERP (MS-SQL: DZICUBE) <br/> IP: 192.168.13.50"] SatisCore <-->|mssql_connect: 192.168.13.50:5539<br/>DZGUEST/dzguest123| iCubeDB["더존 iCube ERP (MS-SQL)<br/>DB: DZICUBE<br/>회계전표 연동, 인사급여 싱크"]
SatisCore <-->|MySQL Driver (Port 3306)| IntranetSystem["인트라넷 시스템 (MySQL: hallaerp) <br/> Host: erp.samaneng.com"] SatisCore <-->|mysql_connect: erp.samaneng.com<br/>root/vbxsystem| IntranetDB["인트라넷 MySQL<br/>DB: hallaerp<br/>전자결재 사원/부서 정보, 코드 사전"]
SatisCore -->|SMS API| SMSSvc["SMS 발송 서비스<br/>기술자보수교육 대상자 알림<br/>프로젝트 미결재 알림"]
SatisCore -->|PdfLogic| PDFSvc["PDF 생성 서비스<br/>결재문서/보고서 PDF 변환"]
``` ```
1. **더존 iCube ERP 연동 (`saman_icube_dbcon.inc`)** | 연동 시스템 | 접속 방식 | 연동 목적 | 관련 파일 |
* **연동 목적**: 사내 더존 회계/인사 ERP 데이터와의 실시간 동기화 및 전표 전송 | :--- | :--- | :--- | :--- |
* **접속 방식**: Dedicated MS-SQL Connection (`192.168.13.50:5539`, DB명: `DZICUBE`) | **Oracle DB (Main)** | OCI8: `oci_connect('satis','SATIS11707808','samandb')` | ERP 핵심 데이터 (결재/인사/회계/프로젝트) | `OracleClass.php` |
2. **사내 인트라넷 연동 (`dbcon.inc`)** | **더존 iCube ERP** | MS-SQL: `192.168.13.50:5539` DB: `DZICUBE` | 회계 전표 더존 전송, 인사/급여 싱크 | `saman_icube_dbcon.inc` |
* **연동 목적**: 인트라넷 기존 데이터 및 파일 연결 | **인트라넷 MySQL** | MySQL: `erp.samaneng.com` DB: `hallaerp` | 전자결재용 사원/부서 코드, 문서 마스터 | `dbcon.inc`, `approval_function.php` |
* **접속 방식**: MySQL Connection (`erp.samaneng.com`, DB명: `hallaerp`) | **SMS 서비스** | PHP Logic 클래스 | 기술자 보수교육 대상자 알림, 프로젝트 미결재 경고 문자 | `sms_controller.php`, `sms_logic.php` |
3. **메인 Oracle DB 연동 (`OracleClass.php`)** | **PDF 서비스** | PHP Logic 클래스 | 결재 문서/보고서 PDF 변환 및 뷰 | `pdf_controller.php`, `PdfLogic.php` |
* **연동 목적**: Satis 그룹웨어 고유의 결재, 인사, 프로젝트, 출장, 자산 관리 데이터 처리
* **접속 방식**: Oracle OCI8 라이브러리 및 커스텀 트랜잭션 바인딩 처리
--- ---
## 7. 주요 업무 도메인 서브시스템 (Business Subsystems) ## 8. 프론트엔드 아키텍처 (Frontend Architecture)
| 도메인 구분 | 서브시스템 모듈 | 아키텍처적 역할 및 주요 처리 기능 | ### 8.1 프론트엔드 구성 개요
```mermaid
graph LR
subgraph "Frontend Stack (Satis/js/)"
jQuery["jQuery 1.11.3<br/>(erp_jquery-1.11.3.min.js)"]
jqGrid["jqGrid<br/>(219KB, common_jqGrid.js)"]
BigGrid["BigData Grid<br/>(50KB, common_bigdata_grid.js)"]
w2ui["w2ui 1.5 RC1<br/>(그리드/레이아웃)"]
amCharts["amCharts 3.20.15<br/>(경영분석 차트)"]
dtree["dTree<br/>(조직도/메뉴 트리)"]
Common3["common3.js (172KB)<br/>(전체 공통 함수)"]
end
```
### 8.2 주요 프론트엔드 파일 및 역할
| 파일명 | 크기 | 역할 |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| **회계/재무** | `Account` | 전표 생성/승인, 예산 관리, 결산, 재무제표, 법인세/부가세, 원가 계산 | | `common_jqGrid.js` | 219KB | jqGrid 표준 래퍼. 컬럼 정의, 정렬, 페이징, 필터, Excel 내보내기 공통화 |
| **인사/급여** | `Person` | 인사기록, 근태 관리, 급여/상여 계산, 연말정산(`yeta_data`) 처리 | | `common_bigdata_grid.js` | 50KB | 수십만 건 이상 대용량 데이터 가상 스크롤 렌더링 |
| **프로젝트/공정** | `Project`, `Project_work` | 엔지니어링 프로젝트 현장 관리, 공정률 계산, 기성 산출, 수주/매출 처리 | | `SlipTemp.js` | 182KB | 회계 임시전표 작성 클라이언트 로직 (차변/대변 자동 계산, 전표 검증) |
| **전자결재/문서** | `Document`, `Sign` | 전자결재 작성, 양식/결재선 관리, 전자서명 및 인장 관리 | | `SlipConfirm.js` | 147KB | 전표 확정 처리 로직 |
| **영업/구매** | `Sale`, `Purchase` | 수주/매출 관리, 자재 구매 신청 및 발주 처리 | | `ProjectScreen06.js` | 115KB | 프로젝트 기성/원가 화면 복잡 UI 처리 |
| **자산/도서/출장** | `Asset`, `Book`, `Travel` | 고정자산 추적, 도서 대여 관리, 국내/외 출장 신청 및 여비 정산 | | `ProjectScreen07.js` | 111KB | 프로젝트 원가 세부 화면 처리 |
| **시스템 관리** | `Supervisor`, `Common` | 전체 공정/부서/직급 코드 관리 (`CommonCodeList.php`), 관리자 권한 설정 | | `common3.js` | 172KB | 공통 팝업, AJAX 함수, 날짜 유틸, 입력 검증 |
| `GenerateDate.js` | 27KB | 날짜 계산/생성 유틸리티 |
| `erp_PrintAgent.js` | 2.5KB | 인쇄 에이전트 연동 |
| `dtree.js` | 12KB | 메뉴/조직도 트리 렌더링 |
| `amcharts_3.20.15.free/` | — | 경영분석, 프로젝트 현황 차트 |
| `pdfviwer/` | — | 결재문서 PDF 인라인 뷰어 |
### 8.3 Smarty 템플릿 네이밍 규칙
Smarty `.tpl` 파일은 아래의 일관된 명명 규칙을 따릅니다.
```
{화면명}_{화면번호}_{렌더링타입}_{AJAX순번}_mvc.tpl
```
| 패턴 예시 | 설명 |
| :--- | :--- |
| `LoginScreen_01_Main_mvc.tpl` | 로그인 화면 메인 렌더링 |
| `LoginScreen_01_HTML_AJAX_01_mvc.tpl` | 로그인 화면 AJAX 응답 분리 파일 |
| `AlramInfo_List_01_AJAX_02_mvc.tpl` | 알림 목록 두 번째 AJAX 응답 |
| `SCREEN_01_Main_mvc.tpl` | 비밀번호 변경 화면 |
| `SCREEN_10_Main_mvc.tpl` | 초기화 비밀번호 로그인 전용 화면 |
--- ---
## 8. 아키텍처 총평 및 고려사항 (Architectural Evaluation) ## 9. 주요 업무 도메인 서브시스템 (Business Subsystems)
1. **강점 (Strengths)**: | 도메인 | 모듈 | 컨트롤러 수 | 핵심 기능 |
* **명확한 모듈화**: 업무 도메인별 Controller, Model, View가 체계적으로 분리되어 있어 대규모 ERP 시스템의 확장성이 확보되어 있습니다. | :--- | :--- | :---: | :--- |
* **이종 DB 유연성**: Oracle, MS-SQL(더존 iCube), MySQL을 동시에 연동하는 하이브리드 데이터 아키텍처를 안정적으로 운영합니다. | **회계/재무** | `Account` | 30 | 전표(임시/확정/자동), 시산표, 재무제표, 기성, 원가, 법인세, 부가세, 공동도급예산, 고정자산, 어음/대출 관리 |
* **대용량 그리드 최적화**: `jqGrid` 라이브러리와 메모리 해제 조치(`ini_set`)를 통해 수만 건 이상의 공정/회계 데이터 조회를 지원합니다. | **인사/급여** | `Person` | 23 | 인사기록카드, 발령, 자격증, 근태, 급여계산, 급여명세서, 퇴직금, 연말정산, 더존 싱크 |
2. **향후 아키텍처 개선 제언 (Future Roadmap)**: | **프로젝트/공정** | `Project`, `Project_work` | 15+16 | 프로젝트 마스터, 수주계약, 기성, M/M 공수, 원가현황, 선급금, 협력업체, 목표수주 관리 |
* **PHP 버전을 현대화**: Classic PHP 드라이버(`mssql_*`, `mysql_*`)를 최신 `PDO` 또는 `sqlsrv`/`mysqli`로 마이그레이션 권장. | **전자결재** | `Document`, `Sign` | 1+3 | 기안/임시저장/상신, 결재진행, 전결/반송, 전자서명 문서, 결재선 관리 |
* **하드코딩된 DB 접속 정보 격리**: `saman_icube_dbcon.inc` 등의 DB 계정 정보를 `.env` 또는 보안 설정 파일로 분리 관리 권장. | **영업** | `Sale` | 9 | 입찰, 수주 계약, 매출/기성 수금, 수금 관리, 해외 사업, 영업 계획, 실적 분석 |
| **구매** | `Purchase` | 4 | 구매 정보, 발주, 대금 청구, 정산 관리 |
| **자산/도서** | `Asset`, `Book` | 3+α | 자산 기본코드, 자산 정보, 자산 구매, 도서 대여/목록 |
| **출장** | `Travel` | 1 | 국내/해외 출장 신청 및 여비 정산 |
| **협회** | `Association` | 1 | 엔지니어링 관련 협회 가입/관리 |
| **시스템관리** | `Management`, `Supervisor` | 4+1 | 공통코드, 메뉴권한, 알림 관리, 시스템 관리자 전체 설정 |
| **공통/인프라** | `Common`, `Jqgrid`, `Fileupload` | 17+α | SMS, PDF, OTP, 팝업, 파일업로드, 그리드 JSON 응답 |
---
## 10. 아키텍처 총평 및 고려사항 (Architectural Evaluation)
### 10.1 강점 (Strengths)
| 항목 | 내용 |
| :--- | :--- |
| **체계적 모듈화** | 20개 이상 업무 도메인이 Controller-Model-View 3계층으로 명확히 분리 |
| **이종 DB 하이브리드** | Oracle(ERP), MS-SQL(더존), MySQL(인트라넷) 3개 DB를 단일 애플리케이션에서 동시 운영 |
| **대용량 그리드 최적화** | `jqGrid` + `common_bigdata_grid.js` + `ini_set("memory_limit", -1)`를 통해 수만 건 공정/회계 데이터 조회 지원 |
| **보안 이중 방어** | CSRF 토큰 + PHP 세션 + OTP 검증의 다단계 인증 구조 |
| **도메인 특화 클라이언트** | `SlipTemp.js`(182KB), `ProjectScreen06.js`(115KB) 등 업무 특화 대용량 클라이언트 스크립트 |
### 10.2 기술 부채 및 위험 요소 (Technical Debt & Risks)
> [!CAUTION]
> **레거시 PHP 드라이버 사용**: `mysql_connect()`, `mssql_connect()`는 PHP 7.0에서 완전히 제거된 deprecated 함수입니다. PHP 5.6 이하 환경에서만 실행 가능합니다.
> [!CAUTION]
> **DB 접속 정보 평문 노출**: `dbcon.inc`(root/vbxsystem), `saman_icube_dbcon.inc`(DZGUEST/dzguest123$), `OracleClass.php`(satis/SATIS11707808) 소스 코드에 DB 계정이 하드코딩되어 있습니다.
> [!WARNING]
> **SQL Injection 위험**: `approval_function.php`, `function.php` 등 다수 함수에서 `$mCode` 값을 필터링 없이 SQL에 직접 삽입합니다. `mysql_real_escape_string()` 미적용.
> [!WARNING]
> **개발자 화이트리스트 하드코딩**: `DefaultInformation.php`에 개발자 사번 6명이 소스 코드에 직접 명시되어 있어 인사이동 시 소스 수정이 필요합니다.
> [!NOTE]
> **Smarty 절대경로 의존**: `SmartyConfig.php`의 모든 경로가 `D:/APM_Setup/htdocs/`로 하드코딩되어 있어 서버 이전 시 전면 수정이 필요합니다.
### 10.3 향후 아키텍처 개선 로드맵 (Future Roadmap)
| 우선순위 | 항목 | 개선 방향 |
| :---: | :--- | :--- |
| 🔴 긴급 | **DB 접속 정보 격리** | `.env` 파일 또는 환경 변수(`getenv()`)로 분리, 소스 버전 관리에서 제외 |
| 🔴 긴급 | **PHP 버전 현대화** | `mysql_*` → `PDO/mysqli`, `mssql_*` → `sqlsrv` (PDO_SQLSRV) 마이그레이션 |
| 🟠 중요 | **SQL Injection 방어** | Prepared Statement 또는 ORM 도입, 입력값 필터링 강화 |
| 🟡 권장 | **Smarty 경로 상대화** | `SmartyConfig.php`를 `__DIR__` 기반 상대경로로 변경, 이식성 확보 |
| 🟡 권장 | **개발자 권한 DB화** | 화이트리스트 사번을 DB 권한 테이블로 이전, 운영 중 동적 변경 가능하도록 개선 |
| 🟢 선택 | **템플릿 엔진 현대화** | Smarty 2.6 → Twig/Blade 또는 React/Vue.js SPA 전환 고려 |
| 🟢 선택 | **로그 중앙화** | 날짜별 txt 파일 로그 → ELK Stack 또는 구조화 로그(JSON) 도입 |