본문으로 건너뛰기

기본 modules 소개

HandStack은 모듈러 모놀리식 아키텍처를 기반으로 만들어 집니다. 왜냐하면 모놀리식과 마이크로서비스 아키텍처의 장점을 활용하기 위해서 인데, 프로젝트의 업무 요건이나 규모에 따라 개발 및 운영 방식을 기업내에서 결정할 수 있는 방법이기 때문입니다.

HandStack 아키텍처에 대한 자세한 내용은 모듈러 모놀리식 아키텍처을 참고하세요.

애플리케이션에 필요한 주요 기능들과 발생 가능한 이슈에 대응하여 대안을 제공하며 기존에 만들었던 프로그램 단위를 module로 만들어지며 ack 프로그램으로 실행할 module 들을 선택하여 모놀리식 또는 마이크로서비스 아키텍처 방식으로 다음과 같이 스케일을 확장 할 수 있습니다.

예를 들면 전자상거래 웹 애플리케이션을 위해 필요한 주요 기능은 다음과 같습니다

  • 고객
  • 제품
  • 주문
  • 결제
  • 배송

위의 기능들은 프로젝트의 결정에 따라 하나 또는 각각의 module 단위로 개발 할 수 있습니다. 하지만 이 기능을 개발 하기 위해 매번 처음부터 구축을 할 수 없기 때문에 다음의 공통 기반이 있어야 합니다.

  • Database CRUD 거래
  • 외부 시스템과 연동을 위한 기능 개발
  • 클라이언트 인증 및 권한
  • 파일 업로드/다운로드 기능
  • 화면 개발에 필요한 UI 컴포넌트
  • 유연한 CI/CD 전략

이외에도 모니터링, 장애 확인등등 안정적인 운영을 위해 다양한 부가 기능들을 고려해야 합니다. HandStack은 기본적으로 애플리케이션을 개발하기 위한 부분을 논리적으로 추상화하여 module로 개발 및 제공합니다.

공식 modules

HandStack module은 ASP.NET Core의 모든 기능을 사용 가능한 모듈 프로젝트로 개발됩니다.

.NET Core 프로젝트의 주요 속성을 다음과 같습니다.

  • 프로그램: Project Sdk="Microsoft.NET.Sdk.Web"
  • 모듈: Project Sdk="Microsoft.NET.Sdk.Razor"
  • 라이브러리: Project Sdk="Microsoft.NET.Sdk"

module은 독립적으로 실행 할 수 없으며 라이브러리로 개발 되어지기 때문에 반드시 ack 애플리케이션 실행시 필요한 모듈을 선택적으로 로드 되어 운영됩니다. 이것은 개발 및 운영에 유연한 확장 방안을 제공합니다.

HandStack 기반으로 애플리케이션을 개발 하기 위해 .NET Core 및 C#을 배워야 할까요?

HandStack은 nginx, apache와 같은 단독 실행 가능한 웹 서버 프로그램인 ack를 제공합니다. 요구사항에 대응하여 기능을 개발 하기 위한 주요 기능들을 module로 제공합니다. 모든 프론트엔드, 백엔드 개발 언어는 웹 표준 기술인 HTML, CSS, Javascript, XML 등등 컴파일 없이 텍스트 기반의 파일로 구성됩니다.

HandStack에서는 공식 module로서 다음과 같이 기본 제공됩니다.

module명설명
checkup태넌트 앱 개발 및 운영 기능 관리
dbclientSQL Server, Oracle, MySQL & MariaDB, PostgreSQL, SQLite SQL을 관리
functionC# 또는 Node.js 기반 Function 개발 기능 관리
repository단일, 다중, 이미지, 첨부파일 등등 파일 업로드/다운로드 관리
transact거래 요청 검증 및 접근 제어 관리와 요청 정보를 dbclient, function 등등 module로 라우팅 기능 관리
loggermodule 요청/응답 구간 주요 이벤트 로그 수집 관리
wwwroot웹 공통 static assets 및 화면 단위 소스 호스팅 관리
openapi데이터베이스 데이터를 Open API로 제공 하기 위한 기능 관리

