--- title: HandStack 라이선스 버전 1.0 (2024년 04월) url: https://handstack.kr/docs/라이선스 --- # HandStack 라이선스 버전 1.0 (2024년 04월) 저작권 (c) 2024, HandStack 모든 권리 보유. ## HandStack 라이선스 비즈니스 SW를 개발하고 운영하기 위해서 신뢰할 수 있는 성능, 확장성 및 안정성이 검증된 환경이 필요합니다. HandStack은 기업의 고유 활동에 필요한 관리 업무 앱을 합리적인 비용으로 개발 및 운영하는 개발자 또는 엔지니어를 위한 고도화된 환경을 제공합니다. 다음 조건이 충족되는 경우 결과물에 대한 소스 및 바이너리 형태의 재배포 및 사용이 허용됩니다. HandStack은 기본적으로 MIT 오픈소스 라이선스를 준수합니다. 누구나 소스 코드 수정 여부에 관계없이 소스 및 바이너리 형식의 재배포 및 사용은 다음과 같은 조건에 따라 허용됩니다. - 소스 코드에 대한 전체 액세스 권한을 갖고 복제하고 수정할 수 있는가? : 예 - 내 프로젝트가 상업용이고 수익을 창출하는 경우에도 회사에서 무료로 내려받아 사용할 수 있는가? : 예 - 소스 코드를 가져와 고객사 인프라에서 실행하는 제품 및 서비스를 만들어 판매할 수 있는가? : 예 - HandStack 기술로 사용하는 제품을 무료로 만들 수 있는가? : 예 - Dockerlize 환경과 같이 git pull > build > run' 할 수 있는가? : 예 - 소스 코드를 가져와 클라우드 또는 셀프 호스트에서 실행하는 SaaS 제품 및 서비스를 만든 후 이를 재 판매할 수 있는가? : 아니요 - HandStack의 이름이나 기여자의 이름을 제품을 보증하거나 홍보하는 데 사용할 수 있는가? : 아니오 > HandStack은 웹 서비스와 클라우드 네이티브 기반 앱을 만들기 위한 개발 언어, 시스템간 거래, 데이터베이스 처리, 인프라 관리, 개발 프레임워크등을 포함하는 풀스택 기술 집합입니다. '투명하게 있는 그대로' 소스 코드와 문서, 예제를 제공하며 어떠한 명시적 또는 묵시적 보증을 포함하지 않습니다. 어떠한 경우에도 HandStack 및 기여자는 책임을 지지 않습니다. HandStack 및 내부에서 사용 중인 오픈소스 라이선스 저작권과 특허를 준수하세요. 소프트웨어 산업은 신뢰를 기반으로 합니다. nuget.org, npmjs.com 또는 다른 곳에 게시된 라이브러리를 포함한 모든 필수 또는 선택적 종속 요소의 라이선스를 알고 있어야 합니다. ### HandStack 라이선스 요약 1. 사용자는 자신의 선택에 따라 이 소프트웨어에 상업적 또는 오픈소스 라이선스를 부여할 수 있습니다. 2. 버그를 보고하고 이 저장소에 기여하는 것이 적극 권장됩니다. 3. 기여자는 목소리를 낼 수 있지만 프로젝트 또는 소프트웨어 소유자는 아닙니다. ### 기여를 감사하고 환영합니다. * 이 라이브러리를 개선할 수 있는 기술이 있다면 공유해 주세요: https://github.com/handstack77/handstack/pulls * 이 저장소, 모든 포크 또는 사본에 대한 기여는 MIT 라이선스 조건에 따라 HandStack에 남습니다. * 기여한 중요한 코드에 메모를 추가할 수 있지만, 변경 사항에 대한 저작권이나 특허를 가질 수는 없습니다. * 모든 코드나 문서가 가치 있는 것은 아닙니다. HandStack은 재량에 따라 기여자의 변경 사항을 편집, 사용 또는 폐기할 수 있습니다. * 본 저장소의 소프트웨어와 모든 파생 저작물 및 관련 특허는 HandStack의 자산으로 유지됩니다. * 이 코드베이스를 크게 개선한 경우 HandStack은 기여자를 공식 프로젝트 기여자로 초대하고 배지를 부여할 수 있습니다. ### 버그 및 이슈를 공유해주세요. * 버그를 발견하면 다른 사람에게 위임하기 전에 직접 수정해 주세요. * 문제가 이미 문서화되어 있는 경우 이슈 로그를 확인하세요. * 기술적으로 가능하다면 풀 리퀘스트를 만드세요. * 이슈를 게시하려면: https://github.com/handstack77/handstack/issues --- ## 상업용 라이선스 https://www.qcn.co.kr/#contact 에서 상업용 라이선스를 구매하여 기업의 비즈니스를 위한 신뢰할 수 있는 추가 기능과 상업적 지원이 필요한 소프트웨어 및/또는 파생 저작물에 대한 상업용 라이선스를 선택할 수 있습니다. ### 상업용 라이선스 요약 무료인 것에 대해 비용을 지불해야 하는 경우가 많습니다. 양 당사자가 구매하고 동의한 경우 상업용 라이선스 고객에게 다음과 같은 지원이 제공됩니다. * 메인 프레임 화면 개발 지원 * 프로젝트 개발/운영 관리 화면 및 CLI 도구 제공 * 장애/일반 기술지원 * Activity log 로그 분석 * 구성 리소스 소개 및 가이드 제공 * 서비스 운영 교육 제공 * 화면/기능 개발 가이드 및 예제 제공 * 네트워크(LB, WAF, AG) 구성 서비스 지원 * 보안 시스템 연계 지원 * 서버 관리 서비스 연계 지원 (VM, Backup, 이중화) * 스토리지 서비스 연계 지원 (Blob, File Storage, Managed Disk) * 고객사가 필요한 상업용 라이선스로 대체할 수 있는 옵션 제공 * 커스터마이징 개발 협의 커스터마이징 개발 협의는 다음이 포함될 수 있습니다. 추가 기능 개발, 내부망, 외부망 연계 개발, 아키텍쳐 검토 및 재 설계, 인프라 신규 구축 및 확장 리소스 적정/성능 진단 , 이중화, 백업, DR 지원 --- title: 실행·화면·거래 문제 해결 url: https://handstack.kr/docs/guides/문제-해결 --- # 실행·화면·거래 문제 해결 오류가 난 단계부터 확인하세요. HTTP 상태가 200이어도 거래 응답에 오류가 있을 수 있으므로 응답 본문과 서버 로그를 함께 봅니다. ## 서버에 접속되지 않음 1. `ack` 터미널이 열려 있고 기동 오류 없이 대기 중인지 확인합니다. 2. 실행 로그의 포트와 브라우저 주소를 비교합니다. 기본 주소는 `http://localhost:8421`입니다. 3. 다른 프로그램이 같은 포트를 사용하는지 확인합니다. 포트를 바꿨다면 화면의 서버 연결 설정도 함께 맞춥니다. 관리 화면이 열리면 [게시판 첫 조회](https://handstack.kr/docs/tutorial/첫-조회)로 돌아갑니다. 명령을 찾지 못하거나 런타임 오류가 나면 [도구 확인](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기#설치-완료-기준)을 먼저 수행하세요. ## 화면이 비어 있거나 리소스가 404임 `BOD010.html`을 파일 탐색기에서 직접 열지 말고 `http://localhost:8421/view/BOD/BOD010.html`로 접속하세요. 브라우저 개발자 도구의 Network에서 HTML, `syn.loader.js`와 화면 JS 요청을 확인합니다. 404인 파일은 [계약 파일 경로](https://handstack.kr/docs/reference/식별자와-파일-경로)와 비교하세요. 설정을 변경했다면 [wwwroot 모듈](https://handstack.kr/docs/reference/api/modules/wwwroot)의 계약 위치도 확인합니다. 수정 후 새로고침했을 때 화면과 필요한 리소스가 모두 로드되면 다시 조회합니다. ## no such table: Board {#board-table} 실제로 연결된 SQLite 데이터베이스에 `Board` 테이블이 없는 상태입니다. 배포본에 따라 첫 조회에서 빈 테이블을 자동 생성할 수도 있으므로 모든 환경에서 이 오류가 나는 것은 아닙니다. ### 처음 실행하는 실습용 예제 :::warning 초기화하면 기존 게시글이 삭제됩니다 **게시판 Board 테이블 초기화**는 `ZD01` 계약으로 기존 `Board` 데이터와 ID 순번을 지우고 예제 데이터를 넣습니다. 기존 데이터가 있는 환경이나 운영 DB에서 실행하지 마세요. ::: 1. 별도로 준비한 실습 환경인지 확인합니다. 2. 예제 화면의 **게시판 Board 테이블 초기화** 버튼을 누르고 확인 메시지를 읽습니다. 3. 초기화 완료 후 **조회**를 누릅니다. 게시글이 표시되면 해결된 것입니다. ### 기존 데이터가 있는 환경 초기화하지 말고 `BOD010.xml`의 `datasource`와 서버에 등록된 데이터 원본이 의도한 DB 파일을 가리키는지 확인하세요. 배포본에 포함된 파일과 현재 편집한 계약이 같은지도 비교합니다. 연결을 바로잡은 뒤 조회를 다시 수행합니다. 설정 항목은 [dbclient 레퍼런스](https://handstack.kr/docs/reference/api/modules/dbclient)를 참고하세요. ## 오류는 없는데 목록이 비어 있음 - 제목을 비우고 분류를 ‘전체’로 바꿉니다. 날짜 범위에 데이터의 작성일이 포함되는지 확인하세요. - 응답 본문에 데이터가 있는지 확인합니다. 없다면 SQL 조건과 연결 DB를 확인합니다. - 응답에는 데이터가 있는데 화면만 비었다면 HTML의 `syn-datafield`와 JS의 `outputs[].dataFieldID`, 계약의 출력 형식과 순서를 비교합니다. 이름을 맞춘 뒤 다시 조회해 표시 여부를 확인하세요. [거래 호출의 연결 규칙](https://handstack.kr/docs/reference/거래-호출#입출력-연결)을 참고합니다. ## 거래 설정이나 계약을 찾지 못함 화면 JS의 거래 이름, JSON의 `ServiceID`, XML의 `statement id`를 대조하세요. `HDS / BOD / BOD010 / LD01`이 각각 어느 파일과 항목인지 [식별자 레퍼런스](https://handstack.kr/docs/reference/식별자와-파일-경로)에서 확인할 수 있습니다. 파일을 고친 뒤에도 예전 계약이 실행되면 배포본의 계약 감시·캐시 설정을 확인하세요. 서버 관리 API의 인증이나 공개 거래 범위를 오류 회피 목적으로 풀지 마세요. 재현 정보를 정리하려면 [결함 재현과 원인 분석](https://handstack.kr/docs/tutorial/테스트와-디버깅/결함-재현과-원인분석)을 확인하세요. --- title: AI 에이전트에 HandStack 문서 연결하기 url: https://handstack.kr/docs/guides/에이전트에-문서-연결하기 --- # AI 에이전트에 HandStack 문서 연결하기 AI 코딩 에이전트에 문서 MCP(Model Context Protocol) 서버를 등록하면, 에이전트가 HandStack 규칙을 기억에 의존해 답하지 않고 이 사이트의 문서를 직접 검색해 근거로 삼습니다. 에이전트는 문서 전체를 컨텍스트에 싣지 않고 `search_docs`로 후보를 찾은 뒤 `get_doc`으로 필요한 섹션만 가져옵니다. 서버 주소는 `https://handstack.kr/mcp`입니다. 설치할 것이 없고, 읽기 전용이며, 로그인이 필요 없습니다. ## 시작 조건 - Claude Code, Codex CLI, Cursor처럼 원격(Streamable HTTP) MCP 서버를 지원하는 AI 에이전트가 설치되어 있어야 합니다. - 에이전트를 실행하는 PC에서 `https://handstack.kr`에 접속할 수 있어야 합니다. ## 절차 ### 1. 서버 등록하기 사용하는 에이전트의 방법을 고르세요. **Claude Code** ```bash claude mcp add --transport http handstack-docs https://handstack.kr/mcp ``` 팀 전체가 쓰려면 프로젝트 루트의 `.mcp.json`에 넣고 저장소에 커밋합니다. ```json { "mcpServers": { "handstack-docs": { "type": "http", "url": "https://handstack.kr/mcp" } } } ``` **Codex CLI** ```bash codex mcp add handstack-docs --url https://handstack.kr/mcp ``` 설정 파일(`~/.codex/config.toml`)에 직접 쓰려면 다음과 같이 추가합니다. 신뢰하는 프로젝트에서는 프로젝트의 `.codex/config.toml`에 넣어 팀이 함께 쓸 수도 있습니다. ```toml [mcp_servers.handstack-docs] url = "https://handstack.kr/mcp" ``` **Cursor 및 원격 MCP를 지원하는 클라이언트** MCP 설정 파일에 서버 주소를 추가합니다. 클라이언트가 원격 MCP 서버 주소 입력을 지원하면 같은 주소를 쓸 수 있습니다. ```json { "mcpServers": { "handstack-docs": { "url": "https://handstack.kr/mcp" } } } ``` ### 2. 새 세션에서 연결 확인하기 등록하기 전에 열어 둔 세션에는 반영되지 않습니다. **현재 세션을 끝내고 새 세션을 시작하세요.** 데스크톱 앱이라면 앱을 재시작하면 확실합니다. **Claude Code** - 새 세션에서 `/mcp`를 입력하면 등록된 서버와 연결 상태가 보입니다. `handstack-docs`가 연결됨으로 보여야 합니다. - 세션 밖에서는 터미널에서 `claude mcp list`로 확인합니다. - 기본 등록 범위(`local`)는 **등록한 프로젝트 폴더에서만** 보입니다. 모든 프로젝트에서 쓰려면 `--scope user`로 등록하세요. 프로젝트의 `.mcp.json`으로 등록했다면 그 프로젝트를 열 때 서버를 사용할지 묻는 확인이 처음 한 번 나옵니다. **Codex CLI** - 새 세션에서 `/mcp`를 입력하거나, 터미널에서 `codex mcp list`를 실행합니다. 목록에 `handstack-docs`가 보여야 합니다. - `codex mcp add`로 등록하면 `~/.codex/config.toml`에 저장되므로 **같은 사용자 계정의 이후 모든 세션**에서 유지됩니다. 프로젝트의 `.codex/config.toml`에 넣었다면 그 프로젝트에서만 보입니다. **서버 자체 확인** - 브라우저에서 [`https://handstack.kr/mcp`](https://handstack.kr/mcp)를 엽니다. 서버 상태 페이지가 보이면 서버는 실행 중입니다. 이 페이지는 상태 확인용이며 도구 호출은 에이전트가 합니다. ### 3. 에이전트에 요청하기 문서를 근거로 작업하도록 **사용을 명시적으로 지시**하면 가장 확실합니다. 먼저 도구가 실제로 호출되는지 가볍게 확인해 보세요. > handstack-docs의 list_docs로 영역별 문서 수를 알려줘. **Claude Code에서** > handstack-docs MCP를 사용해 HandStack 화면 개발 규칙을 확인한 뒤, BOD010과 같은 목록 조회 화면을 구현해 줘. - 응답 중간에 `search_docs`, `get_doc` 같은 도구 호출이 보이면 문서를 근거로 작업하는 것입니다. Claude Code에서는 `mcp__handstack-docs__search_docs`처럼 `mcp__서버이름__도구이름` 형태로 표시됩니다. - 처음 도구를 호출할 때 허용 여부를 묻습니다. 읽기 전용 서버이니 허용해도 됩니다. 매번 묻지 않게 하려면 `.claude/settings.json`에 `{"permissions": {"allow": ["mcp__handstack-docs"]}}`를 추가하세요. - `/mcp`에서 서버가 연결 실패로 보이면 [실패하면](#실패하면)의 표를 확인하세요. **Codex CLI에서** > handstack-docs MCP를 사용해 HandStack 화면 개발 규칙을 확인한 뒤, BOD010과 같은 목록 조회 화면을 구현해 줘. - 응답 중간에 `handstack-docs`의 `search_docs`, `get_doc` 호출 내역이 보이면 문서를 근거로 작업하는 것입니다. - 도구 호출 승인을 묻는 화면이 나오면 읽기 전용 서버이니 허용해도 됩니다. - 다른 세션에서 쓰던 `handstack-docs`가 안 보이면 `codex mcp list`로 등록이 남아 있는지, 새 세션인지 확인하세요. **이런 요청도 쓸 수 있습니다** - "handstack-docs로 쿼리 ID 규칙을 찾아서 LD01 형식으로 새 SQL 계약을 만들어 줘." - "prompter 모듈에서 MCP 서버 사용 범위를 제한하는 설정을 문서에서 확인해 줘." - "handstack-docs의 get_sample로 prompter decision 예제를 찾아서 구조를 설명해 줘." 매번 사용을 지시하기 번거롭다면 프로젝트의 `AGENTS.md`(Codex)나 `CLAUDE.md`(Claude Code)에 "HandStack 규칙은 handstack-docs MCP로 확인한다"는 문구를 넣어 두세요. 템플릿은 [프로젝트 규칙 파일과 함께 쓰기](#프로젝트-규칙-파일과-함께-쓰기)를 참고하세요. 검색은 한글 조사가 붙어도 찾도록 2글자 단위로 색인합니다. API 이름(`syn.$w.transactionAction`), 설정 키, 식별자는 그대로 검색하세요. 바이브 코딩 지침 같은 보조 자료는 순위가 낮게 반영됩니다. ## 연결 해제하기 에이전트에 등록한 정보만 지우면 됩니다. 서버와 프로젝트 파일에는 영향이 없고, 다시 연결하려면 위의 등록 절차를 반복하면 됩니다. **Claude Code** ```bash claude mcp remove handstack-docs ``` 같은 이름을 여러 범위에 등록했다면 범위를 지정해 지웁니다. ```bash claude mcp remove handstack-docs --scope local # 또는 user, project ``` - `.mcp.json`으로 팀과 공유하고 있다면 파일에서 `handstack-docs` 항목을 지우고 커밋해야 팀원에게도 반영됩니다. - `.claude/settings.json`에 `mcp__handstack-docs` 자동 허용 규칙을 넣었다면 함께 지웁니다. - `claude mcp list`에 더 이상 보이지 않으면 해제된 것입니다. 이미 열려 있는 세션은 다시 시작하세요. **Codex CLI** ```bash codex mcp remove handstack-docs ``` - `~/.codex/config.toml`에 직접 적었다면 `[mcp_servers.handstack-docs]` 블록을 지워도 됩니다. - 프로젝트의 `.codex/config.toml`에 넣은 항목은 위 명령으로 지워지지 않습니다. 해당 파일에서 직접 지우세요. - 지우지 않고 잠시 쓰지 않으려면 설정 파일의 해당 블록에 `enabled = false`를 두는 방법도 있습니다. - `codex mcp list`에서 확인합니다. **Cursor 및 기타 클라이언트** MCP 설정 파일에서 `handstack-docs` 항목을 지우고 클라이언트를 다시 시작합니다. **규칙 파일도 함께 정리하세요.** 프로젝트의 `AGENTS.md`나 `CLAUDE.md`에 "handstack-docs 도구로 문서를 조회하라"는 안내가 남아 있으면 에이전트가 없는 도구를 찾습니다. 해당 문구를 지우거나 [MCP를 쓸 수 없을 때](#mcp를-쓸-수-없을-때)의 `llms.txt` 안내로 바꾸세요. ## 제공 도구 | 도구 | 용도 | 주요 인자 | |---|---|---| | `search_docs` | 키워드로 관련 섹션 검색 | `query`, `section`, `module`, `limit` | | `get_doc` | 문서 본문 또는 한 섹션 읽기 | `doc`(id·URL·제목), `section`, `max_chars` | | `list_docs` | 영역·모듈·경로별 문서 목록 | `section`, `module`, `prefix` | | `get_sample` | 문서에 딸린 예제 파일 조회 | `path`, `query` | `section` 값은 `startup`(시작하기), `tutorial`(따라 만들기), `guides`(작업별 가이드), `reference`(API·설정 참조), `ide`(IDE 사용하기), `twelvefactor`(배포·운영 원칙)입니다. `module`은 `transact`, `dbclient`, `wwwroot`, `prompter`처럼 서버 모듈 문서를 가리킵니다. ## 프로젝트 규칙 파일과 함께 쓰기 MCP 서버는 문서를 찾아 주고, 프로젝트별 규칙은 에이전트 지침 파일이 맡습니다. 둘을 함께 두면 에이전트가 먼저 문서를 확인하고 규칙을 지킵니다. - [AGENTS.md 템플릿](https://handstack.kr/docs/reference/vide-coding-instruction/examples/AGENTS): 식별자, 파일 배치, 계약 작성, 보안 규칙 - [CLAUDE.md 템플릿](https://handstack.kr/docs/reference/vide-coding-instruction/examples/CLAUDE): Claude Code의 문서 조회 방식, 작업 순서, 검증 규칙 ## MCP를 쓸 수 없을 때 MCP를 지원하지 않는 도구나 웹 기반 에이전트에는 정적 파일을 제공합니다. | 파일 | 내용 | |---|---| | [`/llms.txt`](https://handstack.kr/llms.txt) | 문서별 한 줄 설명과 링크 목차 | | [`/llms-full.txt`](https://handstack.kr/llms-full.txt) | 전체 문서 본문(약 3MB) | | `/llms-startup.txt`, `/llms-tutorial.txt`, `/llms-guides.txt`, `/llms-reference.txt`, `/llms-ide.txt`, `/llms-twelvefactor.txt` | 영역별 본문. 전체 파일이 너무 클 때 필요한 영역만 사용 | ## 동작 방식 1. 문서 사이트를 빌드할 때 플러그인이 모든 문서를 순수 마크다운으로 바꾸고 섹션(H2·H3) 단위로 나눠 `https://handstack.kr/agent/docs-index.json`을 만듭니다. 2. 서버는 이 인덱스를 읽어 검색하고, 10분마다 새 배포를 확인합니다. 새 문서가 배포되면 클라이언트 설정을 바꾸지 않아도 반영됩니다. 3. 요청마다 응답 하나를 돌려주는 방식이라 세션이나 로그인 정보를 저장하지 않습니다. 4. 남용을 막기 위해 IP당 분당 요청 수를 제한합니다. 제한을 넘으면 `429` 응답이 오고 `Retry-After` 초 뒤에 다시 시도하면 됩니다. ## 실패하면 | 증상 | 확인할 것 | |---|---| | 서버에 연결되지 않음 | 브라우저로 `https://handstack.kr/mcp`를 열어 상태 페이지가 보이는지. 사내 프록시가 `POST`를 막는지 | | `429` 응답 | 요청 제한을 넘었습니다. `Retry-After` 초 뒤에 다시 시도하세요 | | `403` 응답 | 브라우저 기반 클라이언트의 `Origin`이 허용 목록에 없습니다. 일반 MCP 클라이언트는 영향이 없습니다 | | 최신 문서가 반영되지 않음 | 새 배포 후 10분 정도 기다리세요 | | 검색 결과가 엉뚱함 | 질문 문장 대신 핵심 키워드(API 이름, 식별자)로 검색하고 `section`·`module`로 좁히기 | | 해제했는데 도구가 계속 보임 | 다른 범위(local·user·project)나 프로젝트의 `.mcp.json`·`.codex/config.toml`에 같은 이름이 남아 있는지 확인하고, 열려 있던 세션을 다시 시작하세요 | ## 직접 운영하기 사내망에서 같은 서버를 운영하거나 문서를 수정하면서 확인하려는 경우의 방법입니다. 사이트 호스트에 서버를 붙이는 방법과 환경 변수는 저장소의 `mcp/README.md`에 정리되어 있습니다. ### 서버만 따로 실행하기 저장소의 `mcp/` 폴더에서 실행합니다. 기본적으로 `127.0.0.1:8787`에만 바인딩합니다. ```bash cd mcp npm install HANDSTACK_DOCS_INDEX=../build/agent/docs-index.json npm start claude mcp add --transport http handstack-docs-local http://127.0.0.1:8787/mcp codex mcp add handstack-docs-local --url http://127.0.0.1:8787/mcp # Codex CLI ``` ### 문서를 고치면서 확인하기 사이트 개발 서버(`npm run start`)가 MCP 서버를 함께 실행하고 `http://localhost:3000/mcp`로 제공합니다. 문서를 저장하면 검색 인덱스가 자동으로 갱신되고 1분 안에 MCP 응답에 반영됩니다. `mcp/`에서 `npm install`을 한 번 해 두어야 합니다. ```bash npm install --prefix mcp npm run start claude mcp add --transport http handstack-docs-dev http://localhost:3000/mcp codex mcp add handstack-docs-dev --url http://localhost:3000/mcp # Codex CLI ``` 브라우저로 `http://localhost:3000/mcp`를 열면 상태 페이지가 보입니다. 끄려면 `AGENT_DOCS_MCP=false npm run start`로 실행하세요. --- title: 작업별 가이드 url: https://handstack.kr/docs/guides/ --- # 작업별 가이드 지금 해결할 작업을 고르세요. 처음 사용한다면 [게시판 첫 조회](https://handstack.kr/docs/tutorial/첫-조회)부터 진행합니다. | 할 일 | 문서 | |---|---| | 화면에 입력과 목록 배치 | [목록 화면 작성](https://handstack.kr/docs/tutorial/화면저작/목록-화면-작성), [UI 예제 모음](https://handstack.kr/docs/startup/learning/ui-library/ui-library-소개) | | 조회 버튼에 거래 연결 | [이벤트와 거래 연결](https://handstack.kr/docs/tutorial/화면동작과-거래연결/이벤트와-거래-연결) | | SQL 작성과 검증 | [SQL 계약 작성](https://handstack.kr/docs/tutorial/dbclient-SQL계약/CRUD-계약-작성), [단독 검증](https://handstack.kr/docs/tutorial/dbclient-SQL계약/단독-검증과-동적SQL) | | 화면과 SQL 사이 연결 점검 | [CRUD 거래 연결과 검증](https://handstack.kr/docs/tutorial/transact-거래계약/CRUD-거래-연결과-검증) | | 서버 함수 추가 | [function 모듈 실습](https://handstack.kr/docs/tutorial/확장모듈/function-모듈-실습) | | 파일 업로드·다운로드 | [repository 모듈](https://handstack.kr/docs/reference/api/modules/repository) | | 설치·실행·조회 오류 해결 | [증상별 문제 해결](https://handstack.kr/docs/guides/문제-해결) | | 환경별 설정과 비밀정보 관리 | [환경설정과 보안](https://handstack.kr/docs/tutorial/환경설정과-보안/) | | 빌드·배포 | [빌드·릴리즈·실행 절차](https://handstack.kr/docs/twelvefactor/빌드-릴리즈-실행/빌드-릴리즈-실행-절차) | | 운영 인수인계 | [인수인계 체크리스트](https://handstack.kr/docs/tutorial/모니터링과-운영인수인계/인수인계-체크리스트) | | AI 코딩 에이전트가 HandStack 문서를 직접 찾아 읽게 하기 | [AI 에이전트에 HandStack 문서 연결하기](https://handstack.kr/docs/guides/에이전트에-문서-연결하기) | 세부 작업 예제는 왼쪽 **작업별 실습 모음**에 있습니다. 이름이나 설정값으로 찾으려면 [API·설정 참조](https://handstack.kr/docs/reference/)를 이용하세요. --- title: 도메인 모델과 SDLC 문서 url: https://handstack.kr/docs/ide/guides/도메인-모델링 --- # 도메인 모델과 설계 근거 남기기 화면을 만들기 전에 데이터 구조와 사용자 흐름을 정리할 때 사용합니다. 모든 도구를 채우기보다 **지금 결정할 질문 하나**에 맞는 도구를 선택하세요. ## 데이터 구조부터 정리 1. **업무 > 도메인 모델 > 메타 정보 관리 > 엔티티 관리**에서 엔티티와 필드를 만듭니다. 2. 필드의 PK·NN·IX·AI·UI와 관계·열거형을 확인하고 저장합니다. 3. **앱 데이터베이스 관리**에서 앱 업무를 만들고 필요한 엔티티를 테이블로 가져옵니다. 4. DBML·ERD에서 관계를 확인합니다. 구조를 고치려면 엔티티 관리에서 수정한 뒤 다시 가져옵니다. 엔티티 관리의 **DBML 직접 편집**은 문법·참조 검사를 거쳐 모델에 반영합니다. 반면 앱 데이터베이스의 DBML은 읽기 전용입니다. **모델 저장이나 ERD 표시가 실제 DB 테이블 생성·변경을 뜻하지는 않습니다.** DB 적용은 대상 DB와 SQL을 따로 검증하세요. ## 질문에 맞는 SDLC 도구 선택 **업무 > 도메인 모델** 아래에서 찾습니다. | 폴더 | 결정할 질문 | 도구 | |---|---|---| | 기획·계획 | 무엇을 만들고 먼저 할까? | ERRC, 중요도–불확실성, 친화도, 이해관계자, 고객 여정, 마인드맵, RICE | | 기획·계획 | 누가 언제까지 할까? | WBS, Gantt, RACI, PERT 일정 예측 | | 분석 | 사용자·업무·데이터는 어떻게 흐를까? | 유스케이스, 활동, DFD, BPMN | | 설계 | 책임·상태·호출 관계는 무엇인가? | 클래스, 시퀀스, 객체, 상태 머신, 컴포넌트, 패키지 | | 구현 | 어디에서 실행되고 통신하는가? | 배치, 네트워크 | ## 작은 실습: 조회 흐름 연결 1. 같은 **앱 업무**를 선택하고 유스케이스 문서에 ‘항목 검색’을 만듭니다. 2. 시퀀스 문서에 사용자 → 화면 → 거래 → DB의 요청·응답을 표현합니다. 3. **문서 연계**에서 두 문서를 연결하고 **문서 열기**로 이동합니다. 4. 각 문서를 저장하고 다시 열어 내용·관계가 유지되는지 확인합니다. 처음에는 **추천 구조**를 읽어 보고, 실제 작업에는 필요한 요소만 남기세요. 문서 연계는 근거를 추적하는 기능이며 코드 생성·서버 배포를 대신하지 않습니다. 여러 탭에서 같은 문서를 수정해 충돌하면 편집본을 새 복사본으로 보존합니다. ## PC를 옮기기 전에 모델은 작업 영역 파일과 별도로 관리됩니다. 엔티티, 앱 데이터베이스, SDLC의 백업 범위를 구분하세요. **업무 백업**은 선택 앱 업무의 SDLC 문서를 내보내며 테이블·관계 백업과는 별개입니다. **업무 복원은 해당 업무의 SDLC 문서를 교체**하므로 현재 데이터를 먼저 백업합니다. [백업 대상 표](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#백업-대상)를 확인한 뒤 별도 검증 환경에서 문서 목록과 연계가 복원되는지 시험하세요. --- title: Tabler 웹 페이지 제작 url: https://handstack.kr/docs/ide/guides/tabler-studio --- # 서버 없이 화면 시안 만들기 **도구 > 개발 도구 > Tabler 웹 페이지 제작**은 일반 HTML 시안을 만드는 도구입니다. HandStack 거래와 컨트롤 실행을 연결할 화면은 [View Designer 학습](https://handstack.kr/docs/ide/learn/화면-편집하기)을 이용하세요. ## 1. 화면 추가하고 편집 1. **화면 추가 (+)**에서 빈 페이지나 목적에 맞는 기본 템플릿을 고릅니다. 2. 구성요소를 추가하고 요소 계층에서 대상 요소를 선택합니다. 3. 속성에서 문구와 크기를 바꿉니다. 이동은 선택 상자의 **이름 레이블**을 드래그합니다. 4. **미리보기**에서 표시 결과를 확인합니다. 템플릿의 검색·저장 버튼과 HandStack Controls는 디자인용 예시입니다. 실제 거래, 업로드 서버, 지도 API나 고급 컨트롤 라이브러리는 자동 연결되지 않습니다. ## 2. 저장과 내보내기 구분 | 작업 | 목적 | |---|---| | 저장 | 다시 편집할 `.project.json` 프로젝트 파일 갱신 | | 소스보기·소스 적용 | 화면 HTML 원문 편집 | | HTML 내보내기·퍼블리싱 | 다른 환경에서 제공할 화면과 자산 경로 확인 | 처음 저장할 때 위치·파일명을 정하고 `.project.json` 확장자를 포함하세요. 브라우저의 임시 복구 데이터는 파일 저장을 대신하지 않습니다. 기존 파일을 열어 편집했다면 저장 시 그 파일을 갱신합니다. 이미지 파일 선택은 주소를 입력하는 기능이지 파일을 자동 복사·포함하는 기능이 아닙니다. 내보낸 환경에서도 같은 자산 경로를 제공해야 합니다. ## 3. 다시 열어 확인 프로젝트를 다시 열어 요소·중첩 구조가 유지되는지 확인하고, 내보낸 HTML도 확인하세요. 모바일 미리보기는 크기를 바꿔 보는 기능이며 반응형 `@media` 규칙을 자동 생성하지 않습니다. Studio의 저장 마커는 `data-studio-props`입니다. View Designer의 `data-designer-*`와 혼용하지 마세요. 두 도구의 원본 차이는 [파일과 저장 규칙](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#화면-원본)에 정리되어 있습니다. --- title: IDE 사용하기 url: https://handstack.kr/docs/ide/ --- # IDE 사용하기 HandStack IDE(`stavlo`)는 작업 영역의 소스, 화면 디자이너, 계약 편집기와 개발 서버 도구를 한곳에서 다룹니다. 먼저 파일 하나를 저장하고, 화면 → 계약 → 실행 결과를 연결하며 익혀 보세요. 아직 설치하지 않았다면 [IDE 설치하기](https://handstack.kr/ide)에서 배포 파일을 확인하세요. ## 처음이라면 이 순서로 | 단계 | 해 볼 일 | 다음 단계로 넘어갈 기준 | |---|---|---| | 1. [작업 영역 열기](https://handstack.kr/docs/ide/learn/작업영역-열기) | 파일을 고치고 저장·다시 열기 | 실제 파일에 변경이 남음 | | 2. [프로젝트와 서버](https://handstack.kr/docs/ide/learn/프로젝트와-서버) | 예제 프로젝트를 만들고 개발 서버 연동 | 작업 영역·서버 경로·포트를 구분함 | | 3. [화면 편집하기](https://handstack.kr/docs/ide/learn/화면-편집하기) | View Designer에서 문구 하나 변경 | 저장 후 다시 열어도 화면 구조가 유지됨 | | 4. [계약 실행하기](https://handstack.kr/docs/ide/learn/계약-실행하기) | 같은 조회를 SQL·거래·화면에서 비교 | 입력값과 결과가 세 곳에서 일치함 | | 5. [메뉴와 검증](https://handstack.kr/docs/ide/learn/메뉴와-검증) | 업무 메뉴 연결, 빈 결과·실패 확인 | 성공과 실패를 응답·로그로 설명함 | | 6. [운영 인수인계](https://handstack.kr/docs/ide/learn/운영-인수인계) | 백업과 재현 기록 전달 | 다른 사람이 같은 결과를 확인함 | 실습에는 별도 프로젝트와 실습 DB를 사용합니다. 이 경로의 새 프로젝트 예시는 `idelab` / `LAB`입니다. [따라 만들기](https://handstack.kr/docs/tutorial/)의 게시판 예제와는 파일·DB 구조가 다르므로 두 예제의 계약을 섞지 마세요. ## 이미 사용 중이라면 - 기능 위치: [메뉴와 도구](https://handstack.kr/docs/ide/reference/메뉴와-도구) - `.txn`, `.dbc`, `pageMappings`, `data-designer-*`: [파일과 저장 규칙](https://handstack.kr/docs/ide/reference/파일과-저장-규칙) - 키보드 조작: [단축키](https://handstack.kr/docs/ide/reference/단축키) - 포트·미리보기·설정 저장: [설정과 보안](https://handstack.kr/docs/ide/reference/설정과-보안) - 증상부터 찾기: [문제 해결](https://handstack.kr/docs/ide/reference/문제-해결) 설계를 먼저 정리하려면 [도메인 모델링](https://handstack.kr/docs/ide/guides/도메인-모델링), 서버 없이 HTML 시안을 만들려면 [Tabler 웹 페이지 제작](https://handstack.kr/docs/ide/guides/tabler-studio)을 선택하세요. 이 문서는 IDE의 조작과 저장·실행 경계를 설명합니다. HandStack API와 모듈 옵션의 정확한 명세는 [API·설정 참조](https://handstack.kr/docs/reference/)에서 관리합니다. 문서는 2026-09-27의 소스 기준이며, 설치된 IDE 버전에 따라 메뉴가 다를 수 있습니다. --- title: 4. 계약 실행하기 url: https://handstack.kr/docs/ide/learn/계약-실행하기 --- # SQL·거래·화면의 결과 비교하기 화면이 비어 있을 때 원인을 한꺼번에 추측하지 말고 SQL → 거래 → 화면 순으로 확인합니다. 개발 서버와 실습 데이터 원본을 먼저 준비하세요. :::warning ‘조회’도 실행 전에 SQL을 확인하세요 현재 새 프로젝트 템플릿의 `LD01`에는 `CREATE TABLE`과 초기 데이터 `INSERT`가 포함되어 있습니다. 조회 버튼도 DB를 변경할 수 있습니다. 실제 `.dbc`를 읽고 **별도의 실습 DB**인지 확인한 뒤 실행하세요. README의 DDL과 계약 SQL이 다르면 먼저 스키마·키 타입을 대조합니다. ::: ## 1. SQL 계약부터 확인 1. **개발 > dbclient**에서 `LAB010.dbc`를 엽니다. 2. 왼쪽 계약 구성에서 `LD01`을 선택합니다. 3. 헤더의 데이터 원본과 SQL, 파라미터를 확인한 뒤 저장합니다. 4. **쿼리 실행**으로 결과와 메시지를 확인합니다. 현재 생성 예제의 검색 입력은 `SearchItemName`, `SearchUseYN`입니다. 설치 버전의 파일에 있는 이름과 기본값을 기준으로 사용하세요. `.dbc`의 파라미터에는 `@`가 붙지만 거래 입력 필드는 해당 이름을 기준으로 비교합니다. ## 2. 거래 계약 실행 1. **개발 > transact**에서 `LAB010.txn`을 열고 `LD01` 서비스를 선택합니다. 2. 저장한 뒤 **거래 실행**을 엽니다. 서비스 선택 전에는 실행 버튼이 비활성화됩니다. 3. **입력값**에 SQL 시험과 같은 조건을 넣고 **요청 JSON**에서 식별자·데이터 맵을 확인합니다. 4. 실행 후 응답의 **Table**과 **JSON**을 비교합니다. HTTP 200이어도 거래 오류가 있을 수 있습니다. 입력칸이 비어 있고 모델 ID가 `Dynamic`이면 필드를 직접 추가해 `SearchItemName`, `SearchUseYN`을 넣습니다. SQL 시험에 사용한 값과 동일하게 맞추세요. 개발 서버는 저장된 계약을 읽습니다. 미저장 경고를 무시하면 이전 내용으로 실행될 수 있습니다. 실행 팝업을 닫으면 진행 중인 요청이 취소되지만, 이를 이미 반영된 DB 변경의 복구로 해석해서는 안 됩니다. ## 3. 화면에서 같은 조건 실행 브라우저의 `LAB010`에서 같은 검색 조건으로 조회합니다. 결과가 다르면 오른쪽 **연관 계약 찾기**로 화면 → transact → dbclient를 따라가세요. 이 도구는 저장된 파일을 기준으로 하므로 수정 후 저장·새로 고침이 필요합니다. | 시험 | 확인할 결과 | |---|---| | 검색값 비움 | SQL·거래·화면의 행 수와 키가 일치 | | 존재하는 항목명 일부 | 조건에 맞는 행만 표시 | | 존재하지 않는 항목명 | 빈 결과이며 실행 실패와 구별됨 | ## 직접 확인 각 시험의 입력값, 결과 건수, 오류 유무를 한 줄씩 기록하세요. SQL만 성공하면 [계약·매핑 진단](https://handstack.kr/docs/ide/reference/문제-해결#거래와-화면-결과)을 확인합니다. 거래 문법 전체는 [거래 호출 참조](https://handstack.kr/docs/reference/거래-호출)에서 찾습니다. --- title: 5. 메뉴와 검증 url: https://handstack.kr/docs/ide/learn/메뉴와-검증 --- # 업무 메뉴 연결하고 검증하기 화면 단독 실행을 확인했다면 실제 사용자가 들어오는 업무 메뉴에서도 같은 결과가 나오는지 확인합니다. ## 1. 메뉴에서 화면 열기 1. **도구 > 유틸리티 > 메뉴 정보 관리**를 엽니다. 2. 현재 프로젝트의 `wwwroot/idelab/menus.json`을 선택합니다. 3. 기존 `LAB010` 화면 메뉴를 선택하고 이름, 표시 여부, `DirectoryID`, `ItemID`를 확인합니다. 새 메뉴가 필요할 때만 추가합니다. 4. 저장한 뒤 **웹 브라우저로 열기**로 업무 셸의 메뉴·탭·기능 버튼을 확인합니다. 예시 연결은 `DirectoryID=LAB`, `ItemID=LAB010`입니다. 프로젝트에 `main.html`이 있으면 화면을 업무 셸 탭으로 엽니다. 메뉴 파일 규칙은 [메뉴와 파일 경로](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#메뉴-연결)에서 확인하세요. ## 2. 화면과 HTTP 요청 구분해서 시험 **도구 > 개발 도구 > 거래 클라이언트**에서는 실제 모듈 서버 주소·본문·헤더를 확인하며 요청을 보낼 수 있습니다. 처음 요청을 만들 때는 **Payload 작성**을 이용하고, 계약 편집기의 성공 요청과 비교하세요. | 시험 | 남길 증거 | |---|---| | 메뉴로 열어 정상 조회 | 화면 경로, 입력값, 결과 건수 | | 없는 검색값으로 조회 | 빈 목록과 오류 없는 응답 | | 시험 요청의 기능 ID만 없는 값으로 변경 | HTTP 상태와 거래 오류 메시지 | 실패 시험은 실습 서버의 복사한 요청에서만 수행합니다. 저장·삭제 계약을 무작정 실행하지 말고, 시험 후 원래 요청으로 되돌려 정상 조회를 다시 확인하세요. 기능 버튼이 보인다는 사실만으로 해당 기능이 구현된 것은 아닙니다. ## 3. 실패를 추적하기 로그 DB가 준비되었다면 **업무 > 프로젝트 관리 > 모니터링 > 거래 이력정보**에서 시각·거래·기능 ID로 좁히고 `GlobalID`로 서버 로그를 연결합니다. 로그 수집이 설정되지 않았다면 하단 **서버·콘솔·출력**에서 최초 오류를 확인합니다. 소스 수준 조사가 필요할 때만 [ack 디버깅 조건](https://handstack.kr/docs/ide/reference/문제-해결#중단점이-잡히지-않음)을 확인하세요. 화면 캡처나 요청 전문을 공유하기 전 인증 헤더·연결 문자열·개인정보를 제거합니다. ## 직접 확인 다른 사람이 반복할 수 있도록 `환경 → 입력 → 기대 결과 → 실제 결과 → 증거 위치`를 기록하세요. 정상 조회와 의도한 실패를 모두 설명할 수 있으면 완료입니다. --- title: 6. 운영 인수인계 url: https://handstack.kr/docs/ide/learn/운영-인수인계 --- # 재현 가능한 상태로 전달하기 IDE에서 저장한 것만으로 배포나 백업이 끝나지는 않습니다. 실행할 소스, 환경 설정, 모델 데이터와 검증 기록을 구분해 전달합니다. ## 1. 변경 범위 정리 모든 편집 내용을 저장하고 diff에서 화면·계약·메뉴가 같은 변경을 가리키는지 확인합니다. 설정 복제·배포 스크립트는 대상 파일을 덮어쓸 수 있으므로 생성 프로젝트의 README와 대상 환경을 먼저 확인하세요. | 전달할 것 | 반드시 확인할 내용 | |---|---| | 소스와 계약 | 기준 커밋, 변경 파일, 필요한 모듈·런타임 | | 실행 정보 | 작업 영역·서버 경로, 포트, 시작·중지 방법 | | 데이터와 설정 | 스키마 변경, 데이터 원본 ID, 비밀 값의 관리 위치 | | 검증 기록 | 대표 조회, 빈 결과, 실패 후 복구 결과 | | 복구 정보 | 직전 정상 버전, 백업 위치, 복원 조건·담당자 | 키·암호 자체를 문서에 적지 않습니다. 접근 절차와 책임자만 기록하세요. ## 2. 저장 위치에 맞춰 백업 작업 영역은 Git·파일 백업, 모델은 화면의 JSON 백업, IDE의 영속 파일은 앱 종료 후 `data` 백업을 사용합니다. 구체적인 범위는 [저장 위치 표](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#백업-대상)를 따르세요. Git만으로 WebView의 모델 데이터까지 보호되지는 않습니다. :::warning 복원은 현재 데이터를 바꿀 수 있습니다 현재 상태를 먼저 백업하고 별도 검증 환경에서 복원하세요. 특히 SDLC의 **업무 복원**은 선택 업무의 문서를 교체합니다. 코드 복원과 DB 복원은 별개이며, 서버 재시작만으로 데이터가 되돌아오지 않습니다. ::: ## 3. 새 세션에서 검증 1. 기록한 경로로 작업 영역과 서버를 다시 확인합니다. 2. 메뉴를 통해 대표 화면을 열고 동일한 입력으로 조회합니다. 3. 응답과 로그를 확인하고, 모델을 사용했다면 백업 복원 후 문서와 연계를 확인합니다. 4. 미해결 오류와 수행하지 않은 시험은 `미완료`로 남깁니다. 다른 사람이 기록만 보고 정상 조회와 점검을 반복하면 이 학습 경로가 완료됩니다. 다음에는 [도메인 모델링](https://handstack.kr/docs/ide/guides/도메인-모델링)으로 설계 근거를 남기거나 [IDE 빠른 참조](https://handstack.kr/docs/ide/reference/)에서 필요한 기능만 찾아보세요. --- title: 1. 작업 영역 열기 url: https://handstack.kr/docs/ide/learn/작업영역-열기 --- # 작업 영역 열기 IDE가 편집할 폴더를 정하고, 파일 하나를 저장해 봅니다. 실습용 폴더에 수정해도 되는 텍스트 파일을 준비하세요. ## 1. 폴더와 파일 열기 1. 왼쪽 위 **작업 영역 폴더**를 눌러 실습 폴더를 선택합니다. 2. 트리 위 경로가 선택한 폴더인지 확인합니다. 3. 왼쪽 **작업 영역**에서 파일을 열고 짧은 문장을 추가합니다. 4. **저장**을 누른 뒤 탭을 닫고 다시 열어 문장이 남아 있는지 확인합니다. 한 번에 작업 영역 하나를 엽니다. 다른 폴더로 전환하기 전에는 미저장 탭을 먼저 정리하세요. 외부 파일 열기는 가능하지만, 외부 파일 탭은 다음 실행 때 복원되지 않습니다. ## 2. 세 탭의 차이 익히기 | 왼쪽 탭 | 무엇을 찾나요? | 여는 방식 | |---|---|---| | 작업 영역 | 경로와 실제 파일 | 텍스트 파일은 소스 편집기로 열기 | | 개발 | 화면·계약의 종류와 이름 | `view`는 View Designer, 계약은 전용 편집기로 열기 | | 업무 | 모델·환경설정·운영 도구 | 업무 화면과 오른쪽 사용 가이드 열기 | 같은 계약도 **작업 영역**에서는 원본으로, **개발**에서는 폼으로 편집합니다. 전용 편집기가 열리지 않는다고 확장자를 바꿀 필요는 없습니다. ## 3. 검색 범위 바꾸기 **편집 > 찾기**로 방금 쓴 문장을 찾고, **작업영역 찾기**로 같은 문장을 검색하세요. 전자는 현재 파일, 후자는 작업 영역의 파일들을 대상으로 합니다. 전체 검색 결과는 하단 **출력**에서 확인합니다. 여러 파일을 바꾸는 명령은 먼저 찾기로 대상과 건수를 확인한 뒤 사용하세요. 변경 후에는 diff로 의도한 파일만 수정되었는지 검토합니다. ## 직접 확인 문장을 한 번 더 바꾸고 저장 전·후의 탭 표시를 비교해 보세요. **탭을 다시 열어 변경을 확인했다면 완료**입니다. 파일이 보이지 않으면 [트리 필터와 제외 규칙](https://handstack.kr/docs/ide/reference/문제-해결#파일이-보이지-않음)을 확인하세요. 자주 쓰는 키는 [단축키 참조](https://handstack.kr/docs/ide/reference/단축키)에서 찾을 수 있습니다. --- title: 2. 프로젝트와 서버 url: https://handstack.kr/docs/ide/learn/프로젝트와-서버 --- # 프로젝트와 서버 연결하기 프로젝트는 편집할 소스이고, 개발 서버는 그 결과를 실행하는 프로그램입니다. IDE 자체의 포트와 개발 서버의 포트도 서로 구분합니다. ## 1. 새 프로젝트 만들기 **파일 > 새 프로젝트 만들기**에서 다음 예시를 입력합니다. 기존 실습 프로젝트가 있다면 생성하지 않고 2단계로 이동하세요. | 항목 | 실습 예시 | 규칙 | |---|---|---| | 프로젝트명 | `idelab` | 모듈 ID. 영문 소문자로 시작하고 소문자·숫자만 사용 | | 프로젝트 코드 | `LAB` | 업무 프로젝트 ID. 영문 대문자 3자리 | | 설명 | IDE 사용 실습 | 화면·계약의 설명에 사용 | | 상위 폴더 | 별도의 실습 경로 | 기존 업무 프로젝트와 분리 | 개발 서버도 필요하면 **개발 서버 > 같이 만들기**를 선택하고 프로그램명, 비어 있는 서버 폴더, 사용 가능한 포트를 지정합니다. 생성에는 IDE 실행 파일 옆의 `rdy.zip`이 필요합니다. 이 옵션을 선택하지 않으면 프로젝트만 생성합니다. 생성 후 프로젝트 폴더를 작업 영역으로 열고 `README.md`를 읽으세요. 화면·계약 파일이 생겼다는 것과 서버 실행 준비가 끝났다는 것은 다릅니다. ## 2. 기존 서버 연동하기 1. 작업 영역 툴바의 **서버 연동**을 엽니다. 2. `app` 폴더가 들어 있는 **rdy 프로그램 루트 폴더**를 선택합니다. 3. **연동하기**를 누르고 연결 상태와 하단 **서버** 로그를 확인합니다. 4. 설정의 **기본 실행 URL**이 의도한 개발 서버를 가리키는지 확인합니다. 함께 생성한 서버가 자동 연동되었다면 다시 연동할 필요는 없습니다. 연동 실패 시에는 생성된 폴더를 무작정 지우지 말고 로그와 보존된 파일을 확인하세요. :::warning 연동은 서버 설정을 변경합니다 연동은 서버의 계약 경로와 웹 루트를 현재 작업 영역에 맞춥니다. 다른 사람이 사용하는 서버에는 적용하지 마세요. **연동해제는 연결 기록만 지우며, 바뀐 서버 설정을 원래대로 복원하지 않습니다.** ::: ## 3. 실행 준비 확인 - 모듈을 빌드한다면 `HANDSTACK_SRC`와 `HANDSTACK_HOME`을 실습용 경로로 지정합니다. 일반 도구 설치는 [필수 프로그램](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기)을 참고하세요. - 생성된 README와 실제 설정을 대조해 실행할 ack의 `AppSettings.LoadModules`와 데이터 원본을 확인합니다. - DB 스키마는 **실제로 실행할 `.dbc` SQL**과 대조합니다. 예제 SQL에도 테이블 생성·초기 데이터 입력이 있을 수 있으므로 업무 DB를 연결하지 않습니다. ## 직접 확인 작업 영역 경로, rdy 루트, IDE 포트, 서버 포트를 각각 기록하세요. 하단 **서버**에서 정상 시작을 확인했다면 다음 단계에서 화면을 엽니다. 실패하면 [서버·미리보기 진단](https://handstack.kr/docs/ide/reference/문제-해결#서버와-미리보기)을 사용하세요. --- title: 3. 화면 편집하기 url: https://handstack.kr/docs/ide/learn/화면-편집하기 --- # 화면 편집하고 다시 열기 생성된 `LAB010` 화면을 활용해 문구 하나만 바꿉니다. 첫 편집에서는 컨트롤 ID나 거래 구성을 유지해 화면 편집과 데이터 오류를 분리하세요. ## 1. View Designer 열기 1. 왼쪽 **개발**에서 유형을 `view`로 좁힙니다. 2. `LAB010`을 엽니다. 예시 경로는 `wwwroot/idelab/view/HDS/LAB/LAB010.html`입니다. 3. **디자인**에서 제목이나 안내 문구 요소를 선택하고 속성에서 문구를 변경합니다. 4. **저장**한 뒤 **소스보기**에서 변경한 문구가 HTML에 반영되었는지 찾습니다. 예제 파일이 없다면 **새 개발 파일 > view**를 사용하되, 기존 파일과 같은 이름으로 만들지 마세요. 템플릿은 전체 화면의 시작점, 디자인 블록은 화면 일부를 추가할 때 사용합니다. ## 2. 세 편집 영역 구분하기 | 영역 | 여기에서 바꾸는 것 | |---|---| | 디자인·속성 | 배치, 컨트롤 ID, 데이터 필드, 옵션, 추가 스타일 클래스 | | 스크립트 | `$LAB010` 객체의 이벤트·메서드·거래 구성 | | 소스보기 | 실제 HTML 원문 | `id`는 화면 요소를 찾는 이름이고 `syn-datafield`는 거래 데이터와 연결할 이름입니다. 이름을 바꾸는 실습은 다음 단계에서 계약과 함께 진행합니다. 옵션 전체 명세는 [UI 컨트롤 참조](https://handstack.kr/docs/startup/learning/uicontrols/uicontrols-퀵-가이드)를 이용하세요. ## 3. 저장 왕복 확인 1. 저장 후 탭을 닫고 같은 화면을 다시 엽니다. 2. 바꾼 문구와 요소 계층이 유지되는지 확인합니다. 3. 해당 항목이나 탭의 **웹 브라우저로 열기**로 실제 실행 화면을 확인합니다. 캔버스의 그리드·컨트롤 모양은 디자인용 표시일 수 있습니다. **캔버스가 보이는 것만으로 데이터 조회 성공을 판단하지 않습니다.** 브라우저 실행에는 서버 연동과 해당 리소스가 필요합니다. 소스 편집기와 View Designer에서 같은 파일을 동시에 수정했다면 먼저 어느 편집본을 보존할지 정하세요. 미저장 내용을 덮어쓰지 말고 저장·다시 열기로 상태를 맞춥니다. ## 직접 확인 문구를 원래대로 되돌리고 다시 저장하세요. diff에서 의도한 HTML·JS 변경만 남는지 확인하면 완료입니다. 저장 마커와 `pageMappings`의 정확한 위치는 [파일과 저장 규칙](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#화면-원본)을 참고하세요. --- title: 단축키와 편집 문맥 url: https://handstack.kr/docs/ide/reference/단축키 --- # 단축키와 편집 문맥 아래는 Windows 기본 키입니다. 변경한 키는 **도구 > 환경설정 > 단축키**에서 확인하세요. macOS·Linux에서 같은 키가 작동한다고 가정하지 말고 설치본의 메뉴와 설정을 확인합니다. ## 소스 편집과 탐색 | 작업 | 기본 키 | |---|---| | 저장 / 모두 저장 | `Ctrl+S` / `Ctrl+Shift+S` | | 모두 닫기 | `Ctrl+Alt+W` | | 실행 취소 / 다시 실행 | `Ctrl+Z` / `Ctrl+Y` | | 현재 파일 찾기 / 바꾸기 | `Ctrl+F` / `Ctrl+H` | | 작업 영역 찾기 / 바꾸기 | `Ctrl+Shift+F` / `Ctrl+Shift+H` | | 현재 문서 포맷 | `Shift+Alt+F` | | 별도 코드 서식 도구 | `Ctrl+Alt+B` | | 자동완성 목록 | `Ctrl+Space` | | 시스템 터미널 | `Ctrl+Alt+Space` | | 왼쪽 / 오른쪽 패널 토글 | `Ctrl+Alt+Left Arrow` / `Ctrl+Alt+Right Arrow` | 소스 편집 단축키는 해당 편집기에 포커스를 두고 사용합니다. 전용 화면·입력란·캔버스가 활성화되면 화면별 처리가 우선할 수 있습니다. 키가 듣지 않으면 반복해서 누르지 말고 현재 화면의 저장·실행 버튼으로 확인하세요. ## HandStack 코드 탐색 `view` 경로의 HTML에는 `syn-datafield`, `syn-options`, `syn-events` 자동완성이, JS에는 `syn.*`와 화면 객체의 자동완성이 제공됩니다. View Designer의 스크립트·소스보기에서도 사용할 수 있습니다. | 기능 | 키·방법 | 범위 | |---|---|---| | 정의로 이동 | 편집기 메뉴 또는 `F12` | 화면 객체의 실제 선언, 라이브러리 API의 요약 선언 | | 참조 찾기 | `Shift+F12` | 같은 화면 스크립트의 호출·선언 | | 문자열 거래 ID 추적 | 오른쪽 연관 계약 찾기 | 저장된 화면·거래·실행 계약 | `F12`는 개발자 모드에서 DevTools 키로도 쓰입니다. 혼동되면 편집기 우클릭 메뉴의 **Go to Definition**을 사용하세요. API 정의로 이동한 화면이 라이브러리 구현 전체 소스는 아닙니다. ## 디버그 | 작업 | 기본 키 | |---|---| | 시작·계속 / 디버그 없이 실행 | `F5` / `Ctrl+F5` | | 실행 프로세스 Attach | `Ctrl+Alt+P` | | 일시 중지 / 중지 | `Ctrl+Alt+Break` / `Shift+F5` | | Step Over / Into / Out | `F10` / `F11` / `Shift+F11` | 디버그 키는 대상 프로젝트·실행 명령·활성 세션에 따라 동작합니다. 먼저 [바이너리와 PDB 조건](https://handstack.kr/docs/ide/reference/문제-해결#중단점이-잡히지-않음)을 확인하세요. ## 캔버스 주의 복사·붙여넣기·삭제는 선택한 블록을 바꿀 수 있습니다. 입력란 안에서는 텍스트 편집이 우선합니다. View Designer의 Position Layout은 스냅 상태에 따라 이동량이 달라지며 Studio와 같은 수치를 전제하지 마세요. 실행 전 선택 요소와 현재 레이아웃을 확인합니다. --- title: 메뉴와 도구 url: https://handstack.kr/docs/ide/reference/메뉴와-도구 --- # 메뉴와 도구 파일을 찾는 곳은 **작업 영역**, 계약 종류를 찾는 곳은 **개발**, 설정·모델·운영 기능을 찾는 곳은 **업무**입니다. ## 자주 하는 작업 | 작업 | 위치 | 범위·주의 | |---|---|---| | 폴더 열기 | 왼쪽 위 작업 영역 폴더 | 현재 작업 영역 전환 | | 프로젝트 생성 | 파일 > 새 프로젝트 만들기 | 모듈 소스와 예제 생성 | | rdy 배포 | 파일 > 개발 서버 만들기 | 비어 있는 서버 폴더 필요 | | 서버 연결 | 작업 영역 툴바 > 서버 연동 | 연결 대상의 설정 변경 | | 원본 편집 | 작업 영역 > 파일 선택 | 텍스트 소스 편집기 | | 화면·계약 폼 편집 | 개발 > 유형 필터 > 항목 선택 | 전용 저작 화면 | | 전체 파일 검색 | 편집 > 작업영역 찾기 | 결과는 하단 출력 | | 화면 실행 | view 항목·탭 우클릭 > 웹 브라우저로 열기 | 서버 연동과 URL 확인 | | 업무 메뉴 편집 | 도구 > 유틸리티 > 메뉴 정보 관리 | 프로젝트의 `menus.json` | | IDE 표시·키·포트 설정 | 도구 > 환경설정 | 서버 설정과 구분 | ## 오른쪽 패널 | 기능 | 나타나는 문맥 | 활용 | |---|---|---| | 심볼 아웃라인 | 일반 소스 탭 | 함수·클래스·HTML ID로 이동 | | 연관 계약 찾기 | 계약, View Designer, `view` 하위 JS | 호출하는 계약·호출받는 계약 추적 | | 화면 정보 | HTML·HTM 소스 | `syn_*` 메타데이터 편집 후 파일 저장 | | 실행 이력 | DB·거래 클라이언트 | 이전 SQL·요청 복원 | | 업무 화면 가이드 | 업무 화면 | 현재 화면의 항목·사용법·주의 확인 | **연관 계약 찾기**는 저장된 파일을 읽습니다. 문자열 기능 ID는 일반 ‘정의로 이동’ 대신 이 도구로 추적하세요. 작업 영역에서 클릭하면 소스로, 개발 탭에서 클릭하면 전용 편집기로 이어집니다. ## 개발과 운영 도구 | 도구 | 메뉴 경로 | 쓰는 때 | |---|---|---| | Tabler 웹 페이지 제작 | 도구 > 개발 도구 | 서버 없이 HTML 시안 작성 | | DB 클라이언트 | 도구 > 개발 도구 | 연결·메타데이터·SQL 확인 | | 거래 클라이언트 | 도구 > 개발 도구 | 모듈 실행 요청의 URL·헤더·본문 시험 | | 데이터 원본·거래 라우팅 | 업무 > 환경설정 > 프로그램 | 환경의 연결·실행 대상 확인 | | 환경별 Settings 관리 | 업무 > 환경설정 > 프로그램 | 환경 프리셋 비교·복제·편집 | | module.json 설정 | 업무 > 환경설정 > 모듈 관리 | 모듈 설정 원본 편집 | | 모듈별 API 콘솔 | 업무 > 환경설정 > 모듈 관리 | 실행 서버의 계약·캐시 등 조회·관리 | | 엔티티·앱 데이터베이스 | 업무 > 도메인 모델 > 메타 정보 관리 | 모델 작성·ERD 확인 | | SDLC 도구 | 업무 > 도메인 모델 > 기획·계획 / 분석 / 설계 / 구현 | 설계와 결정 근거 작성 | | 거래 이력정보·ack 서버 정보 | 업무 > 프로젝트 관리 > 모니터링 | 요청 실패·서버 상태 추적 | 계약 편집기의 **거래 실행**은 작성 중인 계약을 시험하고, **거래 클라이언트**는 HTTP 요청을 직접 구성합니다. **모듈 API 콘솔**은 실행 서버의 관리 상태를 다룹니다. 이름이 비슷해도 변경 대상이 다릅니다. 삭제·캐시 제거·재적재·DB 변경은 실제 데이터나 실행 상태에 영향을 줍니다. 조회로 대상을 확인하고 백업·복구 수단을 마련한 뒤 수행하세요. repository 화면의 오른쪽 파일 도구도 실제 저장소를 변경합니다. ## 하단 패널 - **서버**: 연동 개발 서버의 시작·중지·로그 - **콘솔**: IDE·웹 UI 동작 오류 - **출력**: 검색·바꾸기 등 작업 결과 - **터미널**: Photino 앱에서 경로별 셸 실행 - **디버그**: ack 시작·Attach·중단점·변수 확인 일부 하단 개발 도구는 Debug 빌드에 디버거가 연결된 경우에만 보입니다. 도구 메뉴의 DevTools 표시 조건과는 다릅니다. [설정과 보안](https://handstack.kr/docs/ide/reference/설정과-보안#개발자-도구의-표시-조건)을 확인하세요. --- title: IDE 문제 해결 url: https://handstack.kr/docs/ide/reference/문제-해결 --- # IDE 문제 해결 먼저 미저장 편집본을 보호하고 발생 시각, 작업 영역, 실행 대상, 최초 오류를 기록하세요. 설정을 여러 개 동시에 바꾸거나 사용자 데이터를 지우는 초기화부터 시작하지 않습니다. ## 파일이 보이지 않음 1. 작업 영역 경로와 트리 필터를 확인합니다. 2. **도구 > 환경설정 > 모양 > 숨김 항목 표시**와 `.gitignore`를 확인합니다. 3. 파일이 디스크에 있는지 확인하고 트리를 새로 고칩니다. Function의 `.g.cs`, `.g.js`, `.g.py`는 생성 파일이라 트리에서 제외될 수 있습니다. 원본 계약을 찾으세요. 계약이 소스로 열리면 **개발** 탭에서 다시 열어 전용 편집기와 구분합니다. ## 저장하거나 다시 열 수 없음 현재 파일 경로·읽기 전용·쓰기 권한을 확인합니다. 같은 파일을 소스 탭, 전용 편집기, 외부 편집기에서 동시에 고쳤다면 먼저 각 편집본을 보존하세요. 다른 탭의 변경을 강제로 덮어쓰지 않습니다. 모델이 다른 PC에서 보이지 않는다면 프로젝트 파일이 아니라 WebView 저장소에 저장된 항목인지 [백업 대상](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#백업-대상)을 확인합니다. ## 서버와 미리보기 | 증상 | 먼저 볼 것 | 다음 확인 | |---|---|---| | IDE 시작 시 포트 설정 창 | 현재 IDE 포트 점유 | 다른 사용 가능한 포트 선택, 재시작 | | 개발 서버 시작 실패 | rdy 루트·실행 파일·하단 서버 로그 | 포트, 계약 경로, 모듈 설정 | | 화면 404 | 실제 열린 URL과 `wwwroot` 이후 경로 | 작업 영역 폴더명·대소문자·웹 루트 | | 브라우저 열기 실패 | 서버 연동, Chrome/WorkView 설치·경로 | 기본 실행 URL과 최초 오류 | | 터미널 열기 실패 | Photino 앱에서 실행 중인지 | 경로 존재·운영체제 권한 | IDE 포트와 개발 서버 포트를 혼동하지 마세요. 보안 오류는 개발자 모드나 CSP를 해제해 덮지 말고 [설정과 보안](https://handstack.kr/docs/ide/reference/설정과-보안)을 확인합니다. ## 거래와 화면 결과 | 증상 | 확인 순서 | |---|---| | 실행 버튼 비활성 | 계약 구성의 항목·서비스 선택 → 서버 연동 | | 수정 전 결과가 나옴 | 계약 저장 → 서버의 계약 경로·재적재 상태 | | HTTP 200인데 실패 | 응답의 오류·메시지 → 계약 ID·입력 맵 | | SQL은 성공, 거래는 실패 | `.txn`의 서비스·입출력 → `.dbc` 구문·파라미터 | | 거래는 성공, 화면은 비어 있음 | `outputs.dataFieldID`와 `syn-datafield` → 결과 컬럼·그리드 필드 | | 연관 계약이 없거나 경고 | 파일 저장·목록 새로 고침 → 열린 작업 영역의 경로·ID | | 예제 SQL의 키 타입 오류 | 실제 테이블 DDL → 계약의 키 생성·입력 타입 → README와의 차이 | 모든 이름은 대소문자까지 대조합니다. 스키마가 다르다고 운영 테이블을 삭제해 맞추지 마세요. 백업 후 별도의 실습 DB에서 일치하는 스키마·계약으로 검증합니다. 거래 이력정보에서는 발생 시간과 `GlobalID`로 요청을 좁힙니다. 이 화면은 실제 로그 DB를 조회하므로 로그가 없다고 거래가 실행되지 않았다고 단정하지 말고 로그 수집 설정·DB 대상·시간 조건도 확인하세요. ## 중단점이 잡히지 않음 1. 하단 **디버그**의 Attach 대상 PID·실행 파일·포트가 원하는 ack인지 확인합니다. 2. 실행 바이너리와 같은 빌드의 PDB가 함께 있는지 확인합니다. 3. PDB의 소스 경로와 작업 영역 소스가 일치하는지 확인합니다. 4. Release 최적화 때문에 위치가 달라질 수 있으므로 재현용 Debug 빌드를 검토합니다. 실행 파일 폴더와 소스 폴더 자체가 같을 필요는 없습니다. 중요한 것은 바이너리·PDB·소스의 일치입니다. ## 복구 후 확인 원래 실패했던 입력으로 재시험하고 정상 결과·로그를 남깁니다. 공유할 기록에는 재현 순서와 비식별 오류만 포함하고 키·쿠키·연결 문자열은 제거하세요. 서버 자체 문제는 [HandStack 문제 해결](https://handstack.kr/docs/guides/문제-해결)로 이어서 확인합니다. --- title: 설정과 보안 url: https://handstack.kr/docs/ide/reference/설정과-보안 --- # 설정과 보안 설정을 바꾸기 전에 **IDE 자체**, **개발 서버**, **업무 앱** 중 어느 대상을 바꾸는지 확인하세요. 운영 환경의 값을 실습 설정에 복사하지 않습니다. ## 설정을 바꿀 위치 | 바꿀 것 | 위치 | 적용·확인 | |---|---|---| | 테마·글자·편집기·단축키 | 도구 > 환경설정 | 활성 화면에서 확인 | | IDE 포트 | 환경설정 > 프로그램 > stavlo IDE 포트 | 관련 설정 갱신 후 IDE 재시작 | | 개발 서버 연결 | 작업 영역 > 서버 연동 | rdy 루트·로그·실제 요청 확인 | | 기본 실행 URL·브라우저 | 환경설정의 미리보기·웹 브라우저 연동 | 실제 열린 주소 확인 | | 모듈 설정 원본 | 업무 > 환경설정 > 모듈 관리 > module.json 설정 | 현재 선택 경로와 버전 확인 | | 환경 프리셋 | 업무 > 환경설정 > 프로그램 > 환경별 Settings 관리 | 실행 환경에 적용했는지 별도 확인 | IDE 포트의 기준은 IDE `Bootstraping/appsettings.json`의 `AppSettings.ServerPort`입니다. 기본 예시 숫자를 불변값으로 사용하지 마세요. 포트 변경은 IDE 기능을 이용하며 모듈 URL·CSP를 일부만 수동 변경하지 않습니다. ## 미리보기 URL 주소는 기본 실행 URL과 `wwwroot` 이후 경로로 구성됩니다. 예시 파일 `wwwroot/idelab/view/HDS/LAB/LAB010.html`의 경로 부분은 `/idelab/view/HDS/LAB/LAB010.html`입니다. IDE 자체 URL을 사용하면 IDE가 작업 영역 정적 파일을 제공할 수 있습니다. 다른 서버 URL이면 **그 서버가 같은 경로의 파일을 제공해야** 합니다. 개발 서버 연동 후에는 선택한 서버 URL로 바뀌므로 이전 주소를 그대로 재사용하지 마세요. ## 환경 프리셋과 실제 설정 환경별 Settings 화면은 루트의 `ack.{환경}.json`과 `modules`·`modulesettings`·`synconfigs`·`nodeconfigs`의 해당 환경 파일을 묶어 보여 줍니다. 환경 추가는 세트 복제이므로 주소·계정·키를 다시 확인합니다. 프리셋을 저장한 것과 실행 서버에 적용한 것은 다릅니다. 화면에 안내되는 적용 대상·명령을 검토하고 검증 환경에서 대표 거래를 실행하세요. 명령 전체 옵션은 [HandStack CLI](https://handstack.kr/docs/startup/HandStack-CLI-사용법)에서 확인합니다. ## 개발자 도구의 표시 조건 | 기능 | 조건 | |---|---| | 도구 > DevTools 열기, 브라우저 기본 컨텍스트 메뉴 | `AppSettings.IsDeveloperMode=true` | | 하단 개발자 도구·API 테스트 | Debug 빌드에 디버거가 연결된 경우 | :::warning 개발자 모드는 보안 경계도 바꿉니다 `IsDeveloperMode=true`는 DevTools 표시뿐 아니라 로컬 요청의 접근 토큰 검사도 건너뜁니다. 접속 오류를 해결하려고 무조건 켜지 마세요. 배포용 실행에서는 `false`를 유지하고 인증·호스트 상태를 진단합니다. ::: ## 키와 AI 입력 `AuthorizationKey`, `HostAccessID`, DB 연결 문자열, LLM 키는 서로 용도가 다릅니다. 문서·로그·화면 공유에 값을 남기지 마세요. AI 서비스 설정에서 공급자·모델을 고르기 전에 소스·개인정보를 해당 서비스로 전송해도 되는지 확인합니다. 생성한 SQL·HTML은 검토 후 적용합니다. --- title: 파일과 저장 규칙 url: https://handstack.kr/docs/ide/reference/파일과-저장-규칙 --- # 파일과 저장 규칙 이 페이지는 IDE에서 여는 원본과 저장 위치의 기준입니다. 서버의 상세 식별자 규칙은 [HandStack 식별자와 파일 경로](https://handstack.kr/docs/reference/식별자와-파일-경로)를 참고하세요. ## 계약 확장자 | 유형 | IDE 파일 | 용도 | 실행 도구 | |---|---|---|---| | view | `.html` + `.js` | 업무 화면·스크립트 | View Designer·웹 브라우저 | | transact | `.txn` | 거래 입출력과 기능 연결 | 거래 실행 | | dbclient | `.dbc` | SQL·파라미터·데이터 원본 | 쿼리 실행 | | command | `.bas` | 명령행·웹 요청 | 명령 실행 | | function | `.fnc` | 함수·런타임 실행 | 함수 실행 | | graphclient | `.cyp` | Cypher 구문 | 쿼리 실행 | | prompter | `.pmt` | 프롬프트·모델 요청, Jev·Ollama 판단 계약 | 프롬프트 실행 | | repository | `.rpo` | 파일 저장소 정책 | 계약 편집·저장소 관리 | 확장자가 파일의 내부 형식을 뜻하지는 않습니다. 예를 들어 `.dbc`는 XML 계약이며 `.txn`은 JSON 계약입니다. 기존 파일을 다른 확장자로 일괄 변경하지 마세요. 정확한 계약 옵션은 [모듈 참조](https://handstack.kr/docs/reference/)에서 확인합니다. prompter 계약 화면은 `.pmt` 파일만 열고 저장합니다. 모듈 소스에서 직접 관리하는 같은 형식의 `.xml` 계약은 이 화면에서 지원하지 않습니다. 판단 계약(``)은 구문의 **판단 계약 (Decision)** 섹션이나 **판단 구문** 버튼으로 편집하며, 질문 JSON 규칙은 [prompter 모듈 참조](https://handstack.kr/docs/reference/api/modules/prompter)를 따릅니다. IDE의 사용자 편집용 JSON 계약은 주석과 후행 쉼표를 허용합니다. 원본 편집 시 이를 오류로 단정해 제거하지 말고 계약 편집기의 검증 결과를 확인하세요. ## 프로젝트 경로 새 프로젝트 예시 `idelab` / `LAB`의 구분입니다. | 식별자·경로 | 의미 | |---|---| | `idelab` | 모듈 ID와 프로젝트 폴더명 | | `HDS` | 예제 ApplicationID | | `LAB` | 업무 ProjectID, 생성 화면의 프로젝트 코드 | | `LAB010` | 예제 화면·거래 ID | | `LD01` | 조회 서비스·SQL 구문 ID | | `wwwroot/idelab/view/HDS/LAB/LAB010.html` · `.js` | 화면 원본 | | `Contracts/transact/HDS/LAB/LAB010.txn` | 거래 원본 | | `Contracts/dbclient/HDS/LAB/LAB010.dbc` | SQL 원본 | | `module.json` | 이 모듈의 설정 | 위 경로는 IDE가 생성하는 모듈 프로젝트 기준입니다. HandStack 기본 배포본의 예제 경로와 동일하다고 가정하지 마세요. 서버가 읽는 계약 경로는 실행 환경의 설정과도 일치해야 합니다. ## IDE 자체 프로젝트 {#ide-host-project} IDE를 개발하는 C# 프로젝트 이름은 `winform`에서 `stavlo`로 변경되었습니다. 위의 업무 모듈 프로젝트와 구분하세요. 현재 소스 기준은 다음과 같습니다. | 항목 | 이름·경로 | |---|---| | 솔루션 디렉터리·파일 | `qcn.winform/`, `winform.slnx` — 변경 없음 | | C# 프로젝트 | `1.DesktopHost/stavlo/stavlo.csproj` | | 네임스페이스·어셈블리 | `Stavlo` · `stavlo` | | 실행 파일 | Windows: `stavlo.exe`, macOS·Linux: `stavlo` | | Velopack 배포 패키지 ID | `Stavlo` — 이전 이름은 `HandStack.IDE` | 소스 경로는 솔루션 루트 기준입니다. 새 패키지의 Windows 설치 파일명은 `Stavlo-win-Setup.exe`입니다. 기존 배포 파일은 이전 이름으로 남아 있을 수 있으므로, 파일명이나 주소를 직접 치환하지 말고 [IDE 설치하기](https://handstack.kr/ide)에서 실제 배포 정보를 확인하세요. ## 화면 원본 | 이름 | 저장 위치·규칙 | |---|---| | `config.pageMappings` | 화면 스크립트의 거래 매핑. `$this.config.pageMappings`로 참조 | | `data-designer-type` | View Designer의 컴포넌트 유형 | | `data-designer-root-count` | View Designer의 여러 루트 요소 경계 | | `data-designer-props` | 실제 HTML 요소에 저장하는 디자이너 편집 속성 | | `data-designer-id` | 캔버스 전용. 저장 원본에 남기지 않음 | | `data-studio-props` | Tabler Studio의 편집 정보. View Designer 마커와 별개 | | `data-studio-node` | Studio 캔버스 전용. 저장·내보내기에서 제외 | View Designer의 메타데이터를 별도 JSON 파일이나 HTML ``에 옮기지 않습니다. `pageMappings`도 HTML이 아닌 화면 스크립트가 기준입니다. 기존 HTML은 편집 전 원문을 보존하고, **소스보기 저장은 편집한 원문**을 기준으로 합니다. HTML과 같은 이름의 JS를 함께 관리한다면 두 파일의 변경을 함께 확인하세요. 같은 파일을 소스 탭과 디자이너에서 동시에 고친 경우 미저장 편집본을 먼저 보호합니다. ## 메뉴 연결 메뉴 정보 관리의 대상은 `wwwroot/{모듈ID}/menus.json`입니다. IDE 자체의 업무 메뉴 정의와 혼동하지 마세요. | 필드 | 연결 대상·동작 | |---|---| | `DirectoryID` | `view/HDS/{DirectoryID}/` 폴더 | | `ItemID` | 해당 폴더의 `{ItemID}.html` | | `MenuID` | 메뉴 고유 식별자. 중복 불가 | | `ParentMenuID`, `ParentMenuName`, `Step`, `SortingNo` | 편집기가 트리 구조에 맞게 계산 | | `ModuleID` | 프로젝트와 공유하므로 메뉴 편집기에서는 읽기 전용 | | `FnSearch`, `FnSave`, `FnDelete`, `FnPrint`, `FnExport`, `FnRefresh` | 업무 셸의 기능 버튼 구성 | 메뉴 연결만으로 이벤트나 거래가 구현되지는 않습니다. 화면·JS·계약과 함께 검증하세요. ## 백업 대상 | 데이터 | 어디에 있나요? | 보존 방법 | |---|---|---| | 소스·화면·계약·메뉴 | 작업 영역의 실제 파일 | Git·파일 백업 | | IDE UI 설정·탭 일부 | WebView 로컬 저장소 | 필요한 값 별도 기록 | | 엔티티·앱 DB 모델 | WebView IndexedDB | 각 화면의 백업 JSON | | SDLC 문서 | 앱 업무별 모델링 데이터 | SDLC 업무 백업. 앱 DB 백업과 별개 | | Studio 프로젝트 | 사용자가 저장한 `.project.json` | 프로젝트 파일과 사용 자산 함께 백업 | | DB 연결·이력·서버 연동 등 | IDE 실행 기준 `data` | IDE 종료 후 폴더 백업 | | Velopack 설치본의 영속 파일 | `{install-root}/data` | `current`와 구분해 백업 | 폴더 하나를 복사했다고 모든 모델·설정이 포함되는 것은 아닙니다. 백업 파일에 연결 문자열이나 키가 포함될 수 있으므로 접근을 제한하세요. 복구는 [인수인계 절차](https://handstack.kr/docs/ide/learn/운영-인수인계)로 검증합니다. --- title: IDE 빠른 참조 url: https://handstack.kr/docs/ide/reference/ --- # IDE 빠른 참조 조작 순서를 배우려면 [하나씩 익히기](https://handstack.kr/docs/ide/learn/작업영역-열기), 정확한 이름이나 규칙을 찾으려면 아래 링크를 사용하세요. ## 이름으로 찾기 | 검색어 | 대표 문서 | |---|---| | 작업 영역, 개발, 업무, 연관 계약 찾기 | [메뉴와 도구](https://handstack.kr/docs/ide/reference/메뉴와-도구) | | `.txn`, `.dbc`, `.bas`, `.fnc`, `.cyp`, `.pmt`, `.rpo` | [계약 확장자](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#계약-확장자) | | `ModuleID`, 프로젝트 코드, `Contracts`, `wwwroot` | [프로젝트 경로](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#프로젝트-경로) | | `stavlo`, `stavlo.csproj`, `Stavlo`, 패키지 ID, IDE 실행 파일 | [IDE 자체 프로젝트](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#ide-host-project) | | `pageMappings`, `data-designer-*`, `data-studio-props` | [화면 원본](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#화면-원본) | | `menus.json`, `DirectoryID`, `ItemID`, `FnSearch` | [메뉴 연결](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#메뉴-연결) | | `.project.json`, IndexedDB, `data`, 백업 | [백업 대상](https://handstack.kr/docs/ide/reference/파일과-저장-규칙#백업-대상) | | `Ctrl+S`, `F12`, `F5`, 포맷 | [단축키와 포커스](https://handstack.kr/docs/ide/reference/단축키) | | `ServerPort`, 미리보기 URL, Settings, `IsDeveloperMode` | [설정과 보안](https://handstack.kr/docs/ide/reference/설정과-보안) | | `GlobalID`, HTTP 200인데 실패, PDB | [문제 해결](https://handstack.kr/docs/ide/reference/문제-해결) | ## 목적에 맞는 도구 고르기 | 하려는 일 | 이동 | |---|---| | 작성 중인 계약 한 개 시험 | [계약 실행](https://handstack.kr/docs/ide/learn/계약-실행하기) | | URL·헤더·본문까지 직접 시험 | [거래 클라이언트](https://handstack.kr/docs/ide/reference/메뉴와-도구#개발과-운영-도구) | | SQL 직접 실행·연결 확인 | [DB 클라이언트](https://handstack.kr/docs/ide/reference/메뉴와-도구#개발과-운영-도구) | | 엔티티·ERD·SDLC 문서 작성 | [도메인 모델링](https://handstack.kr/docs/ide/guides/도메인-모델링) | | 일반 HTML 시안 제작 | [Tabler 웹 페이지 제작](https://handstack.kr/docs/ide/guides/tabler-studio) | | 모듈 API·계약 필드 전체 명세 | [HandStack API·설정 참조](https://handstack.kr/docs/reference/) | --- title: 기여하기 url: https://handstack.kr/docs/information/community/기여하기 --- # 기여하기 기여를 감사하고 환영합니다 * 이 라이브러리를 개선할 수 있는 기술이 있다면 공유해 주세요: https://github.com/handstack77/handstack/pulls * 이 저장소, 모든 포크 또는 사본에 대한 기여는 MIT 라이선스 조건에 따라 HandStack에 남습니다. * 기여한 중요한 코드에 메모를 추가할 수 있지만, 변경 사항에 대한 저작권이나 특허를 가질 수는 없습니다. * 모든 코드나 문서가 가치 있는 것은 아닙니다. HandStack은 재량에 따라 기여자의 변경 사항을 편집, 사용 또는 폐기할 수 있습니다. * 본 저장소의 소프트웨어와 모든 파생 저작물 및 관련 특허는 HandStack의 자산으로 유지됩니다. * 이 코드베이스를 크게 개선한 경우 HandStack은 기여자를 공식 프로젝트 기여자로 초대하고 배지를 부여할 수 있습니다. ## 버그 및 이슈 * 버그를 발견하면 다른 사람에게 위임하기 전에 직접 수정해 주세요. * 문제가 이미 문서화되어 있는 경우 이슈 로그를 확인하세요. * 기술적으로 가능하다면 풀 리퀘스트를 만드세요. * 이슈를 게시하려면: https://github.com/handstack77/handstack/issues ## 왜 HandStack 오픈소스에 기여할까요? * 비즈니스 앱을 위한 개발 및 운영 지식을 공유 할 수 있습니다. * 검증된 레퍼런스로 비즈니스 앱 구축을 할 수 있습니다. * 레거시 자사 솔루션을 현대적인 클라우드 네이티브 앱으로 마이그레이션에 도움이 될 수 있습니다. * 공식 프로젝트 기여자로 초대 받으시면 온라인/오프라인 HandStack 교육 및 기술 지원을 받을 수 있습니다. --- title: 프로젝트 정보 관리 url: https://handstack.kr/docs/information/community/프로젝트-정보-관리 --- # 프로젝트 정보 관리 ## HandStack 대화 주제 HandStack은 기업의 비즈니스 모델을 통합 하기 위해 검증된 개발 프로세스, 도구, 문서, 교육을 단순화하는 방안을 효과적으로 만드는 것을 연구 개발합니다. 이에 대해 대화 주제를 벗어나지 않도록 다음과 같은 기준을 정리합니다. ## 프로젝트 시스템 - 업무 - 메타 - 모니터링 - 배포 - 시스템 - 인프라 - 작업 - 프로젝트 ## 공용 프로젝트 서비스 - 메타 - 정보 - 모니터링 - 배포 - 작업 ## 프로젝트 업무 프로세스 1. 확인 1. 업무인지 2. 사전영업 3. 기술검토 4. 제안서 및 약정 2. 검토 1. 업체선정 2. 투자심의 3. 심의합의 3. 진행 1. 계획 2. 개발 3. 이행 4. 종료 4. 운영 1. 업무 2. VOC 3. SR처리 ## 권한 분류 - 관리자 - 개발자 - 사용자 ## 사용자 분류 - 고객 (Customer) - 업무 (Business) - 개발 (Project) ## 프로젝트(Project) 역할 분류 - (AL) ALL - 전체 멤버 - (CP) Customer Performer - 고객 업무 프로젝트 담당자 - (CC) Customer Consultant - 고객 업무 아키텍트, 컨설팅, 제안 - (CO) Customer Officer - 고객 업무/행정/관리 지원 - (CM) Customer Manager - 고객 업무 프로젝트 수행 관리 - (CD) Customer Developer - 고객 업무 프로젝트 화면/업무/데이터 중심 개발 - (CU) Customer UX/UI Designer - 고객 업무 프로젝트 UX/UI 중심 개발 - (BP) Business Performer - 도메인 업무 프로젝트 담당자 - (BC) Business Consultant - 도메인 업무 아키텍트, 컨설팅, 제안 - (BO) Business Officer - 도메인 업무/행정/관리 지원 - (BM) Business Manager - 도메인 업무 프로젝트 수행 관리 - (BD) Business Developer - 도메인 업무 프로젝트 화면/업무/데이터 중심 개발 - (BU) Business UX/UI Designer - 도메인 업무 프로젝트 UX/UI 중심 개발 - (PP) Project Performer - 수행사 프로젝트 담당자 - (PC) Project Consultant - 수행사 아키텍트, 컨설팅, 제안 - (PO) Project Officer - 수행사 업무/행정/관리 지원 - (PM) Project Manager - 수행사 프로젝트 수행 관리 - (PD) Project Developer - 수행사 프로젝트 화면/업무/데이터 중심 개발 - (PU) Project UX/UI Designer - 수행사 프로젝트 UX/UI 중심 개발 ## 프로젝트 정보 관리 - 계정 - 가입 - 가입 요청 - 계정 확인 - 관리 - 가입 요청 확인 - 회사 및 조직 - 사용자 계정 - 프로젝트 - 프로젝트 정보(생성|변경) 요청 - 프로젝트 관리[조회/수정] - 사전업무 - 업무 기획 - RFP 요청서 - 기획/제안서 - 기술검토 - 주관/참여사 관리 - 시스템 - 시스템 사양 - 실행 환경 - 개발 환경 - 인프라 및 네트워크 환경 - 검토 확인 (업무, 인프라, 보안등등 담당자 확인) - 업무합의 - 킥오프 미팅 - 업무(주관부서/협력부서)담당 조직도 - 업무(주관사/협력사)관련 조직도 - 합의결과(기술/IT/비용등등 심의결과 고객 합의) - 프로젝트 관리 - 프로젝트 정보(생성|변경) 요청 접수 - 프로젝트 관리 - 프로젝트 담당자 - 확장 시스템 설정 - 메타 - 배치 작업 - 배포 - 모니터링 - 인프라 - 프로젝트 관리 - 프로젝트 사용자 관리 - 확장 시스템 관리 --- title: Forbes 소개 url: https://handstack.kr/docs/information/forbes/Forbes-모듈이란 --- # Forbes 소개 HandStack Forbes는 HandStack의 확장 기능으로서, 오픈소스 커뮤니티나 아웃소싱과 같은 방법으로 외부의 소스를 효율적으로 통합 처리할 수 있도록 가이드 라인을 제공합니다. 확장 기능은 새로운 기능을 추가하거나, 기존 기능을 변경할 때, 기존 코드를 건드리지 않고 새로운 기능을 추가하거나 변경할 수 있어야 합니다. ## 태넌트 앱 (tenantapps) 태넌트 앱은 여러 테넌트(tenant)가 동일한 애플리케이션 인스턴스를 공유하지만, 각 테넌트의 데이터는 격리된 상태로 유지하는 멀티테넌시(multi-tenancy) 애플리케이션을 의미합니다. 이를 통해 각 테넌트는 자신만의 데이터를 안전하게 관리하고 사용할 수 있습니다. HandStack 에서 제공하는 테넌트 템플릿은 다음과 같으며, checkup 모듈을 통해 나만의 테넌트 앱을 만들 수 있습니다. * [handstack.apps.board](https://github.com/handstack77/handstack/tree/master/1.WebHost/ack/AppTempletes/handstack.apps.board) * [handstack.apps.empty](https://github.com/handstack77/handstack/tree/master/1.WebHost/ack/AppTempletes/handstack.apps.empty) * [handstack.apps.helloworld](https://github.com/handstack77/handstack/tree/master/1.WebHost/ack/AppTempletes/handstack.apps.helloworld) * [handstack.apps.uicontrols](https://github.com/handstack77/handstack/tree/master/1.WebHost/ack/AppTempletes/handstack.apps.uicontrols) 태넌트 앱은 비즈니스 앱을 만들기 위한 기본 템플릿을 제공합니다. 이를 통해 사용자는 쉽게 애플리케이션을 만들고, 테스트할 수 있습니다. ## 업무 모듈 (modules) 업무 모듈은 특정 업무 기능을 수행하기 위한 코드의 집합을 의미합니다. 이는 애플리케이션의 기능을 논리적으로 분리하여 코드의 재사용성을 높이고, 유지보수를 용이하게 합니다. 기술적으로 표현하면 module 은 ASP.NET Core에서 Controller, View Layout, Tag Helper, Razor Pages 와 같은 웹 어플리케이션의 기능을 독립적으로 구현한 것을 의미합니다. > module 은 그룹웨어, 쇼핑몰, ERP, CRM 등등 다양한 B2B, B2C와 같은 업무를 독립적으로 개발 할 수 있습니다. ## 화면 컨트롤 (uicontrol) 화면 컨트롤은 사용자 인터페이스의 구성 요소를 제어하는 데 사용됩니다. 이는 버튼, 텍스트 박스, 드롭다운 메뉴 등 다양한 형태의 사용자 인터페이스 요소를 생성, 수정, 제거하는 기능을 포함합니다. HandStack 에서 기본 제공되는 화면 컨트롤은 자체 제작/오픈소스/유료 구분 없이 만들어지며 기본적으로 널리 사용중인 오픈소스를 기반으로 만들어집니다. 업무에 따라 요구사항에 적합한 Pivot, Chart, Grid, Tree, Form, Dialog, Menu, Tab, List, Calendar, Map, Editor, Viewer, Report, Dashboard, Workflow, Wizard, Search 등등 추가 화면 컨트롤을 만들 수 있습니다. ## 공통 기능 (library) 공통 기능 라이브러리는 여러 애플리케이션에서 공통적으로 사용되는 기능을 모아놓은 코드의 집합입니다. 이를 통해 코드의 재사용성을 높이고, 개발 시간을 단축시킬 수 있습니다. 공통 기능 라이브러리는 화면에 필요한 기능 뿐만 아니라, C#, Node.js 서버 함수에서 필요한 데이터베이스 연결, 파일 입출력, 보안, 로깅, 테스트, 디버깅 등 다양한 기능을 포함합니다. ## 외부 시스템 연동 (connector) 외부 시스템 연동 커넥터는 애플리케이션과 외부 시스템 간의 통신을 가능하게 하는 도구입니다. 이를 통해 다양한 외부 시스템과 데이터를 주고받을 수 있습니다. 이는 API 호출, 데이터베이스 연결, 외부 서비스 접근 등 다양한 형태로 구현될 수 있습니다. Postman과 같은 클라이언트 도구로 호출 가능한 API를 제공하는 외부 시스템들은 쉽게 연동 가능한 모든 커넥터로 만들 수 있습니다. * Jenkins * Slack * Mattermost * Microsoft Teams * Google * Airtable * ChatGPT * DeepAI --- title: 5kb 미만 Javascript 오픈소스 목록 url: https://handstack.kr/docs/information/resource/5kb-미만-Javascript-오픈소스-목록 --- # 5kb 미만 Javascript 오픈소스 목록 MicroJS 웹 사이트는 작고 강력한 마이크로 프레임워크와 마이크로 라이브러리를 발견하고 선택할 수 있도록 도와줍니다. 이 사이트는 종속성이 없고, 압축된 상태에서 5KB 이하인 라이브러리만을 다룹니다. 그래서 간결하고 효율적인 도구를 제공하여, 대규모 프레임워크 대신 작고 특정한 기능을 잘 수행하는 라이브러리를 사용할 수 있게 합니다. 예를 들어, DOM 조작, 이벤트 처리, 애니메이션 등 다양한 작업을 수행할 수 있는 라이브러리를 찾을 수 있습니다. HandStack 에서도 영감을 받아 도입하거나 활용해서 프로젝트를 진행하고 있어, 목록을 소개합니다. 향후에도 새로운 라이브러리와 프레임워크를 추가하고 싶다면 GitHub 에서 새로운 사이트를 만들어 리퀘스트를 제출할 수 있습니다. ## Javascript 오픈소스 목록 http://mourner.github.com/simplify-js/ 초소형 고성능 JavaScript 2D/3D 폴리라인 간소화 라이브러리. https://github.com/jeromeetienne/microevent.js 노드 및 브라우저용 자바스크립트 객체를 위한 이벤트 이미터. https://github.com/gigafied/minion 크로스 플랫폼 및 브라우저 간 자바스크립트 클래식 상속. http://imsky.github.com/cssFx/ 이전 브라우저와 새 브라우저에 필요한 공급업체별 CSS3 속성을 삽입하는 독립형 폴리필. https://github.com/bemson/Panzer 스마트 데이터를 위한 포괄적인 노드 트리 솔루션 https://github.com/jeromeetienne/microcache.js 노드 및 브라우저용 인메모리 캐시. https://github.com/ctult/TinyDOM 아주 작은 DOM 조작 프레임워크 https://github.com/One-com/one-color 브라우저/노드 색상 라이브러리. 암시적 색 공간 변환, 체인 가능한 채널 메서드 및 CSS 편의 메서드. RGB, HSV, HSL, CMYK(알파 채널 포함) http://tinyjs.sourceforge.net/tiny.js 작지만 완벽한 툴킷 http://jsfiddle.net/SubtleGradient/4W3RR/ 기이할 정도로 깔끔하고 간단한 구문 설탕으로 HTML/XML 문자열을 구축하세요. http://westcoastlogic.com/lawnchair/ 클라이언트 측 JSON 문서 저장소. WebKit 모바일 앱에 적합합니다. https://bitbucket.org/davidchambers/mathmethods.js Number.prototype`에 `Math` 메서드를 제공하세요. https://bitbucket.org/davidchambers/base64.js 이러한 함수를 제공하지 않는 브라우저의 경우 `window.btoa` 및 `window.atob`. https://bitbucket.org/davidchambers/string-format String.prototype`에 `format` 메서드를 추가합니다. 파이썬의 `str.format()`에서 영감을 얻었습니다. http://extralogical.net/projects/firmin/ CSS 트랜스폼과 전환을 사용하여 부드러운 하드웨어 가속 애니메이션을 만드는 애니메이션 라이브러리. https://bitbucket.org/killdream/ekho 버블링 기능을 갖춘 DOM에 구애받지 않는 이벤트 라이브러리. https://bitbucket.org/scott_koon/bootstrap 작고 간단한 부트로더. 군더더기 없음. 블랙과 화이트 라벨. http://ejohn.org/blog/javascript-micro-templating/ 빠르고 캐시 속도가 빠르며 사용하기 쉬운 템플릿 기능. http://xuijs.com HTML5 모바일 웹 애플리케이션 제작을 위한 DOM 라이브러리로, 다양한 디바이스 및 플랫폼에서 작동합니다. http://jsonselect.org JSON용 CSS와 유사한 선택기. https://github.com/jeromeetienne/gowiththeflow.js 노드 및 브라우저용 비동기 흐름 제어 마이크로 라이브러리. http://underscorejs.org/ Ruby에서 기대할 수 있는 기능적 프로그래밍 지원을 제공하는 유틸리티 벨트. https://github.com/glebm/DOMBrew 클린 API 고성능 DOM 빌더 https://github.com/devongovett/slang 문자열을 위한 유틸리티 함수 모음 http://backbonejs.org/ 사용자 정의 이벤트, 풍부한 열거 기능이 있는 컬렉션, 보기 및 RESTful JSON을 갖춘 경량 MVC 모델. https://github.com/bemson/genData/ 모든 것을 구축, 쿼리, 조작하기 위한 정규화 패턴. https://github.com/daniellmb/MinPubSub 게시/구독 메시징 프레임워크 https://github.com/joelambert/morf 사용자 정의 완화 기능을 사용하여 하드웨어 가속 CSS3 전환을 위한 JavaScript 해결 방법. https://github.com/julienw/dollardom DOM 요소 선택, 스타일 지정, 트래버스 및 애니메이션. http://www.modernizr.com/ 현재 브라우저에서 사용 가능한 기본 CSS3 및 HTML5 기능을 감지합니다. http://zeptojs.com 최신 웹 브라우저를 위한 jQuery API 호환 프레임워크. 선택적 Ajax, 이벤트, 데이터 및 터치 모듈. http://www.github.com/hij1nx/weld 완전히 눈에 띄지 않는 완전한 기능의 템플릿 안티물질. Node.js 또는 브라우저, 멋진 내장 디버거에서 작동합니다. http://mustache.github.com/ 콧수염}}을 사용한 최소한의 로직이 없는 템플릿. 서버 또는 클라이언트 측 템플릿에 적합합니다. http://labjs.com/ 성능* 스크립트 로더: 종속성에 대한 순서대로 실행되는 온디맨드 병렬 스크립트 로딩. https://github.com/ded/qwery 초고속 쿼리 선택기 엔진으로 CSS1, CSS2 및 CSS3 선택기로 요소를 선택할 수 있습니다. https://github.com/alpha123/Jaguar 가볍고 확장 가능하며 빠른 선택기 엔진으로, 이벤트 위임에 일반적으로 사용되는 matchesSelector()에 대한 탁월한 지원을 제공합니다. 재규어는 모든 CSS1, CSS2 및 대부분의 CSS3 선택자를 지원합니다. https://github.com/fat/bean Bean은 데스크톱, 모바일 및 터치 기반 브라우저용으로 설계된 매끄러운 크로스 플랫폼, 프레임워크에 구애받지 않는 이벤트 유틸리티입니다. https://github.com/ded/script.js 놀랍도록 인상적인 설치 공간을 제공하는 비동기 자바스크립트 로더 및 종속성 관리자입니다. https://github.com/ded/klass 프로토타입 상속을 위한 매끄러운 클래식 인터페이스를 갖춘 표현력이 풍부한 크로스 플랫폼 JavaScript 클래스 제공업체. https://github.com/ded/bonzo 번거로움이 없고 라이브러리에 구애받지 않는 확장 가능한 DOM 유틸리티. http://classy.pocoo.org/ Classy는 파이썬에서 영감을 받은 자바스크립트용 클래스를 구현하는 작은 자바스크립트 라이브러리입니다. https://github.com/flatiron/director 단일 페이지 앱을 위한 가볍고 모든 기능을 갖춘 클라이언트 측 라우터. https://github.com/ded/Reqwest 비동기 HTTP 요청을 위한 강력한 래퍼. http://ender.no.de 사용자 정의 JavaScript 라이브러리를 구성하기 위한 개방적이고 강력한 마이크로-매크로 API. http://twigkit.github.com/tempo/ Tempo는 순수 HTML로 데이터 템플릿을 제작할 수 있는 JSON 렌더링 엔진입니다. http://scaleapp.org/ scaleApp은 확장 가능한 한 페이지 애플리케이션을 위한 작은 자바스크립트 프레임워크입니다. https://github.com/kriskowal/q 자바스크립트를 위한 언제/디퍼 스타일 프로미스(CommonJS/Promises/A,B,D) http://icanhazjs.com/ jQuery 또는 Zepto.js를 위한 간단하고 강력한 클라이언트 측 템플릿. http://snackjs.com/ DOM 조작, 이벤트, pub/sub, Ajax 및 언어 유틸리티를 갖춘 작은 크로스 브라우저 라이브러리. https://github.com/pvande/Milk 사양 호환(v1.1+λ) Mustache 템플릿: CoffeeScript로 작성되어 어디서나 실행할 수 있습니다. https://github.com/ded/domready DOM이 준비되면 알려줍니다. https://github.com/douglascrockford/JSON-js 글로벌 객체에 아직 없는 경우 문자열화 및 구문 분석 메서드를 사용하여 JSON 프로퍼티를 생성합니다. https://github.com/ded/Kizzy 멤캐시드 인터페이스와 함께 로컬 스토리지 및 XML 스토어를 활용한 크로스 브라우저 캐싱 활용 http://yepnopejs.com/ 사용자에게 필요한 스크립트만 로드할 수 있는 비동기 조건부 리소스 로더입니다. https://github.com/ded/bowser 브라우저 탐지기. 감지할 기능이 없는 경우 브라우저 스니핑을 해야 할 때가 있기 때문입니다. https://github.com/danwrong/loadrunner 간단하고 유연하며 건전한 브라우저용 JavaScript 로더 및 빌드 도구 https://github.com/azer/functools 함수형 작업을 위한 라이브러리 http://kitcambridge.github.com/maddy 함수형 객체 연산 라이브러리. https://github.com/kriskowal/es5-shim/ 레거시 JavaScript 엔진이 ES5에 최대한 가깝게 작동하도록 호환성 심을 제공합니다. https://github.com/rgrove/lazyload 비동기 JavaScript 및 CSS 로더. https://github.com/azer/observer 관찰자 디자인 패턴의 CommonJS 구현 https://github.com/ryanseddon/H5F HTML5 Forms 챕터의 새로운 필드 입력 유형, 속성 및 제약 조건 유효성 검사 API를 지원하지 않는 브라우저에서 지원 추가. https://github.com/marcuswestin/store.js 쿠키나 플래시를 사용하지 않고 모든 브라우저를 위한 localStorage 래퍼 추가 https://github.com/ded/valentine 반복자, 유형 검사 및 기본 유틸리티를 제공하는 자바스크립트 함수형 자매 기능 http://github.com/tinyhippos/jWorkflow 클라이언트 또는 서버사이드 자바스크립트를 위한 간단하고 빌드 가능하며 반복 가능한 워크플로우 http://caolan.github.com/nimble/ 자바스크립트를 위한 기능적 흐름 제어. 밑줄 라이브러리와 비동기 라이브러리의 기능을 결합합니다. https://github.com/Wolfy87/EventEmitter 브라우저용 이벤트 발생 자바스크립트 https://github.com/tekool/objs 자바스크립트에서 네임스페이스와 클래스 상속을 사용하는 데 도움을 주기 위한 최소한의 라이브러리입니다. http://millermedeiros.github.com/crossroads.js/ 서버 측 및 클라이언트 측 애플리케이션을 위한 강력한 JavaScript URL 라우팅/디스패치. https://github.com/andyet/fermata 클라이언트 측 웹 앱과 node.js를 위한 간결한 네이티브 REST 클라이언트. URL을 마법의 JavaScript 객체로 변환합니다. http://millermedeiros.github.com/js-signals/ JavaScript를 위한 사용자 정의 이벤트/메시징 시스템. https://github.com/millermedeiros/Hasher 리치 미디어 애플리케이션을 위한 브라우저 기록 관리자. https://github.com/subtleGradient/SubtleLocationProxy.js 한 창, 프레임 또는 iframe의 위치를 다른 해시로 프록시하거나 그 반대로 프록시할 수 있습니다. http://leviroutes.com HTML5 히스토리에 연결되는 JS의 기본 경로 프레임워크. http://benbscholz.github.com/jaylist JavaScript의 내장 해시 저장소를 위한 간단한 래퍼. http://github.com/getify/JSON.minify 파싱하기 전에 JSON에서 // 및 /*..*/ 주석을 제거합니다. http://mwbrooks.github.com/thumbs.js/ 데스크톱 및 기타 마우스 기반 브라우저에 터치 이벤트 지원을 추가합니다. https://github.com/kbjr/Events.js 키 입력 처리, 해시 변경, 마우스 진입/퇴장 등 브라우저 간 DOM 이벤트를 지원합니다. http://augmentjs.com 최신 자바스크립트 메서드로 내장 객체를 보강하여 최신 자바스크립트를 사용할 수 있습니다. http://headjs.com/ HTML5 및 CSS3 폴리필을 지원하는 비동기 로더 라이브러리 https://github.com/jussi-kalliokoski/binary.js 빠르고 작고 강력하며 확장 가능한 바이너리 변환 라이브러리. https://github.com/pyrsmk/ClassIE ClassIE는 JS 및 CSS 측의 Internet Explorer 버전을 감지하는 눈에 잘 띄지 않는 라이브러리입니다. https://github.com/pyrsmk/Sheethub 중앙 집중식 방식으로 멋진 스크립트를 제공하기 위한 CSS 백도어 API https://github.com/pyrsmk/nut 간결한 CSS 선택기 엔진 https://github.com/pyrsmk/molt 반응형 디자인을 위한 이미지 업데이터 https://github.com/pamelafox/lscache localStorage 기반 멤캐시에서 영감을 받은 클라이언트 측 캐싱 라이브러리. https://github.com/pyrsmk/W 반응형 디자인을 위한 너비 관리 도구 https://github.com/insin/DOMBuilder (대부분) 상호 교환 가능한 DOM 또는 HTML 출력을 지원하는 선언적 빌더 https://github.com/kbjr/DragDrop 고급 UI 개발을 위한 드래그 앤 드롭 기능. https://github.com/pyrsmk/mediatizr 지원되지 않는 브라우저에 미디어 쿼리 지원 추가 https://github.com/pyrsmk/toast 작고 강력한 리소스 로더 https://github.com/ded/morpheus 단일 고성능 루프에서 정수부터 색상까지 여러 요소를 병렬로 트위닝할 수 있는 애니메이터 https://github.com/jakesgordon/javascript-state-machine 게임 개발에 유용한 유한 상태 머신 https://github.com/azer/environ 크로스 플랫폼 환경 감지 라이브러리. https://github.com/mrdoob/system.js 사용자의 시스템 정보가 포함된 JavaScript 객체를 생성합니다. https://github.com/searls/extend.js 네임스페이스를 정의하고 확장하는 간단한 방법 http://capmousse.github.com/include.js/ 작은 온디맨드 비동기 자바스크립트 로더. https://github.com/OiNutter/Obscura 캔버스 기반 이미지 조작 라이브러리 https://github.com/bramstein/Hypher Node.js와 브라우저를 위한 빠르고 작은 하이픈 엔진 https://github.com/mkuklis/asEvented 자바스크립트 객체에 옵저버 패턴을 제공하는 마이크로 이벤트 이미터. https://github.com/madrobby/keymaster 수정자 키를 포함하여 범위가 지정된 키보드 단축키를 정의합니다. https://github.com/arexkun/Vine DOM 요소 또는 JavaScript 객체에서 이벤트 바인딩, 바인딩 해제 및 트리거를 지원하는 이벤트 라이브러리입니다. https://github.com/jgallen23/resistance 작은 자바스크립트 비동기 흐름 제어 라이브러리. https://github.com/k33g/species 자바 스타일 OOP 및 AOP 기능, 감시 가능한 멤버, 상속 및 슈퍼 멤버 호출 기능을 제공합니다. https://github.com/JerrySievert/node-date-utils 유연성이 뛰어난 경량 날짜 폴리필. https://github.com/bradbirdsall/Swipe 가벼운 1대1 모바일 슬라이더. 터치 디바이스에 최적화되어 있습니다. https://github.com/bestiejs/platform.js 거의 모든 자바스크립트 플랫폼에서 작동하는 플랫폼 감지 라이브러리. https://github.com/ekalinin/typogr.js 타이포그래피가 개선된 HTML을 일반 텍스트로 변환하는 랜포메이션을 제공합니다. https://github.com/narfdre/Editr 체인 가능한 API를 갖춘 매우 간단한 이미지 편집 라이브러리. https://github.com/jgallen23/cookie-monster 경량 쿠키 라이브러리 https://github.com/jakesgordon/javascript-audio-fx HTML5 오디오 라이브러리 https://github.com/chjj/zest 터무니없이 빠른 셀렉터 엔진. Sizzle보다 빠른 CSS3/CSS4 선택기를 지원합니다. https://github.com/tmcw/happen 범용 이벤트 트리거링 https://github.com/e-/hsi.js 작은 RGB & lt; - & gt; HSI 변환기. https://github.com/WebReflection/wru 브라우저, node.js, Rhino와 호환되는 필수 단위 테스트 프레임워크 https://github.com/jeremyckahn/shifty 자바스크립트의 작은 트위닝 엔진. https://github.com/chjj/marked 마크다운 파서 및 컴파일러. 속도를 위해 제작되었습니다. https://github.com/makeable/uuid-v4.js RFC-4122 호환 랜덤(v4) UUID 생성기 https://github.com/sandeepjain/fayer 페이지별 JavaScript를 쉽게 킥오프할 수 있습니다. https://github.com/makeable/Notificon 동적 탭 파비콘 알림/경고 http://boronine.github.com/colorspaces.js 더 스마트한 색상 조작을 위해 RGB와 여러 CIE 색 공간 간에 변환하세요. https://github.com/k33g/speculoos 커피스크립트와 완벽하게 호환되는 간단한 자바스크립트 클래스 표기법 http://supplementjs.com 자바스크립트 작업을 훨씬 더 멋지고 표현력 있게 만들어주는 작은 유틸리티 함수 모음입니다. http://mtrpcic.github.com/pathjs/ 웹 브라우저를 위한 간단하고 가벼운 라우팅 https://github.com/jgallen23/aug 객체 확장 유틸리티 http://wavded.github.com/humane-js/ 간단하고 현대적인 브라우저 알림 시스템 https://github.com/tannhu/jsface 객체 지향 프로그래밍 라이브러리 https://github.com/gtramontina/keyvent.js 키보드 이벤트 시뮬레이터. https://github.com/CapMousse/T-Lite 가볍지만 강력한 자바스크립트 템플릿 엔진 https://github.com/jasonwyatt/ancestry.js 다형성과 슈퍼 생성자가 제대로 작동하도록 하는 간단하지만 강력한 상속 라이브러리. https://github.com/dperrymorrow/callbacks.js 이벤트 디스패치, 정적 또는 인스턴스 기반으로 사용할 수 있습니다. http://gtramontina.github.com/draggable.js/ 돔 요소를 쉽게 드래그할 수 있습니다. https://github.com/dperrymorrow/router.js 자바스크립트의 컨트롤러/액션 규칙을 사용합니다. home/index는 자동으로 Home js 클래스를 인스턴스화하고 인덱스 액션을 실행합니다. http://radio.uxder.com 체인 가능한 게시/구독 프레임워크 https://github.com/jgnewman/blueshell 클래스와 유사한 구성을 가능하게 하는 프로토타입 상속 도구를 갖춘 상속용 마이크로라이브러리입니다. https://github.com/honza/140medley 일반적인 자바스크립트 작업을 위한 마이크로 프레임워크 또는 작고 유용한 유틸리티 모음입니다. https://github.com/rvagg/traversty 위로(), 아래로(), 다음(), 이전()에서 영감을 얻은 PrototypeJS를 사용하여 두통 없는 DOM 탐색. Ender와 함께 사용하기에 이상적입니다. http://mir.aculo.us/2011/03/09/little-helpers-a-tweet-sized-javascript-templating-engine/ 아주 작은 템플릿 엔진 함수. http://code.google.com/p/microajax/ 간단한 AJAX 라이브러리. http://code.google.com/p/jsclassextend/ 자바스크립트를 위한 클래스 기반 OO. https://github.com/mdix/ytIframe 40줄 미만의 유연한 일반 자바스크립트 유튜브 동영상 임베딩 스크립트. http://listjs.com 일반 HTML 목록(div, ul, 표, 모든 것!)에 검색, 정렬 및 유연성을 추가하세요. https://github.com/NV/placeholder.js 이 HTML5 기능을 지원하지 않는 구형 브라우저에서 플레이스홀더 속성에 대한 지원을 추가합니다. http://jeromeetienne.github.com/dropinrequire.js/ 브라우저에서 require()를 드롭인 대체. https://github.com/jeromeetienne/shorttag.js 노드 및 브라우저용 템플릿 엔진. http://marijnhaverbeke.nl/mold/ Mold는 템플릿 라이브러리입니다. https://github.com/daniellmb/HEX-RGB-Conversion 16진수 및 RGB 정수 색상을 위한 양방향 색상 변환 https://github.com/bemson/GSet/ 같은 이름의 게터/세터로 비공개 객체의 공개 프록시를 공유하고 제어하세요. https://github.com/jiem/my-class 아마도 가장 빠른 JS 클래스 시스템일 것입니다. 래퍼가 없습니다. https://github.com/jiem/my-common CommonJS와 유사한 스크립트/모듈 로더. http://maxpert.github.com/oorja/ OORJa = 객체 지향 자바스크립트 https://github.com/digitarald/sly Sly는 쿼리 선택기 엔진으로 CSS1, CSS2 & CSS3 선택기로 요소를 선택할 수 있습니다. https://github.com/madrobby/emile Émile은 간편한 독립형 CSS 애니메이션 자바스크립트 프레임워크입니다. https://github.com/vladocar/picoCSS 모바일 웹 앱 구축을 위해 웹킷 브라우저(Safari, Chrome)에 최적화된 기본 CSS DOM 조작 및 애니메이션을 제공합니다. https://github.com/davebalmer/turtlewax 로고에서 영감을 받은 캔버스 드로잉 라이브러리, 메서드 체인 및 극좌표를 추가하여 재미를 더합니다. https://github.com/Wolfy87/Color 16진수, RGB, 이름 및 배열 간 전환을 위한 색상 변환 기능. https://github.com/michalbe/mibbu 캔버스 및 DOM을 사용하여 빠른 게임 프로토타이핑을 위한 마이크로프레임워크 https://github.com/rpflorence/loom 차등 상속 및 AOP를 위한 간단한 4가지 메서드 API. https://github.com/BorisMoore/jsdefer/ 비동기 작업에 'Deferred' 패턴을 사용하는 스크립트 로더. http://formfactorjs.com 개발자가 태블릿, TV, 데스크톱, 핸드헬드(또는 원하는 모든 디바이스)를 대상으로 하는 폼팩터 감지 라이브러리. https://github.com/padolsey/satisfy HTML 생성기에 대한 CSS 선택기. https://github.com/ChiperSoft/Timed JavaScript의 setTimeout() 및 setInterval()을 위한 구문 설탕. https://github.com/vsa-partners/c-qwncr 복잡한 애니메이션이 완료되기 전에 다시 시작되지 않도록 하는 애니메이션 시퀀싱 라이브러리. https://github.com/Poincare/ShinyCar localStorage 키와 값을 객체로 설정 https://github.com/jussi-kalliokoski/htmlentities.js DOM을 사용하는 최소한의 HTML 엔티티 디코더/인코더. https://github.com/jakobo/sslac 런타임 패치를 지원하는 (겉보기에는 후진적인) JS 클래스 빌더 http://edspencer.github.com/jaml/ Jaml은 Ruby의 Haml 라이브러리를 에뮬레이션하여 JavaScript 프로젝트에서 HTML을 쉽게 생성할 수 있도록 합니다. https://github.com/madrobby/evidence Evidence는 자바스크립트 단위 테스트 라이브러리입니다. 이 포크는 콘솔만 사용하여 로깅합니다. https://github.com/alpha123/Viper 시간이 지남에 따라 객체의 속성을 변경하기 위한 친숙한 라이브러리입니다. 숫자, 색상, 문자열까지 애니메이션을 지원합니다. http://mikemctiernan.github.com/Janis/ 간단한 CSS 트랜지션 애니메이션 프레임워크 https://github.com/deepsweet/microjungle JSON 템플릿 엔진을 통한 매우 간단하고 강력한 클라이언트 측 HTML. https://github.com/fabiomcosta/micro-selector 어디서나 사용할 수 있는 초고속, 초소형, 범위 제한 자바스크립트 선택기 엔진 https://github.com/paulca/whenever.js 영어처럼 읽히는 구문을 사용하여 앱의 동작을 지정하세요. http://limeblack.github.com/UnlimitJS/ 객체의 프로토타입을 확장하지 않고도 네이티브 자바스크립트 객체와 연결할 수 있습니다. http://www.thejacklawson.com/Mediator.js 네임스페이스 이벤트를 처리하기 위한 유연한 pubsub식 프레임워크. https://github.com/k33g/artemia/ Artemia는 Lawnchair에서 영감을 얻은 클라이언트 측 문서 저장소입니다. http://somajs.github.com/somajs/ 개발자가 느슨하게 결합된 애플리케이션을 작성하여 확장성과 유지 관리성을 높이는 데 도움이 되는 Javascript mvc 프레임워크. https://github.com/olado/doT 노드 및 브라우저를 위한 가장 빠르고 간결한 자바스크립트 템플릿 엔진. 부분, 사용자 정의 구분자 등을 지원합니다. http://hay.github.com/stapes/ (정말) 작은 자바스크립트 MVC 마이크로프레임워크. 모바일에 적합합니다. https://github.com/bentomas/smokesignals 정말, 정말 가벼운 이벤트 이미징 https://github.com/EarMaster/CSSClass 엘리먼트 프로토타입에 .hasClass, .addClass, .removeClass, .toggleClass 함수를 추가합니다. http://smoothiecharts.org/ 실시간 스트리밍 데이터를 위한 매끄러운 자바스크립트 차트 https://github.com/unhosted/remoteStorage.js 클라이언트 측 앱에 원격 저장소 지원을 추가하기 위한 라이브러리. https://github.com/bartaz/impress.js 최신 브라우저의 CSS3 변환 및 전환 기능을 기반으로 하고 prezi.com의 아이디어에서 영감을 얻은 프레젠테이션 프레임워크입니다. https://github.com/keithamus/jwerty 사용하기 쉬운 키보드 선택기 콤보로 키보드 이벤트에 바인딩, 실행 및 어설트하기 http://qatrix.com 더 적은 코드로 고성능 웹 애플리케이션을 쉽게 구축할 수 있는 새로운 경량 JavaScript 프레임워크 https://github.com/jakesgordon/javascript-state-machine 게임 개발에 유용한 유한 상태 머신 http://filesizejs.com 파일 크기를 설명하는 사람이 읽을 수 있는 문자열을 생성하는 JavaScript 라이브러리 https://github.com/tajjyarden/bacon.js 모바일 브라우저 감지 http://bestiejs.github.com/json3 거의 모든 자바스크립트 플랫폼과 호환되는 최신 JSON 구현입니다. https://github.com/stackp/promisejs 경량 프로미스(또는 퓨처 또는 디퍼드). AJAX REST 함수를 포함합니다. https://github.com/adius/DOMinate/ 간단하지만 강력한 DOM 구축 유틸리티 및 템플릿 엔진으로 DOM을 지배하세요. https://github.com/cburgdorf/swiftcore.js 테스트 가능한 분리형 시스템을 구축하는 데 도움이 되는 가볍고(3.4k) 유연한 마이크로커널/IOC 컨테이너. https://github.com/bripkens/mix.js 종속성 해결 및 비공개 속성을 갖춘 믹스인(클로저 없음). http://momentjs.com/ 날짜 구문 분석, 조작 및 서식 지정을 위한 경량(3.7k) 라이브러리. https://github.com/metalipower/inputControl InputControl은 특정 문자나 숫자를 허용하도록 자체 입력 텍스트를 제어할 수 있는 강력한 스크립트입니다. https://github.com/js-coder/cookie.js 쿠키 설정, 가져오기, 제거를 아주 쉽게 해주는 작은 라이브러리입니다. https://bitbucket.org/davidchambers/an.hour.ago 날짜와 시간을 표현하고 비교하기 위한 DSL http://cho45.stfuawsc.com/jsdeferred/ 자바스크립트의 독립형 컴팩트 비동기 라이브러리. https://github.com/tubalmartin/riloadr 크로스 브라우저 프레임워크에 독립적인 반응형 이미지 로더. jQuery 버전 사용 가능. https://github.com/flatiron/plates Plates (템플릿의 약자)는 데이터를 마크업에 바인딩합니다. Plates는 특별한 구문이 없습니다. 브라우저와 Node.js에서 작동합니다. https://github.com/jocafa/Nonsense 반복 가능한 랜덤 데이터를 생성합니다. http://mathiasbynens.be/notes/async-analytics-snippet Google의 원래 분석 스니펫을 3분의 1로 줄이고 성능을 향상시켰습니다. https://github.com/creynders/dijon-framework Robotlegs와 Swiftsuspenders에서 영감을 받은 JavaScript의 IOC/DI 프레임워크입니다. https://github.com/g13n/ua.js 아주 작은 사용자 에이전트(브라우저) 및 장치 감지 라이브러리입니다. https://github.com/lukasalexandre/fader.js 요소를 페이드 인 및 페이드 아웃하는 마이크로 JS입니다. https://github.com/rodrigoalvesvieira/microtext.js/ 텍스트를 처리하는 JavaScript 유틸리티입니다. https://github.com/Cedriking/is.js 조건을 더 빠르게 수행할 수 있게 해주는 마이크로 JavaScript 라이브러리입니다. https://github.com/js-coder/lostorage.js HTML5 localStorage API를 사용하여 클라이언트 측 저장소를 구현합니다. lostorage.js는 모든 종류의 데이터를 저장할 수 있습니다. https://github.com/OiNutter/guggenheim.js 프레임워크에 구애받지 않는 애니메이션 갤러리 플러그인입니다. http://boronine.github.com/husl HSL 색상 공간의 인간 친화적인 대안입니다. https://github.com/pazguille/jvent NodeJS EventEmitter를 기반으로 한 브라우저용 이벤트 발행자 클래스입니다. https://github.com/lukasalexandre/TemporizedSlider.js 각 이미지에 맞춤 텍스트와 제목을 포함한 사용자 정의 가능한 시간제 이미지 슬라이더를 구현하는 마이크로 라이브러리입니다. https://github.com/shiftyp/hypo Spring에서 영감을 받은 간단하고 직관적인 마이크로 의존성 주입 프레임워크입니다. https://github.com/federico-lox/pubsub.js 다양한 JavaScript 환경을 지원하는 작고 최적화된 독립형 퍼블리시/서브스크라이브 구현입니다. https://github.com/One-com/one-validation 브라우저/노드 검증 라이브러리입니다. 사용할 수 있는 함수와 정규식 조각이 포함되어 있습니다. URL, 이메일, 도메인, TLD, UUID, IPv4 등을 검증합니다. https://github.com/thanpolas/server2js 서버와 JS 애플리케이션 간의 훅 기반 인터페이스입니다. https://github.com/jayferd/pjs 아주 작은 클래스 시스템입니다. 프로토타입만 사용하지만, 불편한 부분은 없습니다. https://github.com/Munter/node-histogram PNG/JPEG/GIF 이미지 경로에서 히스토그램 데이터 구조를 제공합니다. NodeJS, AMD 모듈 및 일반 JS 지원. https://github.com/malko/l.js 별칭, 순서 및 병렬 로딩, 콜백을 지원하는 또 다른 작은 js/css 로더입니다. https://github.com/ShadowCloud/ES5-Class Node.js 및 ES5 지원 브라우저용 네이티브 프로토타입 상속을 제공합니다. https://github.com/thanpolas/ready.js 여러 비동기 작업을 모니터링하고 모든 작업 또는 일부 작업이 완료되면 트리거합니다. http://craig.is/killing/mice JavaScript에서 키보드 단축키를 처리하는 간단한 라이브러리입니다. https://github.com/BorisMoore/jsdefer/ 비동기 작업을 위한 'Deferred' 패턴을 사용하는 스크립트 로더입니다. https://github.com/errplane/driftwood.js JavaScript에서 로깅 및 예외 추적을 위한 간단한 라이브러리입니다. https://github.com/lloyd/persona.js 웹 애플리케이션에서 Mozilla Persona를 사용한 인증을 구현합니다. https://github.com/mdix/progress.js 의존성 없는 (애니메이션) JavaScript 진행률 표시줄입니다. http://github.com/jgnewman/shotgun 중첩 가능한 사용자 정의 이벤트, 내부 이벤트 트래핑, 기능적 try/catch 추상화, 이름 없는 함수 구독 취소 기능을 제공합니다. https://github.com/nokia-entertainment/JSONPHandler 많은 비동기 및 동기 JSONP 요청, 응답, 시간 초과 및 오류를 관리하는 JS 모듈입니다. http://github.com/steelsojka/Hexy.js HEX 색상을 다양한 출력 형식으로 RGB 값으로 변환합니다. https://github.com/jasonmoo/t.js 약 400바이트로 압축된 작은 JavaScript 템플릿 프레임워크입니다. https://github.com/tubalmartin/ondomready DOM이 준비되었을 때 코드를 초기화합니다. jQuery의 ready() 메서드를 기반으로 합니다. AMD 호환. https://github.com/philbooth/vagueTime.js 시간 차이를 '방금 전' 또는 '3주 전'과 같은 모호한 시간으로 형식화합니다. https://github.com/joshwnj/statelet 작은 상태 객체 https://github.com/goloroden/compare.js compare.js는 Node.js와 브라우저에서 JavaScript의 비교 연산자를 기대하는 방식으로 구현합니다. https://github.com/rvagg/delayed setTimeout()을 사용하여 지연 및 연기를 위한 함수 도우미 모음입니다. https://github.com/radmen/css.js 동적 스타일 시트를 처리합니다. https://github.com/soundstep/infuse.js js 주입을 처리하는 IOC 라이브러리입니다. http://brad.is/coding/BigScreen/ BigScreen은 JavaScript 전체 화면 API를 사용하는 간단한 라이브러리입니다. https://github.com/DominikGuzei/Class.js 빠른 클래스 시스템. 아름다운 API. https://github.com/thlorenz/kebab 반은 큐, 반은 퍼블리시/서브스크라이브. 구독자를 지원하는 매우 작고 간단한 큐입니다. http://stringjs.com string.js는 브라우저 또는 Node.js용으로 추가 String 메서드를 제공하는 가벼운 JavaScript 라이브러리입니다. (압축 및 gzip으로 4kb 미만) https://github.com/aaditmshah/lexer flex를 모델로 한 우아하고 견고한 JavaScript 렉서입니다. 완벽을 위해 쉽게 확장할 수 있습니다. https://github.com/davidchambers/airwaves 모든 JavaScript 환경을 위한 가벼운 퍼블리시/서브스크라이브입니다. https://github.com/fschaefer/Stately.js Stately.js는 JavaScript 기반의 유한 상태 기계(FSM) 또는 유한 상태 자동화 엔진입니다. https://github.com/davidchambers/mathmethods Number.prototype에 필요한 Math 메서드를 제공합니다. https://github.com/gmac/micro-module-definition 작은 동기 모듈 정의 및 종속성 관리 프레임워크입니다. http://eightmedia.github.com/hammer.js/ 터치 장치에서 제스처를 제어하는 데 사용할 수 있는 작은 JavaScript 라이브러리입니다. https://github.com/fschaefer/Probability.js Probability.js는 Node.js와 브라우저에서 확률에 따라 JavaScript 함수를 호출하기 쉽게 만듭니다. https://github.com/fschaefer/Timer.js Timer.js는 Node.js와 브라우저용 주기적 타이머입니다. http://mlbli.github.com/craft Craft.js는 웹 앱을 쉽게 구축할 수 있도록 도와주는 작지만 강력한 JavaScript 프레임워크입니다. https://github.com/philbooth/check-types.js 타입을 확인하고 예외를 던지는 작은 라이브러리입니다. https://github.com/kylebarrow/chibi 작은 JavaScript 마이크로 프레임워크입니다. https://github.com/fschaefer/Lambda.js Node.js와 브라우저용 문자열 기반 람다로, 'x+1' 및 'x -> x+1'과 같은 문자열을 함수로 사용할 수 있습니다. http://benvie.github.com/Mouse 마우스를 일급 객체로 취급하는 고품질 라이브러리입니다. https://github.com/dciccale/xxspubsub JavaScript의 매우 작은 퍼블리시/서브스크라이브 마이크로 라이브러리입니다. https://github.com/leonidas/transparency JSON 객체를 id, class 및 data-bind 속성으로 DOM 요소에 매핑하는 브라우저용 시맨틱 템플릿 엔진입니다. https://github.com/radmen/miuri.js 간단한 URI 파서/빌더입니다. https://github.com/philbooth/spooks.js 단위 테스트 스파이를 생성하는 작은 라이브러리입니다. https://github.com/MikeMcl/big.js/ 소수점 숫자로 임의 정밀도 산술을 위한 작고 빠르고 신뢰할 수 있는 라이브러리입니다. https://github.com/Nycto/PicoModal 자체 포함된 모달 팝업 라이브러리입니다. http://nwtjs.org ajax, anim, dom 및 event 메서드를 포함한 작은 JS 프레임워크입니다. 여러 플러그인이 제공됩니다. http://github.com/zever/time/ Node와 브라우저용 날짜 비독립적 시간 구문 분석입니다. http://craig.is/making/rainbows 간단하고 확장 가능한 코드 구문 강조 표시 라이브러리입니다. https://github.com/pb82/MissMatch JavaScript를 위한 Haskell 또는 Scala와 같은 패턴 매칭입니다. https://github.com/EarMaster/switcher 정규식을 케이스로 사용하여 switch 문과 유사한 구문을 제공하는 함수입니다. https://github.com/eriwen/es6-map-shim 최신 ES6.next Map 사양을 위한 Shim https://github.com/ForbesLindesay/ajax jQuery/zepto에서 영감을 받은 독립형 AJAX 라이브러리 https://github.com/dciccale/parsy CoffeeScript로 작성된 node.js용 작은 명령줄 옵션 파서 https://github.com/rowanmanning/chic JavaScript 프로토타입 상속에 대한 매우 간단한 클래스와 같은 인터페이스입니다. https://github.com/tgriesser/ioc.js 작은 IoC 서비스 로케이터 컨테이너입니다. http://craig.is/riding/gators 간단한 이벤트 위임 라이브러리 https://github.com/piranha/keymage 키 시퀀스를 지원하는 키보드 단축키 처리 라이브러리입니다. https://github.com/bahamas10/node-perms 유닉스 스타일 권한을 ls와 같은 문자열로 변환합니다 (0755 => 'rwxr-xr-x') https://github.com/bahamas10/node-autocast JavaScript에서 일반 데이터 유형을 쉽게 자동으로 캐스팅합니다. https://github.com/mdix/ipsum.js 디자인이 다른 텍스트 길이를 처리할 수 있는지 확인하기 위해 키를 눌러 인라인 요소 내의 텍스트 양을 증가/감소시킵니다. https://github.com/wout/svg.js SVG를 조작하기 위한 가벼운 라이브러리입니다. https://github.com/js-coder/Strukt JavaScript를 위한 Ruby에서 영감을 받은 구조체입니다. https://github.com/js-coder/range.js JavaScript의 누락된 범위 함수입니다. https://github.com/bahamas10/preloadimages.js 이미지를 미리 로드하고 모두 준비되면 콜백을 호출합니다. https://github.com/zynga/atom 비동기 제어 흐름, 속성 리스너, 배리어 패턴 등을 제공하는 작은 클래스입니다. Node와 브라우저용입니다. https://github.com/timseverien/cm.js 쿠키를 쉽게 관리합니다. https://github.com/jakiestfu/Slow.js CSS 전환을 슬로우 모션으로 만듭니다 (Mac 애니메이션처럼) https://github.com/WickyNilliams/enquire.js JavaScript에서 멋진 미디어 쿼리 http://zoejs.org AMD 호환 자연 확장 기반 클래스 및 이벤트 모델로, 프로토타입 상속과 완전히 호환됩니다. http://functionaljs.org/ Clojure 및 ClojureScript에서 영감을 받은 함수형 라이브러리로, Underscore를 기반으로 합니다. https://github.com/dciccale/ki.js 아주 작은 jQuery와 같은 JavaScript 라이브러리입니다. https://github.com/relay/anim 기본적인 애니메이션 라이브러리입니다. https://github.com/Calamari/BehaviorTree.js 게임에서 AI 동작을 개발할 때 유용한 행동 트리의 JavaScript 구현입니다. https://github.com/relay/relay 디커플된 앱을 구축하기 위한 가벼운 프레임워크입니다. https://github.com/philbooth/css-time.js 밀리초를 CSS 시간 문자열로 변환하는 작은 라이브러리입니다. https://github.com/hakubo/Sloth 웹페이지의 구성 요소가 보일 때 지연 초기화합니다. http://josscrowcroft.github.com/accounting.js/ 숫자, 돈 및 통화 형식을 위한 가벼운 JavaScript 라이브러리로, 완전히 현지화 가능하고 종속성이 없습니다. https://github.com/kaimallea/isMobile 페이지를 방문하는 장치가 Apple 전화/태블릿, Android 전화/태블릿 또는 7인치 장치(Nexus 7, Kindle Fire, Nook Tablet, Galaxy Tab)인지 감지하는 간단한 JS 라이브러리입니다. https://github.com/alicelieutier/smoothScroll 종속성이 없는 아주 작은, ease-in-out, 부드러운 스크롤 라이브러리입니다. https://github.com/RubenVerborgh/promiscuous Promises/A+와 호환되는 최소한의 빠른 프라미스/디퍼드 구현입니다. https://github.com/samsonjs/strftime JavaScript용 strftime입니다. Node와 브라우저에서 작동합니다. https://github.com/timjansen/pinkyswear.js Promises/A+ 사양의 작은 구현입니다. https://github.com/nicjansma/breakup.js async.forEachSeries() 및 jQuery.each()의 대체 함수를 제공합니다. https://github.com/dfernandez79/barman JavaScript 객체를 양조하는 작은 라이브러리입니다. https://github.com/samsonjs/format JavaScript용 printf, sprintf 및 vsprintf입니다. Node와 브라우저에서 작동합니다. https://github.com/rowanmanning/upcast 저수준 JavaScript 타입 검사 및 캐스팅 라이브러리입니다. https://github.com/mkuklis/depot.js 간단한 API를 가진 네임스페이스된 localStorage 래퍼입니다. https://github.com/rowanmanning/proclaim 서버 및 클라이언트 측 JavaScript를 위한 간단한 어설션 라이브러리입니다. http://www.dcljs.org/ 믹스인 + AOP를 사용한 우아한 OOP JavaScript입니다. https://github.com/AgileDiagnosis/Fx 현대 웹을 위한 작은, 고성능, 완전히 크로스 브라우저, 종속성이 없는 애니메이션 라이브러리입니다. http://matthewbj.github.com/Colors/ 사용하기 쉬운 색상 조작 라이브러리로, 가볍고 매우 기능적입니다. https://github.com/fabien-d/alertify.js JavaScript 경고/알림 시스템입니다. https://github.com/scottjehl/Respond min/max-width CSS3 미디어 쿼리를 위한 빠르고 가벼운 폴리필입니다 (IE 6-8 등). https://github.com/SimonWaldherr/ColorConverter.js MIT 라이선스 하에 RGB, YUV, HSL 및 HEX 색상 정의 간 변환하는 JavaScript 함수입니다. http://radlikewhoa.github.io/Countable HTML 요소에 실시간 단락, 단어 및 문자 수를 추가하는 JavaScript 함수입니다. https://github.com/SimonWaldherr/disTime.js UNIX 타임스탬프를 '5일 전'과 같은 문자열로 변환하고 업데이트합니다 (영어, 독일어, 이탈리아어 지원). https://github.com/paulmillr/es6-shim/ 레거시 JavaScript 엔진이 ES6 (Harmony)에 최대한 가깝게 동작하도록 하는 호환성 shim입니다. https://github.com/jakiestfu/Behave.js 일반 텍스트 영역에 IDE 스타일 동작을 추가하는 가벼운 크로스 브라우저 라이브러리입니다. https://github.com/jakiestfu/Snap.js JavaScript로 아름다운 모바일 선반을 만드는 라이브러리입니다. https://github.com/usablica/intro.js 웹사이트 및 프로젝트에 대한 새로운 기능 소개 및 단계별 사용자 가이드를 위한 더 나은 방법입니다. https://github.com/SimonWaldherr/CSSfilter.js 이미지(또는 다른 요소)에 CSS 필터를 추가하는 데 도움이 됩니다. https://github.com/SimonWaldherr/PullToRefresh 종속성이 없는 PullToRefresh 구현입니다. https://github.com/Calamari/shunting-yard.js Dijkstra의 션팅 야드 알고리즘을 사용하여 eval 없이 사용자 입력에서 수학을 계산합니다. https://github.com/markdalgleish/bespoke.js CSS3 전환의 힘을 활용한 DIY 프레젠테이션 마이크로 프레임워크입니다. https://github.com/voidplus/onedollar-coffeescript $1 제스처 인식기의 JavaScript 구현으로, 2차원 템플릿 기반 제스처 인식입니다. http://iugojs.com 전체 프레임워크의 부하 없이 매우 가벼운 단방향 데이터 바인딩 도구입니다. 마크업과 콘텐츠를 분리하기 쉽게 만듭니다. https://gist.github.com/marianoviola/1576277 XHR API에 래핑된 JSON-P 기반 크로스 도메인 Ajax입니다. https://github.com/SimonWaldherr/imgResize.js 에지 감지를 기반으로 캔버스에서 이미지를 크기 조정합니다. https://github.com/shownotes/tinyOSF.js OSF를 HTML로 변환하는 몇 줄의 코드입니다. http://malko.github.io/D.js/ Node.js와 브라우저용 Promises/A+ 사양의 작은 구현으로, 사양에 몇 가지 확장이 포함되어 있습니다. https://github.com/davatron5000/TimeJump HTML5 오디오 및 비디오 팟캐스트에 딥 링크를 추가합니다. https://github.com/bjorkstam/animx 런타임 중에 CSS 키프레임 및 애니메이션을 쉽게 정의합니다. https://github.com/nicjansma/usertiming.js 사용자 타이밍 폴리필입니다. https://github.com/BlueJeansAndRain/DOMaker 데이터에서 DOM을 생성하는 문서 객체 생성기입니다. https://github.com/erf/ImageFlip.js 미니멀리스트 슬라이드쇼 라이브러리입니다. https://github.com/philbooth/safemap.js 작고 안전한 ES3 준수 맵/사전 구현입니다. https://github.com/jeromeetienne/creatorpattern.js 클래스에 생성자 패턴을 쉽게 추가할 수 있는 마이크로 라이브러리입니다. http://agnostic.github.io/LocalDB.js LocalDB.js는 localStorage API를 사용하여 데이터베이스 구조를 객체에 매핑하는 도구입니다. 데이터베이스 드라이버가 필요 없으며, 라이브러리를 추가하고 사용하기만 하면 됩니다! https://github.com/jeremyckahn/keydrown 웹 앱을 위한 JavaScript 키 상태 핸들러입니다. https://github.com/BlueJeansAndRain/stdclassjs 아주 간단한 JavaScript 상속 구현입니다. https://github.com/james2doyle/saltjs 쿼리를 네이티브 get 명령에 매핑하는 마이크로 DOM 선택기 라이브러리입니다. https://github.com/bfattori/LogJS 가볍고 확장 가능한 JavaScript 로깅 라이브러리입니다. https://github.com/smelnikov/defineObject JavaScript 객체와 프로토타입을 정의하기 위한 약간의 설탕입니다. https://github.com/musictheory/vivi.js CSS 정의 애니메이션(@keyframes)을 위한 작은 래퍼입니다. https://github.com/ryansmith94/Graph JavaScript에서 그래프 구조에 대해 "jQuery와 같은" 기능을 제공합니다. https://github.com/ryansmith94/Scorebook 크리켓 점수를 기록하기 위한 JavaScript 라이브러리입니다. https://github.com/cScarlson/sawkit-client HTML5 WebSocket API에 대한 비침습적 퍼사드 패턴으로, 사용자 정의 이벤트 방출, 사용자 정의 이벤트 리스너 및 바이너리 전송을 체이닝 가능한 jQuery와 같은 방식으로 허용합니다. https://github.com/cScarlson/SDB HTML5 IndexedDB API에 대한 퍼사드 패턴입니다. https://github.com/rogerluiz/Miniscroll-JS JavaScript를 사용하여 데스크탑 및 모바일 애플리케이션을 위한 간단한 스크롤바입니다. https://github.com/SimonWaldherr/majaX.js AJAX 요청을 수행하고 (파싱된) 값과 헤더를 가져옵니다. https://github.com/pyrsmk/qwest 프라미스와 XHR2 지원을 갖춘 Ajax 라이브러리입니다. https://github.com/nsisodiya/choona.js 확장 가능하고 모듈식 아키텍처를 위한 작은 JavaScript 프레임워크입니다. https://github.com/avoidwork/csv.js JSON, 배열 또는 객체를 CSV로 변환합니다. https://github.com/SimonWaldherr/konami.js 모든 키 입력을 기록하고 나중에 저장합니다. https://github.com/SimonWaldherr/infinity.js 종속성이 없는 무한 스크롤링입니다. https://github.com/EvanHahn/ScriptInclude 브라우저에서 간단한 포함을 제공합니다. https://github.com/monospaced/hamster.js 크로스 브라우저 마우스 휠 지원을 위한 독립형 JavaScript 라이브러리입니다. https://github.com/magnetikonline/cssanimevent 지원되지 않는 브라우저에 대한 간단한 폴백 패턴을 갖춘 CSS3 애니메이션 및 전환 DOM 이벤트 핸들러입니다. https://github.com/jimmynewtron/ClassJS 브라우저와 Node.js를 위한 JavaScript 클래식 상속입니다. 슈퍼 메서드와 네임스페이스를 지원합니다. https://github.com/brehaut/color-js/ RGB, HSV 및 HSL에서 선택적 알파를 갖춘 불변 색상 객체를 위한 API입니다. 포괄적인 CSS 형식 파싱 및 출력 기능을 제공합니다. http://fgnass.github.io/spin.js/ 회전하는 활동 지시자입니다. 애니메이션 CSS3 로딩 스피너입니다. https://github.com/scrapmac/snippets/tree/master/remove.js 작지만 강력한 문자열 정리 및 축소 라이브러리입니다. https://github.com/pyrsmk/quark 처음부터 프레임워크를 구축합니다. https://github.com/nbubna/store localStorage 및 sessionStorage를 더 잘 사용하는 방법입니다. http://chronology.wout.co.uk 실행 취소/다시 실행 기록을 관리하기 위한 마이크로 JavaScript 라이브러리입니다. https://github.com/hgoebl/doublemetaphone DoubleMetaphone 알고리즘을 사용하여 음성적으로 인코딩합니다 ('Alexander' -> 'ALKS'). https://github.com/f5io/satnav-js 마이크로 (~1.5kb gzipped) JS 라우팅 라이브러리입니다. Satnav는 JavaScript에서 정규식과 같은 경로 기능을 제공합니다. http://raptorjs.org/modules-classes/developer-guide/ RaptorJS의 핵심 모듈은 네임스페이싱, AMD, 클래스 상속, 믹스인, 열거형 및 지연 초기화를 지원하는 가벼운 모듈 시스템을 제공합니다. 브라우저와 Node.js에서 작동합니다. http://nicbell.github.io/attach.js/ JavaScript를 페이지에 첨부하는 작업을 정리하고 캡슐화하도록 설계된 DOM 인스턴스화 API입니다. https://github.com/pomke/mediahack 미디어 쿼리 클래스를 DOM 노드에 추가합니다. https://github.com/pimterry/loglevel JavaScript를 위한 최소한의 가벼운 로깅으로, 사용 가능한 console.log 메서드를 래핑하는 신뢰할 수 있는 로그 레벨 메서드를 추가합니다. http://www.storminthecastle.com/projects/goo.js/ HTML5 Canvas API를 사용하여 빠르고 쉽게 그릴 수 있는 마이크로 라이브러리입니다. https://github.com/jimhigson/oboe.js Ajax 응답의 점진적 구문 분석을 위한 라이브러리입니다. 요청이 완료될 때까지 기다리지 않고 발견된 객체에 대한 알림을 제공합니다. https://github.com/SimonWaldherr/parseTime.js "five days ago"와 같은 문자열을 세 가지 언어(영어, 독일어, 포르투갈어)로 밀리초 단위의 정수로 변환합니다. https://github.com/SimonWaldherr/DOMpteur 문서 객체 모델(DOM) 트리를 가지고 놀며 요소를 변경하고 삽입합니다. https://github.com/caolan/async 비동기 JavaScript 작업을 위한 강력하고 직관적인 기능을 제공하는 유틸리티 모듈입니다. https://github.com/avoidwork/tiny-lru 최소 최근 사용(LRU) 캐시입니다. https://github.com/bfil/es5-class Node.js 및 ES5 지원 브라우저용 네이티브 프로토타입 상속을 제공합니다. https://github.com/ryansmith94/Pledges 프라미스 기능을 제공하는 JavaScript 마이크로 라이브러리입니다. https://github.com/madsgraphics/SVGEventListener 지원되지 않는 브라우저(예: 웹킷 엔진)에서 SVG 애니메이션 이벤트를 위한 폴리필입니다. https://github.com/calvinmetcalf/catiline 웹 워커를 쉽게 사용할 수 있게 합니다. https://github.com/javanto/civem.js HTML5 폼 검증을 위한 사용자 정의 오류 메시지입니다. https://bitbucket.org/vogdb/i18n-text 국제화(i18n) 텍스트 메시지를 위한 JavaScript 라이브러리입니다. http://minifiedjs.com/ Minified.js는 jQuery 및 MooTools와 유사한 범위의 클라이언트 측 JavaScript 라이브러리입니다. DOM 조작, 애니메이션, 이벤트, 쿠키 및 HTTP 요청 기능을 포함합니다. https://github.com/Teun/thenBy.js 표준 Array.sort를 사용하여 firstBy().thenBy().thenBy() 배열 정렬을 가능하게 합니다. http://catilinejs.com 웹 워커를 쉽게 사용할 수 있게 합니다. https://github.com/calvinmetcalf/lie 아주 작은 프라미스 라이브러리입니다. https://github.com/avoidwork/assure 비동기 작업 흐름을 돕기 위한 Promises/A+ 마이크로 라이브러리입니다. https://github.com/pete-otaqui/fpscounter 브라우저에서 매우 간단한 FPS 카운터를 생성합니다. 기본적으로 설정이 필요 없으며, 옵션이 제공됩니다. https://github.com/allouis/minivents JavaScript 애플리케이션을 위한 미니 이벤트 라이브러리입니다. https://github.com/evandrolg/audiojs HTML5의 AudioContext API를 쉽게 사용할 수 있는 독립적이고 크로스 브라우저 라이브러리입니다. https://github.com/Jabher/cornerjs IE9+ Angular 스타일 지시문으로, DOM 요소의 클래스, 속성 및 태그를 추가, 제거 및 수정하는 이벤트를 바인딩합니다. IE9+ 폴리필인 MutationObserver와 WeakMap을 포함합니다. https://github.com/nauman1225/http.js HTTP 요청 및 Ajax 호출을 위한 객체 지향 JavaScript 라이브러리입니다. https://github.com/brophdawg11/JsChannels Clojure의 core.async에서 영감을 받은 최소한의 JavaScript 채널 라이브러리입니다. https://github.com/tmwagency/swiftclick 방향 변경을 지원하는 터치 장치에서 300ms 클릭 이벤트 지연을 제거하기 위해 만들어진 라이브러리입니다. https://github.com/orbitaloop/WebSqlSync 로컬 WebSql 데이터베이스(브라우저의 SQLite)를 서버와 자동으로 동기화하는 라이브러리입니다. https://github.com/sindresorhus/detect-indent 코드의 들여쓰기를 감지합니다. https://github.com/fiatjaf/tempreites 데이터를 HTML 마크업에 바인딩하는 시맨틱 템플릿입니다. 브라우저와 서버에서 DOM이 필요 없이 문자열만 사용합니다. http://sean.is/poppin/tags 폼 준비가 된 맛있는 스타일의 태그 라이브러리입니다. https://github.com/tildeio/rsvp.js Promises/A+의 작은 구현과 객체를 이벤트 대상으로 변환하는 믹스인입니다. Node와 브라우저에서 작동합니다. https://github.com/mawrkus/tinycore 작은 JavaScript 모듈식 아키텍처 라이브러리입니다. https://github.com/dperish/nTh.js 정수에서 서수 접미사를 반환하는 마이크로 라이브러리입니다 (예: 1st, 2nd, 3rd, 7th of 9). http://rococojs.org/ 우아하고 견고한 JavaScript 애플리케이션을 만들기 위한 마이크로 프레임워크입니다. https://github.com/jtenner/expando-js 약어를 (X)HTML로 확장하는 매우 빠른 HTML 생성 도구입니다. https://github.com/tomhuda/metamorph.js Metamorph.js는 HTML 문자열을 생성하고 DOM에 삽입한 후 나중에 내용을 업데이트할 수 있게 해주는 라이브러리입니다. https://github.com/yckart/Transe.js 변환 가능한 스크롤 요소(모바일 지원 포함)입니다. https://github.com/yckart/CSSDyer.js 자신만의 CSS 색상을 만듭니다. https://github.com/yckart/DragValue.js 드래그하여 값을 변경합니다. https://github.com/yckart/Curtain.js 커튼을 위로 스크롤합니다! https://github.com/yckart/imageMaps.js 모든 브라우저에서 반응형 이미지 맵을 제공합니다. https://github.com/yckart/SpellChecker JavaScript 철자 교정입니다. https://github.com/yckart/BinaryHeap JavaScript로 구현된 이진 힙입니다. https://github.com/yckart/undone.js 잘 구성된 JavaScript 애플리케이션을 위한 실행 취소/다시 실행 관리자입니다. https://github.com/KoryNunn/crel 간단하고 빠른 DOM 생성 유틸리티입니다. https://github.com/tildeio/route-recognizer 등록된 경로와 경로를 일치시키는 가벼운 JavaScript 라이브러리입니다. 동적 및 별 세그먼트와 중첩된 핸들러를 지원합니다. http://kinglozzer.github.io/SwipeMe/demo/index.html 오프 캔버스 메뉴를 열고 닫기 위한 가벼운 JavaScript 라이브러리입니다. https://github.com/avoidwork/keysort SQL ORDER BY 절로 객체 배열을 정렬합니다. https://bitbucket.org/zserge/klud.js/ 최소한의 단위 테스트 라이브러리입니다. https://bitbucket.org/vogdb/canvas-manipulation 캔버스에 확대/축소, 드래그 및 회전 기능을 추가합니다. https://github.com/gamtiq/basespace 객체 내부에 네임스페이스를 생성하는 함수입니다. https://github.com/gamtiq/extend 한 클래스를 다른 클래스로 상속합니다. https://github.com/gamtiq/numgen 숫자 시퀀스를 생성하는 객체를 만듭니다. https://github.com/gamtiq/duratiform 밀리초 단위의 시간 지속 시간을 분리하고 형식화하는 유틸리티입니다. https://github.com/rkrupinski/easter.js 이스터 에그를 쉽게 만듭니다. https://github.com/toxigenicpoem/henka 가볍고 휴대 가능하며 단일 목적의 반응형 JavaScript 라이브러리입니다. https://github.com/mvasilkov/rssi Node.js와 브라우저용으로 Ruby와 유사한 간단한 문자열 보간입니다. https://github.com/philbooth/trier.js 모두가 좋아하는 트라이어! Node와 브라우저용 조건부 및 반복 작업 호출입니다. https://github.com/jonathanstark/FastActive FastActive는 터치 장치에서 웹사이트와 웹 애플리케이션을 네이티브 앱처럼 반응하게 만드는 JavaScript 스니펫입니다. https://github.com/larryosborn/JSONP JavaScript용 슬림 JSONP 요청 라이브러리입니다. http://responsivecomments.com/ 조건부 로딩을 위한 클라이언트 측 솔루션입니다. https://github.com/gamtiq/chronoman 시간 관리 유틸리티입니다. https://github.com/gamtiq/mixing 객체를 혼합하는 함수입니다. https://github.com/arthesowy/gameloop.js 게임 루프를 생성하기 위한 매우 간단한 라이브러리입니다. https://github.com/adrianmiu/callbacks jQuery의 Callbacks와 유사한 콜백 라이브러리입니다. on(), one(), off() 및 trigger()를 사용할 수 있는 이벤트 관리자도 포함되어 있습니다. https://github.com/ConduitInc/ArrowJS 브라우저 다운로드 위치를 가리키는 화살표를 표시하는 작은 라이브러리입니다. https://github.com/amwmedia/infect.js 모든 JavaScript 프로젝트를 위한 감염적으로 간단한 의존성 주입입니다. http://rubaxa.github.com/Sortable/ Sortable은 현대 브라우저와 터치 장치를 위한 최소한의 JavaScript 라이브러리입니다. jQuery가 필요 없습니다. https://github.com/evandrolg/p JavaScript에서 프라미스를 쉽게 사용할 수 있도록 도와주는 독립적이고 크로스 브라우저 라이브러리입니다. https://github.com/steelbreeze/state_lite.js JavaScript용 경량 상태 기계 라이브러리입니다. https://github.com/brophdawg11/Automator.js JavaScript에서 거의 모든 것을 자동화하기 위한 최소한의 JavaScript 라이브러리입니다. https://github.com/getify/asynquence 시퀀스와 게이트를 사용한 비동기 흐름 제어입니다. https://github.com/sporto/namespacer.js 브라우저에서 네임스페이스 객체를 생성하기 위한 간단한 라이브러리입니다. https://github.com/jtenner/Composer.js 음악 기능의 맛을 가진 객체를 구성합니다. 페이지에 Composer.js를 포함하기만 하면 됩니다. https://github.com/omphalos/web-worker-proxies 웹 워커를 위한 RPC 스타일 인터페이스의 작은 구현입니다. https://github.com/gmac/pods.js 작은 동기 모듈 정의 및 종속성 관리 프레임워크입니다. https://github.com/mariusGundersen/sparkline 텍스트와 함께 인라인으로 스파크라인 그래프를 생성합니다. 기본 설정이 좋고 사용자 정의가 쉽습니다. https://github.com/MAD-GooZe/YoutubeDelayed.js 사용자가 비디오를 시청하려고 할 때만 페이지에 YouTube 플레이어를 로드할 수 있게 해주는 작은 스크립트입니다. https://moot.it/riotjs/ 1kb 클라이언트 측 MVP 라이브러리입니다. 대규모 웹 애플리케이션을 구축하기 위한 매우 빠르고 강력하지만 작은 도구입니다. https://github.com/bevacqua/contra 작은 비동기 흐름 제어 라이브러리입니다. https://github.com/SimonWaldherr/cryptofoo 문자열을 해시하는 속도와 유효성 간의 좋은 타협입니다. https://github.com/SimonWaldherr/micromarkdown.js 5kb 미만으로 마크다운을 HTML로 변환합니다. https://github.com/bbaliguet/ordering array.sort()를 위한 정렬 함수를 빌드하는 도우미입니다. https://github.com/borisschapira/preloadr 필요한 경우 이미지를 하나씩 미리 로드하고 모든 이미지가 준비되었을 때 콜백을 호출합니다. https://github.com/pseudosavant/psQuery DOM, Ajax 및 CSS를 위한 빠른 jQuery 대체 라이브러리입니다. 2kb minified+gzipped. IE8+을 지원합니다. https://github.com/dunxrion/tinyrequire 종속성 관리를 위한 간단한 라이브러리입니다. https://github.com/evandrolg/Feed 피드 리더처럼 작동하는 클라이언트 측 라이브러리로, 게시물의 모든 데이터를 반환합니다 - 제목, 텍스트, 링크 등. https://github.com/aravindbaskaran/simple-async 비동기 반복을 위한 매우 가벼운 JavaScript 라이브러리입니다. 콜백 체인이 없고 종속성이 없습니다. https://github.com/Pencroff/MoaJs 객체 상속, 믹스인, 정적 메서드/속성/믹스인, 싱글톤 선언을 위한 ExtJs 구문을 제공하며, 2kB 미만의 압축된 JavaScript 코드입니다. http://dinbror.dk/blazy/ 지연 로딩 및 멀티 서빙(레티나 및 반응형) 이미지를 위한 가벼운 스크립트입니다. https://github.com/james2doyle/simplebinder simplebinder는 JavaScript를 위한 종속성이 없는 단방향 데이터 바인더입니다. https://github.com/nevyk/tipograph 텍스트 입력을 타이포그래피적으로 올바른 문자 시퀀스로 변환하는 라이브러리입니다. https://github.com/Extaze/fuzzy.js Fuzzy.js는 JavaScript의 퍼지 검색 알고리즘입니다. https://github.com/ZIJ/svg-path 약간의 설탕을 추가한 체이닝 가능한 SVG 경로 문자열 생성기입니다. https://github.com/joaocunha/v-unit 뷰포트 상대 치수에 대한 빠른 대안입니다. 버그가 많은 vh 및 vw CSS 단위는 RIP. http://webpro.github.io/jquery-evergreen/ 현대 브라우저를 위한 작고 빠른 DOM 및 이벤트 라이브러리입니다. jQuery와 동일한 친숙한 API를 가지고 있으며, 작고 선택적인 모듈로 구성되어 있습니다. https://github.com/lagodiuk/decision-tree-js 의사 결정 트리 및 랜덤 포레스트 분류기를 구축하기 위한 작은 라이브러리입니다. https://github.com/pseudosavant/psColor 브라우저에서 img 요소의 평균 색상을 계산하기 위한 작은 JavaScript 라이브러리입니다. https://lhorie.github.io/mithril 훌륭한 애플리케이션을 구축하기 위한 JavaScript MVC 프레임워크입니다. https://github.com/kupriyanenko/jbone 이벤트 및 DOM 조작을 위한 JavaScript 라이브러리입니다. 브라우저에서 Backbone을 위한 jQuery 대체 라이브러리입니다. https://github.com/DominicTobias/extnd 깨끗한 구현과 다중 상속을 갖춘 클래스 시스템입니다. http://ytiurin.github.io/html5tooltipsjs/ CSS3 애니메이션을 사용한 가볍고 깔끔한 툴팁입니다. https://github.com/srubin/microphone 브라우저에서 실시간 오디오 입력을 처리합니다. https://github.com/EngineeringMode/Grapnel.js 이름이 지정된 매개변수를 사용하는 가장 작은(1100 바이트 gzipped) JavaScript 라우터입니다. https://github.com/jstandish/nerve 경로와 채널을 따라 이벤트를 브로드캐스트하는 비동기 JavaScript 마이크로 프레임워크입니다. http://avoidwork.github.io/tiny-stack 브라우저 또는 서버용 작은 스택입니다. https://github.com/PoeHaH/devicedetector 데스크탑, 모바일 또는 태블릿 장치인지 감지하는 작은 스크립트입니다. https://github.com/getify/native-promise-only 엄격한 사양 정의에 최대한 가깝게(확장 없음) ES6 프라미스에 대한 폴리필입니다. http://chrisbateman.github.io/impetus 모든 것에 모멘텀을 추가합니다. iScroll과 비슷하지만 스크롤링을 위한 것은 아닙니다. 마우스 및 터치 이벤트를 지원합니다. http://webpro.github.io/DOMtastic/ 현대 브라우저를 위한 작고 빠른 DOM 및 이벤트 라이브러리입니다. jQuery와 동일한 친숙한 API를 가지고 있으며, 작고 선택적인 모듈로 구성되어 있습니다. https://github.com/dkraczkowski/dom.js DOM.js는 DOM 탐색, 조작 및 이벤트 처리를 위한 가볍고 빠르며 크로스 브라우저 라이브러리입니다. https://github.com/daniellmb/perfnow.js 고해상도 성능 벤치마킹 폴리필입니다. https://github.com/pyrsmk/RIP FORM 컨텍스트에서 REST 요청을 수행하여 동기 Ajax 요청을 피하는 데 유용합니다. http://www.ericmcd.com/byda/ HTML5 가져오기 또는 XHR(Ajax)을 통한 HTML 콘텐츠 교체입니다. https://github.com/gamtiq/eva 함수를 생성하고 표현식을 평가하는 함수입니다. https://github.com/agamemnus/smoke-pure.js 간단한 모달 라이브러리입니다. https://github.com/dhilipsiva/style.js HTML 요소를 스타일링하고 CSS 값을 공유하기 위한 도구입니다. https://github.com/SheetJS/js-crc32 이진 및 유니코드 데이터에 대한 매우 빠른 CRC-32 체크섬 알고리즘입니다. https://github.com/musterknabe/translate.js 문자열을 번역하는 간단한 함수입니다. 여러 복수형 및 대체/자리 표시자를 지원합니다. https://github.com/javascript/augment 세계에서 가장 작고 빠른 클래식 JavaScript 상속 패턴입니다. http://functionaljs.com 커링 및 포인트 프리 프로그래밍을 용이하게 하는 함수형 JavaScript 라이브러리입니다. https://github.com/skibz/SeXHR 브라우저용 간단하고 매력적인 XMLHttpRequest 래퍼입니다. https://github.com/marmottes/marmottajax 프라미스를 포함한 작은 Ajax 라이브러리입니다. https://github.com/AdamBrodzinski/parse-form 양식을 파싱하고 조작하는 데 사용되는 마이크로 라이브러리입니다. https://github.com/krasimir/gifffer 애니메이션 GIF의 자동 재생을 방지하는 작은 JavaScript 라이브러리입니다. http://szarouski.github.io/lodash.dom-traverse/ lodash를 사용한 DOM 탐색입니다. https://github.com/dmfilipenko/datediff 두 날짜 간의 차이를 계산합니다. https://github.com/krasimir/deb.js 세계에서 가장 작은 디버거입니다. https://github.com/chrisdavies/rlite 작고 간단하며 가벼운 라우팅 라이브러리입니다. https://github.com/syntaqx/pass-meter 간단한 비밀번호 강도 테스트입니다. https://github.com/fend25/strg.js 단일 API로 localStorage, sessionStorage 및 쿠키를 간단하고 명확하게 운영하는 라이브러리입니다. https://github.com/Canop/hu.js SVG의 생성, 조작 및 애니메이션을 위한 매우 가벼운 라이브러리입니다. https://github.com/munkychop/bullet AMD/모듈 지원 및 직관적인 API를 갖춘 초경량 퍼블리시/서브스크라이브 라이브러리입니다. https://github.com/SGrondin/bottleneck Node와 브라우저용 최고의 비동기 속도 제한기입니다. http://amobiz.github.io/regexgen.js/ RegexGen.js는 복잡한 정규 표현식을 구성하는 데 도움이 되는 JavaScript 정규 표현식 생성기입니다. https://github.com/dstillman/pathparser.js 작고 사용하기 쉬운 URL 파서/라우터입니다. https://github.com/purge/youarei.js 합리적인 매개변수 처리를 제공하는 URL 파싱 라이브러리입니다. https://github.com/visionmedia/page.js 약 1200 바이트의 Express에서 영감을 받은 클라이언트 측 라우터입니다. https://github.com/kethinov/page.js-body-parser.js page.js용 플러그인으로 body-parser와 유사한 폼 지원을 구현합니다. https://github.com/desandro/draggabilly 요소를 드래그 가능하게 만듭니다. https://github.com/serkanyersen/kwargsjs JavaScript를 위한 스마트한 Python 스타일의 인수 관리입니다. https://github.com/serkanyersen/ifvisible.js 사용자가 페이지를 보고 있는지 또는 상호작용하고 있는지 확인하는 크로스 브라우저 및 가벼운 방법입니다. https://github.com/finom/balalaika 작지만 강력한 jQuery와 유사한 JavaScript DOM 라이브러리입니다. https://github.com/steelbreeze/state.js JavaScript용 경량 상태 기계 라이브러리입니다. https://github.com/kapilkaisare/sleeper-agent 클라이언트 인스턴스에서 선택적으로 로그를 수집합니다. https://github.com/kapilkaisare/daemonizejs 함수에 데몬과 같은 인터페이스(시작, 중지, 재시작)를 제공합니다. https://github.com/nolanlawson/debug-websql 디버깅 목적으로 Web SQL에 대한 모든 호출을 console.log로 기록합니다. https://github.com/machellerogden/unblock 비동기 제어 흐름을 위한 단일 함수입니다. https://github.com/young-steveo/bottlejs 강력하고 확장 가능한 의존성 주입 마이크로 컨테이너입니다. https://github.com/nolanlawson/vuvuzela 비재귀적 JSON.stringify 및 JSON.parse입니다. https://github.com/typicode/pegasus 다른 스크립트를 로드하는 동안 JSON 데이터를 로드합니다 (xhr + promise). https://github.com/strathausen/savage 체이닝 API를 갖춘 작은 SVG 라이브러리입니다. https://github.com/zeusdeux/token-boy 'n' 비트 토큰을 제공하며, 다이제스트 여부에 관계없이 사용할 수 있습니다. https://github.com/zeusdeux/preach Node와 브라우저용 가벼운 퍼블리시/서브스크라이브 유틸리티입니다. https://github.com/stephanebachelier/mixit 스마트한 믹스인/병합 객체 도우미입니다. https://github.com/Galavantier/crate.js 다양한 구성 옵션을 갖춘 모달 생성 라이브러리입니다. 사용자 정의 HTML, 색상, 닫기 동작, 열기 및/또는 닫기 함수 등을 지원합니다. https://github.com/srijs/muject 10줄의 코드로 된 간단한 의존성 주입 마이크로 라이브러리입니다. http://bankfacil.github.io/vanilla-masker/ VanillaMasker는 순수 JavaScript 마스크 입력입니다. https://github.com/sbstjn/timesheet.js Timesheet.js로 데이터를 시각화합니다. https://github.com/alexanderGugel/micro-events 최소한의 이벤트 발행자 구현입니다. https://github.com/dkraczkowski/collection.js localStorage를 기반으로 구축된 작지만 강력한 로컬 데이터베이스입니다. https://github.com/nbouvrette/svgfallback 지원되지 않는 브라우저를 위한 작은 JavaScript SVG 폴백입니다. https://github.com/pyrsmk/imagine 프라미스를 사용하는 이미지 (사전) 로더입니다. https://github.com/nolanlawson/blob-util 브라우저에서 Blob 객체를 다루기 위한 유틸리티입니다. https://github.com/gamtiq/adam 객체를 생성, 처리 및 테스트하는 함수입니다. https://github.com/gamtiq/teo 객체를 테스트/검사하는 함수입니다. https://gist.github.com/ambrosechua/9e4455100c43a8a2cb1c 클라이언트 측 핸들바 템플릿을 렌더링하고 업데이트하는 작은 플러그인입니다. https://gist.github.com/ambrosechua/5b6f804cef53118db28b 전체 객체 트리를 O.o()로 래핑하는 작은 O.o() 래퍼입니다. https://github.com/joelalejandro/stuff C# List 객체의 JavaScript 구현입니다. https://github.com/chrisdavies/plite 작고 빠르며 가벼운 프라미스입니다 (370 바이트 min+zipped). http://linkbroker.hu/stuff/kolorwheel.js KolorWheel.js는 기본 색상에서 색상 팔레트를 생성하고 체이닝 가능한 절대/상대 H-S-L 변환 메서드를 제공합니다(지정된 대상 색상 포함). 문서에는 편집 가능한 매개변수가 포함된 실시간 예제가 포함되어 있습니다. https://github.com/janelznic/simplyjs DOM 조작 및 이벤트 처리를 지원합니다. 사용하기 쉽고 성능에 최적화되어 있으며, 기본 브라우저 지원을 우선합니다. https://github.com/pvorb/node-clone 임의의 객체를 재귀적으로 복제/복사합니다. https://github.com/a-tarasyuk/tag DOM 요소를 생성하기 위한 작은 유틸리티입니다. https://github.com/gitterHQ/mutant.js DOM 수정 관찰자입니다. https://github.com/kylepaulsen/NanoModal 몇 가지 추가 기능이 있는 작고 독립적인 JavaScript 모달 라이브러리입니다. https://github.com/daniellmb/aop.js 관점 지향 프로그래밍 마이크로 라이브러리입니다. https://github.com/daniellmb/VidBG 웹 페이지에 비디오 배경을 삽입하기 위한 마이크로 라이브러리입니다. https://github.com/daniellmb/di.js 의존성 주입 마이크로 라이브러리입니다. https://github.com/daniellmb/ab.js A/B/n 테스트 마이크로 라이브러리입니다. https://github.com/finom/vanillatree 종속성이 없는 jQuery jstree("인터랙티브 트리")의 작은 대체품입니다. https://github.com/wilsonfletcher/Optiscroll 현대 웹앱을 위한 사용자 정의 스크롤바입니다. 기본 스크롤을 강화합니다. http://buunguyen.github.io/topbar/ 작고 아름다운 사이트 전체 진행률 표시기입니다. https://github.com/buunguyen/jundo 브라우저와 Node용 실행 취소 라이브러리입니다. https://github.com/yanatan16/nanoajax 매우 기본적인 크로스 브라우저 AJAX입니다. https://github.com/nighca/lib 브라우저 JavaScript, jQuery와 유사한 라이브러리입니다. https://github.com/nighca/universal-diff JavaScript로 구현된 diff 및 병합 알고리즘입니다. https://github.com/gustavohenrique/eventojs DOM에서 이벤트를 조작하는 쉬운 방법입니다. https://github.com/mateuszgachowski/Carpet.js 대규모 프로젝트를 위한 작고 배우기 쉬운 모듈식 JavaScript 프레임워크입니다. https://github.com/tmwagency/trak.js 범용 분석 이벤트 추적 API 래퍼입니다. https://github.com/lloydzhou/ease 애니메이션을 위한 ease 구성 요소로, 30개의 ease 함수를 포함합니다. https://github.com/tunnckoCore/dual-emitter 크로스 브라우저(IE8 포함) + Node.js 이벤트 발행자입니다. 사용자 정의 또는 DOM 이벤트를 호출합니다. 양방향 데이터 바인딩에 유용합니다! https://github.com/wieringen/tinyscrollbar 예쁜 스크롤바를 만듭니다. https://github.com/RamonGebben/Cquence 아주 작은 JavaScript 애니메이션 라이브러리입니다. https://github.com/evandroeisinger/imago.js 이미지 조작을 용이하게 하기 위한 훌륭한 이미지 라이브러리입니다. imago.js를 사용하면 자르기 및 크기 조정을 수행할 수 있습니다. https://github.com/jesseskinner/hoverboard 매우 가벼운(반중력?) 데이터 모델 및 Flux 스토어로, 액션과 상태 변경 리스너를 포함합니다. https://github.com/bohwaz/xhr.js 가장 작은 XmlHttpRequest JavaScript 마이크로 라이브러리입니다. 정말로! https://github.com/thephuse/vanilla-modal ECMAScript 6을 사용하여 구축된 유연하고 종속성이 없는 CSS 기반 모달입니다. https://github.com/davidbau/seedrandom 시드된 난수 생성기입니다. Math.random을 재정의하거나 생성기 함수를 반환할 수 있습니다. https://github.com/chrisdavies/eev 작고 빠르며 종속성이 없는 이벤트 발행자입니다 (~500 바이트 min + gzip). https://github.com/konsumer/emitonoff JavaScript를 위한 매우 간단한 이벤트 발행자입니다. https://github.com/nicjansma/resourcetiming-compression.js ResourceTiming 압축 및 압축 해제입니다. https://github.com/vissense/vissense DOM 요소의 가시성 변화를 관찰하기 위한 유틸리티 라이브러리입니다. 요소가 숨겨지거나, 부분적으로 보이거나, 완전히 보이게 될 때 즉시 알 수 있습니다. https://github.com/AlexDM0/keycharm 간단하고 가벼운 키 바인딩 라이브러리입니다. MIT 또는 Apache 2.0 라이선스입니다. http://w8r.github.io/GreinerHormann/ Greiner-Hormann 다각형 클리핑 알고리즘입니다. AND, OR, XOR 연산을 수행합니다. https://github.com/mauriciosoares/core.js JavaScript로 작성된 확장 가능한 애플리케이션을 작성하는 데 도움이 되며, 모든 것을 분리된 상태로 유지하기 위한 구조와 패턴을 제공합니다. https://github.com/markmarijnissen/js-mediator 중재자와 결합된 깨끗하고 재사용 가능하며 독립적인 모듈을 작성하기 위한 디자인 패턴입니다. https://github.com/hufyhang/chop 초경량 JavaScript 프레임워크입니다. https://github.com/mailcheck/mailcheck 양식에서 사용자가 잘못 입력한 이메일 주소를 줄입니다. https://github.com/iofjuupasli/guard 프론트엔드 및 노드용으로 계정 수준(무료/프로/엔터프라이즈 등)에 따라 기회를 분할하는 유틸리티입니다. https://github.com/leeluolee/stateman 복잡한 웹 애플리케이션을 위한 중첩 상태 기반 라우팅을 제공하는 작은 기반입니다. https://github.com/EvandroLG/selecting 사용자가 선택한 텍스트에 접근할 수 있게 해주는 라이브러리입니다. https://github.com/weeger/wjs 서버에서 클라이언트로 지연 로딩을 관리하기 위한 JavaScript/PHP입니다. http://krampstudio.com/aja.js/ XML 없이 Ajax: 비동기 JavaScript 및 JavaScript/JSON(P)입니다. http://bajs.io JavaScript에서 CSS3 애니메이션을 생성하고 관리합니다. https://github.com/typicode/fetchival 간편한 fetch 요청입니다. http://j2c.py.gy JavaScript 객체에서 작동하는 CSS 전처리기입니다. https://github.com/chrisdavies/form-to-obj 작고 종속성이 없는 폼-객체 직렬화 유틸리티입니다. https://github.com/seun40/HTMLparser HTML을 파싱합니다 ¯\(ツ)/¯ https://github.com/dubrowgn/telegraph Benjamin Thomas의 smokesignals.js에서 포크된 브라우저용 매우 최소한의 이벤트 발행자로, 취소 가능한 이벤트를 허용합니다. https://github.com/anywhichway/stringformatter 객체, 통화, 날짜/시간, 소수 등을 지원하는 확장 가능하고 가비지 수집이 가능한 JavaScript 문자열 포매터입니다. sprintf 접근 방식을 훨씬 뛰어넘습니다. https://github.com/fhopeman/justlazy 반응형 이미지를 지연 로드하기 위한 마이크로 JavaScript 라이브러리입니다 (srcset 속성도 포함). https://github.com/ytiurin/hyphenjs Frank Liang의 하이픈화 미화기입니다. https://github.com/ruyadorno/dom-i18n JavaScript를 사용하여 매우 기본적인 HTML 다국어 지원을 제공합니다. https://github.com/aaron-harvey/micro-query 최소한의 URL 매개변수 파싱 라이브러리입니다. https://github.com/javimosch/xflagable/ 플래그 프라미스를 생성합니다. https://github.com/tbleckert/location-init 간단한 라우트 콜백입니다. https://github.com/gagan-bansal/geojson2svg 주어진 SVG 뷰포트 크기와 맵 범위에 따라 geojson을 SVG 문자열로 변환합니다. 맵에서 데이터 시각화에 사용됩니다. https://github.com/kogarashisan/ClassManager 세계에서 가장 빠르고 편리한 클래스 시스템 중 하나입니다. https://github.com/fresheneesz/proto JavaScript의 프로토타입 시스템의 강력함을 잃지 않고 객체와 상속 계층을 쉽게 생성할 수 있게 해주는 프로토타입 기반 상속 라이브러리입니다. https://github.com/fresheneesz/mongo-parse Mongo DB 쿼리를 파싱합니다. https://github.com/arqex/freezer 항상 루트에서 업데이트되는 불변 트리 데이터 구조로, 반응형 사고를 쉽게 만듭니다. https://github.com/ezakto/CSSTemplate.js 간단한 JS 템플릿을 사용하여 동적 CSS를 주입하고 업데이트합니다. http://AtSpy.github.io ES7 데코레이터와 TypeScript로 구동되는 테스트 스파이입니다. http://inversify.io TypeScript로 작성된 경량 IoC 컨테이너입니다. https://github.com/guardianjs/guardianjs 의견이 없는 JavaScript(단위/통합/기타) 테스트 라이브러리입니다. https://github.com/garygreen/lightrouter 전통적인 및 단일 페이지 앱을 위한 초경량 JavaScript 라우팅입니다. https://github.com/michaelsogos/Hash-Router SPA를 염두에 두고 개발된 작고 가벼운 브라우저 라우터 라이브러리입니다. :) https://github.com/janmarek/JsDic Angular.js에서 영감을 받은 의존성 주입 컨테이너입니다. http://router5.github.io 간단하고 프레임워크에 구애받지 않으며 강력하고 기능적인 HTML5 라우팅 솔루션입니다. https://github.com/keyten/Rat.js 캔버스에서 객체를 사용합니다. https://github.com/creationix/domchanger Domchanger는 가상 DOM 트리(JSONML) 간의 차이를 계산하고 DOM에 차이만 적용합니다. https://github.com/creationix/msgpack-js-browser ArrayBuffer와 DataView를 사용하는 msgpack 인코더 및 디코더입니다. https://github.com/marcojetson/type-ahead.js 가볍고 확장 가능한 타입 어헤드 라이브러리입니다. https://github.com/5HT/n2o N2O 웹 프레임워크 JavaScript 동반 라이브러리입니다. https://github.com/lcavadas/Storage.js 모든 브라우저에서 WebStorage(LocalStorage, SessionStorage, WebSQL 및 IndexedDB)를 사용하여 크로스 브라우저 지속성을 제공하는 JavaScript 라이브러리입니다. https://github.com/radiosilence/xr XMLHttpRequest 주위에 초간단 프라미스 기반 래퍼입니다. https://github.com/magnumjs/mag.js 우아한 DOM 바인딩 - 직관적이고 작고 매우 빠르며 순수 JavaScript 2 HTML 구성 요소 템플릿 라이브러리입니다. https://github.com/Hypercubed/mini-signals JavaScript에서 빠른 신호입니다. https://github.com/buzinas/simple-scrollbar 크로스 브라우저 및 크로스 디바이스 사용자 정의 스크롤바를 생성하기 위한 매우 간단한 바닐라 JavaScript 라이브러리입니다. https://github.com/alxgutnikov/tplize 템플릿화된 콘텐츠를 빠르게 프로토타입화하기 위한 약 2kb 라이브러리입니다. https://github.com/vkomulai/finnish-ssn 핀란드 사회 보장 번호를 검증하고 생성하기 위한 JavaScript 라이브러리입니다. https://github.com/dannyvankooten/populate.js JSON 객체에서 양식 필드를 채웁니다. 매우 작고 종속성이 없습니다. https://github.com/abdi0987/ViaJS 페이지에 동적으로 콘텐츠를 로드할 수 있게 해주는 작은 라이브러리입니다. https://github.com/sbrl/soundbox 사운드 효과를 재생하기 위한 매우 간단한 JS 라이브러리입니다. https://github.com/toomuchdesign/offside 클래스 조작만으로 오프 캔버스로 항목을 밀어내기 위한 약 3kb의 최소한의 JavaScript 키트입니다. 라이브러리 종속성이 없습니다. https://github.com/maael/html-chain JavaScript 함수를 체이닝하여 DOM 요소를 빌드하기 위한 작은 JavaScript 라이브러리입니다. https://github.com/wilddeer/Peppermint 또 다른 터치 슬라이더입니다. 빠르고 가볍고 확장 가능하며 모든 장치에서 작동합니다. https://github.com/unicorn-standard/uniloc Uniloc은 URI를 명명된 경로와 일치시키고 경로 이름과 옵션을 주어진 URI를 생성하는 유틸리티입니다. https://github.com/likethemammal/gamepad-micro/ HTML5 게임패드 API와 인터페이스하고 게임패드 업데이트 이벤트를 게시하는 마이크로 라이브러리입니다. http://jaywcjlove.github.io/hotkeys/ 키보드 단축키를 정의하고 디스패치하기 위한 간단한 마이크로 라이브러리입니다. 종속성이 없습니다. https://github.com/VizuaaLOG/microlib-tabs 탭 콘텐츠를 쉽게 생성하기 위한 작은 라이브러리입니다. 작은 마크업과 단일 함수로 구성됩니다. http://sylvester.jcoglan.com/ 벡터와 행렬을 사용한 수학을 위한 JS 라이브러리입니다. https://github.com/daniellmb/once.js CoffeeScript 또는 JavaScript 함수가 한 번만 실행될 수 있도록 강제합니다. https://github.com/koffeine/class-256.js 256바이트 미만의 JavaScript 클래식 상속 패턴 라이브러리입니다. https://github.com/imaustink/swiss-army-knife Swiss Army Knife는 클라이언트 측 개발을 조금 덜 고통스럽게 만들기 위한 JavaScript 라이브러리입니다. https://github.com/peduarte/wallop 항목을 표시하고 숨기기 위한 최소한의 JS 라이브러리입니다. https://github.com/RazorfishGermany/es6-module-isMobileOs 모바일 운영 체제를 확인하는 간단한 ECMAScript6 모듈입니다. https://github.com/amirhkkh/blobcounter.js blobcounter.js는 이미지에서 블롭과 모양을 찾는 데 도움이 됩니다. https://github.com/danristea/xion JsonML 구문과 가상 DOM 차이 계산을 사용하는 가벼운 클라이언트 측 MVC 프레임워크입니다. https://github.com/lukeed/fromNow 현재 시점과 과거 또는 미래 날짜 간의 읽기 쉬운 시간 차이를 계산하기 위한 매우 가벼운 JavaScript 유틸리티입니다. https://github.com/lukeschaefer/WorkerB JavaScript에서 쉬운 멀티스레딩을 위한 매우 간단한 인라인 웹 워커입니다. https://github.com/Temoto-kun/avtomat 비결정적 유한 상태 기계(빈 이동 포함) 구현입니다. https://github.com/lagodiuk/earley-parser-js 일반 목적의 문맥 자유 언어 파서 - Earley 파서입니다. https://github.com/top-quark/rounding.js 여러 반올림 알고리즘을 선택할 수 있는 정확한 반올림입니다. http://javascript-kurse-berlin.de/labs/babelbox.html 여러 언어를 쉽게 지원하고 requirejs를 지원하는 i18n 라이브러리입니다. http://giraysam.github.io/viiny-dragger/ vinny-dragger는 JavaScript용 드래그 앤 드롭 플러그인입니다. https://github.com/ohager/nanoflux 매우 가볍고 종속성이 없는 Flux 구현입니다. https://github.com/w3core/min.css min.css는 CSS 파일을 최소화하기 위한 가장 작고 빠르며 효율적인 JavaScript 라이브러리입니다. Node와 브라우저에서 작동합니다. https://github.com/StephanHoyer/smoke-signal 브라우저와 Node용 간단하고 작은 기능적 이벤트 관찰자입니다. https://github.com/chrisdavies/tiny-date-picker 작고 종속성이 없는 날짜 선택기입니다 (~1500 바이트 min+zipped). https://github.com/pyrsmk/panorama Canvas2D로 배경 이미지를 밝게 합니다. http://chrisdavies.github.io/tlite/ CSS3 전환을 사용하는 툴팁입니다 (650 바이트의 JS min+zipped). https://jccazeaux.github.io/scriber HTML DOM 요소를 작성하기 위한 간단한 유창한 라이브러리입니다. https://jccazeaux.github.io/diapason 모든 프라미스 프레임워크에서 작동하는 비동기 의존성 주입입니다. https://github.com/ziolko/window.module 브라우저용 동기 모듈 시스템입니다. https://github.com/razaibi/razaxjs 인수 유무에 관계없이 단일 코드 줄로 Ajax 요청을 수행하는 간단한 방법입니다. 초보자에게도 쉽습니다. https://github.com/branneman/TinyAnimate 애니메이션 마이크로 라이브러리입니다. 바닐라 JavaScript입니다. http://mom.js.org DOM 요소를 기반으로 JavaScript를 동적으로 로드합니다. https://github.com/eorroe/NodeList.js jQuery만큼 쉽게 네이티브 DOM API를 사용합니다. http://fusejs.io 가벼운 퍼지 검색 라이브러리입니다. http://xtype.js.org JavaScript 앱을 위한 우아하고 매우 효율적인 데이터 검증입니다. https://github.com/orbitbot/pastafarian 작은 이벤트 발행자 기반 유한 상태 기계입니다. https://github.com/jdarling/lambda-30 일부 ES6(...rest, () => {}, () => retval) 및 내장 JSON 인코더를 지원하는 Node.js용 Lambda 문자열 구현입니다. https://github.com/orbitbot/henderson 프라미스를 사용하는 작은 이벤트 발행자 기반 유한 상태 기계입니다. https://microtk.io 작은 JavaScript 프레임워크입니다. http://giraysam.github.io/boomerang-cache/ localStorage 및 sessionStorage를 기반으로 하는 클라이언트 측 캐싱 라이브러리입니다. http://redux.js.org/ JavaScript 앱을 위한 예측 가능한 상태 컨테이너입니다. https://github.com/thedumbterminal/TinyBrowserFramework 최소한의 클라이언트 JS 프레임워크입니다. https://github.com/ramonvictor/body-scroll-freezer 모달 상자를 열 때 본문 스크롤을 고정하는 종속성이 없는 JS 모듈입니다. https://github.com/oncode/handorgel ES6로 작성된 접근 가능한 W3C 준수 아코디언입니다. https://github.com/vkomulai/finnish-business-ids 핀란드 사업자 ID(Y-tunnus, alv-numero)를 검증하고 생성하기 위한 라이브러리입니다. https://github.com/vkomulai/finnish-bank-utils 핀란드 IBAN 은행 계좌 번호와 참조 번호를 검증하고 생성하기 위한 라이브러리입니다. https://github.com/ytiurin/hyphen Franklin M. Liang의 하이픈화 알고리즘을 JavaScript로 구현한 것입니다. https://github.com/eqcss/eqcss/ EQCSS는 Scoped Styles, Element Queries, Container Queries 및 $parent와 $prev와 같은 새로운 선택자를 도입하는 CSS 재처리기입니다. https://github.com/dajbd/dzt-url-parser URL 매개변수(또는 location.search)를 객체로 파싱합니다. https://github.com/aishikaty/tiny-mustache Mustache 논리 없는 템플릿 엔진의 가장 작은 구현입니다. https://github.com/eduardomb/onfontload 폰트가 로드될 때 감지합니다. https://catc.github.io/displace 이동 가능한 DOM 요소를 생성하기 위한 최소한의 JavaScript 라이브러리입니다. https://www.kriasoft.com/universal-router/ 동형 JavaScript 웹 앱을 위한 간단한 미들웨어 스타일 라우터입니다. https://github.com/binarybaba/prophetjs 깨끗한 토스트 알림을 위한 바닐라 JS 라이브러리입니다. https://github.com/isiahmeadows/simple-require-loader 핫 스와핑 및 선택적 원격 로딩 지원을 갖춘 간단하고 동적이며 강력한 모듈 로더입니다. https://github.com/kmpatel/microBench/releases 브라우저 콘솔에서 JS 함수를 벤치마킹하기 위한 작고 간단한 프레임워크입니다. https://github.com/reduardo7/xPrototype xPrototype은 빠르고 작으며 기능이 풍부한 JavaScript 라이브러리입니다. for 루프, for each, 타임아웃/인터벌, 데이터 유형, 정렬/순서, 변환, 객체 복제, 객체 확장, 문자열 조작 등을 다양한 브라우저와 플랫폼에서 작동하는 사용하기 쉬운 API로 단순화합니다. https://gibbok.github.io/animatelo/ Animatelo는 프로젝트에서 사용할 수 있는 멋지고 재미있으며 크로스 브라우저 애니메이션 모음입니다. 이 프로젝트는 훌륭한 animate.css 프로젝트를 Web Animation API로 포팅한 것입니다. https://github.com/schubergphilis/vp-pubsub VP PubSub는 메시지 필터링을 지원하는 퍼블리시/서브스크라이브 라이브러리입니다. https://github.com/lmettini/data-obs 간단하고 가벼운 JavaScript 데이터 관찰자입니다. https://www.frontexpressjs.com 프론트엔드를 위한 Express.js 스타일 라우터입니다. https://github.com/tiaanduplessis/stoor 네임스페이싱 및 다중 가져오기, 설정 및 제거를 지원하는 로컬 및 세션 스토리지 래퍼입니다. https://github.com/cameron-martin/speedball 유연한 의존성 주입 라이브러리입니다. https://github.com/secondstreet/talker.js 간단한 이벤트 위임 라이브러리입니다. https://github.com/ruyadorno/simple-slider 1kb JavaScript 캐러셀입니다. https://github.com/Holixus/nano-markdown 아주 작은 마크다운을 HTML로 변환하는 라이브러리입니다. https://github.com/tiaanduplessis/dont-go 페이지가 비활성화될 때 제목 및/또는 파비콘을 변경합니다. https://github.com/Soldier-B/ns.js 작고 간단한 JavaScript 네임스페이스 함수입니다. https://github.com/arenite/arenite 제어 반전/의존성 주입 라이브러리입니다. https://github.com/ai/nanoevents 간단하고 작은 이벤트 발행자 라이브러리입니다. https://github.com/ai/nanoid 보안 URL 친화적인 고유 문자열 ID 생성기입니다. https://a-jie.github.io/ppo/ ppo는 JavaScript를 위한 매우 작고 유용한 유틸리티 라이브러리입니다. https://github.com/jbreckmckye/trkl 관찰 가능 항목과 Knockout 스타일의 계산된 항목을 포함한 반응형 마이크로 라이브러리입니다 (430 바이트 minified 및 gzipped). https://github.com/jesseskinner/hover 매우 가벼운(반중력?) 데이터 모델 및 Flux 스토어로, 액션과 상태 변경 리스너를 포함합니다. https://hyperapp.js.org 함수형 패러다임을 사용하여 확장 가능한 브라우저 기반 애플리케이션을 만듭니다. https://github.com/wisniewski94/sprites.js Sprites.js는 간단한 캔버스 스프라이트 애니메이션 라이브러리입니다. setTimeout() 또는 setInterval()을 사용하지 않습니다. rAF만 사용합니다. https://github.com/zebzhao/indent.js JS, CSS, HTML 코드를 순수하게 들여쓰기만 합니다. https://github.com/ezakto/chaintastic 체이닝 가능한 동기/비동기 API를 쉽게 생성합니다. https://github.com/john-doherty/pure-dialog 웹 및 하이브리드 모바일 앱에서 대화 상자 생성을 단순화하기 위해 설계된 순수 JavaScript 모달 대화 상자입니다. https://github.com/reduardo7/sjsClass 간단한 JavaScript 클래스입니다. 고급 JavaScript 클래스를 만드세요! https://github.com/reduardo7/xpopup JavaScript 팝업을 완전히 제어합니다. https://github.com/nextapps-de/flexsearch 차세대 전체 텍스트 검색 라이브러리로, 종속성이 없습니다. https://github.com/bcoop713/routerx Rx.js 앱에서 사용하기 위해 구축된 매우 간단한 기능적 반응형 라우터입니다. http://www.bitstorm.org/javascript/miq/ 가벼운 현대적인 jQuery와 유사한 DOM 라이브러리입니다. http://juanbrujo.github.io/tinyModal/ 깨끗하고 빠르며 모듈식이고 사용자 정의 가능한 모달 창 컨트롤러입니다. https://github.com/bevacqua/fuzzysearch JavaScript에서 매우 빠른 퍼지 검색을 제공합니다. https://github.com/ahmed-musallam/syrupjs 원격 구성 요소 상호 작용을 위한 작은 퍼블리시/서브스크라이브 jQuery 마이크로 프레임워크입니다. https://bevacqua.github.io/dragula/ 드래그 앤 드롭이 매우 간단합니다. https://github.com/Mapita/Canary 단위 테스트를 작성하고 실행합니다. https://github.com/daniellmb/Euclids-algorithm 두 숫자의 최대 공약수를 찾기 위한 재귀적 유클리드 알고리즘입니다. https://github.com/davidecantoni/smart-select 표준 선택 항목을 비동기 상태로 유지하면서 대체하고 아름답게 만듭니다. http://www.graphicsjs.org SVG/VML을 기반으로 한 강력하고 가벼운 JavaScript 그래픽 및 애니메이션 라이브러리로, 직관적인 API를 제공합니다. https://fezvrasta.github.io/popper.js 팝업을 관리하기 위한 멋진 라이브러리입니다. https://github.com/northeastnerd/wavyjs 종속성이 없는 JavaScript RIFF Wav 파일 조작 루틴입니다. https://github.com/MrOnlineCoder/sul.js DOM 및 AJAX 작업을 위한 작은 라이브러리입니다 (jQuery 함수 스타일). http://jccazeaux.github.io/jacks/ 유창하고 확장 가능하며 사용하기 쉬운 AJAX 프레임워크입니다. https://github.com/agamemnus/tiptext.js 변형 관찰자를 사용하는 떠 있는 툴팁 함수입니다. 6개의 사용자 정의 가능한 콜백이 있습니다! https://github.com/Morklympious/check.js 타입 및 무결성 검사를 위한 작은 라이브러리입니다. https://moqmar.github.io/tinyfade.js/ 완전히 반응형 이미지 슬라이드쇼를 위한 작은 순수 JavaScript 라이브러리입니다. https://github.com/yavorskiy/microdi JavaScript 의존성 주입(DI)을 위한 마이크로 도우미입니다. https://github.com/kaisermann/aph 작고 빠른 DOM 조작 라이브러리입니다. 매우 슬림하고 빠른 도우미입니다. https://github.com/vursen/FloatSidebar.js 사이드바를 떠 있게 만듭니다. https://github.com/graciano/mess mess - 메시지 극도로 간단한 스크립트: '안드로이드 토스트'와 같은 메시지 대화 상자입니다. https://github.com/dimitrinicolas/overflow-color CSS HTML 배경색을 자동으로 전환합니다. https://github.com/spectjs/subscript JS/C++/Python/Rust/Go의 공통 구문 하위 집합을 사용하는 마이크로 언어로, 사용자 정의 DSL/표현식 평가/템플릿 등에 사용됩니다. 또한 표현식이 포함된 JSON인 justin lang을 제공합니다. https://github.com/razaibi/WirupExpress Wirup의 초경량 버전입니다. https://github.com/rvanbaalen/hashparser URL 해시에서 (인코딩/디코딩된) 매개변수를 설정하고 가져오기 위한 매우 작은 라이브러리입니다. https://github.com/razaibi/Wirup 웹에서 단일 페이지 애플리케이션(SPA)을 위한 경량 나노 프레임워크입니다. https://github.com/schrotie/shadow-query 바닐라 웹 구성 요소를 작성하기 위한 마이크로 라이브러리입니다. https://github.com/skarukas/JShorthand 단일 문장에서 객체에 대한 메서드 호출을 집계합니다. https://github.com/GrosSacASac/event-e3 범용 가벼운 이벤트 발행자입니다. https://github.com/snapwich/fun-hooks 애플리케이션에 확장성을 추가하기 위한 일반적이고 간단한 후킹 API입니다. https://dom99.now.sh/ 지시문으로 HTML을 확장합니다. https://github.com/morris/samd 작고 정적인 AMD API 구현입니다. TypeScript와 결합하여 Webpack을 대체할 수 있습니다. https://github.com/ezakto/sqroll 간단한 API와 작은 오버헤드를 가진 스크롤 라이브러리입니다. https://colonjs.org ColonJs 프론트 엔드 마이크로 프레임워크입니다. https://github.com/Funlang/z-data 매우 가볍고 설정이 필요 없는 임베디드 프론트 엔드 JS 프레임워크입니다. https://websheet.js.org Google 스프레드시트의 데이터를 사용하여 웹사이트 섹션을 렌더링합니다. https://github.com/Sphinxxxx/vanilla-picker-mini 알파 선택이 가능한 간단하고 사용하기 쉬운 색상 선택기입니다. https://github.com/tomas2387/almy 빠르고 간단한 중앙 집중식 상태 관리 라이브러리입니다. https://github.com/Masquerade-Circus/dragonbinder Vuex에서 영감을 받은 1kb의 점진적 상태 관리 라이브러리입니다. https://github.com/GhostWrench/pqm 물리적 양과 측정(PQM)은 단위가 있는 숫자를 처리하기 위한 Node 및 브라우저 패키지입니다. https://github.com/laurentpayot/minidenticons 사이트를 위한 매우 가벼운 SVG 아이덴티콘(아바타) 생성기입니다. 온라인 데모를 시도해보세요 😃 https://github.com/nextapps-de/spotlight 종속성이 없는 크로스 브라우저 반응형 이미지 갤러리입니다. https://github.com/anonyco/Force-DOM-reflow-JS 모든 현재 및 미래 브라우저에서 작동하는 크로스 브라우저 강제 DOM 리플로우 라이브러리입니다. https://anonyco.github.io/BestBase64EncoderDecoder/demo.html 유니코드 문자열의 높은 코드 포인트에 대해 가장 표준적이고, 가장 크로스 브라우저 호환되며, 가장 작고, 가장 빠른 btoa 및 atob 솔루션입니다. https://github.com/anonyco/Javascript-Fast-Light-Map-WeakMap-Set-And-WeakSet-JS-Polyfill 빠르고 가벼운 JavaScript Map 및 WeakMap 폴리필입니다. https://anonyco.github.io/FastestSmallestTextEncoderDecoder/gh-pages/ UTF-8 전용 TextEncoder 인코딩 및 TextDecoder 디코딩을 위한 가장 빠르고 작은 JavaScript 폴리필입니다. https://github.com/anonyco/SuperSimpleExtensibleSmallXMLHttpRequestWrapper 338바이트의 매우 작고 간단하며 가볍고 빠른 XMLHttpRequest 래퍼입니다. https://github.com/anonyco/DeferStackJS '최대 스택 호출 초과' 오류를 해결하는 작고 빠른 라이브러리입니다. https://github.com/anonyco/AsynchronousEvalFunction 실행 스레드 차단을 방지하기 위해 문자열에 저장된 코드의 실행을 비동기적으로 지연시키는 간단한 방법입니다. https://github.com/anonyco/IDL-Property-Observer HTMLInputElement.value와 같은 변경 사항을 766바이트의 MutationObservers에 플러그인합니다. 프레임워크에 구애받지 않습니다! https://github.com/anonyco/Highlighter-JS 간단하고 작고 빠르며 다국어를 지원하는 JavaScript 텍스트 하이라이터입니다. https://github.com/nextapps-de/fat 웹에서 가장 빠르고 가벼운 애니메이션 도구입니다. 이 버전은 애니메이션, 이징, 베지어, 변환, 색상을 포함한 압축 버전입니다. https://github.com/lcavadas/browser-storage-js 모든 브라우저에서 WebStorage(LocalStorage, SessionStorage, WebSQL 및 IndexedDB)를 사용하여 크로스 브라우저 지속성을 제공하는 JavaScript 라이브러리입니다. https://github.com/spckio/spck-embed 데모를 위한 작은 임베디드 온라인 코드 편집기입니다. https://github.com/aMarCruz/easyrouter 작고 빠르고 쉬우면서도 강력한 JavaScript 해시 라우터입니다. https://github.com/Siddharth11/gradstop 그라디언트 색상 정지를 생성하기 위한 JavaScript 마이크로 라이브러리입니다. https://github.com/Stuhl/javascript-entity-component-system JavaScript로 작성된 작은 엔티티-컴포넌트-시스템 라이브러리입니다. https://github.com/vitaly-t/excellent DOM 조작 프레임워크입니다. https://github.com/hankchizljaw/beedle JavaScript 앱에서 상태를 관리하는 데 도움이 되는 Redux 및 Vuex에서 영감을 받은 작은 라이브러리입니다. https://github.com/eko3alpha/hollydates 날짜가 공휴일인지 또는 사용자 정의 날짜에 해당하는지 확인합니다. 사용자 정의 및 반복 날짜를 추가합니다. https://github.com/frqnck/apt.js 미니멀리스트, 빠르고, 슬림하며 간결한 프레임워크/라이브러리입니다. jQuery와 RequireJS의 맛을 제공하지만 페이로드는 없습니다. 첫 번째 바이트에 포함될 만큼 작습니다. https://github.com/enzyme/qoob 가벼운 DOM 조작 라이브러리입니다. https://github.com/kucukharf/tiv 1kb JavaScript 식별 번호 검증기입니다. https://github.com/edwinm/carbonium DOM을 쉽게 조작하기 위한 1킬로바이트 라이브러리입니다. https://github.com/caracal7/fast-ease 빠르고 미니멀리스트한 JavaScript 애니메이션 라이브러리입니다. https://github.com/Axorax/fullscr.js 한 줄의 코드로 모든 브라우저에서 전체 화면 모드로 전환합니다. https://github.com/matt08/microlite.js 초경량, 미니멀리스트 순수 JS 라이트박스 스크립트입니다. --- title: 기술문서 Tech Docs url: https://handstack.kr/docs/information/resource/기술문서 --- # 기술문서 Tech Docs ## 언어 학습 [C# 프로그래밍 가이드](https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/) - C# 프로그래밍 가이드 > C# 프로그래밍 가이드는 C# 프로그래밍 언어의 기본 개념과 기능을 설명합니다. 이 가이드는 C# 의 최신 버전을 기준으로 합니다. [C# in Depth](https://csharpindepth.com/articles/) - C#에 대한 깊은 이해를 위한 튜토리얼을 제공 > C#과 관련된 다양한 주제에 대한 기사가 있으며, 일부는 "C# in Depth"라는 책과 관련이 있고, 일부는 책에서 다루는 주제를 더 깊게 다룹니다. [닷넷노트 10.0](https://github.com/VisualAcademy/DotNetNote) - ASP.NET Core 10.0 개발, 강의, 집필 소스 모음 > ASP.NET & Core를 다루는 기술 책의 닷넷코어 파트 소스 결과물을 포함하고 있습니다. 이전 버전의 소스를 포함하여 전체 소스가 포함되어 있습니다. [JavaScript 안내서](https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Introduction) - JavaScript를 소개하고 기본 개념에 대해 설명 > 웹 브라우저 및 Node.js에서 사용하는 최신 ECMAScript 의 기능을 소개하고, 이전 버전과 비교하여 새로운 기능을 설명합니다. [Learn SQL](https://dataschool.com/learn-sql/) - SQL 학습 > PostgreSQL 대화형 SQL 튜토리얼을 제공합니다. 기술에 능숙한 사용자들이 스스로 분석과 데이터 가져오기를 수행할 수 있을 만큼의 SQL을 배울 수 있도록 특별히 설계되었습니다. # 웹 개발 Web Development [Web Development Tutorial](https://poiemaweb.com/) - 웹 개발에 필요한 튜토리얼을 제공 > 다양한 웹 개발 주제를 다루며, 각 주제는 여러 개의 세부 학습 단계로 구성되어 있습니다. 주요 학습 주제로는 HTML5, CSS3, JavaScript, Node.js, Express, MongoDB, TypeScript, Angular 등이 있습니다. [코딩의 시작, TCP School](https://tcpschool.com/) - 코딩 교육을 위한 무료 온라인 학습 사이트 > 웹 개발, 프로그래밍 언어, 데이터베이스 등 다양한 주제에 대한 튜토리얼을 제공합니다. 주요 학습 주제로는 HTML, CSS, JavaScript, Python, PHP, MySQL, Java, C언어, C++언어 등이 있습니다. [web.dev](https://web.dev/learn?hl=ko) - 주요 웹 디자인 및 개발 주제에 대한 과정 모음 > 웹 디자인과 개발에 대한 주요 주제들에 대한 강좌를 제공하며, 각각의 강좌는 업계 전문가가 작성하고 Chrome 팀의 멤버들이 도움을 주었습니다. 강좌는 순차적으로 진행하거나, 가장 배우고 싶은 주제를 선택하여 학습할 수 있습니다. ## 개발 레퍼런스 [RestSharp 공식 문서](https://restsharp.dev/intro.html#introduction) - RestSharp 공식 문서 > HandStack 내에서 C# 으로 함수를 만들때 외부 API를 호출하는 데 사용되는 RestSharp 라이브러리에 대한 공식 문서입니다. [Axios vs Fetch](https://velog.io/@eunbinn/Axios-vs-Fetch) - 입문자를 위한 Axios vs Fetch > HandStack 내에서 Node.js 으로 함수를 만들때 외부 API를 호출하는 데 사용되는 Axios와 Fetch 라이브러리에 대한 참고 문서입니다. [ASP.NET Core 개발자 로드맵](https://github.com/MoienTajik/AspNetCore-Developer-Roadmap) - ASP.NET Core 개발자 로드맵 > ASP.NET Core 개발자가 되기 위해 배울 수 있는 경로와 배울 수 있는 라이브러리를 보여주는 차트를 확인할 수 있습니다. [Node.js 소개](https://nodejs.org/en/learn/getting-started/introduction-to-nodejs) - Node.js 공식 학습 자료 Node.js는 Google Chrome의 핵심인 V8 JavaScript 엔진을 기반으로 하는 오픈소스 크로스 플랫폼 JavaScript 런타임 환경입니다. 거의 모든 종류의 프로젝트에 인기 있는 도구입니다. [Collecting All Cheat Sheets](https://overapi.com/) - 프로그래밍 언어, 라이브러리, 프레임워크 등의 치트 레퍼런스를 모아놓은 사이트 > 프로그래밍 언어, 라이브러리, 프레임워크 등의 치트 시트를 모아놓은 사이트입니다. [tutorialspoint](https://www.tutorialspoint.com/) - 프로그래밍 언어, 라이브러리, 프레임워크 등의 레퍼런스를 모아놓은 사이트 > Python, Java, DSA, C++, SQL, HTML 등 다양한 주제를 다루며, 각각의 주제는 학습자가 자신의 속도에 맞춰 학습할 수 있도록 구성되어 있습니다. 또한, 이 사이트는 "Coding Ground"이라는 온라인 플랫폼을 통해 개발자들이 코드를 작성하고 실행하며, 학습하고, 기술을 개발할 수 있도록 지원합니다. [W3schools](https://www.w3schools.com/) - 웹 프로그래밍 관련 레퍼런스를 모아놓은 사이트 > 웹 기술에 대한 튜토리얼을 제공하며, 각각의 튜토리얼은 수준별로 나누어져 있습니다. 또한, 각 튜토리얼은 실습 문제와 테스트 도구를 포함하고 있어, 사용자가 학습한 내용을 바로 적용해 볼 수 있습니다. [MDN Web Docs](https://developer.mozilla.org/) - 웹 프로그래밍 관련 레퍼런스를 모아놓은 사이트 > HTML, CSS, JavaScript 등의 웹 기술과 웹 사이트 및 프로그레시브 웹 앱을 위한 API에 대한 정보를 제공합니다. [programiz](https://www.programiz.com/) - 프로그래밍 언어, 라이브러리, 프레임워크 등의 레퍼런스를 모아놓은 사이트 > Python, JavaScript, R, C, C++, Java, Kotlin 언어를 중점으로 코스, 튜토리얼, 예제 컨셉으로 정보를 제공합니다. [30 seconds of code](https://www.30secondsofcode.org/) - 코드 스니펫을 모아놓은 사이트 > JavaScript, CSS, JavaScript Algorithms, Python, Git, Node.js 등 다양한 주제에 맞는 30초만에 이해 가능한 짧은 코드 조각을 제공합니다. [부트스트랩 5 공식문서](https://getbootstrap.kr/docs/5.0/getting-started/introduction/) - 부트스트랩 5 시작하기 > 부트스트랩 5의 시작하기, 레이아웃, 컴포넌트, 유틸리티 등의 정보를 제공합니다. [Bootstrap 5 CheatSheet](https://bootstrap-cheatsheet.themeselection.com/) - 부트스트랩 5 클래스, 변수, 믹스인의 치트시트 사이트 > HandStack 의 화면 디자인과 레이아웃은 Bootstrap 기반의 tabler 프레임워크를 사용합니다. Bootstrap 5의 클래스, 변수, 믹스인을 대화형 치트시트로 제공합니다. [tabler](https://tabler.io/) - Develop beautiful web apps with Tabler > Tabler는 부트스트랩 5 기반의 오픈소스 대시보드 및 관리자 패널 템플릿입니다. Tabler는 모바일 친화적이며, 다양한 레이아웃, 컴포넌트, 유틸리티를 제공합니다. [RegexLearn](https://regexlearn.com/learn) - 정규표현식 학습 사이트 > 정규표현식을 학습할 수 있는 사이트로, 정규표현식을 이용한 검색, 치환, 분리, 검증 등의 기능을 학습할 수 있는 도구를 제공합니다. [.NET CLI 개요](https://learn.microsoft.com/ko-kr/dotnet/core/tools/) - .NET 애플리케이션의 개발, 빌드, 실행, 게시에 사용되는 명령 CLI 도구 > .NET CLI 도구를 사용하여 .NET 애플리케이션의 개발, 빌드, 실행, 게시에 사용되는 명령을 학습할 수 있는 사이트입니다. ## 블로그 Blog [.NET Blog](https://devblogs.microsoft.com/dotnet/) - 마이크로소프트에서 제공하는 .NET 공식 블로그 > .NET, .NET MAUI, ASP.NET 등 개발자들을 대상으로 다양한 주제의 Microsoft 기술에 대한 최신 정보와 업데이트를 확인할 수 있습니다. ## 개발 도구 [Git 시작하기](https://git-scm.com/book/ko/v2) - Git 시작하기 소스코드 버전관리를 위한 Git의 역사와 기본 개념들과 함께 알아야 할 CLI 명령어를 확인합니다. [Code Beautify](https://codebeautify.org/) - 다양한 형식의 코드를 변환하고 포맷팅하는 도구 > 웹 개발에 특화된 Code Formatter, JSON Beautifier, XML Viewer, Hex Converters 등 다양한 도구를 제공합니다. [URL-encoded](https://www.urlencoder.org/), [URL-decoded](https://www.urldecoder.org/) - URL 인코딩 형식으로 인코딩/디코딩하기 > URL 인코딩 형식을 처리해야 할 경우 간단한 온라인 도구를 사용해 데이터를 인코딩하거나 디코딩 서비스를 제공합니다. [Instant SQL Formatter & Beautifier](https://www.dpriver.com/pp/sqlformat.htm) - SQL 문을 읽기 쉬운 형식으로 자동으로 포맷팅해주는 도구 > MS Access, DB2, MSSQL, MySQL, Oracle 등 데이터베이스를 지원하며, 출력 결과를 SQL, HTML, C#, Javas, XML 등 다양한 형식으로 지원합니다. [ConvertCSV](https://www.convertcsv.com/) - CSV 파일을 변환하고 다양한 형식으로 변환하는 도구 > CSV 파일을 변환하고 다양한 형식으로 변환하는 도구로, CSV 파일을 JSON, XML, SQL, Excel, HTML, Markdown 등 다양한 형식으로 변환할 수 있습니다. [JSON Editor Online](https://jsoneditoronline.org/) - JSON 데이터를 생성, 편집, 검증할 수 있는 도구 > 사용자가 복잡한 JSON 구조를 쉽게 시각화하고 생성, 수정할 수 있도록 도와주며, 다양한 스키마 형식에 대해 JSON 데이터를 검증할 수 있습니다. [Table to Markdown](https://markdown-convert.com/en/tool/table) - 마크다운 테이블을 생성하는 도구 > 다양한 표를 마크다운 표기법으로 변환하는 도구로, Excel, CSV, JSON, SQL 결과 및 기타 표 형식에서 마크다운 표를 생성합니다. [HTML Beautifier & Formatter](https://www.cleancss.com/html-beautify/), [CSS Formatter](https://www.cleancss.com/css-beautify/), [Javascript Formatter](https://www.cleancss.com/javascript-beautify/) - HTML, CSS, Javascript 코드를 읽기 쉬운 형식으로 자동으로 포맷팅해주는 도구 [Javascript Minifier](https://www.cleancss.com/javascript-minify/), [Javascript Obfuscate](https://www.cleancss.com/javascript-obfuscate/), [CSS Minifier](https://www.cleancss.com/css-minify/), [HTML Minifier](https://www.cleancss.com/html-minify/) - HTML, CSS, Javascript 코드를 압축 및 난독화 하는 도구 [Convert HTML to Markdown](https://www.convertsimple.com/convert-html-to-markdown/) - HTML을 마크다운으로 변환하는 도구 > HTML을 붙여넣거나 업로드하여 마크다운으로 변환하는 도구입니다. [BeautifyTools](https://beautifytools.com/) - HTML, CSS, Javascript 코드를 읽기 쉬운 형식으로 자동으로 포맷팅해주는 도구 [Clipboard 2 Markdown](https://euangoddard.github.io/clipboard2markdown/) - 클립보드에 복사한 텍스트를 마크다운으로 변환하는 도구 > 클립보드에 복사한 텍스트를 마크다운으로 변환하는 도구로, 텍스트를 붙여넣기하면 마크다운으로 변환된 텍스트를 얻을 수 있습니다. [Tables Generator](https://www.tablesgenerator.com/markdown_tables) - 마크다운 표 생성기 [onlinepngtools](https://onlinepngtools.com/create-transparent-png) - 투명한 PNG 이미지를 생성하는 도구 > 투명한 PNG 이미지를 생성하는 도구로, 이미지를 업로드하거나 URL을 입력하여 투명한 PNG 이미지를 생성할 수 있습니다. [htmlcolorcodes](https://htmlcolorcodes.com/) - HTML 색상 코드를 생성하는 도구 > HTML 색상 코드를 생성하는 도구로, 색상 코드를 선택하거나 입력하여 색상 코드를 생성할 수 있습니다. [json2yaml](https://www.json2yaml.com/) - JSON을 YAML로 변환하는 도구 > YAML은 복잡한 데이터를 간결하고 읽기 쉬운 형식으로 저장하는 데 사용됩니다. 주로 설정 파일의 형식으로 사용됩니다. [regex101](https://regex101.com/) - 정규식을 테스트하고 설명하는 도구 > 정규식을 테스트하고 설명하는 도구로, 정규식을 입력하고 테스트할 텍스트를 입력하면 정규식이 어떻게 작동하는지 확인할 수 있습니다. [realfavicongenerator](https://realfavicongenerator.net/) - Favicon 생성기 > 이미지를 업로드하여 Favicon을 생성하는 도구로, Favicon을 생성하고 다양한 플랫폼에 대응하는 Favicon을 생성할 수 있습니다. [json-to-jsonschema](https://jsonformatter.org/json-to-jsonschema) - JSON을 JSON 스키마로 변환하는 도구 > JSON을 JSON 스키마로 변환하는 도구로, JSON을 붙여넣으면 JSON 스키마로 변환된 결과를 얻을 수 있습니다. [quicktype](https://app.quicktype.io/) - JSON 데이터를 분석하여 코드를 생성하는 도구 > JSON 데이터를 분석하여 C#, C++, Dart, Go, Java, Javascript, Kotlin 등등 코드를 생성하는 도구로, JSON 데이터를 붙여넣으면 다양한 언어의 코드를 생성할 수 있습니다. [shaper.design](https://shaper.design) - UI 인터페이스용 CSS 디자인 시스템 생성 도구 단 몇 초 만에 다양한 CSS 디자인 레이아웃 시스템을 살펴보세요. 디자인 토큰을 정의하고 실시간으로 변경 사항을 시각화 도구를 제공합니다. 결과물은 단순한 그림이 아니라 다른 디자인 도구에서 사용할 수 있는 스타일 세트와 프로젝트에 복사할 수 있는 코드입니다. [shuffle](https://shuffle.dev/) - CSS 그리드 레이아웃을 생성하는 도구 Tailwind CSS, Bootstrap, Bulma, Foundation, Materialize, Semantic UI, UIKit 등의 CSS 프레임워크를 지원하며, CSS 그리드 레이아웃을 생성할 수 있습니다. ## 업무 도구 [다음 맞춤법 검사기](https://alldic.daum.net/grammar_checker.do) - 한글 맞춤법과 문법을 확인할 수 있는 도구 > 한글 맞춤법과 문법을 확인할 수 있는 도구로, 텍스트를 입력하거나 붙여넣어서 문법을 확인할 수 있습니다. [charactercountonline](https://www.charactercountonline.com/) - 문자 수를 세는 도구 --- title: 디자인 시스템 참고자료 url: https://handstack.kr/docs/information/resource/디자인-시스템-참고자료 --- # 디자인 시스템 참고자료 ## 디자인 시스템이란? 디자인 시스템은 UI 및 UX 디자인 원칙과 규격을 정의하고, 재사용 가능한 UI 컴포넌트를 제공하여 다양한 제품(PC, 모바일 등)에 일관성 있게 대응할 수 있도록 하는 체계입니다. ### 주요 요소 - **UI, UX 디자인 원칙 및 규격**: 사용자 인터페이스와 사용자 경험을 위한 일관된 디자인 원칙과 규격을 정의합니다. - **재사용 가능한 UI 컴포넌트**: 버튼, 입력 필드, 모달 등 다양한 UI 컴포넌트를 재사용 가능하게 설계합니다. - **다양한 제품 대응**: PC, 모바일 등 다양한 디바이스와 플랫폼에 일관된 디자인을 제공합니다. ## 왜 디자인 시스템인가? 디자인 시스템을 도입하는 주요 이유는 다음과 같습니다: - **효율성 확보**: 디자인과 개발 과정에서 반복 작업을 줄이고, 생산성을 높입니다. - **일관성 있는 개발/사용자 경험**: 모든 제품에서 일관된 사용자 경험을 제공하여 브랜드 신뢰성을 높입니다. ## 디자인 시스템 기반 환경 디자인 시스템을 구축하고 활용하기 위해 다음과 같은 도구와 프레임워크를 사용할 수 있습니다: - **Bootstrap 5**: 인기 있는 CSS 프레임워크로, 반응형 디자인을 쉽게 구현할 수 있습니다. - **Tabler**: 현대적이고 깔끔한 디자인의 UI 컴포넌트 라이브러리입니다. - **Tabler Icons**: 다양한 아이콘을 제공하여 UI 디자인을 풍부하게 합니다. - **Master UI**: 다양한 UI 컴포넌트를 제공하는 라이브러리입니다. - **Chrome 기반 PC, 모바일 브라우저**: 크롬 브라우저를 기반으로 한 다양한 디바이스에서 테스트 및 사용이 가능합니다. ## 샘플 및 예제 이 문서에서는 HandStack 기본 CSS 프레임워크인 Bootstrap 기반의 Tabler 테마에 대한 참고 자료에 대한 링크를 제공합니다. ### 디자인 컴포넌트 예제 - [Bootstrap 5](https://getbootstrap.com/docs/5.3/examples/) - [Bootstrap Components](https://getbootstrap.com/docs/5.3/components/) - [Tabler](https://preview.tabler.io/) - [Tabler Form Elements](https://preview.tabler.io/form-elements.html) ## 유용한 Bootstrap Snippet 사이트 - [Bootsnipp](https://bootsnipp.com/) - [Bootdey](https://www.bootdey.com/bootstrap-snippets) - [Bootstrapious](https://bootstrapious.com/snippets) - [Tutorial Republic](https://www.tutorialrepublic.com/snippets/gallery.php) ## Tailwind UI 컴포넌트 Copilot 변환 프롬프트 - [Tailwind UI 컴포넌트](https://tailwindui.com/components) > ```html > 여기에 tailwind 기반 HTML 코드 추가... > ``` > 위의 tailwindcss 코드를 master.co 문법으로 변경해줘 --- title: AI로 게시판 설계 검토하기 url: https://handstack.kr/docs/information/resource/AI로-게시판-설계-검토하기 --- # AI로 게시판 설계 검토하기 게시판을 이미 실행한 뒤 설계를 검토할 때 읽는 선택 자료입니다. 아래는 기존 문서에서 분리한 Copilot 대화 예시이며, 모델·계정·시점에 따라 결과가 달라집니다. 생성된 SQL은 실행 전 스키마와 실제 계약에 맞춰 검토하세요. [첫 조회 실습](https://handstack.kr/docs/tutorial/첫-조회) · [게시판 구현 예제](https://handstack.kr/docs/startup/handsonlab/게시판-프로젝트-시작하기) ## Copilot으로 관리 데이터 생각 정리하기 HandStack은 공식적으로 SQL Server, Oracle, MySQL/MariaDB, PostgreSQL, SQLite 데이터베이스를 지원합니다. 게시판 프로젝트에서 사용하는 데이터베이스는 SQLite 입니다. SQLite는 개발자에게 다음과 같은 장점을 제공합니다. * 최신 ANSI SQL 준수: 표준 SQL 문법을 사용 가능합니다. 고유 기능을 제외한 호환성이 높은 SQL을 다른 데이터베이스에 재사용 가능합니다. * 서버가 필요 없습니다: SQLite는 서버 프로세스를 시작, 중지 또는 구성할 필요가 없습니다. * 간단한 데이터베이스 파일: SQLite 데이터베이스는 단일 일반 디스크 파일로, 백업 및 복구가 간단합니다. 게시판을 만드는 데 필요한 데이터 항목을 Copilot에게 다음과 같이 활용해서 만들어 보겠습니다. > 동일한 프롬프트 스크립트여도 로그인 계정의 작업 이력에 따라 다른 결과가 나올수 있고 출력 결과는 검증되지 않았기 때문에 참고용으로 사용 해야 합니다. ### 테이블 및 DDL 쿼리 작성 도움받기 게시판 테이블 및 쿼리 작성을 위해 Copilot에게 질문한 스크립트와 결과는 다음과 같습니다. > ``` > 간단한 분류 게시판 데이터베이스 테이블 정보 (컬럼명, 데이터 타입, 설명)를 SQLite 기준으로 MarkDown 문법으로 만들어줘. 그리고 실행 결과에서 테이블을 생성 하는 ddl 문법에서 ID를 자동 증가 키 컬럼으로 구성하고 기존 테이블이 없으면 CREATE 하는 예제를 알려줘 > ``` --- > SQLite 기준으로 분류 게시판 데이터베이스 테이블을 만들었습니다. 아래는 간단한 분류 게시판 테이블의 구조입니다: > > | 컬럼명 | 데이터 타입 | 설명 | > |--------|-------------|------| > | ID | INTEGER | 게시글의 고유 번호 (기본 키) | > | Category | TEXT | 게시글의 카테고리 | > | Title | TEXT | 게시글의 제목 | > | Content | TEXT | 게시글의 내용 | > | Author | TEXT | 게시글 작성자의 이름 | > | DatePosted | TEXT | 게시글이 작성된 날짜와 시간 | > > 이 테이블은 게시판의 기본적인 기능을 수행할 수 있습니다. 필요에 따라 추가적인 컬럼을 추가하거나 수정할 수 있습니다. 이 정보를 CSV 파일에 입력하면 SQLite 기준의 분류 게시판 데이터베이스 테이블 정보를 CSV 형식으로 만들 수 있습니다. > > 참고로, SQLite에서 테이블을 생성하는 SQL 쿼리는 다음과 같습니다: > > ```sql > CREATE TABLE IF NOT EXISTS Board ( > ID INTEGER PRIMARY KEY AUTOINCREMENT, > Category TEXT, > Title TEXT, > Content TEXT, > Author TEXT, > DatePosted TEXT > ); > ``` ### 게시판 CRUD 쿼리 작성 도움받기 > ``` > 위의 Board 테이블 결과에서 SQLite 기준으로 CRUD 쿼리를 만들어줘 > ``` --- > 네, Board 테이블에 대한 CRUD(Create, Read, Update, Delete) 쿼리를 SQLite 기준으로 작성해드리겠습니다. > > 1. **Create (생성)**: 새로운 게시글을 추가합니다. > ```sql > INSERT INTO Board (ID, Category, Title, Content, Author, DatePosted) > VALUES (1, '카테고리', '제목', '내용', '작성자', datetime('now')); > ``` > > 2. **Read (조회)**: 게시글을 조회합니다. > ```sql > -- 모든 게시글 조회 > SELECT * FROM Board; > > -- 특정 ID의 게시글 조회 > SELECT * FROM Board WHERE ID = 1; > > -- 특정 카테고리의 게시글 조회 > SELECT * FROM Board WHERE Category = '카테고리'; > ``` > > 3. **Update (수정)**: 기존 게시글을 수정합니다. > ```sql > UPDATE Board > SET Title = '새 제목', Content = '새 내용' > WHERE ID = 1; > ``` > > 4. **Delete (삭제)**: 게시글을 삭제합니다. > ```sql > DELETE FROM Board WHERE ID = 1; > ``` > > 위의 쿼리들은 간단한 예시이며, 실제 사용 시에는 필요에 따라 적절히 수정하여 사용하시면 됩니다. 또한, 데이터베이스 작업을 할 때는 항상 주의를 기울여야 합니다. 특히, `UPDATE`와 `DELETE` 쿼리는 신중하게 사용해야 합니다. 잘못 사용하면 예상치 못한 데이터 손실이 발생할 수 있습니다. --- 게시판을 만들고 관리하기 위해 참고용 SQL이 충분히 만들어져 있지만 업무에 맞게 조금 다듬어 이후 예제에 활용 하겠습니다. --- title: Claude CLI 기술 레퍼런스 url: https://handstack.kr/docs/information/resource/Claude CLI 기술 레퍼런스 --- # Claude CLI 기술 레퍼런스 ## 핵심 요약 Claude Code는 터미널에서 실행되는 **코딩 에이전트**입니다. 코드베이스를 읽고, 계획을 세우고, 파일을 수정하고, 명령을 실행하고, 결과를 검증하는 일련의 루프를 사람 대신 빠르게 반복합니다. 개발자가 Claude Code를 효과적으로 사용하려면 다음 5가지 핵심 시스템을 먼저 이해해야 합니다. | 핵심 시스템 | 목적 | 개발자가 얻는 효과 | |---|---|---| | `settings.json` | 모델, 권한, Hooks, 환경변수 설정 | 세션마다 반복 설정하지 않음 | | Permission / Sandbox | 파일·명령·네트워크 실행 범위 통제 | 안전한 자율 실행 가능 | | `CLAUDE.md` | 프로젝트별 아키텍처·규칙 제공 | 매번 컨텍스트를 설명하지 않음 | | MCP | 외부 도구·문서·API 연결 | GitHub, DB, Sentry, 사내 API 연동 | | Hooks / Subagents | 결정론적 실행과 위임 작업 분리 | 포맷팅·검증을 보장하고 비용 절감 | 실무 사용 루프는 다음과 같습니다. ```txt 요구사항 입력 → 관련 파일 지정 → Plan Mode로 계획 수립 → 패치 생성 → 테스트/빌드 실행 → diff 검토 → 커밋/PR ``` --- ## Claude Code를 어떻게 이해해야 하나? Claude Code는 하나의 모델이 여러 실행 표면(surface)에서 동작하는 구조로 이해하면 쉽습니다. | 실행 표면 | 적합한 상황 | |---|---| | 대화형 REPL (`claude`) | 터미널 중심 개발, 탐색적 작업 | | Print Mode (`claude -p`) | 단발성 질의, 파이프 입력, 스크립트 연동 | | IDE 확장 (VS Code 등) | 열린 파일·선택 영역 기반 작업 | | Remote / Background Agent | 장시간 작업, 비동기 분석 | | SDK (`@anthropic-ai/claude-code`) | 사내 도구·슬랙봇 등에 에이전트 내장 | 개발자는 보통 REPL만으로 시작해도 충분하지만, 팀 단위로 확장하려면 다음 순서로 적용하는 것이 좋습니다. ```txt REPL 사용 → CLAUDE.md 작성 → settings.json 표준화 → Hooks로 포맷팅/검증 고정 → MCP 연결 → Subagents로 비용·컨텍스트 분리 ``` --- ## 설치 및 인증 ### 설치 방법 | 방법 | 명령어 | 특징 | |---|---|---| | 네이티브 (macOS/Linux) | `curl -fsSL https://claude.ai/install.sh \| bash` | 권장, Node 불필요 | | Homebrew | `brew install --cask claude-code` | macOS/Linux 안정화 버전 | | Windows PowerShell | `irm https://claude.ai/install.ps1 \| iex` | 네이티브 실행 파일 | | winget | `winget install Anthropic.ClaudeCode` | Windows 패키지 관리자 | | npm (레거시) | `npm install -g @anthropic-ai/claude-code` | 사용 중단 안내 표시 | ### 업데이트 및 진단 ```bash claude update # 수동 업데이트 claude --version # 버전 확인 claude doctor # 설치 상태 진단 ``` 자동 업데이트를 끄려면 환경변수를 설정합니다. ```bash export DISABLE_AUTOUPDATER=1 ``` ### 인증 옵션 ```txt 1. Claude Console: platform.claude.com 에서 API 청구 기반 인증 2. Claude Pro/Max 구독: claude.ai 계정으로 정액제 사용 3. 엔터프라이즈 플랫폼: AWS Bedrock, Google Vertex AI, Microsoft Foundry ``` ```bash claude auth login # 로그인 또는 계정 전환 claude auth status # 현재 인증 상태 확인 claude auth logout # 저장된 자격증명 제거 ``` 엔터프라이즈 플랫폼 사용 시: ```bash export CLAUDE_CODE_USE_BEDROCK=1 export CLAUDE_CODE_USE_VERTEX=1 export CLAUDE_CODE_USE_FOUNDRY=1 ``` --- ## 첫 번째 세션 프로젝트 루트에서 실행합니다. ```bash cd ~/projects/my-app claude ``` 처음에는 코드 변경보다 **읽기와 요약** 작업으로 시작하는 것이 좋습니다. ```txt What does this repo do? Read the key files and summarize. 변경하지 말고 분석만 해 줘. ``` 이후 작은 작업을 시킵니다. ```txt src/api/users.ts의 getUser 함수에서 null 반환 가능성을 방어해 줘. 변경 후 관련 테스트만 실행해 줘. ``` 작업이 끝나면 비용과 변경 사항을 확인합니다. ```txt /cost /status ``` --- ## 기본 명령과 슬래시 명령 ### CLI 실행 모드 | 모드 | 명령 | 용도 | |---|---|---| | 대화형 REPL | `claude` | 기본 세션 시작 | | 초기 프롬프트 | `claude "explain the authentication"` | 프롬프트와 함께 시작 | | Print 모드 | `claude -p "list all TODO comments"` | 비대화형 단발 실행 | | 세션 계속 | `claude -c` | 가장 최근 세션 이어가기 | | 세션 선택 재개 | `claude --resume` / `claude -r "abc123"` | 세션 목록·ID로 재개 | | PR 연결 세션 | `claude --from-pr 123` | GitHub/GitLab/Bitbucket PR과 연결 | | 명명 세션 | `claude -n "auth-refactor"` | 이름을 붙여 세션 시작 | Print 모드는 파이프와 출력 리다이렉트에 적합합니다. ```bash cat error.log | claude -p "identify root cause" claude -p "generate README" > README.md claude -p "count files" --output-format json ``` 종료 코드는 `0`(성공), `1`(오류)입니다. ### 자주 쓰는 슬래시 명령 | 명령 | 용도 | |---|---| | `/model` | 모델 변경 | | `/effort` | 추론 강도(effort) 조정 | | `/fast` | Fast Mode 토글 | | `/cost` | 토큰 사용량·비용 확인 | | `/status` | 세션 상태 확인 | | `/plan` | Plan Mode 진입 | | `/compact` | 컨텍스트 압축 | | `/config` | 설정 변경 | | `/undo` / `/rewind N` | 변경 되돌리기 / N턴 되감기 | | `/sandbox` | Sandbox 모드 토글 | | `/init` | `CLAUDE.md` 초안 생성 | | `/security-review` / `/code-review` | 보안/코드 리뷰 | | `/resume` / `/rename` | 세션 선택 / 이름 변경 | | `/exit` | 세션 종료 | `Shift+Tab`으로 권한 모드를 `default → acceptEdits → auto → plan` 순서로 전환할 수 있습니다. --- ## 설정 시스템: `settings.json` ### 설정 우선순위 ```txt 1. CLI 플래그 2. .claude/settings.local.json (개인용, 현재 프로젝트) 3. .claude/settings.json (Git으로 팀 공유) 4. ~/.claude/settings.json (사용자 전역) 5. managed-settings.json (엔터프라이즈 강제 정책, 사용자가 완화 불가) ``` `managed-settings.json` 위치: ```txt macOS: /Library/Application Support/ClaudeCode/managed-settings.json Windows: C:\Program Files\ClaudeCode\managed-settings.json Linux: /etc/claude-code/managed-settings.json ``` ### 설정 예시 ```json { "$schema": "https://json.schemastore.org/claude-code-settings.json", "model": "claude-sonnet-4-5-20250929", "permissions": { "allow": ["Read", "Glob", "Grep", "Bash(npm run:*)", "Bash(git:*)", "Edit(src/**)"], "deny": ["Read(.env*)", "Read(secrets/**)", "Bash(rm -rf:*)"], "ask": ["WebFetch", "Bash(curl:*)"], "defaultMode": "acceptEdits" }, "env": { "NODE_ENV": "development" }, "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "npx prettier --write \"$FILE_PATH\"" }] } ] }, "sandbox": { "enabled": false, "autoAllowBashIfSandboxed": true }, "cleanupPeriodDays": 30 } ``` 세션 중 직접 변경할 수도 있습니다. ```txt /config key=value /config thinking=false /config --help ``` ### 자주 쓰는 환경변수 ```bash ANTHROPIC_API_KEY=sk-ant-... # API 직접 인증 ANTHROPIC_MODEL=claude-opus-4-7 # 기본 모델 재정의 CLAUDE_CODE_SUBAGENT_MODEL=haiku # Subagent 전용 모델 MAX_THINKING_TOKENS=10000 # 확장 사고 토큰 예산 DISABLE_AUTOUPDATER=1 # 자동 업데이트 비활성화 DISABLE_TELEMETRY=1 # 사용 현황 텔레메트리 거부 BASH_DEFAULT_TIMEOUT_MS=30000 # Bash 명령 기본 타임아웃 MCP_TOOL_TIMEOUT=30000 # MCP 도구 실행 타임아웃 HTTPS_PROXY=https://proxy:8080 # 사내 프록시 ``` --- ## 모델 선택과 비용 최적화 ### 모델 라인업 | Alias | 적합한 용도 | |---|---| | `haiku` | 빠른 탐색, 단순 작업, Subagent용 | | `sonnet` | 균형 잡힌 일상 개발의 주력 모델 | | `opus` | 복잡한 추론, 장기 작업, 아키텍처 결정 | | `fable` | 최고 난이도 추론이 필요한 경우 (Opus보다 고가) | | `opus[1m]` / `sonnet[1m]` | 대규모 코드베이스용 확장 컨텍스트 | | `opusplan` | Opus로 계획, Sonnet으로 실행하는 하이브리드 | ```bash > /model opus > /model sonnet > /model haiku claude --model opus export ANTHROPIC_MODEL=opus ``` Primary 모델이 과부하 상태면 순서대로 대체합니다. ```json { "model": "claude-opus-4-8", "fallbackModel": ["claude-sonnet-4-6", "claude-haiku-4-5"] } ``` ### Effort와 Fast Mode ```txt /effort 대화형 슬라이더 /effort xhigh 직접 설정 (low / medium / high / xhigh / max) /fast 같은 모델로 더 빠른 출력 (비용 약 6배) ``` | 작업 | 권장 effort | |---|---| | 오타, 포맷팅 | low | | 단순 버그 수정 | medium | | 테스트 실패 분석 | medium ~ high | | 아키텍처 변경, 보안 검토 | high ~ xhigh | ### 비용 확인과 절감 전략 ```txt /cost ``` ```txt 1. Subagent에는 Haiku 사용 (탐색 작업에 고가 모델 불필요) 2. Prompt caching은 기본 활성화 상태 확인 3. claude --max-turns 5 로 폭주 방지 4. Plan Mode로 우발적 고비용 실행 차단 5. /compact로 컨텍스트 선제적 정리 6. 긴급하지 않은 작업은 Batch API로 50% 절감 ``` --- ## 권한(Permission) 시스템과 Sandbox Claude Code 보안 모델은 두 계층으로 나뉩니다. ```txt Permission = 어떤 도구·명령을 실행할 수 있는가 Sandbox = 파일시스템·네트워크를 OS 수준에서 어디까지 격리할 것인가 ``` ### Permission Mode | 모드 | 동작 | 권장 상황 | |---|---|---| | `default` | 도구 사용 시마다 승인 요청 | 일반 개발 초기 | | `acceptEdits` | 파일 편집 자동 승인, Bash는 승인 요청 | 신뢰할 수 있는 프로젝트 | | `auto` | Classifier가 각 작업의 안전성 평가 | 보호장치가 있는 자율 실행 | | `plan` | 실행·편집 불가, 읽기 전용 | 분석, 코드 리뷰 | | `bypassPermissions` | 모든 승인 생략 | 격리된 CI/CD 환경만 | ```bash claude --permission-mode auto ``` ### 권한 규칙 문법 ```json { "allow": ["Bash(npm run test:*)", "Edit(src/**)", "mcp__github"], "deny": ["Bash(rm -rf:*)", "Bash(sudo:*)", "Read(.env*)", "Edit(.git/**)"], "ask": ["Bash(curl:*)", "WebFetch"] } ``` Bash 패턴은 정규식이 아닌 prefix matching만 지원합니다. 파일 경로는 working directory 기준 상대 경로(`src/**`), 설정 파일 기준 절대 경로(`/build/**`), 실제 절대 경로(`//tmp/**`)를 구분해 사용합니다. ### Auto Mode의 자동 차단 대상 ```txt - curl | bash - 운영 환경 배포/마이그레이션 - 대량 클라우드 리소스 삭제 - IAM/권한 변경 ``` 한 세션에서 3회 연속 차단되거나 누적 20회 차단되면 수동 프롬프트 모드로 자동 복귀합니다(circuit breaker). ### Sandbox 모드 ```json { "sandbox": { "enabled": true, "autoAllowBashIfSandboxed": true, "excludedCommands": ["git", "docker"], "network": { "deniedDomains": ["pastebin.com", "transfer.sh"] }, "credentials": { "denyRead": [".aws/credentials", ".ssh/*"] } } } ``` Sandbox를 활성화하면 파일시스템 접근이 프로젝트 디렉터리로 제한되고, 자격 증명 파일 읽기가 차단되며, 내부 테스트 기준 승인 프롬프트가 크게 줄어듭니다. --- ## `CLAUDE.md`: 프로젝트 지침 파일 `CLAUDE.md`는 프로젝트 루트에 두는 특수 파일로, Claude가 세션마다 자동으로 읽습니다. 매번 긴 프롬프트로 설명하는 대신, 아키텍처와 팀 규칙을 문서화해 자동 로딩되게 하는 방식입니다. ### 예시 ```markdown # Project Architecture ## Tech Stack - Node.js 18+, TypeScript, React 18, PostgreSQL ## Key Files - `/src/auth/` - Authentication logic - `/src/api/` - API endpoints - `/tests/` - Test suite ## Build & Run \`\`\`bash npm install npm run build npm run dev \`\`\` ## Coding Standards - TypeScript strict mode 사용 - 모든 public API에 테스트 작성 ## Known Issues - DB 커넥션 풀 타임아웃 5초 - 동시 빌드 시 간헐적 실패 ``` 초기 파일은 다음 명령으로 생성할 수 있습니다. ```txt /init ``` 작성 원칙은 다음과 같습니다. ```txt - 아키텍처 개요를 유지한다. - 주요 파일 경로를 문서화한다. - 빌드/실행 명령을 포함한다. - 코딩 표준과 금지 규칙을 명시한다. - 알려진 제한사항과 흔한 실수를 기록한다. ``` --- ## Plan Mode와 작업 제어 ### Plan Mode 복잡한 작업은 바로 수정하지 말고 `/plan`으로 시작합니다. ```txt /plan 인증 시스템의 refresh token 처리 방식을 개선해 줘. ``` Plan Mode에서는 읽기 전용 도구만 사용할 수 있습니다. ```txt Read · Glob · Grep · LS · WebSearch · WebFetch · AskUserQuestion ``` `Edit`, `Write`, `Bash`, `NotebookEdit`은 모두 차단됩니다. 계획은 `.claude/plans/{session-slug}.md`에 작성되고, 사용자가 검토 후 다음 중 하나를 선택해 승인합니다. ```txt 1. 컨텍스트를 비우고 계획만으로 새로 시작 (계획 준수도 향상) 2. 컨텍스트를 유지하며 각 변경을 수동 승인 3. 컨텍스트를 유지하며 자동 승인 ``` `Shift+Tab`으로 세션 중 `normal → plan → auto-accept` 모드를 전환할 수 있습니다. ### 작업 중 방향 전환과 되돌리기 ```txt 잠깐, 이 방식 말고 기존 인터페이스는 유지하고 내부 구현만 바꿔. ``` ```txt /undo 최근 변경 되돌리기 /rewind 3 3턴 이전으로 되감기 ``` --- ## MCP: 외부 도구 연결 MCP(Model Context Protocol)는 Claude Code가 외부 도구나 데이터 소스를 사용할 수 있게 해주는 연결 계층입니다. ```txt - GitHub: 저장소 관리, PR 생성·검토 - Database: SQL 쿼리 실행 - Sentry: 에러 로깅과 모니터링 - Slack: 메시지 전송 ``` ### 설정 ```json { "mcp": { "servers": { "github": { "command": "npx", "args": ["@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_..." } } } } } ``` ### MCP 도구 권한 제어 ```json { "allow": ["mcp__github", "mcp__database__query"], "deny": ["mcp__dangerous_server__*"] } ``` MCP는 “있으면 좋은 도구”가 아니라, 반복적인 수동 조회를 줄일 수 있을 때 도입합니다. --- ## Skills Skill은 재사용 가능한 AI 전문성을 패키징한 파일입니다. `.claude/skills/` 아래에 둡니다. ```txt .claude/skills/ ├── security-review.md ├── performance-analysis.md └── api-design-check.md ``` ### 구조 예시 ```markdown --- name: Security Review description: Comprehensive security analysis of code type: auto # 또는 user-invocable-only, off tags: [security, review] --- You are a security expert analyzing code for vulnerabilities. When reviewing code: 1. Check for SQL injection patterns 2. Verify authentication/authorization 3. Review error handling 4. Check for hardcoded secrets ``` | type | 설명 | |---|---| | `auto` | 관련 컨텍스트에서 자동 적용 | | `user-invocable-only` | 명시적으로 호출할 때만 적용 | | `off` | 비활성화 | `settings.json`의 `skillOverrides`로 개별 Skill을 일괄 제어할 수 있습니다. ```json { "skillOverrides": { "legacy-skill": "off", "manual-only-skill": "user-invocable-only" } } ``` --- ## Subagents Subagent는 메인 세션 컨텍스트와 분리된 격리 컨텍스트에서 작업하고, 요약만 메인 세션에 반환합니다. ```bash /task explore # 탐색 전용 /task plan # 계획 수립 /task implement # 구현 /task "custom prompt" # 사용자 정의 작업 ``` ### 특성 ```txt - 깨끗한 컨텍스트로 시작해 메인 세션 컨텍스트를 비대화시키지 않는다. - 더 저렴한 모델로 라우팅할 수 있다. - 최대 5단계 깊이까지 재귀적으로 생성될 수 있다. ``` 탐색용 Subagent는 보통 Haiku로 충분합니다. ```bash export CLAUDE_CODE_SUBAGENT_MODEL=haiku ``` 여러 Subagent를 병렬로 운용할 수도 있습니다(Agent Teams). ```bash /agent-team "Review auth module, Review API routes, Review database layer" ``` --- ## Hooks Hooks는 세션 라이프사이클의 특정 시점에 결정론적으로 스크립트를 실행하는 확장 기능입니다. 프롬프트로 부탁하는 것과 달리 실행을 보장합니다. ### 주요 이벤트 | Event | 시점 | 차단 가능 | |---|---|---| | `PreToolUse` | 도구 실행 전 | 예 | | `PostToolUse` | 도구 완료 후 | 아니오 | | `UserPromptSubmit` | 사용자 프롬프트 전송 시 | 예 | | `Stop` | 응답 완료 시 | 예 | | `SubagentStop` | Subagent 완료 시 | 예 | | `SessionStart` / `SessionEnd` | 세션 시작/종료 시 | 아니오 | | `PreCompact` / `PostCompact` | 컨텍스트 압축 전/후 | 전: 예 | ### 설정 예시 ```json { "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "npx prettier --write \"$FILE_PATH\"" }] } ], "PreToolUse": [ { "matcher": "Bash", "hooks": [{ "type": "command", "command": ".claude/hooks/validate-bash.sh" }] } ] } } ``` Hook은 stdin으로 JSON 입력을 받고, exit code `0`(성공), `2`(차단), 그 외(비차단 오류)로 결과를 반환합니다. `command` 외에 `prompt`(모델에게 판단을 위임), `http`(외부 엔드포인트 호출), `agent`(도구 접근이 있는 서브에이전트로 다단계 검증) 타입도 지원합니다. 비동기 Hook은 세션을 차단하지 않습니다. ```json { "type": "command", "command": ".claude/hooks/notify-slack.sh", "async": true } ``` 포맷팅·검증처럼 다음 작업 전에 반드시 끝나야 하는 작업은 동기(`async: false`)로, 알림처럼 결과를 기다릴 필요 없는 작업은 비동기로 둡니다. --- ## 비대화형 모드와 CI/CD `claude -p`는 REPL 없이 Claude Code를 실행하는 헤드리스 모드입니다. ### 기본 사용 ```bash claude -p "list all TODO comments" cat error.log | claude -p "find root cause" ``` ### 출력 형식 ```bash claude -p "build" --output-format text # 기본값 claude -p "build" --output-format json # 스크립트 파싱용 claude -p "build" --output-format stream-json # 실시간 스트리밍 ``` JSON 출력 예시: ```json { "type": "result", "subtype": "success", "total_cost_usd": 0.0034, "is_error": false, "duration_ms": 2847, "num_turns": 4, "result": "Response text...", "session_id": "abc-123-def" } ``` ### 자동화 시 안전 옵션 ```bash claude -p "refactor module" --max-turns 10 claude -p "fix lint" --allowedTools "Edit,Bash(npm run lint)" ``` ### CI 스크립트 예시 ```bash result=$(claude -p "security review" --output-format json) is_error=$(echo "$result" | jq -r '.is_error') if [ "$is_error" = "true" ]; then echo "Review failed" exit 1 fi echo "$result" | jq -r '.result' ``` ### CI에서 안전하게 쓰는 원칙 ```txt - main 브랜치에 직접 적용하지 않는다. - 별도 브랜치 또는 worktree에서 실행한다. - --max-turns 로 폭주를 제한한다. - --allowedTools 로 도구 범위를 좁힌다. - bypassPermissions는 격리된 환경에서만 사용한다. - 결과는 PR diff로 검토한다. ``` --- ## 개발자 실무 레시피 ### 새 프로젝트 분석 ```txt 이 저장소를 변경하지 말고 분석만 해 줘. 출력: 1. 프로젝트 구조 2. 주요 실행 진입점 3. 빌드 명령 4. 테스트 명령 5. 위험해 보이는 설정 ``` ### 기능 개발 ```txt 목표: - 사용자 프로필 수정 API에 nickname 검증을 추가한다. 범위: - src/users/** - tests/users/** 제약: - public API route는 변경하지 않는다. - 새 패키지는 추가하지 않는다. 완료 조건: - 관련 테스트 통과 - 변경 파일 목록 출력 - 남은 위험 요소 출력 ``` ### 리팩토링 ```txt /plan OrderService의 결제 검증 로직을 별도 클래스로 분리하고 싶다. 먼저: - 현재 의존성 구조 분석 - 변경 후보 파일 목록 제안 - public API 영향 여부 판단 승인 전까지 파일은 수정하지 마. ``` ### 코드 리뷰 ```txt /code-review 이번 브랜치의 변경 사항을 main 기준으로 리뷰해 줘. 관점: - 버그 가능성 - 예외 처리 - SQL injection 가능성 - 테스트 누락 ``` --- ## 팀 도입 전략 팀에 Claude Code를 도입할 때는 기능보다 **운영 규칙**을 먼저 정해야 합니다. ### 단계: 개인 사용 ```txt - CLI 설치 - 기본 로그인 - Plan Mode로 분석 - 작은 버그 수정 ``` ### 단계: 저장소 표준화 ```txt - repo-root/CLAUDE.md 작성 - .claude/settings.json 추가 - 빌드/테스트 명령 명문화 - 금지 작업 명문화 ``` ### 단계: 반복 작업 패키징 ```txt - 자주 쓰는 리뷰 프롬프트를 Skill로 분리 - 포맷팅/검증을 Hooks로 고정 - 탐색 작업을 Subagent + Haiku로 위임 ``` ### 단계: 외부 도구 연결 ```txt - GitHub MCP - Sentry MCP - 내부 문서 검색 MCP - 사내 배포/로그 API MCP ``` ### 단계: 엔터프라이즈 배포 ```txt - managed-settings.json으로 권한/모델 정책 강제 - AWS Bedrock / Google Vertex AI / Microsoft Foundry 연동 - Hooks 기반 중앙 감사 로깅 - Admin API로 조직 사용량 모니터링 ``` --- ## 안티패턴 | 안티패턴 | 문제 | 대안 | |---|---|---| | “알아서 고쳐줘” | 범위가 넓어 토큰 낭비와 오작동 증가 | 파일·목표·완료 조건 명시 | | 포맷팅을 프롬프트로 매번 요청 | 일관성 보장 안 됨 | `PostToolUse` Hook으로 고정 | | 모든 작업에 Opus/Fable 사용 | 비용 과다 | 탐색은 Haiku, 일상 개발은 Sonnet | | 모든 작업에 Extended Thinking 상시 적용 | 비용 증가, 속도 저하 | 어려운 문제에서만 토글 | | `--dangerously-skip-permissions` 상시 사용 | 안전장치 전무 | 기본은 `auto` 또는 `acceptEdits` | | 8시간 단일 세션 유지 | 컨텍스트 비대화 | `/compact`, Subagent로 분리 | | main 브랜치에서 직접 자동화 실행 | 위험한 변경이 섞임 | feature branch/worktree 사용 | --- ## 권장 기본 세팅 개인 개발자 기준: ```json { "model": "claude-sonnet-4-5-20250929", "permissions": { "defaultMode": "acceptEdits", "allow": ["Bash(npm run:*)", "Bash(git:*)"], "ask": ["Bash(curl:*)", "Bash(docker:*)"] }, "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "npx prettier --write \"$FILE_PATH\"" }] } ] } } ``` 처음 보는 저장소: ```bash claude --permission-mode plan ``` 일반 개발: ```bash claude --permission-mode acceptEdits ``` CI 자동화: ```bash claude -p "지정된 검증 작업을 수행하고 JSON으로 결과를 출력해 줘" \ --output-format json \ --max-turns 10 \ --allowedTools "Edit,Bash(npm run test:*)" ``` --- ## 도입 체크리스트 ### 개인 개발자 ```txt [ ] Claude Code 설치 [ ] claude auth login [ ] 기본 프로젝트에서 Plan Mode로 분석 실행 [ ] /status, /cost 확인 [ ] 작은 파일 수정 후 diff 검토 [ ] CLAUDE.md 작성 [ ] .claude/settings.json 작성 ``` ### 프로젝트 ```txt [ ] repo-root/CLAUDE.md 작성 [ ] .claude/settings.json 작성 [ ] 빌드/테스트/lint 명령 문서화 [ ] public API 변경 규칙 문서화 [ ] PostToolUse Hook으로 포맷팅 고정 [ ] 권한 allow/deny/ask 정의 ``` ### 팀 ```txt [ ] 공통 Skill 후보 선정 [ ] MCP 도입 후보 선정 [ ] Subagent 모델 라우팅 정책 정의 [ ] managed-settings.json으로 조직 정책 강제 [ ] Admin API로 사용량 모니터링 체계 구축 [ ] CI 실행 정책(`--max-turns`, `--allowedTools`) 정의 ``` --- ## 빠른 참조 ```bash # 시작 claude # 초기 프롬프트와 함께 시작 claude "이 프로젝트 구조를 요약해 줘" # 비대화형 실행 claude -p "테스트 실패 원인을 분석해 줘" # 권한 모드 claude --permission-mode plan claude --permission-mode acceptEdits claude --permission-mode auto # 모델 claude --model opus claude --model sonnet[1m] # 세션 claude -c claude --resume claude -n "auth-refactor" # 비용 확인 /cost /status ``` 슬래시 명령: ```txt /model 모델 변경 /effort 추론 강도 조정 /plan Plan Mode 진입 /cost 비용 확인 /compact 컨텍스트 압축 /config 설정 변경 /undo 변경 되돌리기 /rewind N N턴 되감기 /sandbox Sandbox 모드 토글 /init CLAUDE.md 생성 /security-review 보안 검토 /code-review 코드 리뷰 ``` --- ## 결론 Claude Code를 잘 쓰는 핵심은 “더 강한 권한을 주는 것”이 아니라 **좋은 작업 경계와 검증 루프를 만드는 것**입니다. 개발자 개인은 다음 3가지만 먼저 적용해도 효과를 볼 수 있습니다. ```txt 1. 프로젝트 루트에서 claude 실행 2. CLAUDE.md에 아키텍처·빌드·테스트·금지 규칙 작성 3. 작업마다 파일 범위와 완료 조건을 명확히 지정 ``` 팀 단위에서는 다음 순서가 가장 안정적입니다. ```txt CLAUDE.md → settings.json → Hooks → Subagents → MCP → 엔터프라이즈 배포(managed-settings.json) ``` Claude Code는 개발자를 대체하는 도구라기보다, **잘 정의된 개발 루프를 빠르게 반복하는 에이전트 실행 환경**에 가깝습니다. 따라서 좋은 결과는 모델 성능만이 아니라, 프로젝트 규칙, 테스트 체계, 권한 정책, 비용 관리 설계 품질에 의해 결정됩니다. --- ## 참고 자료 - Blake Crosley, `Claude Code: 최종 기술 레퍼런스`: https://blakecrosley.com/ko/guides/claude-code - Anthropic Claude Code 공식 문서: https://docs.claude.com/en/docs/claude-code - Anthropic Claude Code Settings: https://docs.claude.com/en/docs/claude-code/settings - Anthropic Claude Code Permissions: https://docs.claude.com/en/docs/claude-code/iam - Anthropic Claude Code Hooks: https://docs.claude.com/en/docs/claude-code/hooks - Anthropic Claude Code MCP: https://docs.claude.com/en/docs/claude-code/mcp - Anthropic Claude Code SDK: https://docs.claude.com/en/docs/claude-code/sdk - Anthropic API Pricing: https://docs.claude.com/en/docs/about-claude/pricing --- title: Codex CLI 기술 레퍼런스 url: https://handstack.kr/docs/information/resource/Codex CLI 기술 레퍼런스 --- # Codex CLI 기술 레퍼런스 ## 핵심 요약 Codex CLI는 단순히 코드를 생성하는 챗봇이 아니라, **코드베이스를 읽고, 패치를 만들고, 명령을 실행하고, 테스트 결과를 반영하는 개발 에이전트**입니다. 개발자가 Codex를 효과적으로 사용하려면 다음 5가지를 먼저 이해해야 합니다. | 핵심 시스템 | 목적 | 개발자가 얻는 효과 | |---|---|---| | `config.toml` | 모델, 권한, MCP, 프로필 설정 | 세션마다 반복 설정하지 않음 | | Sandbox / Approval | 파일·네트워크·명령 실행 범위 통제 | 안전한 자동화 가능 | | `AGENTS.md` | 프로젝트별 작업 규칙 제공 | 팀 표준을 에이전트에 내장 | | MCP | 외부 도구·문서·API 연결 | GitHub, Figma, Sentry, 사내 API 연동 | | Skills / Plugins | 반복 워크플로 패키징 | 긴 프롬프트를 재사용 가능한 기능으로 전환 | 실무 사용 루프는 다음과 같습니다. ```txt 요구사항 입력 → 관련 파일 지정 → 계획 수립 → 패치 생성 → 테스트/빌드 실행 → diff 검토 → 커밋/PR ``` --- ## Codex를 어떻게 이해해야 하나? Codex는 하나의 모델이 여러 실행 표면(surface)에서 동작하는 구조로 이해하면 쉽습니다. | 실행 표면 | 적합한 상황 | |---|---| | CLI | 터미널 중심 개발, 빠른 수정, 자동화 스크립트 | | IDE Extension | VS Code, Cursor 등에서 열린 파일·선택 영역 기반 작업 | | Desktop App | 여러 작업 스레드, Git worktree, 시각적 diff 리뷰 | | Codex Cloud / Web | 장시간 작업, 비동기 분석, PR 생성 | | Browser / App 통합 | 웹 기반 디버깅, 문서·외부 서비스와의 연결 | 개발자는 보통 CLI만으로 시작해도 충분하지만, 팀 단위로 확장하려면 다음 순서로 적용하는 것이 좋습니다. ```txt CLI 사용 → AGENTS.md 작성 → config.toml 표준화 → MCP 연결 → 반복 업무를 Skill로 분리 → 공유가 필요하면 Plugin으로 패키징 ``` --- ## 설치 및 인증 ### macOS / Linux 설치 ```bash curl -fsSL https://chatgpt.com/codex/install.sh | sh ``` 또는 npm으로 설치할 수 있습니다. ```bash npm install -g @openai/codex ``` macOS에서는 Homebrew도 사용할 수 있습니다. ```bash brew install --cask codex ``` ### Windows 설치 ```powershell powershell -ExecutionPolicy ByPass -c "irm https://chatgpt.com/codex/install.ps1 | iex" ``` 또는 npm을 사용할 수 있습니다. ```powershell npm install -g @openai/codex ``` Windows에서 샌드박스 안정성과 Linux 개발 환경 호환성이 중요하다면 WSL2 기반 실행을 우선 검토합니다. ### 로그인 ```bash codex ``` 처음 실행하면 ChatGPT 계정 로그인 또는 API 키 인증을 선택할 수 있습니다. 일반적으로는 ChatGPT 계정 로그인을 권장합니다. ```bash codex login codex login status codex logout ``` API 키 기반 사용이 필요한 경우: ```bash export CODEX_API_KEY="sk-..." codex login --with-api-key ``` --- ## 첫 번째 세션 프로젝트 루트에서 실행합니다. ```bash cd ~/projects/my-app codex ``` 처음에는 코드 변경보다 **읽기와 요약** 작업으로 시작하는 것이 좋습니다. ```txt 이 프로젝트의 구조를 요약해 줘. 주요 진입점, 빌드 명령, 테스트 명령을 찾아서 정리해 줘. 변경하지 말고 분석만 해 줘. ``` 이후 작은 작업을 시킵니다. ```txt src/api/users.ts의 getUser 함수에서 null 반환 가능성을 방어해 줘. 변경 후 관련 테스트만 실행해 줘. ``` 작업이 끝나면 diff를 검토합니다. ```txt /diff /review /status ``` --- ## 기본 명령과 슬래시 명령 ### CLI 실행 명령 | 명령 | 용도 | |---|---| | `codex` | 대화형 TUI 실행 | | `codex "prompt"` | 초기 프롬프트와 함께 실행 | | `codex exec "prompt"` | 비대화형 실행 | | `codex app` | 데스크톱 앱 실행 또는 handoff | | `codex mcp` | MCP 서버 관리 | | `codex completion ` | 셸 자동완성 생성 | 예시: ```bash codex "이 저장소의 테스트 실행 방법을 찾아줘" codex exec "README의 오타를 수정하고 diff를 요약해줘" codex mcp --help ``` ### 자주 쓰는 슬래시 명령 | 명령 | 용도 | |---|---| | `/status` | 현재 모델, 권한, 토큰, AGENTS 로딩 상태 확인 | | `/model` | 모델 변경 | | `/permissions` | 승인·샌드박스 모드 변경 | | `/plan` | 계획 모드 진입 | | `/diff` | 변경 사항 확인 | | `/review` | 변경 사항 리뷰 | | `/compact` | 대화 컨텍스트 압축 | | `/init` | `AGENTS.md` 초안 생성 | | `/mcp` | MCP 서버 상태 확인 | | `/skills` | 사용 가능한 Skill 확인 | | `/plugins` | Plugin 탐색·관리 | --- ## 설정 시스템: `config.toml` Codex 설정은 개인, 프로젝트, 시스템 레벨로 나눌 수 있습니다. ### 기본 위치 | 범위 | 경로 | 용도 | |---|---|---| | 사용자 기본값 | `~/.codex/config.toml` | 개인 기본 모델, 권한, MCP | | 프로젝트 설정 | `.codex/config.toml` | 저장소별 규칙 | | 프로필 설정 | `~/.codex/.config.toml` | 빠른 전환용 프리셋 | | 시스템 설정 | `/etc/codex/config.toml` | 조직 공통 설정 | | 강제 정책 | `/etc/codex/requirements.toml` | 사용자가 완화할 수 없는 제약 | ### 설정 우선순위 최신 공식 문서 기준으로 우선순위는 다음과 같습니다. ```txt 1. CLI 플래그와 --config 오버라이드 2. 프로젝트 .codex/config.toml 3. --profile 로 선택한 프로필 파일 4. 사용자 ~/.codex/config.toml 5. 시스템 /etc/codex/config.toml 6. 내장 기본값 ``` ### 기본 설정 예시 ```toml # ~/.codex/config.toml model = "gpt-5.5" model_reasoning_effort = "medium" approval_policy = "on-request" sandbox_mode = "workspace-write" [features] hooks = true [sandbox_workspace_write] network_access = false ``` ### 프로필 예시 반복 작업과 신중한 작업을 분리합니다. ```toml # ~/.codex/fast.config.toml model = "gpt-5.5" model_reasoning_effort = "low" approval_policy = "on-request" sandbox_mode = "workspace-write" ``` ```toml # ~/.codex/careful.config.toml model = "gpt-5.5" model_reasoning_effort = "high" approval_policy = "untrusted" sandbox_mode = "read-only" ``` 실행: ```bash codex --profile fast codex --profile careful ``` --- ## Sandbox와 Approval Codex 보안 모델은 두 계층으로 나뉩니다. ```txt Sandbox = 기술적으로 무엇을 할 수 있는가 Approval = 언제 사람에게 물어볼 것인가 ``` ### Sandbox 모드 | 모드 | 설명 | 권장 상황 | |---|---|---| | `read-only` | 읽기 전용 | 분석, 코드 리뷰, 보안 검토 | | `workspace-write` | 현재 작업공간 쓰기 가능 | 일반 개발 작업 | | `danger-full-access` | 전체 시스템 접근 | 격리된 컨테이너 내부, 매우 신뢰된 작업만 | 권장 기본값: ```bash codex --sandbox workspace-write --ask-for-approval on-request ``` 분석만 할 때: ```bash codex --sandbox read-only ``` ### Approval 정책 | 정책 | 설명 | 권장 상황 | |---|---|---| | `untrusted` | 대부분의 작업에 승인 요청 | 처음 보는 저장소 | | `on-request` | 경계 밖 작업에만 승인 요청 | 일반 개발 | | `never` | 승인 없이 진행 | CI/CD, 완전 자동화 | 비대화형 자동화에서는 다음 조합을 사용할 수 있지만, 신뢰된 환경에서만 사용합니다. ```bash codex exec \ --sandbox workspace-write \ --ask-for-approval never \ "테스트 실패 원인을 수정하고 결과를 요약해 줘" ``` --- ## `AGENTS.md`: 프로젝트 지침 파일 `AGENTS.md`는 Codex에게 전달되는 프로젝트 수준의 운영 규칙입니다. 매번 긴 프롬프트를 쓰는 대신, 팀 규칙을 문서화해 자동으로 로딩되게 하는 방식입니다. ### 언제 필요한가? 다음과 같은 지시를 반복하고 있다면 `AGENTS.md`로 옮깁니다. ```txt - 테스트는 npm test로 실행해. - API 변경 시 OpenAPI 문서도 업데이트해. - SQL은 반드시 파라미터 바인딩을 사용해. - Controller에는 비즈니스 로직을 넣지 마. - 변경 후 /review로 diff를 검토해. ``` ### 위치와 병합 방식 ```txt ~/.codex/AGENTS.md # 개인 기본 지침 repo-root/AGENTS.md # 저장소 공통 지침 repo-root/services/api/AGENTS.md # 하위 디렉터리 지침 ``` 더 가까운 디렉터리의 지침이 더 구체적인 규칙으로 작동합니다. ### 예시 ```markdown # AGENTS.md ## Repository overview - Backend: .NET Core - Frontend: Vue - Database: SQL Server - Do not use Entity Framework in this repository. ## Build and test - Backend build: `dotnet build` - Backend test: `dotnet test` - Frontend install: `pnpm install` - Frontend test: `pnpm test` ## Engineering rules - Do not change public API contracts without updating docs. - Prefer small, reviewable patches. - Do not add new production dependencies without asking first. - After code changes, run the smallest relevant test suite. ## Definition of done - Code compiles. - Relevant tests pass. - Diff is reviewed. - Risky changes are called out in the final summary. ``` 초기 파일은 다음 명령으로 생성할 수 있습니다. ```txt /init ``` --- ## Plan Mode와 작업 제어 ### Plan Mode 복잡한 작업은 바로 수정하지 말고 `/plan`으로 시작합니다. ```txt /plan 인증 모듈의 refresh token 처리 방식을 개선해 줘. 현재 구조를 먼저 분석하고, 변경 계획과 위험 요소를 제안해 줘. ``` 적합한 상황: ```txt - 3개 이상의 파일을 수정해야 함 - 아키텍처 변경이 포함됨 - DB 마이그레이션이 있음 - 테스트 전략이 필요함 - 성능/보안 영향이 있음 ``` ### 작업 중 방향 전환 작업 중간에 개입할 수 있습니다. ```txt 잠깐, 이 방식 말고 기존 인터페이스는 유지하고 내부 구현만 바꿔. ``` 또는 현재 작업이 끝난 뒤 이어서 처리하도록 요청할 수 있습니다. ```txt 이 작업이 끝나면 lint와 unit test도 실행해 줘. ``` --- ## MCP: 외부 도구 연결 MCP(Model Context Protocol)는 Codex가 외부 도구나 데이터 소스를 사용할 수 있게 해주는 연결 계층입니다. 예시: ```txt - Context7: 최신 라이브러리 문서 조회 - GitHub: PR, issue, Actions 로그 확인 - Figma: 디자인 스펙 확인 - Sentry: 런타임 오류 확인 - 사내 API: 배포, 로그, 검색, 업무 시스템 연동 ``` ### CLI로 MCP 서버 추가 ```bash codex mcp add context7 -- npx -y @upstash/context7-mcp ``` 상태 확인: ```txt /mcp ``` 또는: ```bash codex mcp --help ``` ### `config.toml` 직접 설정 ```toml [mcp_servers.context7] enabled = true command = "npx" args = ["-y", "@upstash/context7-mcp"] ``` 환경변수가 필요한 경우: ```toml [mcp_servers.github] enabled = true command = "npx" args = ["-y", "github-mcp-server"] env = { GITHUB_TOKEN = "${GITHUB_TOKEN}" } ``` ### MCP 도입 기준 MCP는 “있으면 좋은 도구”가 아니라, 반복적인 수동 조회를 줄일 수 있을 때 도입합니다. | 반복 작업 | MCP 후보 | |---|---| | PR 상태 확인 | GitHub MCP | | 프론트엔드 구현 중 디자인 확인 | Figma MCP | | 장애 분석 | Sentry / 로그 MCP | | 최신 API 사용법 조회 | Context7 | | 내부 업무 API 호출 | 사내 MCP 서버 | --- ## Skills Skill은 Codex가 필요할 때만 로드하는 **재사용 가능한 작업 패키지**입니다. 긴 프롬프트를 매번 붙여 넣는 대신, 다음과 같은 반복 업무를 Skill로 만듭니다. ```txt - PR 리뷰 체크리스트 - 릴리스 노트 생성 - 장애 로그 분석 - DB 마이그레이션 검토 - 보안 점검 - 프로젝트 표준 코드 생성 ``` ### Skill 구조 ```txt my-skill/ SKILL.md # 필수: 지침과 메타데이터 scripts/ # 선택: 실행 스크립트 references/ # 선택: 참고 문서 assets/ # 선택: 템플릿, 이미지 등 agents/openai.yaml # 선택: UI, 의존성, MCP 등 ``` ### `SKILL.md` 예시 ```markdown --- name: dotnet-api-review description: Use this skill when reviewing .NET Core API changes for contract safety, SQL safety, test coverage, and deployment risk. --- # .NET API Review Skill ## Goal Review API changes before merge. ## Steps 1. Identify changed controller, service, repository, and contract files. 2. Check whether public request/response contracts changed. 3. Check SQL access for parameter binding. 4. Check exception handling and logging. 5. Check relevant tests. 6. Produce a review summary with: - blocking issues - non-blocking issues - test gaps - deployment risk ## Do not - Do not rewrite code unless explicitly asked. - Do not approve changes without listing risks. ``` ### 호출 방법 명시적으로 호출: ```txt $dotnet-api-review 이 PR 변경 사항을 리뷰해 줘. ``` 또는 설명이 명확하면 Codex가 자동으로 선택할 수 있습니다. ```txt 이 API 변경 사항을 계약 안정성, SQL 안전성, 테스트 관점에서 리뷰해 줘. ``` ### Skill 작성 원칙 | 원칙 | 설명 | |---|---| | 하나의 Skill은 하나의 일만 | 범위가 넓으면 정확도가 떨어짐 | | description이 중요 | 자동 선택은 description에 크게 의존 | | 입력과 출력 형식을 명확히 | 결과 품질이 안정됨 | | 스크립트는 필요할 때만 | 지침만으로 충분하면 단순하게 유지 | | 반복 수정 후 개선 | 처음부터 모든 예외를 넣지 않음 | --- ## Plugins Plugin은 Skill, MCP 서버, app connector, hooks 등을 하나로 묶은 **설치 가능한 배포 단위**입니다. Skill이 “워크플로 작성 형식”이라면, Plugin은 “배포와 공유 형식”입니다. ### 언제 Plugin이 필요한가? | 상황 | Skill | Plugin | |---|---:|---:| | 개인 반복 업무 | 적합 | 과함 | | 한 저장소 안에서만 사용 | 적합 | 보통 불필요 | | 팀 전체 배포 | 가능 | 적합 | | MCP 설정 포함 | 가능 | 적합 | | hooks 포함 | 제한적 | 적합 | | marketplace 배포 | 불가 | 적합 | ### Plugin 사용 흐름 ```bash codex plugin list codex plugin install codex plugin remove ``` TUI 안에서는: ```txt /plugins ``` 채팅 중에는 `@plugin` 멘션으로 컨텍스트에 포함할 수 있습니다. ```txt @gmail 오늘 받은 중요 메일을 요약해 줘. @github 이 PR의 실패한 체크 원인을 분석해 줘. ``` ### Skill을 Plugin으로 전환하는 기준 다음 조건 중 2개 이상이면 Plugin화를 검토합니다. ```txt - 팀원 여러 명이 같은 Skill을 사용한다. - MCP 서버 설정이 함께 필요하다. - 사내 표준 hooks가 포함되어야 한다. - 버전 관리와 배포가 필요하다. - 설치/업데이트 경로를 통일해야 한다. ``` --- ## Hooks Hooks는 Codex 세션 라이프사이클 중 특정 시점에 스크립트를 실행하는 확장 기능입니다. ### 활용 예시 ```txt - 세션 시작 시 현재 브랜치, 티켓 번호, 빌드 환경 주입 - 프롬프트 제출 전에 민감정보 탐지 - 도구 실행 후 lint 검사 - 작업 종료 시 로그 저장 - compact 전후 상태 백업 ``` ### 설정 예시 ```toml [features] hooks = true ``` ```json { "hooks": [ { "event": "SessionStart", "command": "echo Current branch: $(git branch --show-current)" }, { "event": "PostToolUse", "command": "echo Tool completed >> .codex/tool.log" } ] } ``` Hooks는 강력하지만, 팀 환경에서는 “무엇을 자동 실행할지”에 대한 보안 검토가 필요합니다. --- ## 비대화형 모드와 CI/CD `codex exec`는 TUI 없이 Codex를 실행하는 헤드리스 모드입니다. ### 기본 사용 ```bash codex exec "실패한 테스트 원인을 분석하고 수정 후보를 제안해 줘" ``` ### 자동화용 사용 ```bash codex exec \ --sandbox workspace-write \ --ask-for-approval never \ "lint 오류를 수정하고 변경 요약을 출력해 줘" ``` ### JSON 출력 자동화 파이프라인에서는 구조화된 출력을 요구하는 것이 좋습니다. ```bash codex exec --json "변경된 파일과 테스트 결과를 JSON으로 요약해 줘" ``` ### CI에서 안전하게 쓰는 원칙 ```txt - main 브랜치에 직접 적용하지 않는다. - 별도 브랜치 또는 worktree에서 실행한다. - 네트워크 접근은 기본 차단한다. - secret 출력 가능성이 있는 명령은 금지한다. - 결과는 PR diff로 검토한다. - 자동 merge는 별도 정책으로 제한한다. ``` --- ## 성능과 비용 최적화 Codex 성능 저하는 대부분 다음 원인에서 발생합니다. ```txt - 작업 범위가 너무 넓음 - 관련 파일을 지정하지 않음 - 대화 컨텍스트가 너무 커짐 - 테스트 명령을 모름 - AGENTS.md가 없거나 모호함 - MCP/외부 도구 설정이 불완전함 ``` ### 프롬프트 최적화 나쁜 예: ```txt 에러 고쳐줘. ``` 좋은 예: ```txt tests/auth/RefreshTokenTests.cs의 실패 원인을 분석해 줘. 관련 파일은 src/auth/AuthService.cs와 src/auth/TokenRepository.cs야. public API는 바꾸지 말고, 테스트 통과 후 변경 요약을 알려줘. ``` ### 컨텍스트 관리 ```txt /compact ``` 다음과 같이 파일을 명시합니다. ```txt @src/auth/AuthService.cs @tests/auth/RefreshTokenTests.cs 이 두 파일 기준으로 실패 원인을 분석해 줘. ``` ### 모델·추론 강도 선택 | 작업 | 권장 추론 강도 | |---|---| | 오타, 포맷팅 | low | | 단순 버그 수정 | medium | | 테스트 실패 분석 | medium~high | | 아키텍처 변경 | high | | 보안 검토 | high 이상 | --- ## 개발자 실무 레시피 ### 새 프로젝트 분석 ```txt 이 저장소를 변경하지 말고 분석만 해 줘. 출력: 1. 프로젝트 구조 2. 주요 실행 진입점 3. 빌드 명령 4. 테스트 명령 5. 배포 관련 파일 6. 위험해 보이는 설정 ``` ### 기능 개발 ```txt 목표: - 사용자 프로필 수정 API에 nickname 검증을 추가한다. 범위: - src/users/** - tests/users/** 제약: - public API route는 변경하지 않는다. - 새 패키지는 추가하지 않는다. - 실패 테스트가 있으면 원인과 수정 내용을 요약한다. 완료 조건: - 관련 테스트 통과 - 변경 파일 목록 출력 - 남은 위험 요소 출력 ``` ### 리팩토링 ```txt /plan OrderService의 결제 검증 로직을 별도 클래스로 분리하고 싶다. 먼저: - 현재 의존성 구조 분석 - 변경 후보 파일 목록 제안 - public API 영향 여부 판단 - 단계별 마이그레이션 계획 작성 승인 전까지 파일은 수정하지 마. ``` ### 코드 리뷰 ```txt /review 이번 브랜치의 변경 사항을 main 기준으로 리뷰해 줘. 관점: - 버그 가능성 - 예외 처리 - SQL injection 가능성 - 테스트 누락 - 배포 위험 ``` ### Skill 생성 ```txt $skill-creator 다음 반복 작업을 Skill로 만들고 싶다. 작업명: - SQL Server 저장 프로시저 리뷰 트리거: - 프로시저 변경 리뷰 - T-SQL 성능 점검 - SQL injection 위험 분석 검토 기준: - WHERE 조건 누락 - 동적 SQL 파라미터 처리 - 인덱스 사용 가능성 - 트랜잭션 범위 - TRY/CATCH와 로그 처리 출력: - blocking issue - performance risk - maintainability issue - suggested fix ``` --- ## 팀 도입 전략 팀에 Codex를 도입할 때는 기능보다 **운영 규칙**을 먼저 정해야 합니다. ### 단계: 개인 사용 ```txt - CLI 설치 - 기본 로그인 - read-only 분석 - 작은 버그 수정 ``` ### 단계: 저장소 표준화 ```txt - repo-root/AGENTS.md 작성 - .codex/config.toml 추가 - 빌드/테스트 명령 명문화 - 금지 작업 명문화 ``` ### 단계: 반복 작업 패키징 ```txt - 자주 쓰는 리뷰 프롬프트를 Skill로 분리 - 배포 전 점검을 Skill로 분리 - 장애 분석 루틴을 Skill로 분리 ``` ### 단계: 외부 도구 연결 ```txt - GitHub MCP - Sentry MCP - 내부 문서 검색 MCP - 사내 배포/로그 API MCP ``` ### 단계: Plugin 배포 ```txt - 팀 공통 Skill 묶음 - MCP 설정 포함 - hooks 포함 - marketplace 또는 내부 저장소로 배포 ``` --- ## 안티패턴 | 안티패턴 | 문제 | 대안 | |---|---|---| | “알아서 고쳐줘” | 범위가 넓어 토큰 낭비와 오작동 증가 | 파일·목표·검증 명시 | | main 브랜치에서 직접 실행 | 위험한 변경이 섞임 | feature branch/worktree 사용 | | `danger-full-access` 상시 사용 | 시스템 전체 위험 | 기본은 `workspace-write` | | 테스트 명령 미제공 | 검증 불완전 | `AGENTS.md`에 명령 작성 | | 긴 프롬프트 반복 | 유지보수 어려움 | Skill 또는 AGENTS.md로 이동 | | 모든 도구를 MCP로 연결 | 보안/속도/컨텍스트 비용 증가 | 실제 반복 작업부터 연결 | | Skill 하나에 모든 업무 포함 | 자동 선택 실패 | 하나의 Skill은 하나의 업무만 | | 자동화를 너무 빨리 도입 | 실패가 반복 자동화됨 | 수동 루프가 안정된 뒤 자동화 | --- ## 권장 기본 세팅 개인 개발자 기준: ```toml # ~/.codex/config.toml model = "gpt-5.5" model_reasoning_effort = "medium" approval_policy = "on-request" sandbox_mode = "workspace-write" [features] hooks = true [sandbox_workspace_write] network_access = false ``` 처음 보는 저장소: ```bash codex --sandbox read-only --ask-for-approval untrusted ``` 일반 개발: ```bash codex --sandbox workspace-write --ask-for-approval on-request ``` CI 자동화: ```bash codex exec \ --sandbox workspace-write \ --ask-for-approval never \ "지정된 검증 작업을 수행하고 JSON으로 결과를 출력해 줘" ``` 격리 컨테이너 내부에서만 예외적으로: ```bash codex --sandbox danger-full-access --ask-for-approval never ``` --- ## 도입 체크리스트 ### 개인 개발자 ```txt [ ] Codex CLI 설치 [ ] ChatGPT 또는 API 키 로그인 [ ] 기본 프로젝트에서 read-only 분석 실행 [ ] /status 확인 [ ] 작은 파일 수정 후 /diff 검토 [ ] ~/.codex/AGENTS.md 작성 [ ] ~/.codex/config.toml 작성 ``` ### 프로젝트 ```txt [ ] repo-root/AGENTS.md 작성 [ ] .codex/config.toml 작성 [ ] 빌드/테스트/lint 명령 문서화 [ ] public API 변경 규칙 문서화 [ ] DB/보안/배포 금지 규칙 문서화 [ ] PR 리뷰 기준 작성 ``` ### 팀 ```txt [ ] 공통 Skill 후보 선정 [ ] MCP 도입 후보 선정 [ ] Plugin 패키징 기준 정의 [ ] hooks 보안 검토 [ ] CI 실행 정책 정의 [ ] 권한 정책과 secret 처리 기준 정의 ``` --- ## 빠른 참조 ```bash # 시작 codex # 초기 프롬프트와 함께 시작 codex "이 프로젝트 구조를 요약해 줘" # 비대화형 실행 codex exec "테스트 실패 원인을 분석해 줘" # 권한 제한 codex --sandbox read-only codex --sandbox workspace-write --ask-for-approval on-request # 프로필 사용 codex --profile fast codex --profile careful # MCP codex mcp add context7 -- npx -y @upstash/context7-mcp codex mcp --help # 자동완성 codex completion bash codex completion zsh codex completion fish ``` 슬래시 명령: ```txt /status 현재 상태 확인 /model 모델 변경 /permissions 권한 변경 /plan 계획 모드 /diff 변경 사항 확인 /review 코드 리뷰 /compact 컨텍스트 압축 /init AGENTS.md 생성 /mcp MCP 상태 확인 /skills Skill 확인 /plugins Plugin 관리 ``` --- ## 결론 Codex CLI를 잘 쓰는 핵심은 “더 강한 권한을 주는 것”이 아니라 **좋은 작업 경계와 검증 루프를 만드는 것**입니다. 개발자 개인은 다음 3가지만 먼저 적용해도 효과를 볼 수 있습니다. ```txt 1. 프로젝트 루트에서 codex 실행 2. AGENTS.md에 빌드/테스트/금지 규칙 작성 3. 작업마다 파일 범위와 완료 조건을 명확히 지정 ``` 팀 단위에서는 다음 순서가 가장 안정적입니다. ```txt AGENTS.md → config.toml → Skills → MCP → Plugins → CI/CD 자동화 ``` Codex는 개발자를 대체하는 도구라기보다, **잘 정의된 개발 루프를 빠르게 반복하는 에이전트 실행 환경**에 가깝습니다. 따라서 좋은 결과는 모델 성능만이 아니라, 저장소 규칙, 테스트 체계, 권한 정책, 반복 워크플로 설계 품질에 의해 결정됩니다. --- ## 참고 자료 - Blake Crosley, `Codex CLI: 최종 기술 레퍼런스`: https://blakecrosley.com/ko/guides/codex - OpenAI Codex GitHub: https://github.com/openai/codex - OpenAI Codex Config Basics: https://developers.openai.com/codex/config-basic - OpenAI Codex Configuration Reference: https://developers.openai.com/codex/config-reference - OpenAI Codex Sandbox: https://developers.openai.com/codex/concepts/sandboxing - OpenAI Agent Approvals & Security: https://developers.openai.com/codex/agent-approvals-security - OpenAI AGENTS.md Guide: https://developers.openai.com/codex/guides/agents-md - OpenAI Codex MCP: https://developers.openai.com/codex/mcp - OpenAI Agent Skills: https://developers.openai.com/codex/skills - OpenAI Codex Plugins: https://developers.openai.com/codex/plugins - OpenAI Codex Hooks: https://developers.openai.com/codex/hooks - OpenAI Codex Best Practices: https://developers.openai.com/codex/learn/best-practices --- title: HandStack 프로젝트 전용 DESIGN.md 템플릿 url: https://handstack.kr/docs/information/resource/HandStack-프로젝트-전용-DESIGN.md-템플릿 --- # HandStack 프로젝트 전용 DESIGN.md 템플릿 | 항목 | 내용 | |---|---| | 적용 범위 | `wwwroot` 화면 HTML | | 적용 원칙 | **신규 화면은 필수 준수. 기존 화면은 수정하는 범위 내에서만 점진 적용** (일괄 리팩터링 금지) | | 개정 절차 | 규칙 변경 시 이 문서를 먼저 수정하고, 근거가 되는 실제 화면 경로를 함께 기록 | 이 문서는 AI(코딩 어시스턴트)와 개발자가 이 프로젝트에서 화면(HTML)을 작성할 때 따라야 할 UI 규칙을 정의합니다. 일반 Tabler 문서와 다른 부분이 많으므로, **Tabler 공식 문서보다 이 문서가 우선**합니다. --- ## 1. 기술 스택 계층 이 프로젝트의 화면은 세 개의 계층이 조합되어 동작합니다. 각 계층의 역할을 혼동하지 마세요. ```text HandStack (syn.loader.js) ← 화면 로딩, 데이터 바인딩(syn-datafield), 컴포넌트(syn_*), 팝업 ├─ Tabler CSS (Bootstrap 5 기반) ← 레이아웃·카드·버튼·폼·배지 등 시각 컴포넌트 └─ Master CSS (런타임 엔진) ← f:20, w:120, mr:4 같은 단축 유틸리티 클래스 ``` - **Tabler**: CDN으로 로드됩니다 (`@tabler/core`). 일부 화면은 `@latest`를 사용 중이므로, **신규 참조 작성 시에는 버전을 고정**(`@tabler/core@1.3.2` 등)하는 것을 권장합니다. `@latest`는 예고 없는 스타일 변경 리스크가 있습니다. - **Master CSS**: `syn.loader.js`가 런타임에 `/lib/master-css/index.min.js`를 로드하여 `f:20` 같은 클래스를 실제 CSS로 변환합니다. 빌드 도구가 아니라 **런타임 엔진**이므로, 클래스만 정확히 쓰면 별도 빌드 없이 동작합니다. 끝의 `!`(예: `f:12!`)는 Master CSS의 `!important` 문법입니다. - **아이콘**: Tabler Icons 웹폰트(`ti ti-*`)만 사용합니다. --- ## 2. 화면 유형 분류 새 화면을 만들기 전에 어떤 유형인지 먼저 결정하고, 해당 유형의 템플릿(6장)을 따르세요. | 유형 | 특징 | 핵심 구성 | |---|---|---| | 목록(조회) 화면 | 검색 조건 + 데이터 그리드 | 필터 카드 + `syn_auigrid` 카드 (+ 하단 `sticky-bottom` 액션바) | | 상세(입력) 화면 | 단건 조회/등록/수정 폼 | `input-group` 좌측 라벨 폼 카드 | | 팝업 화면 | 다른 화면에서 호출되는 다이얼로그 | `simplemodal-data` 패턴 (Bootstrap modal 아님) | | 보고서/인쇄 화면 | RPT 계열, 인쇄 전용 | 순수 `` + 화면 전용 `

${name}

version ${v}

${items}
`; } ``` --- title: Windows 메뉴얼로 필수 프로그램 설치하기 url: https://handstack.kr/docs/startup/handsonlab/Windows-필수-프로그램-설치하기 --- # Windows 메뉴얼로 필수 프로그램 설치하기 ## .NET 10.x 버전과 Node.js 20.x LTS 버전 설치하기 HandStack은 비즈니스 앱을 구동하는 **프로그램**과 화면과 서버 기능 개발에 필요한 **공통 기능 라이브러리**를 제공합니다. 사용 중인 오픈 소스들은 LTS (장기 지원) 이거나 잘 알려진 버전으로 개발합니다. 기반이 되는 .NET Core, Node.js 환경은 x86, x64, Arm 실행 환경을 제공하며, 온프레미스와 클라우드 네이티브 서비스에 적합한 실행 환경입니다. 개발되는 비즈니스 앱은 다음 분야에 적합합니다. |주요 분야|설명| |---|---| |웹|Windows, Linux, macOS 및 Docker용 웹 앱 및 서비스를 빌드합니다| |모바일 및 데스크톱|하이브리드 앱 방식으로 단일 코드를 사용하여 Windows, Linux, macOS 앱을 빌드합니다| |클라우드|모든 주요 클라우드 공급자에서 실행되는 확장 가능하고 복원력 있는 클라우드 네이티브 앱을 빌드합니다| |마이크로 서비스|Docker 컨테이너에서 실행되는 독립적으로 배포 가능한 마이크로 서비스를 만듭니다| IT 시스템은 신뢰를 기본으로 운영 되기 때문에 지속적인 업그레이드에는 성능과 개선, 안정성 향상이 필수 입니다. 그래서 비즈니스 앱을 구축하기 위한 간소화된 기술 스택이 필요합니다. > HandStack의 HAND는 HTML5 + ASP.NET Core + Node.js + Docker의 기반 스택을 정의합니다. ## Windows 환경에서 시작하기 2023년 12월 기준, 대한민국에서 데스크탑 운영체제의 점유율은 88 % 입니다. [Desktop Operating System Market Share Republic Of Korea](https://gs.statcounter.com/os-market-share/desktop/south-korea) macOS, Linux 환경의 경우 설치 옵션이 다양합니다. 관련 자료는 외부 링크로 제공합니다 ### .NET SDK 설치 관리자 설치하기 최근 대부분의 환경은 보안 및 성능 향상을 위해 기본적으로 x64 (64비트) 환경을 권장하고 있습니다. 이 문서는 x64를 전제로 설명합니다. * 웹 브라우저로 [.NET SDK 설치 관리자](https://dotnet.microsoft.com/ko-kr/download/dotnet/thank-you/sdk-10.0.100-windows-x64-installer) 프로그램을 다운로드 하세요. * 다운로드가 완료되면 설치 프로그램을 실행하고 컴퓨터에 .NET을 설치하는 단계를 완료하세요. [이미지: 설치 프로그램 실행] * 설치 프로그램이 완료되면 새 명령 프롬프트를 열고 `dotnet` 명령을 실행합니다. [이미지: 설치 확인] ### Node.js 설치 관리자 설치하기 * 웹 브라우저로 [Node.js 설치 관리자](https://nodejs.org/dist/v20.12.2/node-v20.12.2-x64.msi) 프로그램을 다운로드 하세요. * 다운로드가 완료되면 설치 프로그램을 실행하고 컴퓨터에 Node.js을 설치하는 단계를 완료하세요. [이미지: 설치 프로그램 실행] * 설치 프로그램이 완료되면 새 명령 프롬프트를 열고 `node -v` 명령을 실행합니다. [이미지: 설치 확인] ## HandStack 다운로드 및 설치하기 * 웹 브라우저로 [HandStack 최신 Releases](https://github.com/handstack77/handstack/releases) 압축 파일을 다운로드 하세요. (압축 파일은 주요 버전에 따른 운영체제별 실행 프로그램과 소스입니다.) * 실행 프로그램 압축 파일 다운로드가 완료되면 압축 파일을 해제합니다. 압축 해제 경로는 향후 macOS, Linux에도 동일한 경로를 만들기 위해 `C:/home/[사용자 ID]/handstack` 를 권장합니다.
[이미지: 압축 해제 경로] * 압축 해제가 완료되면 관리자 권한으로 터미널(명령 프롬프트)을 열고 압축 해제한 디렉토리로 이동 하여 `install.bat` 명령을 실행합니다. 번들러 및 Node.js 기반 Function 기능을 위한 라이브러리가 설치됩니다. * app 디렉토리로 이동 하여 `ack` 명령을 실행합니다. [이미지: 설치 확인] * HandStack 서버가 실행되면 웹 브라우저를 실행하여 `http://localhost:8421/module.html` 주소를 연결합니다. [이미지: 설치 확인] 축하합니다. 이제 비즈니스 앱을 개발하기 위한 모든 준비가 되었습니다. ## 주요 정보 바로가기 이제 비즈니스 앱을 개발 하기 위한 기본적인 환경이 만들어졌습니다. 맞춤형 기술 스택으로 직접 앱이나 서비스를 구축하는 것은 많은 비용이 듭니다. HandStack은 오픈 소스 기반으로 기업에서 자유롭게 사용할 수 있으며 공식 문서로 자습서와 핸즈온랩, 참조 자료 및 리소스를 지속적으로 업데이트 합니다. * [기본 모듈 소개](https://handstack.kr/docs/startup/learning/기본-modules-소개) * [화면 개발 시작하기](https://handstack.kr/docs/startup/learning/화면-개발-시작하기) * [.NET 10.x 다운로드](https://dotnet.microsoft.com/ko-kr/download/dotnet/10.0) * [Windows에 .NET 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/windows?tabs=net80) * [macOS에 .NET 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/macos) * [Linux에 .NET 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/linux) * [Node.js 다운로드](https://nodejs.org/en/download) * [HandStack 다운로드](https://github.com/handstack77/handstack/releases) --- title: HandStack CLI 사용법 url: https://handstack.kr/docs/startup/HandStack-CLI-사용법 --- # HandStack CLI 사용법 HandStack CLI는 HandStack 서비스를 개발 및 운영에 유용한 기능을 제공하기 위한 명령줄 인터페이스(Command Line Interface)입니다. ## HandStack CLI 프로그램 위치 ack 프로그램이 배치되어 있는 app 디렉토리의 cli 하위 디렉토리에 위치합니다. 예를 들면 다음과 같습니다. ```bash cd [HandStack 소스 기본경로]/app handstack --help ``` ## 기능 소개 및 사용법 ### list 호스트내에 실행 중인 ack 프로세스 목록을 조회합니다. 이 정보에는 프로세스 ID, 시작 시간, 사용 중인 RAM, 및 파일 경로가 포함됩니다. 이 코드는 시스템 모니터링 또는 디버깅에 유용할 수 있습니다. ```bash handstack list ``` ### configuration 사전에 정의된 ack 프로그램 및 모듈의 환경설정을 적용합니다. HandStack 의 프로그램의 실행을 위한 환경설정은 다음과 같이 4개로 구성됩니다. - appsettings: ack 프로그램의 기본 설정을 정의합니다. - modules 또는 modulesettings: 모듈의 동작 설정을 정의합니다. - nodeconfigs: Node.js 함수의 실행 설정을 정의합니다. - synconfigs: 웹 브라우저의 실행 설정을 정의합니다. ack 프로그램을 실행하는 데 필요한 의도된 설정을 미리 만들어두고 선택적으로 적용할 수 있습니다. ```bash handstack configuration --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --appsettings=ack.localhost.json ``` HandStack 솔루션의 `1.WebHost/ack/Settings` localhost 프리셋은 실행 원본과 동일하게 관리합니다. `ack.localhost.json`은 `1.WebHost/ack/appsettings.json`, `modules/ack..localhost.json`은 각 `2.Modules//module.json`, node/syn 프리셋은 각각 `function/node.config.json`과 `wwwroot/wwwroot/syn.config.json`에 대응합니다. 서버 환경 프리셋은 대응하는 `.localhost.json`과 같은 파일 집합과 설정을 사용합니다. 단, HTTP/HTTPS 루프백 URL의 `localhost`, `127.0.0.1`, `0.0.0.0` 호스트는 환경별 기본 URL로 바꾸고 포트와 경로는 유지합니다. | 파일 접미어 | 기본 URL | `AppSettings:RunningEnvironment` | |---|---|---| | `.development.json` | `http://dev.example.com` | `D` | | `.test.json` | `https://test.example.com` | `D` | | `.staging.json` | `https://staging.example.com` | `S` | | `.production.json` | `https://app.example.com` | `P` | 데이터베이스 호스트처럼 웹 URL이 아닌 값은 바꾸지 않습니다. ack 런타임은 `D`, `S`, `P`만 지원하므로 test 프리셋은 `D`를 사용합니다. ```bash handstack configuration --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --appsettings=ack.development.json handstack configuration --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --appsettings=ack.test.json handstack configuration --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --appsettings=ack.staging.json handstack configuration --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --appsettings=ack.production.json ``` 현재 모듈 프리셋은 `checkup`, `command`, `dbclient`, `forwarder`, `function`, `graphclient`, `logger`, `prompter`, `repository`, `transact`, `wwwroot`입니다. 솔루션에 프로젝트와 `module.json`이 없는 모듈은 모든 환경 프리셋에서 제외합니다. ### purgecontracts 특정 contracts 디렉토리에 있는 파일들을 기준으로 ack 서버 프로그램이 있는 handstack/contracts 디렉토리에 있는 모든 중복된 파일을 삭제합니다. 이 명령은 업무 개발자가 원하는 디렉토리에서 화면과 기능을 구현하는 데 사용됩니다. ```bash handstack purgecontracts --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --directory=C:/projects/myapp/contracts ``` ### startlog ack 서버 프로그램이 있는 appsettings.json 의 환경 설정값을 적용하지 않고 전달하는 매개변수로 적용하는 시작하기 위한 명령어를 로그로 출력합니다. 이 명령은 개발 사용자가 원하는 디렉토리에서 업무 화면과 기능을 구현하거나 호스트에서 여러 ack 서버를 운영 하는데 사용됩니다. ```bash handstack startlog --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --arguments="--debug" --appsettings=ack.localhost.json ``` ### start ack 서버 프로그램이 있는 appsettings.json 의 환경 설정값을 적용하지 않고 전달하는 매개변수로 프로그램을 시작합니다. 이 명령은 개발 사용자가 원하는 디렉토리에서 업무 화면과 기능을 구현하거나 호스트에서 여러 ack 서버를 운영 하는데 사용됩니다. ```bash handstack start --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --arguments="--debug" --appsettings=ack.localhost.json ``` ### stop 호스트내에서 실행중인 ack 서버 프로그램를 프로세스 ID 정보로 강제 종료합니다. ```bash handstack stop --pid=12345 ``` ### encrypt 개발 업무에 필요한 중요한 정보를 암호화 하고 싶을 때 사용합니다. 이 명령은 Base64, SUID, SQIDS, AES256, SYN, SHA256, 데이터베이스 연결문자열 암호화에 필요한 기능입니다. ```bash handstack encrypt --format=base64 --value="hello world" handstack encrypt --format=suid --value=N handstack encrypt --format=sqids --value=12345 handstack encrypt --format=syn --value="hello world" handstack encrypt --format=sha256 --value="hello world" handstack encrypt --format=connectionstring --value="[connection string]" ``` ### decrypt 개발 업무에 필요한 중요한 정보를 복호화 하고 싶을 때 사용합니다. 이 명령은 Base64, SUID, SQIDS, AES256, SYN, SHA256, 데이터베이스 연결문자열 암호화에 필요한 기능입니다. ```bash handstack decrypt --format=base64 --value=aGVsbG8gd29ybGQ= handstack decrypt --format=suid --value=08dc610a149db47e51479a5190026a0c handstack decrypt --format=sqids --value=2pbk0n0i handstack decrypt --format=syn --key=b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 --value=WzE1MiwyMDAsMTYyLDE2NCwxNjQsMTI5LDIxOSwxNjgsMjE2LDE2MSwxNTRdLjBjNjg1YWQ5ZjU2NjAwMGE3ZjNjYmI5YjhkOWFjMzY3MTllNDM3NDcxZmUxYTJhNGQ3Njc4ODRhMDY%3d handstack decrypt --format=sha256 --key=b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 --value="hello world" handstack decrypt --format=connectionstring --value=qkQXrQyWlxBNw/ee2lA2mGxU1PJ4DWn7Ynp+NzA1OIo=.NGVhOGZiMTg1MzZjZTJlNTI2NzBkMWIwYjY5MzYzM2Q=.REVTS1RPUC0xUlZSMzBR.41542b92442fa3c716838a7320135e3f37ec203cda045e4446a10955e48a38b7 ``` ### compress 지정된 디렉터리에서 파일 및 디렉터리를 포함하는 Zip 파일을 만듭니다. 이 기능은 다양한 운영체제에서 동일한 명령으로 작업을 수행할 수 있습니다. ```bash handstack compress --directory=C:/projects/handstack77/handstack --file=C:/tmp/handstack.zip ``` ### extract Zip 압축 파일을 지정된 디렉터리에 해제합니다. 이 기능은 다양한 운영체제에서 동일한 명령으로 작업을 수행할 수 있습니다. ```bash handstack extract --file=C:/tmp/handstack.zip --directory=C:/tmp/handstack ``` ### create modules, webapp 템플릿 ZIP 파일을 기반으로 프로젝트를 생성합니다. 이 기능은 개발자가 새로운 업무 모듈과 앱을 시작할 때 사용됩니다. ```bash handstack create --ack=C:/projects/handstack77/handstack/1.WebHost/build/handstack/app/ack --file=C:/tmp/handstack.zip --directory=C:/tmp/handstack --find=[template] --replace=[myprojectname] ``` ### replacetext 텍스트 파일의 특정 문자열을 치환합니다. 소스코드 템플릿을 만들때 사용됩니다. ```bash handstack replacetext --file=C:/tmp/handstack.txt --find=handstack --replace=myprojectname ``` ### task 운영체제에 따라 사전에 정의된 배치 스크립트 업무를 수행합니다. 클라이언트와 서버의 운영체제가 다를 경우 프로그램 실행에 필요한 사전 정의 된 스크립트를 실행합니다. ```bash handstack task --file=C:/tmp/task.json --value=checkup:build;dbclient:build ``` --- title: 개발 환경 설정하기 url: https://handstack.kr/docs/startup/install/개발-환경-설정하기 --- # 개발 환경 설정하기 서버 소스나 모듈을 수정할 때만 이 과정을 진행하세요. 화면·계약 실습은 [배포본 실행](https://handstack.kr/docs/startup/빠른-시작)으로 시작할 수 있습니다. [필수 도구](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기)와 Git을 준비합니다. 소스 빌드에는 .NET SDK 10이 필요합니다. Git 사용법은 [공식 Git 문서](https://git-scm.com/docs)를 참고하세요. ## 소스 복제 {#github-프로젝트를-cli-명령어로-복제} 쓰기 가능한 작업 디렉터리에서 실행합니다. 이미 복제했다면 다시 내려받지 말고 사용 중인 브랜치와 변경 사항을 확인하세요. ~~~bash git clone https://github.com/handstack77/handstack.git cd handstack ~~~ 이 문서의 **소스 기본경로**는 위에서 만들어진 저장소 디렉터리입니다. 배포본의 `app` 디렉터리와 다릅니다. ## 의존성과 도구 준비 {#프로젝트-빌드-및-종속성-및-도구를-복원} 저장소 루트에서 OS에 맞는 스크립트를 실행합니다. 스크립트는 npm 패키지, 화면 자원과 .NET 도구를 구성하며 사용자 환경 변수·PATH도 변경할 수 있습니다. 기존 개발 환경에서는 먼저 내용을 확인하세요. ### Windows {#windows-운영체제에서-실행하기} ~~~powershell .\install.bat ~~~ ### macOS·Linux {#macos-linux-운영체제에서-실행하기} ~~~bash bash ./install.sh ~~~ 사용자 도구가 다른 계정에 설치되지 않도록 스크립트 전체에 `sudo`를 붙이지 않습니다. 줄바꿈 오류가 나면 파일을 LF로 저장한 뒤 다시 실행하세요. ## 빌드와 확인 설치 로그에 실패가 없는지 확인하고 [도구 확인 명령](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기#설치-완료-기준)을 실행합니다. 이어서 [빌드·릴리즈·실행 절차](https://handstack.kr/docs/twelvefactor/빌드-릴리즈-실행/빌드-릴리즈-실행-절차)에서 대상 OS의 빌드 명령과 산출물 경로를 확인하세요. 빌드 스크립트는 출력 디렉터리와 계약 복사본을 갱신할 수 있습니다. 기존 실행 환경을 덮어쓰지 않도록 대상 경로와 변경 파일을 확인한 뒤 실행합니다. --- title: 선택 프로그램 설치하기 url: https://handstack.kr/docs/startup/install/선택-프로그램-설치하기 --- # 선택 프로그램 설치하기 # Visual Studio 2022 확장 프로그램 설치 가이드 Visual Studio 2022의 기능을 확장하고 개발 생산성을 향상시킬 수 있는 유용한 확장 프로그램들을 소개합니다. 이 가이드에서는 각 확장 프로그램의 기능과 설치 방법을 안내합니다. ## 목차 - [확장 프로그램 설치 방법](#확장-프로그램-설치-방법) - [웹 개발 도구](#웹-개발-도구) - [코드 품질 및 생산성 도구](#코드-품질-및-생산성-도구) - [버전 관리 도구](#버전-관리-도구) - [명령어 및 워크플로우 도구](#명령어-및-워크플로우-도구) - [문서 작성 도구](#문서-작성-도구) ## 확장 프로그램 설치 방법 Visual Studio 2022에서 확장 프로그램을 설치하는 일반적인 방법은 다음과 같습니다: 1. Visual Studio 2022를 실행합니다. 2. 메뉴에서 `확장(Extensions)` > `확장 관리(Manage Extensions)`를 선택합니다. 3. `온라인(Online)` 탭을 선택하고 검색창에 원하는 확장 프로그램 이름을 입력합니다. 4. 목록에서 원하는 확장 프로그램을 찾아 `다운로드(Download)` 버튼을 클릭합니다. 5. Visual Studio를 닫고 확장 프로그램 설치가 완료되면 다시 실행합니다. ## 웹 개발 도구 ### Bundler & Minifier 2022 **기능:** - CSS, JavaScript, HTML 파일을 하나로 번들링 - 파일 크기 압축으로 웹사이트 성능 향상 - 페이지 로딩 시간 단축 **사용 방법:** 1. 솔루션 탐색기에서 번들링할 파일들을 선택합니다. 2. 우클릭하여 컨텍스트 메뉴에서 `Bundler & Minifier` 옵션을 선택합니다. 3. `Bundle` 또는 `Minify` 옵션을 선택합니다. ### Microsoft Library Manager **기능:** - 클라이언트 측 라이브러리(jQuery, Bootstrap 등) 관리 - CDN에서 라이브러리 쉽게 설치 및 업데이트 - NuGet 대신 웹 자산 관리에 최적화 **사용 방법:** 1. 프로젝트에서 우클릭하여 `Add` > `Client-Side Library`를 선택합니다. 2. 원하는 라이브러리를 검색하고 버전을 선택합니다. 3. 설치 위치를 지정하고 `Install` 버튼을 클릭합니다. ## 코드 품질 및 생산성 도구 ### CodeMaid **기능:** - 코드 정리 및 가독성 향상 - 불필요한 주석이나 공백 제거 - 네임스페이스 정리 - 코드 구조 시각화를 위한 코드 브라우저 제공 **사용 방법:** 1. 설치 후 `Extensions` > `CodeMaid` 메뉴를 통해 접근합니다. 2. 코드 정리를 위해 `CodeMaid` > `Cleanup` 옵션을 선택하거나 단축키 `Ctrl+M, Space`를 사용합니다. 3. 설정은 `CodeMaid` > `Options`에서 사용자 지정할 수 있습니다. ### Eazfuscator.NET Visual Studio Integration **기능:** - .NET 애플리케이션 코드 난독화 - 리버스 엔지니어링 및 디컴파일링으로부터 코드 보호 - 빌드 과정에 통합되어 자동 코드 난독화 **사용 방법:** 1. 설치 후 프로젝트 속성에서 `Eazfuscator.NET` 탭을 통해 설정할 수 있습니다. 2. 프로젝트를 빌드할 때 자동으로 난독화 작업이 수행됩니다. ### Productivity Power Tools **기능:** - 탭 관리 기능 향상 - 솔루션 탐색기 개선 - 코드 정렬 및 다양한 생산성 기능 제공 **사용 방법:** 1. 설치 후 `Tools` > `Options` > `Productivity Power Tools`에서 원하는 기능을 켜거나 끌 수 있습니다. 2. 각 도구는 Visual Studio의 해당 위치에 통합되어 자동으로 사용할 수 있습니다. ## 버전 관리 도구 ### VisualSVN for Visual Studio 2022 **기능:** - Subversion(SVN) 버전 관리 시스템을 Visual Studio와 통합 - IDE 내에서 직접 소스 컨트롤 작업 수행 - 코드 변경사항 추적, 커밋, 업데이트 등의 작업 지원 **사용 방법:** 1. 설치 후 `Team` 메뉴에 VisualSVN 옵션이 추가됩니다. 2. SVN 저장소에 연결하고 작업을 수행할 수 있습니다. ### Git Extensions **기능:** - Visual Studio 내에서 Git 작업 강화 - 커밋, 브랜치, 머지 작업 등 Git 관련 기능 확장 - 시각적인 히스토리 뷰 제공으로 코드 변경사항 추적 용이 **사용 방법:** 1. 설치 후 `Team` 메뉴 또는 Git 관련 컨텍스트 메뉴에서 Git Extensions 옵션을 사용할 수 있습니다. 2. 시각적 Git 히스토리를 보려면 솔루션 탐색기에서 프로젝트를 우클릭하고 `Git Extensions` > `View History`를 선택합니다. ## 명령어 및 워크플로우 도구 ### Command Explorer **기능:** - Visual Studio 내 모든 명령어를 쉽게 찾고 실행 - 키보드 단축키 빠르게 찾기 - 자주 사용하는 명령어 관리 **사용 방법:** 1. 설치 후 `View` > `Other Windows` > `Command Explorer`를 선택합니다. 2. 검색창에 원하는 명령어를 입력하여 찾을 수 있습니다. ### Open Command Line **기능:** - Visual Studio에서 직접 명령 프롬프트, PowerShell, Git Bash 등 실행 - 현재 프로젝트나 솔루션 디렉토리에서 바로 명령줄 실행 **사용 방법:** 1. 솔루션 탐색기에서 프로젝트나 폴더를 우클릭합니다. 2. `Open Command Line` 옵션을 선택하고 원하는 명령줄 도구를 선택합니다. ### Open in Visual Studio Code **기능:** - 현재 디렉토리 또는 문서를 Visual Studio Code로 빠르게 열기 **사용 방법:** 1. 솔루션 탐색기에서 파일이나 폴더를 우클릭합니다. 2. `Open in Visual Studio Code` 옵션을 선택합니다. ## 문서 작성 도구 ### Markdown Editor v2 **기능:** - Visual Studio 내에서 Markdown 파일 편집 및 미리보기 - 구문 강조, 실시간 미리보기, 테마 지원 - README 파일이나 문서 작성 편의성 제공 **사용 방법:** 1. `.md` 확장자 파일을 열면 Markdown 편집기가 자동으로 실행됩니다. 2. 화면 분할 보기를 통해 코드와 미리보기를 동시에 확인할 수 있습니다. 3. 툴바를 통해 다양한 Markdown 서식을 쉽게 적용할 수 있습니다. --- title: 개발 도구 자동 설치 url: https://handstack.kr/docs/startup/install/자동-설치 --- # 개발 도구 자동 설치 도구를 개별 설치하려면 [필수 프로그램 안내](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기)의 공식 링크를 사용하세요. 여러 도구를 함께 준비하려는 경우에만 아래 스크립트를 선택합니다. 이 스크립트는 **PC의 개발 도구를 설치**합니다. 배포본의 `install.bat`·`install.sh`로 **HandStack 패키지와 화면 자원을 구성**하는 단계와 다릅니다. ## 스크립트 받기 | 대상 | 파일 | 준비 사항 | |---|---|---| | Windows 11 x64 | windows-bootstrapper.ps1 | Windows PowerShell 5.1, WinGet | | macOS 14 이상 | macos-bootstrapper.sh | 현재 사용자로 실행, Apple Silicon(arm64) 또는 Intel(x64) | | Ubuntu 26.04 amd64 | ubuntu-bootstrapper.sh | 현재 사용자로 실행, 필요한 패키지 설치 시 sudo | 기존 설치 문서의 스크립트를 별도 파일로 제공합니다. .NET SDK, Node.js, Git, curl, gulp-cli, LibMan, PowerShell과 PATH를 구성하므로 실행 전에 내용을 확인하세요. 대상 OS가 다르거나 도구 버전을 직접 관리한다면 공식 설치 방법을 사용합니다. ## 실행 내려받은 파일이 있는 디렉터리에서 실행하세요. Windows 파일은 한국어 메시지를 위해 UTF-8 BOM으로 제공합니다. Windows PowerShell: ~~~powershell powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\windows-bootstrapper.ps1 ~~~ macOS: ~~~bash bash ./macos-bootstrapper.sh ~~~ [.NET 10 지원 OS](https://github.com/dotnet/core/blob/main/release-notes/10.0/supported-os.md)의 최소 macOS 버전인 14를 기준으로, 그 이상은 상한 없이 설치를 시도합니다. 이후 macOS 버전을 허용하는 것이 .NET·Homebrew·개별 도구의 공식 지원이나 설치 성공을 보장하지는 않습니다. Rosetta 터미널에서 아키텍처 안내가 나오면 `arch -arm64 /bin/bash ./macos-bootstrapper.sh`로 실행하세요. Intel Mac에서는 기존 x64 설치 경로를 사용합니다. Ubuntu: ~~~bash bash ./ubuntu-bootstrapper.sh ~~~ macOS·Ubuntu에서는 스크립트 전체에 `sudo`를 붙이지 마세요. 사용자 전역 도구와 PATH가 다른 계정에 설치될 수 있습니다. ## 완료 확인 새 터미널에서 [필수 도구 확인 명령](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기#설치-완료-기준)을 실행하세요. 자동 설치 로그에 실패가 있으면 실패한 도구의 공식 안내에서 해결한 뒤 다시 확인합니다. - `npm`을 찾지 못하면 Node.js 설치와 새 터미널의 PATH를 확인합니다. - `libman`·`pwsh`를 찾지 못하면 `dotnet tool list --global`과 사용자 .NET 도구 경로를 확인합니다. - 프록시 환경에서 실패하면 오류에 표시된 배포 사이트 접근 여부를 확인합니다. 이후 [내 PC에서 실행하기](https://handstack.kr/docs/startup/빠른-시작)에서 HandStack을 구성합니다. --- title: 지원 운영체제 url: https://handstack.kr/docs/startup/install/지원-운영체제 --- # 지원 운영체제 HandStack은 Windows, Linux, macOS용으로 배포합니다. 설치할 때는 **HandStack 릴리스의 대상 OS·CPU**와 **해당 .NET 버전의 지원 범위**를 함께 확인하세요. ## 배포본 선택 [HandStack 릴리스](https://github.com/handstack77/handstack/releases/latest)의 설명과 제공 파일을 기준으로 선택합니다. | 파일명 표기 | 의미 | |---|---| | `win` / `linux` / `osx` | Windows / Linux / macOS | | `x64` | Intel·AMD 64비트 | | `arm64` | ARM 64비트 | 현재 소스의 `ack` 대상은 `net10.0`입니다. 다른 릴리스를 사용한다면 해당 릴리스의 요구사항을 우선하세요. .NET이 특정 OS를 지원한다는 사실만으로 모든 HandStack 모듈과 네이티브 의존성의 호환성이 보장되지는 않습니다. ## 공식 지원 범위 {#net-10-지원-운영체제} - [Windows의 .NET 지원과 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/windows) - [macOS의 .NET 지원과 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/macos) - [Ubuntu의 .NET 지원과 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/linux-ubuntu-install) - [Node.js 릴리스 지원 일정](https://nodejs.org/en/about/previous-releases) Apple Silicon에서는 배포본과 .NET의 아키텍처를 맞추세요. x64용 파일을 받았다면 네이티브 arm64 실행으로 가정하지 말고 릴리스와 공식 설치 안내를 확인합니다. 도구 선택을 마쳤다면 [필수 프로그램 안내](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기)로 이동하세요. --- title: 패키지 관리자 설치하기 url: https://handstack.kr/docs/startup/install/패키지-관리자-설치하기 --- # 패키지 관리자 설치하기 패키지 관리자는 개발 도구를 명령으로 설치하거나 업데이트할 때 사용합니다. 공식 설치 프로그램을 이용한다면 이 단계를 건너뛰고 [필수 프로그램 안내](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기)로 이동하세요. ## Windows: WinGet {#windows-에-winget-설치하기} PowerShell에서 `winget --version`을 실행하세요. 버전이 표시되면 준비되어 있습니다. 명령을 찾지 못하면 [Microsoft의 WinGet 설치 안내](https://learn.microsoft.com/ko-kr/windows/package-manager/winget/)에 따라 앱 설치 관리자를 확인하세요. 설치·업데이트·검색 등 전체 명령은 같은 공식 문서에서 확인할 수 있습니다. HandStack에 필요한 도구는 [필수 프로그램 안내](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기)에 정리되어 있습니다. ## macOS: Homebrew 터미널에서 `brew --version`을 실행하세요. 설치가 필요하면 [Homebrew 공식 설치 안내](https://docs.brew.sh/Installation)를 따릅니다. 설치가 끝난 뒤 공식 안내의 PATH 설정을 적용하고 새 터미널에서 다시 확인하세요. ## Linux 배포판이 제공하는 패키지 관리자를 사용합니다. Ubuntu의 .NET 설치는 [Microsoft의 Ubuntu 설치 안내](https://learn.microsoft.com/ko-kr/dotnet/core/install/linux-ubuntu-install)를 따르세요. 다른 배포판의 명령을 그대로 섞어 실행하지 마세요. 다음은 [필수 도구 확인과 설치](https://handstack.kr/docs/startup/install/필수-프로그램-설치하기)입니다. --- title: 필수 프로그램 설치하기 url: https://handstack.kr/docs/startup/install/필수-프로그램-설치하기 --- # 필수 프로그램 설치하기 먼저 설치된 도구를 확인하고 부족한 것만 준비하세요. 일반적인 설치 절차는 공식 문서에서 확인하고, 이 페이지에서는 HandStack에 필요한 선택과 완료 기준을 안내합니다. > 운영체제 별로 여러 도구를 한 번에 준비하는 설치 스크립트는 [개발 도구 자동 설치](https://handstack.kr/docs/startup/install/자동-설치)에 있습니다. 수동으로 직접 설치는 **공식 설치 안내** 에 있는 각 공식 링크에서 확인하세요. ## 필요한 도구 현재 소스의 `ack`는 `net10.0`을 대상으로 합니다. 아래 구성은 배포본의 `install.bat`·`install.sh`를 사용하는 학습 경로입니다. | 도구 | 필요한 이유와 선택 기준 | 확인 명령 | |---|---|---| | .NET SDK 10 정식 버전 | 서버 빌드와 .NET 전역 도구 설치. SDK에는 서버 실행용 런타임도 포함됩니다. | `dotnet --list-sdks` | | Node.js·npm | 구성 스크립트의 패키지 복원과 화면 자원 처리. 프로젝트 요구사항은 20.12.2 이상이며 새 환경은 지원 중인 LTS 계열을 선택합니다. | `node --version`, `npm --version` | | gulp-cli | HandStack 화면 자원 번들링 | `gulp --version` | | curl | 구성 스크립트에서 외부 자원 다운로드 | `curl --version` | | Git | **소스를 복제할 때만** 필요. 배포본 실습에는 필요하지 않습니다. | `git --version` | Node.js의 최소 요구 버전과 지원 종료 여부는 다릅니다. [Node.js 지원 일정](https://nodejs.org/en/about/previous-releases)을 확인하고 사용하는 HandStack 릴리스의 요구사항과 맞추세요. ### SDK와 Runtime 중 무엇을 설치하나요? 이미 구성이 끝난 framework-dependent 배포본을 실행할 때는 ASP.NET Core Runtime이 필요합니다. 그러나 이 학습 경로의 구성 스크립트는 LibMan 같은 .NET 도구도 설치하므로 **SDK 10**을 준비합니다. 서버 소스를 빌드할 때도 SDK가 필요합니다. ## 공식 설치 안내 OS에 맞는 .NET과 Node.js를 먼저 설치한 뒤 gulp-cli를 준비하세요. 이미 정상 동작하는 도구는 다시 설치할 필요가 없습니다. | 도구 | 공식 안내 | |---|---| | .NET SDK 10 | [Windows 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/windows) · [macOS 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/macos) · [Ubuntu 설치](https://learn.microsoft.com/ko-kr/dotnet/core/install/linux-ubuntu-install) | | Node.js·npm | [OS별 Node.js 다운로드와 설치](https://nodejs.org/en/download) | | gulp-cli | [gulp CLI 설치](https://gulpjs.com/docs/en/getting-started/quick-start/) | | curl | [curl 배포본과 설치 정보](https://curl.se/download.html) | | Git — 소스 개발 시 | [Git 설치](https://git-scm.com/install/) | 패키지 관리자를 사용할 경우 [WinGet·Homebrew 안내](https://handstack.kr/docs/startup/install/패키지-관리자-설치하기)를 확인하세요. 공식 설치 프로그램을 쓴다면 패키지 관리자를 별도로 설치하지 않아도 됩니다. ## 설치 확인 {#설치-완료-기준} 새 터미널에서 실행합니다. ~~~text dotnet --list-sdks dotnet --list-runtimes node --version npm --version gulp --version curl --version ~~~ - SDK 목록에 정식 `10.0.x`가 표시됩니다. - 런타임 목록에 `Microsoft.AspNetCore.App 10.0.x`가 표시됩니다. - 나머지 명령도 버전 정보를 출력합니다. `gulp --version`에서 CLI 버전을 확인하세요. 프로젝트 밖에서 Local version이 없다고 나오는 것은 설치 실패가 아닙니다. - Windows PowerShell에서 `npm.ps1` 실행 정책 오류가 나면 `npm.cmd --version`으로 확인할 수 있습니다. 명령을 찾지 못하면 해당 도구의 설치와 PATH를 확인하세요. 설치 직후라면 먼저 터미널을 새로 여세요. ## HandStack 추가 도구 `install.bat`·`install.sh`는 LibMan이 없으면 .NET 전역 도구 설치를 시도합니다. 직접 관리하려면 [LibMan CLI 안내](https://learn.microsoft.com/en-us/aspnet/core/client-side/libman/libman-cli?view=aspnetcore-10.0)를 참고하세요. PowerShell 스크립트(`.ps1`)로 빌드·운영할 때는 [PowerShell 설치 안내](https://learn.microsoft.com/ko-kr/powershell/scripting/install/install-powershell)를 확인하세요. `.bat` 또는 `.sh`로 진행하는 첫 실습의 별도 필수 단계는 아닙니다. ## 다음 단계 [내 PC에서 실행하기](https://handstack.kr/docs/startup/빠른-시작)에서 배포본을 구성하세요. 서버 소스 자체를 수정하려면 [소스 개발 환경](https://handstack.kr/docs/startup/install/개발-환경-설정하기)으로 이동합니다. --- title: 기본 modules 소개 url: https://handstack.kr/docs/startup/learning/기본-modules-소개 --- # 기본 modules 소개 HandStack은 모듈러 모놀리식 아키텍처를 기반으로 만들어 집니다. 왜냐하면 모놀리식과 마이크로서비스 아키텍처의 장점을 활용하기 위해서 인데, 프로젝트의 업무 요건이나 규모에 따라 개발 및 운영 방식을 기업내에서 결정할 수 있는 방법이기 때문입니다. > HandStack 아키텍처에 대한 자세한 내용은 [모듈러 모놀리식 아키텍처](https://handstack.kr/docs/reference/concept/모듈러-모놀리식-아키텍처)을 참고하세요. 애플리케이션에 필요한 주요 기능들과 발생 가능한 이슈에 대응하여 대안을 제공하며 기존에 만들었던 프로그램 단위를 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|태넌트 앱 개발 및 운영 기능 관리| |command|계약 기반으로 CLI 프로세스와 Web URL 호출을 실행| |dbclient|SQL Server, Oracle, MySQL & MariaDB, PostgreSQL, SQLite SQL을 관리| |forwarder|Playwright 기반 세션 유지형 포워드 프록시 제공| |function|C# 또는 Node.js 기반 Function 개발 기능 관리| |graphclient|Neo4j, Memgraph 등 그래프 데이터베이스의 Cypher 실행 관리| |logger|module 요청/응답 구간 주요 이벤트 로그 수집 관리| |prompter|LLM 프롬프트 계약 실행 및 도구 호출 관리| |repository|단일, 다중, 이미지, 첨부파일 등등 파일 업로드/다운로드 관리| |transact|거래 요청 검증 및 접근 제어 관리와 요청 정보를 dbclient, function 등등 module로 라우팅 기능 관리| |wwwroot|웹 공통 static assets 및 화면 단위 소스 호스팅 관리| > 각 module 디렉토리내에 있는 module.json 설정으로 동작과 기능을 관리 할 수 있습니다. 이에 대한 자세한 사용 정보는 가이드나 참고 문서를 통해 확인 할 수 있습니다. ## contracts 디렉토리 구조 여러분의 기업 내 애플리케이션의 환경 설정과 개발 소스는 프론트엔드와 백엔드 모두 `%HANDSTACK_HOME%\contracts` 단일 디렉토리내에서 관리됩니다. 이를 통해 Visual Studio, Eclipse, Visual Studio Code, Notepad++ 등등 프로젝트 디렉토리 기반 소스 편집 기능을 제공하는 개발 도구로 `%HANDSTACK_HOME%\contracts`를 지정하여 개발 가능합니다. ```txt %HANDSTACK_HOME%\contracts ├─command ├─dbclient ├─function ├─graphclient ├─prompter ├─repository ├─transact └─wwwroot ``` 프로젝트 관리에 필요한 소스 운영 기준을 만들기 위해 디렉토리와 파일 명명에 대한 규칙을 다음과 같이 권장합니다. ```txt 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에서 향후 공식 제공되는 모든 확장 기능들은 이 규칙을 준수합니다. ```txt %HANDSTACK_HOME%\contracts ├─command │ └─HDS │ └─TST ├─dbclient │ └─HDS │ └─TST ├─function │ ├─csharp │ │ └─HDS │ │ └─TST │ │ └─TST010 │ └─javascript │ └─HDS │ └─TST │ └─TST020 ├─graphclient │ └─HDS │ └─TST ├─prompter │ └─HDS │ └─TST ├─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: /command/api/execution/has * GET: /command/api/execution/refresh * GET: /command/api/execution/retrieve * GET: /command/api/execution/meta * POST: /command/api/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 ### Forwarder * GET: /forwarder/api/proxy/get-client-ip * ALL: /forwarder/api/proxy/pipe * GET: /forwarder/api/forward-proxy-lab/* # 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 ### 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 * GET: /graphclient/api/query/has * GET: /graphclient/api/query/refresh * GET: /graphclient/api/query/retrieve * GET: /graphclient/api/query/meta * GET: /graphclient/api/query/reports * POST: /graphclient/api/query/execute ### Prompter * GET: /prompter/api/query/has * GET: /prompter/api/query/refresh * GET: /prompter/api/query/retrieve * GET: /prompter/api/query/meta * GET: /prompter/api/query/reports * POST: /prompter/api/query/execute ### 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 ## 참고자료 * [checkup 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/checkup) * [command 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/command) * [dbclient 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/dbclient) * [forwarder 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/forwarder) * [function 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/function) * [graphclient 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/graphclient) * [prompter 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/prompter) * [repository 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/repository) * [transact 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/transact) * [logger 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/logger) * [wwwroot 모듈 참고하기](https://handstack.kr/docs/reference/api/modules/wwwroot) --- title: 비즈니스, 데이터 개발 시작하기 url: https://handstack.kr/docs/startup/learning/비즈니스-데이터-개발-시작하기 --- # 비즈니스, 데이터 개발 시작하기 ## 거래란 무엇인가요? 거래의 사전적 의미는 '주고 받는 것 또는 사고 파는 것'이지만 처리 방식 또는 업무에 따라 차이가 있습니다. 예를 들어 거래를 영어 단어로 Transaction로 표현하며, 일반적으로 돈이나 물건을 주고 받는 것을 의미하지만, IT에 서 데이터베이스 분야에서는 데이터의 상태를 변화시키기 위해 수행하는 논리적인 작업 단위를 의미합니다. HandStack 기반의 프로젝트에서 거래는 출발지와 도착지간의 데이터를 주고 받는 작업 단위를 의미합니다. 그래서 다음과 같이 표현할 수 있습니다. * 클라이언트에서 업무 서버간에 거래를 한다 * 업무 서버에서 메시지 서버간에 거래를 한다 * 메시지 서버에서 데이터베이스 서버간에 거래를 한다 * 메시지 서버에서 외부 서비스간에 거래를 한다 화면에서 업무 거래를 위해 클라이언트와 서버간에는 반드시 어떻게 요청과 응답이 이뤄질 것인지 계약을 정의 해야 합니다. 계약은 transact 모듈의 업무와 dbclient 모듈 또는 function 모듈의 기능으로 만들어 집니다. 이 문서는 데이터베이스에 요청 및 응답을 처리하는 과정을 설명합니다. ## transact module 업무 계약 클라이언트의 요청 데이터를 검증하고 중계하여 정확한 응답 데이터를 전달 하는 것을 목적으로 하는 Gateway 역할을 담당합니다. 즉 클라이언트와 서비스 사이에서 미들웨어로 사용 되며, 클라이언트로 부터 API 요청을 받아서, 적합한 기능 서비스로 라우팅 하는 역할을 담당 합니다. > transact module의 모든 요청은 단 하나의 Endpoint로 수신합니다. transact module 거래 흐름은 다음과 같습니다. [이미지: transact module 거래 흐름] 일반적으로 클라이언트에 필요한 요청에 대한 Endpoint에 대해 각각의 서비스에서 구현해야 하는 기능을 Gateway단으로 통합함으로써, 서비스 개발을 간편하게 할 수 있고, 메세지 포맷 변경이나, 캐싱, 보안, 로깅등 기존 API 호출에 추가적인 기능을 더할 수 있는 유연성을 더할 수 있습니다. transact module의 주요 기능은 다음과 같습니다. * 요청 검증 * 허가 * 응답 정보 캐싱 * 모니터링 * 로깅 * dbclient, function 등등 이벤트 라우팅 * 메시지 변경 클라이언트 요청 거래를 위해 어떻게 요청과 응답이 이뤄질 것인지 계약을 정의 해야합니다. 그리고 프로젝트 업무에 따라 공개 거래 또는 내부 인트라넷용 연계등에 따라 계약 없이 사용 할 수 있는 옵션을 제공합니다. ### 거래 요청과 응답 설정 클라이언트에서 요청되는 모든 데이터는 transact 모듈에서 수신할 때 기본적으로 신뢰하지 않습니다. 요청/응답 거래 정보에 대한 데이터 정합성 검증과 올바르게 응답을 내려주고 있는지 확인합니다. 예를 들어 하나의 요청에 하나의 응답이 있을 수 있고, 여러 응답이 있을 수 있습니다. 여러 요청에 하나의 응답이 있을 수도 있고 여러 응답이 있을 수도 있습니다. 어떤 요청은 데이터베이스에 CRUD 처리를 실행하는 것일 수도 있고 오픈 API나 배치 작업등 다양한 요청을 수행을 필요로 합니다. 이러한 업무를 처리하기 위해 일반적으로 많이 사용하는 다음과 같은 계약을 Json으로 작성합니다. ```json { "ApplicationID": "HDS", "ProjectID": "TST", "TransactionID": "TST010", "Description": "테스트 > 첫번째 테스트 거래", "Services": [ { "ServiceID": "LD01", "Authorize": false, "ReturnType": "Json", "CommandType": "D", "TransactionScope": false, "Inputs": [ { "ModelID": "Dynamic", "Fields": [], "TestValues": [], "DefaultValues": [], "Type": "Row", "BaseFieldMappings": [], "ParameterHandling": "Rejected" } ], "Outputs": [ { "ModelID": "Dynamic", "Fields": [], "Type": "Grid" } ] } ], "Models": [] } ``` 소스) transact/HDS/TST/TST010.json 계약 파일 위의 계약 정보는 다음과 같이 해석 할 수 있습니다. * HDS 어플리케이션에서 TST 프로젝트의 TST010 거래를 LD01 서비스 ID로 요청을 수신합니다. * LD01 수신 정보는 인증 정보(Authorize)가 필요 없는 공개된 수신 설정입니다. * 반환되는 데이터 포맷은 Json 으로 반환됩니다. * 요청은 데이터베이스 (CommandType) 거래를 수행하며, 이때 트랜잭션(TransactionScope)을 수행하지 않습니다. * 요청 정보는 하나의 Row에 여러 Column으로 구성된 정보가 요청되며 이때 어떤 Fields 정보라도 허용합니다. * 응답 정보는 여러 Row와 여러 Column으로 구성된 정보가 반환되야 합니다. * 요청 정보가 없을 경우 잘못된 요청 응답 처리를 수행합니다. > transact module의 계약 기능은 다양한 시나리오에 대응 할 수 있는 더 많은 옵션을 제공합니다. 이 계약 정보는 지속적으로 개선되고 있으며 자세한 정보는 가이드나 참고 정보를 참조하세요. transact Services의 기본 설정과 고급 설정의 예시는 다음과 같습니다. ## Services 기본 설정 ```json { "ServiceID": "LD01", "Authorize": false, "ReturnType": "Json", "CommandType": "D", "TransactionScope": false, "Inputs": [], "Outputs": [] } ``` --- ## Services 고급 설정 ```json { "ServiceID": "MD01", "Authorize": true, "ReturnType": "Json", "CommandType": "D", "TransactionScope": true, "Inputs": [ { "ModelID": "Dynamic", "Fields": [], "TestValues": [], "DefaultValues": [], "Type": "Row", "BaseFieldMappings": [], "ParameterHandling": "Rejected", "IgnoreResult": false }, { "ModelID": "Dynamic", "Fields": [], "TestValues": [], "DefaultValues": [], "Type": "List", "BaseFieldMappings": [ { "BaseSequence": 0, "SourceFieldID": "APPROVAL_LINE_NO", "TargetFieldID": "APPROVAL_LINE_NO" } ], "ParameterHandling": "ByPassing" } ], "Outputs": [ { "ModelID": "Dynamic", "Fields": [], "Type": "Form" } ] } ``` ## dbclient module 기능 계약 업무 프로젝트에서 대부분의 90% 업무는 데이터베이스의 CRUD 쿼리를 수행합니다. dbclient 모듈은 dbclient 모듈의 요청 데이터를 수신하여 데이터베이스의 처리 후 결과를 응답하는 과정을 실행 하는 것을 목적으로 하며, 이러한 업무를 처리하기 위해 다음과 같은 계약을 Xml로 작성합니다. 지원 데이터베이스는 다음과 같습니다. * SQL Server * Oracle * MySQL & MariaDB * PostgreSQL * SQLite > %HANDSTACK_SRC%/2.Modules/dbclient/module.json DataSource 항목 에서 데이터베이스 연결문자열을 관리합니다. ```xml
HDS TST TST010 DB01 Y 사용자, 이메일, 연락처 2FA 인증 관리
GETDATE(); ]]>
``` 소스) dbclient/HDS/TST/TST010.xml 계약 파일 dbclient 모듈의 계약 파일은 다음과 같은 고급 문법을 지원합니다. - 기본적으로 쿼리 매개변수는 변수화 되어 처리 권장 - ${}, #{} 치환 변수 기능 제공 - 사용자 세션 변수 사용: $UserSessionVariable - pretreatment 전처리 쿼리 기능 제공 - BaseFieldMapping 으로 매개변수 값 전달 - if, foreach 분기 처리 및 bind 변수 기능 제공 ## 고급 문법을 활용한 예제 ```xml SELECT CASE WHEN A.LOG_TYPE = '1' THEN '성공' ELSE '실패' END AS SENDTYPE, A.CREATE_DT, A.MESSAGE_TITLE, A.TOKEN_ID, A.ERROR_MESSAGE FROM CTY_PUSH_DIRECTLOG A WHERE AND A.CREATE_DT <= #{decorate_END_DT} AND (CASE WHEN #{TOKEN_ID} = '' THEN '' ELSE A.TOKEN_ID END) LIKE #{like_TOKEN_ID} AND A.LOG_TYPE IN ('1', '2') AND TOKEN_ID = #{category} AND price = ${price} AND name = 'Fuji' name = #{name} LIMIT 0, 500; ``` ## 테스트 HandStack의 transact module의 기능을 확인 하기 위해 테스트 목적으로 직접 거래 요청을 진행할 경우 Postman을 권장합니다. Postman은 개발한 http 프로토콜 기반의 API를 테스트하고, 테스트 결과를 공유하여 API 개발의 생산성을 높여주는 도구입니다. [Postman 다운로드](https://go.postman.co/build)를 선택하여 프로그램을 설치하세요. Postman 실행 후 다음의 정보를 입력하여 테스트 합니다. * Method: Post * Url: http://localhost:8421/transact/api/transaction/execute * Content-Type: application/json 다음과 같이 [Body] 영역에 JSON Data를 입력합니다. ```json { "accessToken": "", "action": "SYN", "kind": "BIZ", "clientTag": "HANDSTACK|WebClient|ack|D", "loadOptions": { "encryptionType": "P", "encryptionKey": "G", "platform": "Win32", "dynamic": "Y", "authorize": "N", "commandType": "D", "returnType": "Json", "transactionScope": "N", "transactionLog": "Y" }, "requestID": "LD00000HDSHMLHML010LD01W76M6JH160600", "version": "001", "environment": "D", "system": { "programID": "HDS", "version": "1.0.0", "routes": [ { "systemID": "HANDSTACK", "requestTick": 1700809560524 } ], "localeID": "ko-KR", "hostName": "localhost:8421", "pathName": "/handsup/view/TST/TST010.html" }, "interface": { "devicePlatform": "browser", "interfaceID": "WEB", "sourceIP": "192.168.0.45", "sourcePort": 0, "sourceMAC": "", "connectionType": "4g", "timeout": 180000 }, "transaction": { "globalID": "LD00000HDSHMLHML010LD01S76M6JH160600", "businessID": "HML", "transactionID": "HML010", "functionID": "LD01", "commandType": "D", "simulationType": "P", "terminalGroupID": "undefined|undefined", "operatorID": "handstack@handstack.kr", "screenID": "HML010", "startTraceID": "", "dataFormat": "J", "compressionYN": "N" }, "payLoad": { "property": {}, "dataMapInterface": "Row|Grid", "dataMapCount": [ 1 ], "dataMapSet": [ [ { "id": "ApplicationNo", "value": "08dbcde8520ce00cca91a85e00064bf7" } ] ], "dataMapSetRaw": [] } } ``` 소스) 요청 데이터 위와 같이 요청하면 다음과 같은 응답 전문을 결과로 얻을 수 있습니다. ```json { "system": { "programID": "HDS", "version": "", "routes": [ { "systemID": "HANDSTACK", "hostName": "HOSTNAME", "environment": "", "requestTick": 1700809560524, "acceptTick": 1700809560531, "responseTick": 1700809560566 } ], "localeID": "ko-KR", "hostName": "", "pathName": "" }, "transaction": { "globalID": "LD00000HDSHMLHML010LD01S76M6JH160600", "businessID": "HML", "transactionID": "HML010", "functionID": "LD01", "commandType": "D", "simulationType": "P", "terminalGroupID": "", "operatorID": "", "screenID": "", "startTraceID": "", "dataFormat": "J", "compressionYN": "N" }, "message": { "responseStatus": "N", "mainCode": "T200", "mainText": "(성공): 서버가 요청을 제대로 처리", "additions": [] }, "result": { "property": null, "outputAction": { "outputType": "", "nextTransactionID": "", "nextFunctionID": "", "reportName": "", "reportOptions": "", "screenID": "" }, "responseType": "0", "dataSetMeta": [], "dataMapCount": [], "dataSet": [ { "id": "GridData0", "value": [ { "CompanyName": "큐씨엔", "JoinAt": null, "ExpiredAt": "2024-11-13", "Options": null, "CreatedMemberNo": "", "CreatedMemberName": null, "CreatedAt": "2023-11-13", "ModifiedMemberNo": null, "ModifiedMemberName": null, "ModifiedAt": null } ] } ] }, "acceptDateTime": "2023-11-24T16:06:00.5313296+09:00", "acknowledge": 1, "correlationID": "LD00000HDSHMLHML010LD01W76M6JH160600", "exceptionText": "", "rowsAffected": 0, "responseID": "HANDSTACKHOSTNAMED2023112416062400", "loadOptions": {}, "version": "001", "environment": "D" } ``` 소스) 응답 데이터 > 시스템간의 거래 메시지는 크게 헤더(설명)와 바디(정보)로 구성되어 전달되어집니다. 위와 같은 요청/응답 데이터 구조는 HandStack 기반 화면이나 프로그램, 각 서비스 간에 자동으로 만들고 전달 되는 전문 프로토콜입니다. 디버깅, 테스트, 이상거래 파악 등등 각 항목에 대한 의미와 적용 가능한 값을 알아두는 것을 권장합니다. [계약 중심 거래 확인하기](https://handstack.kr/docs/reference/concept/계약-중심-거래) ## 참고자료 * Postman: https://go.postman.co/build --- title: 소스 디렉토리 구조 url: https://handstack.kr/docs/startup/learning/소스-디렉토리-구조 --- # 소스 디렉토리 구조 HandStack 디렉토리는 다음을 의미합니다. 이외에도 업무에 따라 추가적으로 하위 디렉토리가 실시간으로 생성됩니다. * app: HandStack 서버 실행 프로그램이 있습니다. Windows, Linux, macOS를 지원하며, 기본 포트로 8421을 사용합니다 * contracts: 비즈니스 앱에 필요한 프론트엔드, 백엔드에 대한 모든 설정과 소스가 있습니다. * modules: HandStack 필수 기능 제공을 위한 .NET Core 기반 공식 모듈 들이 있습니다. ### 비즈니스 앱에 필요한 모든 설정과 소스 Visual Studio Code 또는 Nodepad++ 와 같은 편집기를 실행하여 작업 디렉토리로 `%HANDSTACK_HOME%\contracts` 를 열면 다음과 같은 5개의 디렉토리가 있으며 다음과 같은 파일들이 있습니다. |디렉토리|설명| |---|---| |dbclient|데이터베이스 SQL을 XML 문서로 관리| |function|C# 또는 Node.js 기반 Function 개발 기능 관리| |repository|단일, 다중, 이미지, 첨부파일 등등 파일 업로드/다운로드 관리| |transact|거래 요청 검증 및 접근 제어 관리와 요청 정보를 dbclient, function 등등 module로 라우팅 기능 관리| |wwwroot|웹 공통 static assets 및 화면 단위 소스 호스팅 관리| > 각 디렉토리내의 구조는 다음의 규칙을 가지고 있습니다 프로그램 ID > 프로젝트 ID > 파일 ID ```bash %HANDSTACK_HOME%\contracts │ file.log │ ├─dbclient │ └─HDS │ ├─TAG │ │ TAG010.xml │ │ │ └─TST │ MYS010.xml │ ORA010.xml │ PGS010.xml │ SLT010.xml │ SQS010.xml │ ├─function │ ├─csharp │ │ └─HDS │ │ └─TST │ │ └─CSF010 │ │ featureMain.cs │ │ featureMeta.json │ │ │ └─javascript │ └─HDS │ └─TST │ └─JSF010 │ featureMain.js │ featureMeta.json │ ├─repository │ └─HDS │ storage.json │ ├─transact │ └─HDS │ ├─STR │ │ STR010.json │ │ STR011.json │ │ │ └─TST │ CSF010.json │ JSF010.json │ MYS010.json │ ORA010.json │ PGS010.json │ SLT010.json │ SQS010.json │ └─wwwroot │ index.html │ └─TST CSF010.html CSF010.js JSF010.html JSF010.js MYS010.html MYS010.js ORA010.html ORA010.js PGS010.html PGS010.js SLT010.html SLT010.js SQS010.html SQS010.js ``` wwwroot 디렉토리의 소스를 웹 브라우저에서 테스트 할 수 있습니다. (MSSQL, Oracle, MariaDB, PostgreSQL 데이터베이스 거래 테스트는 환경에 따라 오류가 발생합니다.) * [C# 함수 거래 테스트](http://localhost:8421/view/TST/CSF010.html) * [Node.js 함수 거래 테스트](http://localhost:8421/view/TST/JSF010.html) * [SQLite 데이터베이스 거래 테스트](http://localhost:8421/view/TST/SLT010.html) * ~~[MariaDB 데이터베이스 거래 테스트](http://localhost:8421/view/TST/MYS010.html)~~ * ~~[Oracle 데이터베이스 거래 테스트](http://localhost:8421/view/TST/ORA010.html)~~ * ~~[PostgreSQL 데이터베이스 거래 테스트](http://localhost:8421/view/TST/PGS010.html)~~ * ~~[SqlServer 데이터베이스 거래 테스트](http://localhost:8421/view/TST/SQS010.html)~~ > **MSSQL, Oracle, MariaDB, PostgreSQL 데이터베이스**에 서버 시간과 서버명을 조회하는 거래 테스트에 필요한 환경을 구성하려면 [docker 기반 개발용 데이터베이스 설치하기](https://handstack.kr/docs/startup/handsonlab/docker-기반-개발용-데이터베이스-설치하기) 문서를 참고하세요. --- title: 화면 개발 시작하기 url: https://handstack.kr/docs/startup/learning/화면-개발-시작하기 --- # 화면 개발 시작하기 HandStack 화면은 다음과 같은 오픈소스 기반의 프레임워크와 라이브러리를 사용하여 만듭니다. - tabler CSS Framework - Tabler는 부트스트랩 5를 기반으로 하여, 이미 검증된 CSS 프레임워크를 사용합니다. 이는 개발자가 빠르게 UI를 구축할 수 있도록 도와줍니다. - 다양한 UI 컴포넌트와 아이콘을 제공하여, 일관된 디자인을 유지하면서도 효율적으로 화면을 구성할 수 있습니다. - 모바일, 태블릿, 데스크탑 등 다양한 디바이스에서 최적화된 화면을 제공할 수 있습니다. - master-css - Master CSS는 직관적인 문법을 제공하여, CSS 클래스만으로 스타일을 간편하게 작성할 수 있습니다. 이는 코드의 가독성을 높이고, 유지보수를 용이하게 합니다. - 다양한 스타일링 옵션을 제공하여, 개발자가 원하는 대로 화면을 커스터마이징할 수 있습니다. - 불필요한 코드가 포함되지 않아, 페이지 로딩 속도를 빠르게 유지할 수 있습니다. - Mustache - Mustache는 템플릿 엔진으로, HTML과 데이터를 결합하여 동적인 콘텐츠를 생성할 수 있습니다. 이는 서버와 클라이언트 간의 데이터 바인딩을 쉽게 처리할 수 있게 합니다. - 직관적인 문법을 사용하여, 복잡한 로직 없이도 템플릿을 작성할 수 있습니다. - 다양한 환경에서 사용할 수 있으며, JavaScript 외에도 여러 언어에서 지원됩니다. ## tabler CSS Framework 부트스트랩 5 기반의 무료 오픈 소스 웹 애플리케이션 UI Kit입니다. 다음 링크에서 더 많은 정보를 확인할 수 있습니다. - [부트스트랩 5 시작하기](https://getbootstrap.kr/docs/5.3/getting-started/introduction) - [Tabler UI Kit 미리보기](https://preview.tabler.io) - [Tabler 아이콘](https://tabler.io/icons) - [Tabler 시작하기](https://tabler.io/docs/getting-started) ## master-css CSS를 간편하게 작성할 수 있는 프레임워크입니다. 다음 링크에서 더 많은 정보를 확인할 수 있습니다. - [Master CSS 공식 사이트](https://css.master.co) - [Master CSS 문법 튜토리얼](https://css.master.co/docs/syntax-tutorial) ## Mustache 템플릿 엔진으로, HTML과 데이터를 결합하여 동적인 콘텐츠를 생성할 수 있습니다. 다음 링크에서 더 많은 정보를 확인할 수 있습니다. - [Mustache 템플릿 엔진 소개](https://taegon.kim/archives/4910) --- 위와 같이 검증된 프레임워크와 라이브러리를 사용하면 개발 생산성을 높이고, 유지보수를 용이하게 하며, 일관된 사용자 경험을 제공할 수 있습니다. 하나의 화면 개발을 위해서는 **HTML**, **Javascript** 동일한 이름의 2개의 파일이 각각 필요합니다. 예를 들어 TST010 화면의 경우 TST010.html, TST010.js 파일이 동일한 디렉토리 내에 있어야 합니다. ## 공통 assets 디렉토리 화면 개발을 위해 공통 라이브러리와 화면 소스는 각각의 별도 디렉토리에서 관리합니다. 왜냐하면 소스 관리 및 관심사의 분리 측면에서 이점이 있기 때문입니다. 대부분의 프로젝트 개발에서 공통 기능은 상용 또는 공개 소스를 기반으로 하거나 공통 기능 개발 조직이 담당하게 됩니다. 이 경우 공통 기능 개발 소스와 화면 개발 소스의 관리 주체가 서로 다르기 때문에 각자 소스에 대한 접근 및 관리 권한은 다르게 가져가는 것이 좋습니다. > 공통 assets 디렉토리는 `%HANDSTACK_HOME%\modules\wwwroot\wwwroot` 입니다. 여기에 있는 모든 파일은 웹 브라우저에 다음과 같이 루트 경로로 공개됩니다. /module.html, /js/syn.js 등등 ## wwwroot 디렉토리 다음과 같이 화면에 대한 개발 소스를 단일 디렉토리내에 저장합니다. ```txt %HANDSTACK_HOME%\contracts └─wwwroot └─HDS └─TST └─TST010.html └─TST010.js ``` 이렇게 파일을 관리하면 웹 브라우저에서 다음과 같이 실행합니다. [http://localhost:8421/view/HDS/TST/TST010.html](http://localhost:8421/view/HDS/TST/TST010.html) 예를 들어 그룹웨어 프로젝트에 대한 일부 프로젝트 ID와 파일 ID 규칙을 dbclient, transact, wwwroot module 에서 다음과 같이 사용 할 수 있습니다. |화면명|프로젝트 ID|파일 ID| |---|---|---| |근태현황|ATM|ATM010| |외근직원 장소 조회|ATM|ATM012| |휴가현황|ATM|ATM040| |자주쓰는 결재선|CMM|CMM010| |결재라인 추가(수신자 설정)|CMM|CMM020| |휴가신청(관리자)|CMM|CMM040| |공문 상세|CMM|CMM050| |신규작성|EST|EST010| |문서기안|EST|EST020| |오피스신청|OFC|OFC120| |고정 결재선 / 수신자 설정|SMP|SMP170| ## HandStack 화면의 고유 특징 만약 여러분이 JSP, ASP.NET, PHP와 같은 화면 개발 경험이 있는 경우 서버 사이드 랜더링 (SSR)에 익숙 하실겁니다. 또는 Angular, React, Vue와 같이 단일 페이지 애플리케이션 (SPA) 방식이나 jQuery 기반 클라이언트 사이드 랜더링 (CSR)을 개발 경험을 하셨을 수도 있습니다. HandStack 화면은 업무적인 관점에서 몇가지 이슈를 해결하기 위해 초보 개발자도 개발 가능하도록 의도된 몇가지 고유 특징이 있습니다. ### 데이터베이스 CRUD 거래의 경우 가급적 서버 기술을 사용하지 않습니다 화면을 개발하기 위해 ASP, JSP, PHP 등과 같은 서버 기술을 사용하지 않는 순수한 HTML과 Javascript, Stylesheet로 구성됩니다. 클라이언트 표준 기술로도 다양한 비즈니스 요구 사항을 충족시킬 수 있기 때문입니다. 이로 인해 화면 소스는 일반 웹 서버, CDN, 하이브리드 앱 등등 어디 곳이든 간단하게 배포가 가능합니다. 또한 화면 개발에 필요한 학습 비용이 절감됩니다. ### 업무 화면에 필요한 공통 기능 제공 화면을 개발하기 위해 필요한 오픈소스 기반 디자인 시스템과 공통 UI 컴포넌트를 선정하여 가이드합니다. 화면 디자인을 위한 공통 CSS 시스템은 기본적으로 업무 화면 개발에 최적화 되어 있는 bootstrap 기반의 tabler를 사용합니다. bootstrap은 세계에서 가장 많은 사랑을 받고 있는 디자인 시스템이며 관리자, 대시보드, 회사, 업무, 블로그 등등 다양한 디자인 템플릿과 도구들이 유료, 무료 버전으로 만들어져 있기 때문에 참고 할 수 있는 리소스가 풍부합니다. 화면 기능 개발에 필요한 다음과 같은 UI 컨트롤을 제공합니다 * CheckBox * CodePicker * ColorPicker * ContextMenu * DataSource * DatePicker * DropDownCheckList * DropDownList * FileClient * FileDropZone * HtmlEditor * RadioButton * SignaturePad * SourceEditor * TextArea * TextBox * TextButton * WebGrid (유료 라이선스 필요) * Element ### 기본에서 시작합니다 특정 라이브러리나 프레임워크에 종속적이지 않는 순수한 vanilla 개발을 지향합니다. 그래서 필요할 경우 jQuery, Svelte, Angular 등등 다양한 프레임워크나 라이브러리와 혼용으로 개발이 가능하며, 비즈니스가 기준이 되어 애플리케이션 설정에 의해 선호하는 오픈소스와 상용 S/W 들을 추가 삭제 할 수 있습니다. ## 화면 소스 기본 구조 먼저 소스를 확인 하겠습니다. 화면에 버튼을 배치하고 'Hello World' 팝업을 보여주는 화면의 경우 다음과 같이 소스를 만들면 됩니다. ### TST010.html 소스 ```html ``` ### TST010.js 소스 ```javascript 'use strict'; let $TST010 = { event: { btnHelloWorld_click() { alert('반갑습니다 !'); } } } ``` 위의 소스는 HandStack 기반 화면 개발 소스의 일관성과 편의성을 보여줍니다. 예를 들면 다음 동작을 자동화 합니다. `syn.loader.js` 스크립트는 현재 개발/운영 환경을 확인하여 현재 화면 동작과 기능 구성에 필요한 최적의 스크립트와 스타일시트를 로드합니다. 화면 개발자는 현재 화면에 필요한 외부 파일에 대한 고민을 하지 않아도 됩니다. wwwroot 모듈에 공통 파일 카탈로그를 설정한 경우 `syn.loader.js`는 `/shared-files/manifest`를 추가로 조회합니다. 등록된 `.css`와 `.js`는 일반 리소스 로딩 목록에 합치고, JSON/XML/HTML/Markdown 등의 텍스트 자산은 확장자별 `type`과 `shared_<파일명>` ID를 가진 DOM 요소로 추가합니다. 설정과 공개 범위는 [wwwroot 모듈의 공통 파일 카탈로그](https://handstack.kr/docs/reference/api/modules/wwwroot#공통-파일-카탈로그)를 참고하세요. 사용자의 동작을 이벤트 처리로 하기 위해 HTML 요소의 속성으로 `syn-events="['click']"`를 설정합니다. 이벤트는 배열로 여러개의 이벤트를 설정할 수 있으며 표준 이벤트명을 지원합니다. 화면은 하나의 Javascript를 반드시 필요로 하며 해당 스크립트의 파일명과 객체의 이름은 동일하게 부여합니다. 예를 들어 HTML내에 선언된 버튼의 이벤트 핸들러를 `$TST010.event.btnHelloWorld_click`와 같이 정의할 수 있습니다. > Javascript는 ECMAScript 2017 이상을 준수 해야 하며, Internet Explorer 브라우저는 동작에 제한이 있을 수 있습니다. ## HTML 요소에 적용 가능한 syn-* 속성 3개 HTML 파일은 화면에 출력할 컨트롤을 배치하고, 서버와 연결하여 데이터를 바인딩 할 컨트롤을 지정합니다. 화면에서 보여져야 할 항목들의 모양과 기능 동작 및 서버와의 요청/응답(이하 `거래`라고 표현)에 대해 다음과 같은 확장 속성을 제공합니다. * syn-datafield * syn-events * syn-options ### syn-datafield 이 속성은 일반적으로 서버와의 거래 요청 및 응답이 필요한 사용자 입력에 대응하는 HTML 태그(이하 UI 컨트롤)에 선언됩니다. ```txt BUTTON INPUT [type] hidden text password color email number search tel url submit reset button radio checkbox TEXTAREA SELECT (multiple) SYN_GRID SYN_CHART SYN_CODEPICKER SYN_COLORPICKER SYN_DATEPICKER SYN_EDITOR ETC... ``` syn-datafield 속성 선언을 하면 HTML 요소를 고유하게 식별할 수 있는 id 속성은 반드시 선언해야 하며, id 값은 헝그리안 표기법을 권장 하며 프로젝트에 따라 결정합니다. ```txt btn: BUTTON txt: INPUT [type] hdn: hidden txt: text pin: password clr: color eml: email num: number txt: search tel: tel url: url smt: submit rst: reset btn: button rdo: radio chk: checkbox txt: TEXTAREA ddl: SELECT (multiple) grd: SYN_GRID cht: SYN_CHART chp: SYN_CODEPICKER clp: SYN_COLORPICKER dtp: SYN_DATEPICKER edt: SYN_EDITOR etc: ETC... ``` ### syn-events UI 컨트롤에 문자열 배열로 HTML 이벤트 및 컨트롤 이벤트 핸들러 선언 가능합니다. Javascript 객체에 이에 대응하는 이벤트 핸들러가 없으면 무시되며, 객체에서 `$this.event.[컨트롤ID]_[이벤트명]` 으로 이벤트에 대한 핸들러를 정의합니다. ```html ``` 또는 Javascript에서 다음과 같이 이벤트 핸들러를 지정 할 수 있습니다. ```javascript syn.$l.addEvent(window, 'resize', () => { }); syn.$l.addEvent(document.body, 'click', () => { }); syn.$l.addEvent('btnDynamicEvent', 'click', $this.event.btnDynamicEvent_click); ``` > 표준 이벤트 명에 대해 다음을 참고하세요. [HTML Event Attributes](https://www.w3schools.com/tags/ref_eventattributes.asp) ### syn-options 사용자 입력에 대응하는 UI 컨트롤의 모양과 기능을 제어하는 옵션입니다. 각 컨트롤에 따라 지원하는 옵션 항목이 다르며 대소문자를 구분합니다. JSON 문법을 사용하며, 문법 오류시 실행시 초기 랜더링 오류가 발생하기 때문에 주의해야 합니다. 예를 들어 다음과 같이 옵션을 지정 할 수 있습니다. ```html ``` 각 UI 컨트롤에서 지원 되는 옵션에 대해서는 가이드 문서 및 API 참조를 참고하세요. ## Javascript 업무 로직은 객체 파일 ID 객체로 지정하면 화면 개발에 필요한 다양한 공통 기능을 자동으로 수행합니다. 객체내 자신을 가리키는 `$this`를 사용할 수 있습니다. 화면 개발 Javascript 객체는 다음의 기반으로 실행되는 구조를 가지고 있습니다. [이미지: 화면 개발 Javascript 객체] 필요 없는 부분은 선언 하지 않아도 되며, 화면 개발에 필요한 스크립트는 일관성을 가질 수 있습니다. 다음은 위의 HTML에 대응하는 소스 구성입니다. ```javascript 'use strict'; let $TST010 = { // 공통 기능 상속 선언 extends: [ ], // 화면 구성에 필요한 환경설정 config: { }, // 화면내 전역변수 선언 prop: { custom1: '블라블라', custom2: 12345, custom3: ['hello', 'world'] }, // life cycle, 외부 이벤트 hook 선언 hook: { }, // 사용자 이벤트 핸들러 선언 event: { txtApplicationID_click(evt) { console.log($this.prop.custom1); }, txtApplicationName_focus(evt) { console.log($this.prop.custom2.toString()); }, txtApplicationName_change(evt) { console.log($this.prop.custom3.toString()); } }, // 거래 메서드 선언 transaction: { }, // 기능 메서드 선언 method: { } }; ``` ## HandStack syn.js 라이브러리 화면 개발에 필요한 대부분의 기능은 syn.js 라이브러리를 이용하여 개발합니다. 이 라이브러리는 외부 종속성이 없으며 jQuery, prototype 등등 수많은 라이브러리와 결합 하여 사용 가능합니다. 이 라이브러리는 화면 개발에 필요한 기능과 최소한의 학습 비용으로 개발이 가능하도록 유지보수, 생산성 차원에서 일관적인 소스 코드 품질을 유지하기 위해 설계 되었습니다. syn.js 라이브러리의 자세한 내용은 가이드 문서 및 API 참조를 참고하세요. ## 참고자료 * HTML Event Attributes: https://www.w3schools.com/tags/ref_eventattributes.asp --- title: ack 프로그램 가이드 url: https://handstack.kr/docs/startup/learning/ack-프로그램-가이드 --- # ack 프로그램 가이드 HandStack 에서 제공되는 서버 프로그램인 ack는 마이크로소프트에서 개발한 Kestrel 서버 프로그램이며 플랫폼 간 웹 서버로, Windows, Linux 및 macOS에서 실행됩니다. Kestrel은 많은 수의 동시 연결을 효율적으로 처리하도록 성능을 중점으로 최적화되어 있으며, 컨테이너 및 에지 디바이스와 같이 리소스가 제한된 환경에서 실행되도록 설계 되었습니다. ack 프로그램으로도 기본적인 웹 서버의 역할은 물론 HTTPS를 지원하고 HTTP/1.1, HTTP/2 및 HTTP/3, WebSocket 등 일반적인 웹 프로토콜을 지원합니다. 특히 마이크로소프트에서 개발된 만큼 ASP.NET Core 모든 구성 요소와 원활하게 통합됩니다. 다만 이러한 특징 때문에 Apache, IIS, Nginx 등등 일반적인 웹 서버의 관리 화면이나 편의성은 제공하지 않아 복잡한 운영 환경에서는 SSL 처리, URL 재작성, GZip 압축 등등 관리 편의성 측면에서 약간의 성능은 낮추더라도 앞단에 IIS 또는 Nginx와 같은 처리를 담당하는 웹 서버 뒷단에 프로그램을 배치하여 역방향 프록시를 수행하는 방법을 권장합니다. ## 여러 개의 독립된 모듈로 구분된 애플리케이션 모듈러 모놀리식 아키텍처는 애플리케이션의 도메인을 더 작고 관리하기 쉬운 컴포넌트 또는 모듈로 나누는 아키텍처 접근법입니다. 이는 코드베이스를 논리적이고 구조적인 디렉토리로 구성하도록 권장하며, 시스템 기능 간의 관심사를 분리하고 경계를 명확하게 합니다. 이러한 모듈은 특정 업무와 기능을 포함하며, 독립적으로 개발하고 테스트할 수 있습니다. 그러나 ack 프로그램을 실행 할 때 단일 단위로 결정되어 운영됩니다. 그림) 모놀리식 방식 프로그램 실행 그림) 마이크로서비스 방식 프로그램 실행 --- title: syn.controls.js 가이드 url: https://handstack.kr/docs/startup/learning/syn.controls.js-가이드 --- # syn.controls.js 가이드 비즈니스 앱 화면을 개발하기 위해 일관된 기능과 디자인 테마로 만드는 것이 필요합니다. 잘 설계된 디자인 시스템은 최신 브라우저에 적합한 현대적이고 반응성이 뛰어나며 접근성과 속도가 빠른 UI를 만들 수 있도록 돕습니다. HandStack에서는 화면 디자인과 레이아웃을 위한 공통 CSS 시스템으로 Bootstrap 기반의 tabler를 사용합니다. 기본적으로 업무 화면 디자인에 최적화 되어 있는 오픈소스이기 때문입니다. > Bootstrap은 세계에서 가장 많은 사랑을 받고 있는 디자인 시스템이며 관리자, 대시보드, 회사, 업무, 블로그 등등 다양한 디자인 템플릿과 도구들이 유료, 무료 버전으로 만들어져 있기 때문에 참고 할 수 있는 리소스가 풍부합니다. 그리고 화면 개발에 필요한 상용/오픈 소스 기반 공통 UI 컴포넌트를 화면 개발자가 일관된 방법으로 사용하기 쉽게 고도화하여 가이드합니다. ## 화면 컨트롤 웹 화면을 개발 하기 위해 다양한 요구 사항을 충족하기 위해 재사용 가능하고 디자인 접근성이 좋은 컴포넌트를 판매하는 곳이 많습니다. 업무와는 별개로 사용자가 입력하는 데이터를 정보화하여 적재적소하게 표현을 해야하는 방법을 얼마나 자동화 하거나 효율적으로 만드는 것이 중요하기 때문입니다. 그림) 50개 이상의 Kendo UI 화면 컨트롤 웹 브라우저에서 동작하는 화면 컨트롤 들은 대부분 Javascript 기반의 컴포넌트들로 만들어져 있으며, jQuery, Angular, React, Vue, WebAssembly 등등 다양한 개발 프레임워크에 따라 특화된 기능을 제공합니다. 그래서 화면에서는 다음과 같이 상용/공개 라이브러리 또는 프레임워크 기반에서 디자인 레이아웃과 기능을 선언하여 개발하는 방식이 일반적으로 진행됩니다. 그림) 화면내 상용/공개 라이브러리 또는 프레임워크를 선언하여 개발 #### 업무 화면에 필요한 공통 기능 제공 HandStack 기반 에서는 비즈니스 앱 화면 개발에 필요한 다음과 같은 UI 컴포넌트을 **wwwroot 모듈**에서 제공합니다. 필요한 기준은 얼마나 사용자에게 정보를 직관적으로 입력을 받아 표시하는 방법을 **간단하게 만들 수 있는가?** 입니다. 이에 대한 자세한 내용은 [데이터 게더링과 바인딩](https://handstack.kr/docs/reference/concept/데이터-게더링과-바인딩) 문서를 참고하세요. 화면 개발자는 다양한 화면 컨트롤을 일관된 속성, 메서드, 이벤트 사용법으로 개발 하게 되며 각 컴포넌트의 사용 유무는 환경설정에서 정의하여 syn.loader.js 에 의해 사용됩니다. 그림) HandStack 화면 컨트롤을 선언하여 개발 > 화면 컨트롤은 자체 제작/오픈소스/유료 구분 없이 만들어지며 기본적으로 널리 사용중인 오픈소스를 기반으로 만들어집니다. |약어|컴포넌트명|설명| |---|---|---| |syn.uicontrols.$checkbox|CheckBox|브라우저마다 다르게 표시되는 체크박스를 일관되게 표현합니다.| |syn.uicontrols.$codepicker|CodePicker|코드도움 팝업 기능을 제공합니다.| |syn.uicontrols.$colorpicker|ColorPicker|색상 팔레트를 제공합니다.| |syn.uicontrols.$contextmenu|ContextMenu|오른쪽 마우스 버튼 기능을 활용하여 컨텍스트 메뉴를 제공합니다.| |syn.uicontrols.$data|DataSource|단일 또는 여러 데이터 건의 데이터 소스 객체 기능을 제공합니다.| |syn.uicontrols.$dateperiodpicker|DatePeriodPicker|시작 및 종료 기간 날짜 선택 기능을 제공합니다.| |syn.uicontrols.$datepicker|DatePicker|날짜 선택 기능을 제공합니다.| |syn.uicontrols.$multiselect|DropDownCheckList|여러 개의 항목을 선택 할 수 있는 콤보박스를 제공합니다.| |syn.uicontrols.$select|DropDownList|단일 항목을 선택 할 수 있는 콤보박스를 제공합니다.| |syn.uicontrols.$element|Element|HTML 항목에서 getValue, setValue 기능을 제공합니다.| |syn.uicontrols.$fileclient|FileClient|파일 업로드/다운로드 기능을 제공합니다.| |syn.uicontrols.$filedropzone|FileDropZone|파일을 끌어다 놓아 repository 모듈로 업로드하고 목록에서 다운로드/삭제합니다.| |syn.uicontrols.$list|GridList|데이터 조회에 특화된 기능을 제공합니다.| |syn.uicontrols.$guide|Guide|화면 내 표시되는 도움말 기능을 제공합니다.| |syn.uicontrols.$htmleditor|HtmlEditor|파일 업로드/다운로드 기능이 통합된 HTML 편집기 기능을 제공합니다.| |syn.uicontrols.$organization|OrganizationView|조직도 데이터를 직관적으로 편집하는 기능을 제공합니다.| |syn.uicontrols.$echarts|ECharts|객체/객체 배열을 다양한 차트로 표현하고 선택한 원본 행을 거래 값으로 제공합니다.| |syn.uicontrols.$radio|RadioButton|브라우저마다 다르게 표시되는 라디오버튼을 일관되게 표현합니다.| |syn.uicontrols.$signaturepad|SignaturePad|마우스·터치로 서명을 입력받고 base64 data URL 문자열로 값을 관리합니다.| |syn.uicontrols.$sourceeditor|SourceEditor|소스 편집기에 특화된 에디터 기능을 제공합니다.| |syn.uicontrols.$textarea|TextArea|여러 텍스트 줄을 관리하기 위한 추가 기능을 제공합니다.| |syn.uicontrols.$textbox|TextBox|단일 텍스트을 관리하기 위한 추가 기능을 제공합니다.| |syn.uicontrols.$button|Button|버튼을 관리하기 위한 추가 기능을 제공합니다.| |syn.uicontrols.$tree|TreeView|재귀적으로 트리 구조를 표현하는 기능을 제공합니다.| |syn.uicontrols.$grid|WebGrid|대량 편집에 가능한 그리드 컴포넌트 기능을 제공합니다. (Handsontable 유료 라이선스 필요)| |syn.uicontrols.$auigrid|AUIGrid|대량 편집에 가능한 그리드 컴포넌트 기능을 제공합니다. (AUISoft 유료 라이선스 필요)| 위의 UI 컴포넌트은 다양한 상용/오픈소스 기반 라이브러리를 활용되었으며 지속적으로 업데이트 됩니다. > `%HANDSTACK_HOME%\modules\wwwroot\wwwroot\lib` 디렉토리에서 기본 제공되는 컴포넌트의 기반인 오픈소스와 상용 라이브러리를 확인 할 수 있습니다. ## CheckBox 브라우저마다 다르게 표시되는 체크박스를 일관되게 표현합니다. #### 소스위치 * /lib/css-checkbox-1.0.0/checkboxes.css * /uicontrols/CheckBox/CheckBox.css * /uicontrols/CheckBox/CheckBox.js #### 다운로드: https://github.com/hunzaboy/CSS-Checkbox-Library #### 공식예제: https://hunzaboy.github.io/CSS-Checkbox-Library/ #### 사용법 ```html
``` ## CodePicker 코드도움 팝업 기능을 제공합니다. #### 소스위치 * /uicontrols/CodePicker/CodePicker.css * /uicontrols/CodePicker/CodePicker.js #### 사용법 ```html ``` ## ColorPicker 색상 팔레트를 제공합니다. #### 소스위치 * /lib/color-picker-1.0.0/color-picker.css * /lib/color-picker-1.0.0/color-picker.js * /uicontrols/ColorPicker/ColorPicker.css * /uicontrols/ColorPicker/ColorPicker.js #### 다운로드: https://github.com/taufik-nurrohman/color-picker #### 공식예제: https://taufik-nurrohman.js.org/color-picker/ #### 사용법 ```html ``` ## ContextMenu 오른쪽 마우스 버튼 기능을 활용하여 컨텍스트 메뉴를 제공합니다. #### 소스위치 * /lib/jquery-ui-contextmenu-1.18.1/jquery-ui.css * /lib/jquery-ui-contextmenu-1.18.1/jquery-ui.js * /lib/jquery-ui-contextmenu-1.18.1/jquery.ui-contextmenu.js * /uicontrols/ContextMenu/ContextMenu.css * /uicontrols/ContextMenu/ContextMenu.js #### 다운로드: https://github.com/mar10/jquery-ui-contextmenu #### 공식예제: https://wwwendt.de/tech/demo/jquery-contextmenu/demo/ #### 사용법 ```html ``` ## DataSource 단일 또는 여러 데이터 건의 데이터 소스 객체 기능을 제공합니다. #### 소스위치 * /uicontrols/DataSource/DataSource.css * /uicontrols/DataSource/DataSource.js #### 사용법 ```html ``` ## DatePicker 날짜 선택 기능을 제공합니다. #### 소스위치 /lib/pikaday-1.8.0/pikaday.css /lib/moment-2.24.0/moment.js /lib/pikaday-1.8.0/pikaday.js /uicontrols/DatePicker/DatePicker.cs /uicontrols/DatePicker/DatePicker.js #### 다운로드: https://github.com/Pikaday/Pikaday, https://github.com/moment/moment #### 공식예제: https://pikaday.com/ #### 사용법 ```html ``` ## DropDownCheckList, DropDownList 여러 개의 항목을 선택 할 수 있는 콤보박스를 제공합니다. #### 소스위치 * /lib/tail.select-0.5.15/css/default/tail.select-light.css * /lib/tail.select-0.5.15/js/tail.select.js * /uicontrols/DropDownCheckList/DropDownCheckList.css * /uicontrols/DropDownCheckList/DropDownCheckList.js #### 다운로드: https://github.com/wolffe/tail.select.js #### 사용법 ```html ``` ## FileClient 파일 업로드/다운로드 기능을 제공합니다. #### 소스위치 * /uicontrols/FileClient/FileClient.css * /uicontrols/FileClient/FileClient.js #### 사용법 ```html ``` ## FileDropZone 파일을 끌어다 놓아 repository 모듈로 업로드하고 목록에서 다운로드/삭제합니다. 값은 업로드가 끝난 파일 항목 객체 배열입니다. #### 소스위치 * /lib/dropzone/dist/dropzone-min.js * /lib/dropzone/dist/dropzone.css * /uicontrols/FileDropZone/FileDropZone.css * /uicontrols/FileDropZone/FileDropZone.js #### 다운로드: https://github.com/enyo/dropzone #### 사용법 ```html ``` ## HtmlEditor 파일 업로드/다운로드 기능이 통합된 HTML 편집기 기능을 제공합니다. #### 소스위치 * /lib/tinymce-5.6.0/tinymce.min.js * /uicontrols/HtmlEditor/HtmlEditor.css * /uicontrols/HtmlEditor/HtmlEditor.js #### 다운로드: https://github.com/tinymce/tinymce, https://www.tiny.cloud/docs/release-notes/release-notes56/ #### 공식예제: https://www.tiny.cloud/docs/demo/ #### 사용법 ```html ``` ## RadioButton 브라우저마다 다르게 표시되는 라디오버튼을 일관되게 표현합니다. #### 소스위치 * /uicontrols/RadioButton/RadioButton.css * /uicontrols/RadioButton/RadioButton.js #### 사용법 ```html ``` ## SignaturePad 마우스·터치로 서명을 입력받고 base64 data URL 문자열(getValue/setValue)로 값을 관리합니다. #### 소스위치 * /lib/signature_pad/dist/signature_pad.umd.min.js * /uicontrols/SignaturePad/SignaturePad.css * /uicontrols/SignaturePad/SignaturePad.js #### 다운로드: https://github.com/szimek/signature_pad #### 사용법 ```html ``` ## SourceEditor 소스 편집기에 특화된 에디터 기능을 제공합니다. #### 소스위치 * /lib/monaco-editor-0.39.0/vs/loader.js * /lib/monaco-editor-0.39.0/vs/editor/editor.main.js * /uicontrols/SourceEditor/SourceEditor.css * /uicontrols/SourceEditor/SourceEditor.js #### 다운로드: https://github.com/microsoft/monaco-editor #### 공식예제: https://microsoft.github.io/monaco-editor/ #### 사용법 ```html ``` ## TextArea 여러 텍스트 줄을 관리하기 위한 추가 기능을 제공합니다. #### 소스위치 * /lib/codemirror-5.50.2/codemirror.css * /lib/codemirror-5.50.2/codemirror.js * /uicontrols/TextArea/TextArea.css * /uicontrols/TextArea/TextArea.js #### 다운로드: https://github.com/codemirror/codemirror5 #### 공식예제: https://codemirror.net/5/ #### 사용법 ```html ``` ## TextBox 단일 텍스트을 관리하기 위한 추가 기능을 제공합니다. #### 소스위치 * /lib/jquery.maskedinput-1.3.js' * /lib/ispin-2.0.1/ispin.js' * /lib/superplaceholder-1.0.0/superplaceholder.js' * /lib/vanilla-masker-1.1.1/vanilla-masker.js' * /uicontrols/TextBox/TextBox.css * /uicontrols/TextBox/TextBox.js #### 다운로드: https://github.com/uNmAnNeR/ispinjs, https://github.com/chinchang/superplaceholder.js, https://github.com/vanilla-masker/vanilla-masker #### 공식예제: https://unmanner.github.io/ispinjs/, https://vanilla-masker.github.io/vanilla-masker/ #### 사용법 ```html txtApplicationID - txtSpinnerID - txtCreateDate - txtHour - txtMinute - txtYearMonth - txtHomePhone - txtMobilePhone - txtEmail - txtCodeGroupID - txtJuminID - txtBusinessID - txtCustomFormat - txtMaxLength - ``` ## WebGrid (유료 라이선스 필요) 대량 편집에 가능한 그리드 컴포넌트 기능을 제공합니다. #### 소스위치 * /lib/handsontable-13.1.0/handsontable.full.css * /lib/papaparse-5.3.0/papaparse.js * /lib/sheetjs-0.16.8/xlsx.core.min.js * /lib/handsontable-13.1.0/handsontable.full.js * /lib/handsontable-13.1.0/languages/ko-KR.js * /uicontrols/WebGrid/WebGrid.css * /uicontrols/WebGrid/WebGrid.js #### 다운로드: https://github.com/handsontable/handsontable, https://github.com/mholt/PapaParse, https://github.com/gitbrent/xlsx-js-style #### 공식예제: https://handsontable.com/demo, https://www.papaparse.com/demo, https://gitbrent.github.io/xlsx-js-style/ #### 사용법 ```html ``` ## Element 최소한의 게더링 및 바인딩 기능을 제공합니다. #### 소스위치 * /uicontrols/Element/Element.js #### 사용법 ```html
span value 1 ``` ## Chart Highcharts와 Chart.js 기반 데이터 시각화 기능을 제공합니다. 두 컨트롤 모두 객체/객체 배열을 `setValue`로 받고 선택한 point의 원본 행을 Row/List 거래 형식으로 반환합니다. #### 소스위치 /lib/highcharts/highcharts.min.js /uicontrols/HighChart/HighChart.css /uicontrols/HighChart/HighChart.js /lib/chart.js/chart.umd.min.js /uicontrols/ChartJS/ChartJS.css /uicontrols/ChartJS/ChartJS.js #### 사용법 ```html ``` 상세 데이터 어댑터, 모듈, 선택 API는 [Chart](uicontrols/chart) 문서를 확인하세요. ## ECharts 객체 또는 객체 배열을 ECharts `dataset.source`로 연결하고 선택한 point의 원본 행을 Row/List 거래 형식으로 반환합니다. #### 소스위치 /lib/echarts/echarts.min.js /lib/echarts/i18n/langKO.js /uicontrols/ECharts/ECharts.css /uicontrols/ECharts/ECharts.js #### 사용법 ```html ``` ## GridList 데이터 조회에 특화된 기능을 제공합니다. #### 소스위치 * /lib/datatable-1.10.21/datatables.js * /lib/datatable-1.10.21/dataTables.checkboxes.js * /uicontrols/GridList/GridList.css * /uicontrols/GridList/GridList.js #### 다운로드: https://github.com/DataTables/DataTables #### 공식예제: https://www.datatables.net/examples/index #### 사용법 ```html ``` ## TreeView 재귀적으로 트리 구조를 표현하는 기능을 제공합니다. #### 소스위치 * /lib/fancytree-2.38.0/skin-win8/ui.fancytree.css * /lib/fancytree-2.38.0/modules/jquery.fancytree.ui-deps.js * /lib/fancytree-2.38.0/modules/jquery.fancytree.js * /uicontrols/TreeView/TreeView.css * /uicontrols/TreeView/TreeView.js #### 다운로드: https://github.com/mar10/fancytree #### 공식예제: https://wwwendt.de/tech/fancytree/demo/ #### 사용법 ```html ``` ## JsonEditor JSON 데이터를 직관적으로 편집하는 기능을 제공합니다. #### 소스위치 * /lib/jsoneditor-9.10.0/jsoneditor.css * /lib/jsoneditor-9.10.0/jsoneditor.js * /uicontrols/JsonEditor/JsonEditor.css * /uicontrols/JsonEditor/JsonEditor.js #### 다운로드: https://github.com/josdejong/jsoneditor #### 공식예제: https://jsoneditoronline.org/ #### 사용법 ```html ``` ## OrganizationView 조직도 데이터를 직관적으로 편집하는 기능을 제공합니다. #### 소스위치 * /lib/orgchart-3.1.1/jquery.orgchart.css * /lib/orgchart-3.1.1/jquery.orgchart.js * /uicontrols/OrganizationView/OrganizationView.css * /uicontrols/OrganizationView/OrganizationView.js #### 다운로드: https://github.com/dabeng/OrgChart #### 사용법 ```html ``` --- title: $array 사용법 ($array) url: https://handstack.kr/docs/startup/learning/syn/array --- # $array 사용법 ($array) ## 개요 `$array`는 자바스크립트 `Array` 객체를 대상으로 하는 확장 함수 모음입니다. 배열 정렬, 그룹화, 집합 연산(합집합/차집합/교집합), 값 검색, 순위 계산 등 목록 데이터를 다룰 때 자주 필요한 기능을 제공합니다. `syn.js`가 로드되면 전역 객체로 즉시 사용할 수 있으며, `syn.$array`와 같은 별도의 `syn.` 접두 별칭은 없습니다. ## 로드 방법 `syn.js`가 로드되면 전역에 `$array`로 즉시 사용할 수 있습니다. 별도의 초기화나 `new` 호출이 필요하지 않습니다. ## 빠른 시작 ```js const unique = $array.distinct(['Apple', 'Banana', 'Banana', 'Mango']); // ["Apple", "Banana", "Mango"] const sorted = $array.sort(['Banana', 'Apple', 'Mango'], true); // ["Apple", "Banana", "Mango"] ``` ## 주요 시나리오 ### 중복 제거와 정렬 목록성 데이터를 화면에 표시하기 전에 중복을 제거하고 정렬해야 하는 경우가 많습니다. ```js const items = ['Apple', 'Banana', 'Banana', 'Mango', 'Cherry']; const result = $array.sort($array.distinct(items), true); ``` ### 객체 배열 정렬과 그룹화 그리드나 목록 화면에서 특정 속성 기준으로 정렬하거나 그룹화할 때 사용합니다. ```js const rows = [{ name: 'Apple', price: 10 }, { name: 'Banana', price: 5 }]; const sortedByPrice = $array.objectSort(rows, 'price', true); const grouped = $array.groupBy(rows, ({ price }) => price <= 5 ? 'buy' : 'not buy'); ``` ### 두 배열의 집합 연산 서버에서 받은 목록과 화면에 있는 목록을 비교할 때 합집합/차집합/교집합/대칭차집합을 활용할 수 있습니다. ```js const server = ['Apple', 'Banana', 'Mango']; const local = ['Grape', 'Banana', 'BlueBerry']; $array.union(server, local); // 합집합 $array.difference(server, local); // server 기준 차집합 $array.intersect(server, local); // 교집합 $array.symmetryDifference(server, local); // 대칭차집합 ``` ### 파라미터 배열에서 값 찾기 서버 응답이 `[{ ParameterName, Value }]` 형태의 파라미터 배열로 오는 경우, `getValue`로 값을 안전하게 조회할 수 있습니다. ```js const items = [{ ParameterName: 'MaxCount', Value: '100' }]; $array.getValue(items, 'MaxCount', '0'); // "100" $array.getValue(items, 'NotExists', '0'); // "0" (기본값) ``` ### 순위 계산 동점 처리가 포함된 순위를 계산할 때 `ranks`를 사용합니다. ```js $array.ranks([79, 5, 18, 5, 32], false); // 내림차순 기준 순위 배열 ``` ## 실전 예제 페이지 `/sample/syn/extension_array.html` 예제에서 다음 항목을 실습할 수 있습니다. - `$array.distinct()` - 중복 제거 - `$array.sort()` - 정렬 - `$array.objectSort()` - 객체 배열 속성 기준 정렬 - `$array.groupBy()` - 그룹화(문자열 키, 배열 length, 함수 predicate 지원) - `$array.shuffle()` - 무작위 섞기 - `$array.addAt()` / `$array.removeAt()` - 지정 위치 추가/삭제 - `$array.contains()` - 포함 여부 확인 - `$array.merge()` - predicate 기반 병합 - `$array.union()` / `$array.difference()` / `$array.intersect()` / `$array.symmetryDifference()` - 집합 연산 - `$array.getValue()` - 파라미터 배열에서 값 조회 - `$array.ranks()` - 순위 계산 - `$array.split()` - 구분자 문자열을 배열로 변환 ## 주의 사항 - `$array`의 대부분의 메서드는 원본 배열을 변경하지 않고 새 배열을 반환합니다(불변성 유지). - `$array.split()`은 배열이 아니라 문자열을 입력으로 받아 배열로 변환하는 메서드입니다. 이미 배열인 값에는 사용하지 마세요. - `groupBy`의 두 번째 인자는 속성명(문자열) 또는 `(item) => key` 형태의 함수 모두 사용할 수 있습니다. - `merge`의 predicate 기본값은 `(a, b) => a === b`이며, 객체 배열을 병합할 때는 적절한 predicate를 지정해야 중복 판정이 올바르게 동작합니다. - 예제 페이지의 "속성" 카드에 있는 `$array.version` 값은 다른 syn.js 샘플 페이지와 동일하게 `syn.$m.version`(라이브러리 공용 버전 표시 관례)을 그대로 사용합니다. ## 관련 모듈 - API 상세는 아래 API 참조 섹션을 확인하세요. ## API 참조 ## 모듈 정보 | 항목 | 내용 | |---|---| | 전역 별칭 | `$array` (전역, `syn.$array` 별칭 없음) | | 예제 페이지 | `/sample/syn/extension_array.html` | | 의존 모듈 | `$string` (`ranks()` 내부에서 `context.$string.toNumber()` 사용) | ## 메서드 ### `$array.distinct(arr)` - 설명: 배열에서 중복된 항목을 제거한 새 배열을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array | Y | 대상 배열 | - 반환값: `Array` — 중복이 제거된 배열. 배열이 아니면 빈 배열을 반환합니다. - 예시 ```js const result = $array.distinct(['Apple', 'Banana', 'Banana', 'Mango']); ``` ### `$array.sort(arr, ascending = true)` - 설명: 배열 항목을 오름차순 또는 내림차순으로 정렬한 새 배열을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array | Y | 대상 배열 | | ascending | boolean | N | true면 오름차순, false면 내림차순(기본값 true) | - 반환값: `Array` — 정렬된 배열 - 예시 ```js const result = $array.sort(['Banana', 'Apple', 'Mango'], false); ``` ### `$array.objectSort(arr, prop, ascending = true)` - 설명: 객체 배열을 지정한 속성값 기준으로 정렬한 새 배열을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array\ | Y | 대상 객체 배열 | | prop | string | Y | 정렬 기준이 되는 속성명 | | ascending | boolean | N | true면 오름차순, false면 내림차순(기본값 true) | - 반환값: `Array` — 정렬된 객체 배열 - 예시 ```js const result = $array.objectSort([{ name: 'Apple', price: 10 }, { name: 'Banana', price: 5 }], 'price', true); ``` ### `$array.groupBy(data, predicate)` - 설명: 배열 항목을 지정한 속성명 또는 함수의 반환값 기준으로 그룹화한 객체를 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | data | Array | Y | 대상 배열 | | predicate | string \| Function | Y | 그룹 키로 사용할 속성명 또는 `(item) => key` 함수 | - 반환값: `Object` — 그룹 키를 속성으로 갖고 값은 해당 그룹에 속한 항목 배열인 객체 - 예시 ```js const result = $array.groupBy([{ name: 'Apple', price: 10 }, { name: 'Banana', price: 5 }], ({ price }) => price <= 5 ? 'buy' : 'not buy'); ``` ### `$array.shuffle(arr)` - 설명: 배열 항목의 순서를 무작위로 섞은 새 배열을 반환합니다(Fisher–Yates 셔플). - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array | Y | 대상 배열 | - 반환값: `Array` — 순서가 섞인 배열 - 예시 ```js const result = $array.shuffle([0, 1, 2, 3, 4, 5]); ``` ### `$array.addAt(arr, index, val)` - 설명: 지정한 위치에 값을 추가한 새 배열을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array | Y | 대상 배열 | | index | number | Y | 삽입할 위치(범위를 벗어나면 0 또는 배열 길이로 보정) | | val | any | Y | 추가할 값 | - 반환값: `Array` — 값이 추가된 배열 - 예시 ```js const result = $array.addAt(['Apple', 'Banana', 'Mango'], 1, 'Cherry'); ``` ### `$array.removeAt(arr, index)` - 설명: 지정한 위치의 항목을 삭제한 새 배열을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array | Y | 대상 배열 | | index | number | Y | 삭제할 위치(0 이상, 배열 길이 미만인 경우만 삭제) | - 반환값: `Array` — 항목이 삭제된 배열 - 예시 ```js const result = $array.removeAt(['Apple', 'Banana', 'Mango'], 1); ``` ### `$array.contains(arr, val)` - 설명: 배열에 지정된 값이 포함되어 있는지 확인합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array | Y | 대상 배열 | | val | any | Y | 포함 여부를 확인할 값 | - 반환값: `boolean` — 포함 여부 - 예시 ```js const result = $array.contains(['Apple', 'Banana'], 'Banana'); // true ``` ### `$array.merge(arr, brr, predicate = (a, b) => a === b)` - 설명: predicate 조건으로 중복 여부를 판단하여 두 배열을 병합한 새 배열을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | arr | Array | Y | 기준 배열 | | brr | Array | Y | 병합할 배열 | | predicate | Function | N | 중복 판단 함수 `(bItem, cItem) => boolean` (기본값: 완전 일치) | - 반환값: `Array` — 병합된 배열 - 예시 ```js const result = $array.merge(['Apple', 'Banana'], ['Grape', 'Banana']); ``` ### `$array.union(sourceArray, targetArray)` - 설명: 두 배열의 합집합(중복 제거)을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | sourceArray | Array | Y | 첫 번째 배열 | | targetArray | Array | Y | 두 번째 배열 | - 반환값: `Array` — 합집합 배열 - 예시 ```js const result = $array.union(['Apple', 'Banana'], ['Banana', 'Mango']); ``` ### `$array.difference(sourceArray, targetArray)` - 설명: sourceArray에서 targetArray에 존재하지 않는 항목만 남긴 차집합을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | sourceArray | Array | Y | 기준 배열 | | targetArray | Array | Y | 제외할 값이 담긴 배열 | - 반환값: `Array` — 차집합 배열 - 예시 ```js const result = $array.difference(['Apple', 'Banana'], ['Banana']); ``` ### `$array.intersect(sourceArray, targetArray)` - 설명: 두 배열에 공통으로 존재하는 항목의 교집합을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | sourceArray | Array | Y | 첫 번째 배열 | | targetArray | Array | Y | 두 번째 배열 | - 반환값: `Array` — 교집합 배열 - 예시 ```js const result = $array.intersect(['Apple', 'Banana'], ['Banana', 'Mango']); ``` ### `$array.symmetryDifference(sourceArray, targetArray)` - 설명: 두 배열 중 한쪽에만 존재하는 항목(대칭차집합)을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | sourceArray | Array | Y | 첫 번째 배열 | | targetArray | Array | Y | 두 번째 배열 | - 반환값: `Array` — 대칭차집합 배열 - 예시 ```js const result = $array.symmetryDifference(['Apple', 'Banana'], ['Banana', 'Mango']); ``` ### `$array.getValue(items, parameterName, defaultValue, parameterProperty, valueProperty)` - 설명: 파라미터 형태의 객체 배열에서 이름으로 값을 찾아 반환합니다. 항목을 찾지 못하면 기본값을 반환합니다. 기본적으로 `ParameterName`/`parameterName` 속성을 이름으로, `Value`/`value` 속성을 값으로 사용하며, `parameterProperty`/`valueProperty`로 다른 속성명을 지정할 수 있습니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | items | Array\ | Y | 파라미터 객체 배열 | | parameterName | string | Y | 찾을 파라미터 이름 | | defaultValue | any | N | 값을 찾지 못했을 때 반환할 기본값(생략 시 `''`) | | parameterProperty | string | N | 이름 속성명을 직접 지정(생략 시 `ParameterName`/`parameterName` 사용) | | valueProperty | string | N | 값 속성명을 직접 지정(생략 시 `Value`/`value` 사용) | - 반환값: `any` — 찾은 값 또는 기본값 - 예시 ```js const items = [{ ParameterName: 'MaxCount', Value: '100' }]; const result = $array.getValue(items, 'MaxCount', '0'); ``` ### `$array.ranks(values, asc = false)` - 설명: 배열 값들의 순위를 계산하여 원본 순서에 대응하는 순위 배열을 반환합니다. 동일한 값은 같은 순위로 처리됩니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | values | Array | Y | 순위를 계산할 값 배열 | | asc | boolean | N | true면 오름차순 기준 순위, false면 내림차순 기준 순위(기본값 false) | - 반환값: `Array` — 원본 배열의 각 위치에 대응하는 순위 배열 - 예시 ```js const result = $array.ranks([79, 5, 18, 5, 32]); ``` ### `$array.split(value, flag = ',')` - 설명: 구분자로 분리된 문자열을 트리밍 후 빈 항목을 제거한 배열로 변환합니다. 입력값이 문자열이 아니면 빈 배열을 반환합니다. - 매개변수 | 이름 | 타입 | 필수 | 설명 | |---|---|---|---| | value | string | Y | 분리할 문자열 | | flag | string | N | 구분자(기본값 `,`) | - 반환값: `Array` — 분리된 문자열 배열 - 예시 ```js const result = $array.split('Apple, Banana ,Mango'); ``` --- title: 양방향 데이터 바인딩 사용법 (syn.$bind) url: https://handstack.kr/docs/startup/learning/syn/binding --- # 양방향 데이터 바인딩 사용법 (syn.$bind) ## 개요 `syn.$bind`는 순수 객체(`{}`) 및 평면 객체 배열(`[{}, {}, ...]`)을 Proxy로 감싸서, 프로퍼티 값 변경/재할당, 배열 `push`·`pop`·`splice`·정렬, 배열 인덱스 직접 교체, 배열 내 객체 값 변경을 표준 JS 문법만으로 감지하고 화면에 반영하는 모듈입니다. [syn.uicontrols.$data](https://handstack.kr/docs/startup/handsonlab/syn.controls/syn.uicontrols.$data)가 `syn-datafield`/`syn-options` 메타 설정 기반으로 HandStack 전용 컨트롤(`syn_grid`, `syn_data` 등)을 바인딩하는 것과는 별개의 기능입니다. `$bind`는 `syn-bind`/`syn-bind-list` 속성만으로 표준 `HTMLElement`는 물론 AUIGrid, Handsontable, tail-select, daterangepicker 같은 임의의 커스텀 컨트롤까지 `get`/`set`/`on`/`off` 4개 함수(어댑터) 구현만으로 가볍게 양방향 연결하고 싶을 때 사용합니다. 두 시스템은 서로 다른 HTML 속성을 사용하므로 같은 화면에서 함께 써도 충돌하지 않습니다. ## 로드 방법 `syn.js`가 로드되면 전역에 `syn.$bind`로 즉시 사용할 수 있습니다. 별도 활성화 설정이나 외부 라이브러리 의존성은 없습니다. ## 빠른 시작 ```html ``` ```javascript const mounted = syn.$bind.mount(document.body, { user: { name: '홍길동' } }); mounted.store.data.user.name = '김철수'; // 표준 JS 문법으로 값 변경 시 화면 자동 반영 mounted.destroy(); // 바인딩 해제 ``` 데이터 변경은 별도 API 없이 표준 JS 문법을 그대로 사용합니다. ```javascript store.data.user.name = '홍길동'; // 프로퍼티 값 변경 store.data.user = { name: '김철수' }; // 프로퍼티(객체) 재할당 store.data.items.push({ title: '신규' }); // 배열 push store.data.items[2] = { title: '교체' }; // 배열 인덱스 직접 변경 store.data.items[2].title = '수정'; // 배열 내 객체 값 변경 store.data.items.splice(1, 1); // 배열 splice ``` ## 주요 시나리오 ### 선언적 바인딩 문법 `syn-bind` 속성에 `타입1(인자1):경로1; 타입2(인자2):경로2` 형태로 여러 바인딩을 세미콜론으로 나열할 수 있습니다. 내장 타입은 `text`, `html`, `value`, `checked`, `radio`, `edit`, `show`, `hide`, `disabled`, `class(이름)`, `attr(이름)`, `style(속성)`, `adapter(어댑터명)`입니다. ```html 사용중 미사용 ``` ### 리스트(배열) 반복 바인딩 `syn-bind-list="경로"` 컨테이너 안에 `