diff options
| author | joonhoekim <26rote@gmail.com> | 2025-07-28 01:24:00 +0000 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-07-28 01:24:00 +0000 |
| commit | 563af36718e25d6ad6b72d3f89d571f9093df043 (patch) | |
| tree | ec516cfc3b37ca3451759761f83fe4d51a6a1e71 | |
| parent | 2650b7c0bb0ea12b68a58c0439f72d61df04b2f1 (diff) | |
(김준회) SPREADJS 키 정리, Knox 동기화 스케줄러 개선
| -rw-r--r-- | .env.development | 23 | ||||
| -rw-r--r-- | .env.production | 21 | ||||
| -rw-r--r-- | instrumentation.ts | 26 | ||||
| -rw-r--r-- | lib/knox-sync/master-sync-service.ts | 72 |
4 files changed, 95 insertions, 47 deletions
diff --git a/.env.development b/.env.development index bed62306..56db2ae4 100644 --- a/.env.development +++ b/.env.development @@ -15,18 +15,19 @@ NEXT_PUBLIC_URL=http://43.203.251.114:3000 NEXT_PUBLIC_BASE_URL=http://43.203.251.114:3001 NEXTAUTH_URL=http://43.203.251.114:3000 - +# === 상용 소프트웨어 키 === # PDFTRON KEYS NEXT_PUBLIC_PDFTRON_WEBVIEW_KEY=demo:1739264618684:616161d7030000000091db1c97c6f386d41d3506ab5b507381ef2ee2bd NEXT_PUBLIC_PDFTRON_SERVER_KEY=demo:1740034881027:6175a0fc0300000000f155d153480e5ba091f17922a109cbd7cf6e40b3 - - +# 메시어스 SPREAD JS NEXT_PUBLIC_SPREADJS_KEY=evcp.dtsolution.io,261619561743613#B14MNE5Nx3kZ8ITTwgXawIWRPNHb64ER8YmZ9NzbtxESHJUd6RTUntmUj3GZXFVQTtUZ7x6S9ADbGl7YygnN9k6UqdnR6ZjZygVZI9UbJdDUQFEbaBDUp3WVYNXMrJ5YwI4NxVzV0VjRK9kau5EZ0t4UGxGdBtmMwZjc4hnRIxUb9skca3iQjNGOuFTNCNmUDBjQ0ZncJBjcNJUTKljMShXVsNkSmVjMrckQRVnNz9kSEJHNu3GZP5mTItGbQBTazh6ZzQVcXZUOyFFVFxUblVTV4lUeIFzZSZVQtZjQS3UUxYlZIJGNu9ES9xkMyk6MOx6YMZFcYF4VFhnerF6b5YDZ4RVW8RDc6UXWh9GdStmTzNUR7R7RiojITJCLiEkRCZkRFN4MiojIIJCL6kjMzIzN6czN0IicfJye=#Qf35VfigUSKJkI0IyQiwiI8EjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsICOxATN4ADIzIjNwUjMwIjI0ICdyNkIsICNycDM5IDMyIiOiAHeFJCLi2Wau86bpRXds36c4RmLwNmdlJiOiMXbEJCLigZhsj0orTphsD1itTJlrLiOiEmTDJCLiMTM6MDN7EjN5kTM6EjNyIiOiQWSiwSfdJCdlVGaTRncvBXZSJCLiQnchh6QhRXYEJCLiUGbiFGV43mdpBlIsICdlVGaTRHduF6RislOicGbmJCLlNHbhZmOiI7ckJye0ICbuFkI1pjIEJCLi4TPB5WbohUMaNHZUlkWHxUVS94axBXQNpFNEV6TPNlWw5Gb9kUO696MjJ6MhN4aSlHdxFnNxcDd4gWNMJVdxd2WMA - -# SPREAD JS 내부망 eVCP 개발 +NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" +NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" +# SPREAD JS 내부망 eVCP 개발 (개발 배포시 이 키로 대체) # NEXT_PUBLIC_SPREADJS_KEY="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh" # NEXT_PUBLIC_SPREAD_LICENSE="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh" + # 기간계 시스템 연동 설정 ERP_API_URL=https://erp.example.com/api/vendors ERP_API_KEY=your-erp-api-key @@ -98,9 +99,6 @@ SAML_IDP_CERT="MIID2zCCAsOgAwIBAgIJAIt4QxV2bA3qMA0GCSqGSIb3DQEBCwUAMIGDMQswCQYDV # === [끝] SSO 설정 === -NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" -NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" - # Bizppurio API 설정 BIZPPURIO_ACCOUNT=shinonsap_evcp BIZPPURIO_PASSWORD=shi_2025 @@ -133,13 +131,8 @@ KNOX_API_BEARER="5a84ab62-d523-3602-ad3d-e3421893ae0c" # 운영 KNOX_API_FORCE_LIMIT=false # 주간대량호출 강제 제한 여부 KNOX_API_HOURLY_LIMIT=90 # 시간당 API 호출횟수 제한 # KNOX_API_CALL_DELAY_MS # API 배치 처리간 딜레이 수동 설정이며, 자동 산출값보다 높아야 적용 -KNOX_TITLE_SYNC_CRON="0 3 * * *" # 매일 새벽 3시 -KNOX_TITLE_SYNC_FIRST_RUN=true -KNOX_ORGANIZATION_SYNC_CRON="30 3 * * *" # 매일 새벽 3시 30분 -KNOX_ORGANIZATION_SYNC_FIRST_RUN=true -KNOX_EMPLOYEE_SYNC_CRON="0 4 * * *" # 매일 새벽 4시 -KNOX_EMPLOYEE_SYNC_FIRST_RUN=true # 양이 많으므로 시작시 갱신 X -# BASEURL: https://openapi.stage.samsung.net +KNOX_MASTER_SYNC_CRON="0 2 * * *" # cron 스케줄, 새벽 2시에 적용되며, 직급-조직도-임직원 순으로 적용. +KNOX_MASTER_SYNC_FIRST_RUN="false" # 앱 시작시 동기화 시작 여부 KNOX_API_BASE_URL="https://openapi.samsung.net" MESSENGER_ACCESS_TOKEN="" MESSENGER_DEVICE_ID="" diff --git a/.env.production b/.env.production index c0a2b8dc..2eeb9096 100644 --- a/.env.production +++ b/.env.production @@ -15,16 +15,19 @@ NEXT_PUBLIC_MUI_KEY=da30586e1f20b93856a9783012fc9258Tz04ODI0MyxFPTE3NDQ0NTM2Nzgw NEXT_PUBLIC_BASE_URL=https://evcp.dtsolution.io NEXTAUTH_URL=https://evcp.dtsolution.io +# === 상용 소프트웨어 키 === # PDFTRON KEYS NEXT_PUBLIC_PDFTRON_WEBVIEW_KEY=demo:1739264618684:616161d7030000000091db1c97c6f386d41d3506ab5b507381ef2ee2bd NEXT_PUBLIC_PDFTRON_SERVER_KEY=demo:1740034881027:6175a0fc0300000000f155d153480e5ba091f17922a109cbd7cf6e40b3 - +# 메시어스 SPREAD JS NEXT_PUBLIC_SPREADJS_KEY=evcp.dtsolution.io,261619561743613#B14MNE5Nx3kZ8ITTwgXawIWRPNHb64ER8YmZ9NzbtxESHJUd6RTUntmUj3GZXFVQTtUZ7x6S9ADbGl7YygnN9k6UqdnR6ZjZygVZI9UbJdDUQFEbaBDUp3WVYNXMrJ5YwI4NxVzV0VjRK9kau5EZ0t4UGxGdBtmMwZjc4hnRIxUb9skca3iQjNGOuFTNCNmUDBjQ0ZncJBjcNJUTKljMShXVsNkSmVjMrckQRVnNz9kSEJHNu3GZP5mTItGbQBTazh6ZzQVcXZUOyFFVFxUblVTV4lUeIFzZSZVQtZjQS3UUxYlZIJGNu9ES9xkMyk6MOx6YMZFcYF4VFhnerF6b5YDZ4RVW8RDc6UXWh9GdStmTzNUR7R7RiojITJCLiEkRCZkRFN4MiojIIJCL6kjMzIzN6czN0IicfJye=#Qf35VfigUSKJkI0IyQiwiI8EjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsICOxATN4ADIzIjNwUjMwIjI0ICdyNkIsICNycDM5IDMyIiOiAHeFJCLi2Wau86bpRXds36c4RmLwNmdlJiOiMXbEJCLigZhsj0orTphsD1itTJlrLiOiEmTDJCLiMTM6MDN7EjN5kTM6EjNyIiOiQWSiwSfdJCdlVGaTRncvBXZSJCLiQnchh6QhRXYEJCLiUGbiFGV43mdpBlIsICdlVGaTRHduF6RislOicGbmJCLlNHbhZmOiI7ckJye0ICbuFkI1pjIEJCLi4TPB5WbohUMaNHZUlkWHxUVS94axBXQNpFNEV6TPNlWw5Gb9kUO696MjJ6MhN4aSlHdxFnNxcDd4gWNMJVdxd2WMA - -# SPREAD JS 내부망 eVCP 개발 +NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" +NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" +# SPREAD JS 내부망 eVCP 개발 (개발 배포시 이 키로 대체) # NEXT_PUBLIC_SPREADJS_KEY="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh" # NEXT_PUBLIC_SPREAD_LICENSE="60.101.108.100,674672615555322#B1dbvNkSiJXZDRFRYJVQHFWa6Y6KTVGV5cVWSRVWVlHejFlcvFWUFdGVzVVZVtEcsNjNvo5aHhjcSNVd6kzNvQUT9tCSxEXU6RzRrh5SxsUYqZjertEU7RWQu3yaDNXT5JmRIh7R6YnSGZlMDhkRqB7MIlTYvUWQFFzYulTTm3ENINEV7FWZMl4Q5cXSy96KthkVC3USvYXa8FnbtJWZFdlVSFmYwsEMKRkQxp6TRdGMLdVOTR7TMJEWiRGa6JncDRlWShTN9glc8FmQkBzdvMkUthHUoJGbOJGatVmUxtkRTVmeUlVWxJDN7kXQ6oHUwhEciZXNNJVOPBzc83UaTNmZVZ6aIxUcQdmcOJiOiMlIsICNzgTN5YTQyIiOigkIsYDM6gDN6YjM0IicfJye35XX3JCSJpkQiojIDJCLigTMuYHITpEIkFWZyB7UiojIOJyebpjIkJHUiwiIyQzMxkDMgQjM7ATNyAjMiojI4J7QiwiIwATMugDMx8SMwEjLwYjI0IyctRkIsIShXyetzqekkyesEyOvCyuI0ISYONkIsIiMyMTN5UTNxYjM7YDN7YjI0ICZJJCL35lI4VWZoNFdy3GclJlIsICdyFGaDFGdhRkIsISZsJWYUR7b6lGUiwiI4VWZoNFd49WYHJyW0IyZsZmIsU6csFmZ0IiczRmI1pjIs9WQisnOiQkIsISP3cXVw2meRZ4Yys4YB3UeaJkck9GWjhHUMVlU4gUcndlS63EWCB7YZh7bHBlVwBHe5kVcvEzc5N5aBZUZlJ6SpZHTHRFVjd5dxs6Yuh" + # 기간계 시스템 연동 설정 ERP_API_URL=https://erp.example.com/api/vendors ERP_API_KEY=your-erp-api-key @@ -103,9 +106,6 @@ SAML_IDP_CERT="MIID2zCCAsOgAwIBAgIJAIt4QxV2bA3qMA0GCSqGSIb3DQEBCwUAMIGDMQswCQYDV # === [끝] SSO 설정 === -NEXT_PUBLIC_SPREAD_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" -NEXT_PUBLIC_DESIGNER_LICENSE="43.203.251.114|60.101.108.100|evcp.dtsolution.io,261619561743613#B1ZaK2ycWtEd7Z4S0FENYlXOQhWRsd7M92GewBlQGV5Qu3WcZdESRJmZup4RwljYzoEettkToRFeZJ5LnBlRhdWSDZHbtdVTQBnZttiWHhWTntScoV6LtF6YrknUa9mVyV6RkljTWtCZ5ETZr24bLpnaXd4cUlXOuhTQvMWV8MWU524K5sWRiZnVzUjTPpESrMzaxJUdMlFVntiVLtkd4hVVax6K8sEMQBFdFRUekB7QwU7LsFWQC3Ed7gEWpd7bRtSOy26cJ56LE96T5REbqJ7bl36dEZXewcUR9wWR8lWZax4RSdUSL5mZ9cmWxFWTlRlTGhjUypGZvI4UplEMJdGSy9UVj54dJREWpl4QvR6bzdFN7sCcMBlZxgTTWt4cJpURyRkI0IyUiwiIBZTMxE4QzQjI0ICSiwyNyATMwgzN9ITM0IicfJye#4Xfd5nIIlkSCJiOiMkIsICOx8idgMlSgQWYlJHcTJiOi8kI1tlOiQmcQJCLiATN8IjMwACNyYDM5IDMyIiOiQncDJCLiQjM7ATNyAjMiojIwhXRiwiIvlmLu3Wa4VHbvNHdk9CcjZXZsADMx8COwEjLxATMuAjNsQTMx8SM5IjLzAjMuMDNiojIz5GRiwiIYWI1oO00UaI1wuY1US90iojIh94QiwiIzEjNzQzNxYTN9EjNxYjMiojIklkIs4XXiQXZlh6U4J7bwVmUiwiI4JXYoNUY4FGRiwiIlxmYhRFdvZXaQJCLiQXZlh6U4RnbhdkIbpjInxmZiwSZzxWYmpjIyNHZisnOiwmbBJye0ICRiwiI34TUYlDTrEGTjlnQtR4L52yK4UjbZNzcDlzYsFWdw96VEhTdVx4RrlGat3SRnRXcjpTNfh" - # Bizppurio API 설정 BIZPPURIO_ACCOUNT=shinonsap_evcp BIZPPURIO_PASSWORD=shi_2025 @@ -132,13 +132,8 @@ KNOX_API_BEARER="5a84ab62-d523-3602-ad3d-e3421893ae0c" # 운영 KNOX_API_FORCE_LIMIT=false # 주간대량호출 강제 제한 여부 KNOX_API_HOURLY_LIMIT=90 # 시간당 API 호출횟수 제한 # KNOX_API_CALL_DELAY_MS # API 배치 처리간 딜레이 수동 설정이며, 자동 산출값보다 높아야 적용 -KNOX_TITLE_SYNC_CRON="0 3 * * *" # 매일 새벽 3시 -KNOX_TITLE_SYNC_FIRST_RUN=true -KNOX_ORGANIZATION_SYNC_CRON="30 3 * * *" # 매일 새벽 3시 30분 -KNOX_ORGANIZATION_SYNC_FIRST_RUN=true -KNOX_EMPLOYEE_SYNC_CRON="0 4 * * *" # 매일 새벽 4시 -KNOX_EMPLOYEE_SYNC_FIRST_RUN=true # 양이 많으므로 시작시 갱신 X -# BASEURL: https://openapi.stage.samsung.net +KNOX_MASTER_SYNC_CRON="0 2 * * *" # cron 스케줄, 새벽 2시에 적용되며, 직급-조직도-임직원 순으로 적용. +KNOX_MASTER_SYNC_FIRST_RUN="false" # 앱 시작시 동기화 시작 여부 KNOX_API_BASE_URL="https://openapi.samsung.net" MESSENGER_ACCESS_TOKEN="" MESSENGER_DEVICE_ID="" diff --git a/instrumentation.ts b/instrumentation.ts index 415214ce..97aa6143 100644 --- a/instrumentation.ts +++ b/instrumentation.ts @@ -12,32 +12,20 @@ export async function register() { // const { startEnhancedSyncScheduler } = await import('./lib/nonsap-sync/enhanced-sync-service'); // startEnhancedSyncScheduler(); - } catch (error) { + } catch { console.error('Failed to start Enhanced NONSAP sync scheduler.'); // 스케줄러 실패해도 애플리케이션은 계속 실행 } try { - // Knox 직급 동기화 스케줄러 시작 - const { startKnoxTitleSyncScheduler } = await import( - './lib/knox-sync/title-sync-service' + // Knox 통합 동기화 스케줄러 시작 (직급 → 조직 → 임직원 순차 실행) + const { startKnoxMasterSyncScheduler } = await import( + './lib/knox-sync/master-sync-service' ); - startKnoxTitleSyncScheduler(); + await startKnoxMasterSyncScheduler(); - // Knox 조직 동기화 스케줄러 시작 - const { startKnoxOrganizationSyncScheduler } = await import( - './lib/knox-sync/organization-sync-service' - ); - startKnoxOrganizationSyncScheduler(); - - // Knox 임직원 동기화 스케줄러 시작 - const { startKnoxEmployeeSyncScheduler } = await import( - './lib/knox-sync/employee-sync-service' - ); - startKnoxEmployeeSyncScheduler(); - } - catch (error) { - console.error('Failed to start Knox employee/organization/title sync scheduler.'); + } catch { + console.error('Failed to start Knox master sync scheduler.'); // 스케줄러 실패해도 애플리케이션은 계속 실행 } } diff --git a/lib/knox-sync/master-sync-service.ts b/lib/knox-sync/master-sync-service.ts new file mode 100644 index 00000000..5cabe9ed --- /dev/null +++ b/lib/knox-sync/master-sync-service.ts @@ -0,0 +1,72 @@ +'use server'; + +import * as cron from 'node-cron'; +import { syncKnoxTitles } from './title-sync-service'; +import { syncKnoxOrganizations } from './organization-sync-service'; +import { syncKnoxEmployees } from './employee-sync-service'; +import { + checkTimeRestriction, + logSchedulerInfo, +} from './common'; + +// 통합 CRON 스케줄 (기본: 매일 04:00) +const CRON_STRING = process.env.KNOX_MASTER_SYNC_CRON || '0 4 * * *'; + +// 애플리케이션 기동 시 최초 한 번 실행 여부 +const DO_FIRST_RUN = process.env.KNOX_MASTER_SYNC_FIRST_RUN === 'true'; + +/** + * Knox 동기화 마스터 함수 - 직급 → 조직 → 임직원 순차 실행 + */ +export async function syncAllKnoxData(): Promise<void> { + console.log('[KNOX-SYNC] 🚀 Knox 통합 동기화 시작 (순차 실행)'); + const overallStartTime = Date.now(); + + try { + // 1단계: 직급 동기화 + console.log('[KNOX-SYNC] 1/3: 직급 동기화 시작'); + await syncKnoxTitles(); + console.log('[KNOX-SYNC] 1/3: 직급 동기화 완료 ✅'); + + // 2단계: 조직 동기화 (직급 완료 후) + console.log('[KNOX-SYNC] 2/3: 조직 동기화 시작'); + await syncKnoxOrganizations(); + console.log('[KNOX-SYNC] 2/3: 조직 동기화 완료 ✅'); + + // 3단계: 임직원 동기화 (조직 완료 후) + console.log('[KNOX-SYNC] 3/3: 임직원 동기화 시작'); + await syncKnoxEmployees(); + console.log('[KNOX-SYNC] 3/3: 임직원 동기화 완료 ✅'); + + const overallDuration = Math.round((Date.now() - overallStartTime) / 1000); + console.log(`[KNOX-SYNC] 🎉 Knox 통합 동기화 완료 - 총 ${overallDuration}초 소요`); + + } catch (error) { + console.error('[KNOX-SYNC] ❌ Knox 통합 동기화 중 오류 발생:', error); + throw error; + } +} + +/** + * Knox 마스터 동기화 스케줄러 시작 + */ +export async function startKnoxMasterSyncScheduler() { + // 환경 변수에 따라 실행시 즉시 실행 여부 결정 + if (DO_FIRST_RUN) { + if (!checkTimeRestriction()) { + return; + } + + console.log('[KNOX-SYNC] 첫 실행: Knox 통합 동기화 즉시 시작'); + syncAllKnoxData().catch(console.error); + } + + // 통합 CRON JOB 등록 (기존 개별 스케줄 대신) + cron.schedule(CRON_STRING, () => { + console.log('[KNOX-SYNC] CRON 실행: Knox 통합 동기화 시작'); + syncAllKnoxData().catch(console.error); + }); + + logSchedulerInfo('통합(직급→조직→임직원)', CRON_STRING); + console.log('[KNOX-SYNC] 💡 순차 실행으로 의존성 문제 해결 (직급 완료 → 조직 완료 → 임직원 완료)'); +}
\ No newline at end of file |