각 module 디렉토리내에 있는 module.json 설정으로 동작과 기능을 관리 할 수 있습니다. 이에 대한 자세한 사용 정보는 가이드나 참고 문서를 통해 확인 할 수 있습니다.

contracts 디렉토리 구조

여러분의 기업 내 애플리케이션의 환경 설정과 개발 소스는 프론트엔드와 백엔드 모두 C:\home\[사용자 ID]\handstack\contracts 단일 디렉토리내에서 관리됩니다. 이를 통해 Visual Studio, Eclipse, Visual Studio Code, Notepad++ 등등 프로젝트 디렉토리 기반 소스 편집 기능을 제공하는 개발 도구로 C:\home\[사용자 ID]\handstack\contracts를 지정하여 개발 가능합니다.

C:\home\[사용자 ID]\handstack\contracts
├─dbclient
├─function
├─repository
├─transact
└─wwwroot

프로젝트 관리에 필요한 소스 운영 기준을 만들기 위해 디렉토리와 파일 명명에 대한 규칙을 다음과 같이 권장합니다.

module
└─HDS: 기본 애플리케이션 ID 3자리
└─TST: 프로젝트 ID 3자리
└─TST010: 파일 ID

예를 들면 위에서 언급한 전자상거래 웹 애플리케이션을 위해 필요한 주요 기능을 다음과 같이 프로젝트 ID로 만들어 관리합니다.

  • 고객: CTM
  • 제품: PDT
  • 주문: ODR
  • 결제: PAY
  • 배송: DVR

파일 ID는 프로젝트 ID + 순번 3자리로 구성되는데 이때 순번의 앞 두자리와 01, 순서 1자리로 구성됩니다. 왜냐 하면 다음과 같이 관리하기 위함 입니다

  • TST010: TST (테스트) 프로젝트의 1번째 파일
  • TST020: TST (테스트) 프로젝트의 2번째 파일
  • TST021: TST (테스트) 프로젝트의 2번째 종속(팝업, 내부) 파일
  • TST030: TST (테스트) 프로젝트의 3번째 파일

HandStack에서 향후 공식 제공되는 모든 확장 기능들은 이 규칙을 준수합니다.

C:\home\[사용자 ID]\handstack\contracts
├─dbclient
│ └─HDS
│ └─TST
├─function
│ ├─csharp
│ │ └─HDS
│ │ └─TST
│ │ └─TST010
│ └─javascript
│ └─HDS
│ └─TST
│ └─TST020
├─repository
│ └─HDS
├─transact
│ └─HDS
│ ├─STR
│ └─TST
└─wwwroot
└─HDS
└─TST

예) 어플리케이션 계약 디렉토리

기본 modules API 목록

비즈니스 앱을 개발하기 위해 제공되는 기본 modules API 목록은 다음과 같습니다.

Account

  • GET: /checkup/api/account
  • GET: /checkup/api/account/invite-member
  • GET: /checkup/api/account/login
  • GET: /checkup/api/account/sign-in
  • GET: /checkup/api/account/signal-event
  • GET: /checkup/api/account/is-authenticated
  • GET: /checkup/api/account/logout

Aggregate

  • GET: /transact/api/aggregate/transaction-list
  • GET: /transact/api/aggregate/summary

Base64

  • GET: /dbclient/api/base64/encode
  • GET: /dbclient/api/base64/decode
  • GET: /function/api/base64/encode
  • GET: /function/api/base64/decode
  • GET: /transact/api/base64/encode
  • GET: /transact/api/base64/decode

Execution

  • GET: /function/api/execution/has
  • GET: /function/api/execution/upsert
  • GET: /function/api/execution/refresh
  • GET: /function/api/execution/delete
  • GET: /function/api/execution/get
  • GET: /function/api/execution/retrieve
  • GET: /function/api/execution/meta
  • POST: /function/api/execution

Index

  • GET: /checkup/api/index
  • GET: /checkup/api/index/has-key
  • GET: /checkup/api/index/create-id
  • POST: /checkup/api/index/create-id
  • GET: /checkup/api/index/client-ip
  • GET: /checkup/api/index/sha256hash
  • GET: /checkup/api/index/get-session
  • GET: /checkup/api/index/set-session
  • GET: /checkup/api/index/session-key
  • GET: /checkup/api/index/id
  • GET: /checkup/api/index/guid
  • GET: /checkup/api/index/encode-no
  • GET: /checkup/api/index/decode-no
  • GET: /dbclient/api/index
  • GET: /function/api/index
  • GET: /logger/api/index
  • GET: /repository/api/index
  • GET: /transact/api/index
  • GET: /wwwroot/api/index
  • GET: /wwwroot/api/index/create-id
  • POST: /wwwroot/api/index/create-id
  • GET: /wwwroot/api/index/client-ip
  • GET: /wwwroot/api/index/sha256hash
  • GET: /wwwroot/api/index/id
  • GET: /wwwroot/api/index/guid

Log

  • GET: /logger/api/log/insert
  • POST: /logger/api/log/insert
  • GET: /logger/api/log/list
  • GET: /logger/api/log/detail

Managed

  • GET: /checkup/api/managed/initailize-settings
  • GET: /dbclient/api/managed/reset-contract
  • GET: /dbclient/api/managed/reset-app-contract
  • GET: /function/api/managed/reset-contract
  • GET: /function/api/managed/reset-app-contract
  • GET: /repository/api/managed/reset-app-contract
  • GET: /transact/api/managed/reset-contract
  • GET: /transact/api/managed/reset-app-contract
  • GET: /transact/api/managed/string-encrypt
  • GET: /transact/api/managed/string-decrypt
  • GET: /openapi/api/managed/initialize-settings
  • GET: /openapi/api/managed/delete-api-service
  • GET: /openapi/api/managed/delete-api-data-source
  • GET: /openapi/api/managed/cache-clear

Query

  • GET: /dbclient/api/query/has
  • GET: /dbclient/api/query/upsert
  • GET: /dbclient/api/query/refresh
  • GET: /dbclient/api/query/delete
  • GET: /dbclient/api/query/get
  • GET: /dbclient/api/query/retrieve
  • GET: /dbclient/api/query/log
  • GET: /dbclient/api/query/meta
  • GET: /dbclient/api/query/reports
  • POST: /dbclient/api/query

Storage

  • GET: /repository/api/storage/get-token
  • GET: /repository/api/storage/get-client-ip
  • GET: /repository/api/storage/action-handler
  • GET: /repository/api/storage/get-repository
  • POST: /repository/api/storage/upload-file
  • POST: /repository/api/storage/upload-files
  • POST: /repository/api/storage/download-file
  • GET: /repository/api/storage/http-download-file
  • GET: /repository/api/storage/virtual-download-file
  • GET: /repository/api/storage/virtual-delete-file
  • GET: /repository/api/storage/get-repositorys
  • GET: /repository/api/storage/remove-item
  • GET: /repository/api/storage/remove-items
  • GET: /repository/api/storage/get-mime-type
  • GET: /repository/api/storage/get-md5hash

Transaction

  • GET: /transact/api/transaction/test
  • GET: /transact/api/transaction/has
  • GET: /transact/api/transaction/add
  • GET: /transact/api/transaction/remove
  • GET: /transact/api/transaction/refresh
  • GET: /transact/api/transaction/cache-clear
  • GET: /transact/api/transaction/cache-keys
  • GET: /transact/api/transaction/get
  • GET: /transact/api/transaction/retrieve
  • GET: /transact/api/transaction/log
  • GET: /transact/api/transaction/meta
  • POST: /transact/api/transaction/execute

OpenAPI

  • GET: /openapi/api/transaction/remove-cache
  • GET: /openapi/[interfaceID]

참고자료