본문으로 건너뛰기

"handstack" 태그로 연결된 23개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 8분
조준철

IT 프로젝트에서 문서화의 품질은 이해당사자 간의 합의, 즉 프로젝트 관련자들이 문서화의 필요성과 중요성에 대해 동일한 이해를 하고 있는지가 중요합니다.

문서화는 시간과 비용이 많이 소요되는 작업이기 때문인데, 이들이 문서화의 목표와 방향에 대해 합의하면, 문서화의 품질과 정보 공유의 만족도가 좋아질 가능성이 높아집니다.

작성하게 되는 문서 분류는 크게 세 가지 주요 그룹을 대상으로 구성되어 있습니다.

  • 첫 번째 그룹은 고객 사용자들로, 제품이나 서비스에 대한 이해를 돕고, 고객의 요구사항을 충족시키는 데 초점을 맞추고 있습니다. 이러한 문서는 사용자 설명서, FAQ, 제품 사양서 등을 포함할 수 있습니다.
  • 두 번째 그룹은 운영 업무를 담당하는 사람들로, S/W, H/W, N/W 아키텍처, 내부 프로세스, 시스템 구조, 환경설정 문서화 등에 대한 정보를 제공하는 데 중점을 두고 있습니다. 이러한 문서는 운영 업무에 필요한 기술 사양서, 시스템 아키텍처, 프로젝트 관리 문서 등을 포함할 수 있습니다.
  • 세 번째 그룹은 개발 업무를 담당하는 사람들로, 이들에게 제공되는 문서는 주로 소프트웨어 개발, 시스템 아키텍처, 소스코드, 데이터 정보, 배포 관리 등에 대한 정보를 제공하는 데 중점을 두고 있습니다. 이러한 문서는 개발 가이드라인, 코드 문서화, 시스템 아키텍처 문서 등을 포함할 수 있습니다.

제가 주로 풀 스택으로 웹 개발을 하다 보니 웹 분야에 중점을 둔 내용이긴 합니다만, 이 중에서 개발자의 관점으로 첫 번째 그룹인 고객 사용자들을 위한 도움말을 어떻게 저비용으로 고효율을 만들고 유지할 수 있을까? 생각해 보았는데, 그 이유는 고객 사용자들과 직접적인 합의가 어렵기 때문입니다.

대부분은 IT 프로젝트의 문서화에 대한 지침이 없으므로, 먼저 IT 프로젝트에서 특정 화면이나 기능에 대한 도움말 문서를 작성해야 할 때 따라 할 수 있는 주어진 상황에 따라 적용할 수 있는 간단한 기준을 만들어봤습니다.

  • 읽는 대상 요구 파악하기: 누가 이 문서를 사용하게 될지 파악하고, 가능하다면 당사자의 요구를 확인하고 그것에 맞게 문서를 조정하는 것이 지름길입니다.
  • 튜토리얼 또는 레퍼런스를 작성하기: 사용자가 기능을 더 잘 이해하거나 사용하는 데 도움이 될 수 있는 추가 정보와 함께 화면/기능에 대한 사용 방법을 명확하게 설명하는 상세한 단계별 튜토리얼 또는 참조 가이드를 만듭니다.
  • 단순하게 만들기: 대부분은 문서가 길어지면 안 봅니다. 의도적으로 명확한 고객이 이해할 수 있는 전문 용어를 사용하세요. 필요한 경우에만 자세한 설명을 제공하세요.
  • 검색할 수 있게 만들기: 검색하기 쉬운 방식으로 문서를 정리하세요. 기능과 관련된 키워드를 사용하고 관련 주제나 기능에 대한 링크를 제공하세요. 사용자가 필요한 정보를 빠르게 찾을 방법이 필요합니다.
  • 최신 상태로 유지하기: 화면/기능이 추가 되거나 개선함에 따라 문서도 반영되어야 합니다.

문서의 품질은 사용자가 기능을 인식하고 사용하는 방식에 도움을 주기 때문에 시간을 들여 일관성 있고 명확하며 사용자 친화적인 도움말 가이드를 작성하는 것이 좋습니다. 약간의 노력이 필요할 수도 있지만 그만한 가치가 있습니다.

제가 고객 사용자를 위해 작성해 본 정보 형식은 워드나 파워포인트 파일을 PDF로 제공하는 문서 외에 고객 만족도가 좋았던 기능들은 다음과 같습니다.

  • HTML/Markdown 에디터로 만든 내용을 링크
  • 주요 입력 항목에 움직이는 애니메이션 placeholder 제공
  • 화면 내 주요 항목에 툴팁 제공
  • 화면 내 하드 코딩된 도움 문장을 보여주거나 숨기기
  • 화면 내 단계별로 동작하는 가이드 팝업

이 기능들을 위해 사용하는 오픈소스는 다음과 같습니다.

다른 웹, CLI/GUI 응용 프로그램, 기타 IT 프로젝트에서 고객 사용자를 위한 IT 프로젝트의 화면/기능에 대한 도움말은 어떻게 만들고 계시는지 궁금하네요.

· 약 6분
조준�철

지난 글을 올린지 한달이 되었네요. HandStack 개발 프레임워크를 작년 12월에 Github에 공개한 후 지속적으로 업데이트 하면서 좀 더 접근성이 좋게 만들 필요성을 느껴서 이런게 있으면 좋겠다~ 싶은 아이디어를 오픈 가능한 수준으로 만들기 위해 열심히 만드는 중입니다.

사이드 프로젝트로 진행하다보니 문서화도 안되고, 정리도 안되고, 버그나 예기치 못한 이슈에 대한 대응도 늦지만 중요한 건 하나하나 꾸준히 진행되고 있습니다.

HandStack 프로젝트는 한마디로 클라우드 네이티브 앱 개발 및 관리 SDK 입니다. 특화된 영역의 개발자를 대상으로 하다보니 초기 설정에서 부터 활용하기 까지 접근성이 높지만 이것을 기반으로 그룹웨어, 쇼핑몰 솔루션 개발과 회사 SI 프로젝트에 적용중이고, 지인 개발 회사에서도 도입하고 있는 오픈소스입니다.

그래서 HandStack 을 셀프 호스트로 세팅하지 않고 웹 브라우저로 바로 개발 경험 해 볼수 있는 방안을 고민하다가 HandStack SaaS 서비스 플랫폼이라는 아이디어를 오류투성이지만 코드 공유 프로젝트로 소개합니다.

  • HandStack === 클라우드 네이티브 앱 개발 및 관리 SDK
  • Qrame === HandStack 으로 개발된 SaaS 서비스 플랫폼

Qrame 서비스의 목표는 원래 HandStack 으로 할 수 있는 것을 UI 도구화 하는 것입니다. 여기에서 만들어진 코드는 셀프 호스트에서도 동작합니다. Qrame 서비스의 핵심 가치는 다음과 같습니다.

  • 코드 공유하기
  • 코드 검색하기
  • 코드 연계하기
  • 코드 협업하기
  • 코드 배포하기

이 가치를 기준으로 HandStack 을 이용하여 지속적인 기능 개선을 진행하고 있습니다. 제가 예전에 만든 게시판 예제는 다음에서 확인 할 수 있습니다. 게시판 소스코드에 대한 설명은 여기를 참조하세요.

https://qrame.kr 에 방문하시면 회원가입 없이 이메일로 시작 페이지를 발송하며, 구글 메일로 로그인 할 경우 바로 시작 페이지로 이동하게 됩니다. 처음 로그인하면 이름, 직급, 회사명과 같은 부가정보는 협업할 때 공유되므로 적절하게 입력하시면 됩니다.


한 달간의 여정 (2024-05-22 ~ 2024-06-22)

  • LoadModuleConfig 검증 추가
  • 클라이언트 모듈 설정 지원 추가
  • dark 모드 라이브러리 추가
  • 버그 수정 및 기능 개선
  • HTML 요소의 기본 type을 text로 고정
  • BearerToken 정보가 훼손되거나 확인 할 수 없을 때 문구 추가
  • 템플릿 내용 수정
  • 레이블 기본 마진값 변경
  • 버그 수정 및 기본 스크립트 변경
  • notifier.css 기본 추가
  • notifier 리소스 변경
  • 리소스 로드 기능 개선
  • Http 프록시 헤더 전달 및 로깅 기능 추가
  • Node.js 기반 checkip 서버 추가
  • ip 주소 조회 기능 개선
  • clientip 조회 Uri 개선
  • Referer 처리 기능 개선
  • 불 필요한 코드 삭제
  • 고유 ID 생성 확인 기능 추가
  • 터미널 명령 실행후 성공 종료 코드를 설정하도록 개선
  • base64 url 인코드, 디코드 기능 추가
  • moment 한국어 로케일 추가
  • moment.js 번들 추가
  • 빌드 설정 변경
  • 경로 오류 수정
  • 웹 폰트 적용
  • css bundle 대응 기본 경로 개선
  • 한줄문구 변경
  • bash 스크립트 캐리지 리턴 변경
  • handstack CLI 컴파일시 게시 디렉토리로 복사 추가
  • Forbes 앱 ID 부여 버그 수정
  • 참조 라이브러리 버전 업데이트 대응 문법 수정
  • 처음 실행시 checkup 실행 경로 로그 추가
  • dispose 앱 정리 버그 수정
  • task.bat, task.sh 업무 스크립트 개선
  • 태넌트 앱 > Forbes 앱 명칭 변경
  • 참조 라이브러리 버전 업데이트
  • 거래 로그 기록 개선
  • 로그 파일 기록 기능 및 UI 컨트롤 기능 개선
  • 공통 기능 개선 및 버그 수정
  • 캐시, 로그 경로 개선
  • 공통 기능 개선 및 버그 수정
  • 파일 동기화 대기시간 추가 및 버그 수정
  • AUIGrid 컨트롤 기능 추가
  • AI 메시지 영역 height을 100% 처리
  • prompter 모듈 빌드 추가

· 약 24분
조준철

최근 프롬프트 엔지니어링에 대한 관심이 생겨 마이크로소프트의 Semantic Kernel(시맨틱 커널)을 사용해서 HandStack 프로그램에서 생산성에 도움이 될 만한 다양한 문법을 테스트 해보고 있었습니다.

이를 통해 HandStack 프로그램에 적용할 수 있는 방법을 고민해보았고, 이에 대한 경험을 공유하는 게 의미가 있을 것 같아 이 글을 작성하게 되었습니다. 시맨틱 커널로 닷넷 기반 프로그램에 프롬프트 엔지니어링을 도입하는 방법을 고민하시는 분들에게 도움이 되었으면 합니다.

시맨틱 커널은 LLM 기반의 생성형 AI 기능을 프로그램에 적용하기 위한 C#, Java, Python 언어를 지원하는 프레임워크로, 특정 업무에 대한 프롬프트를 사전에 템플릿화 하여 실행하는 데 사용됩니다. 이를 통해 사용자의 요청에 대한 응답을 생성하거나, 또 다른 프롬프트를 실행하는 데 사용됩니다. 아마 Python, Typescript 등의 언어로 개발된 프로그램에서는 LangChain(랭체인)을 많이 사용하실 거라 생각합니다. 간단하게 시맨틱 커널은 C#, 랭체인은 Python 기반의 프로그램에 사용되는 프롬프트 엔지니어링 프레임워크입니다.

C# 기반의 프로그램에서 시맨틱 커널을 사용하는 방법에 대한 정보는 랭체인에 비해 상대적으로 부족한 편입니다. LLM 분야가 워낙 빠르게 발전하고 있는데다, 시맨틱 커널의 릴리즈가 거의 1주일에 한 번씩 이루어지다보니 구글 검색이나 ChatGPT 에 물어보는 정보는 대부분 호환성이 없는 불 필요한 정보들 뿐입니다.

이해가 되는 부분인 것이 LLM 분야는 춘추삼국시대와 같이 오픈 AI GPT, 메타 라마, 구글 제미나이를 중심으로 혼란스러운 시기에 있으면서 학술적으로도 많은 연구가 이루어지고 있습니다. 핵심 기능 자체가 외부 종속성을 기본적으로 가지고 있는 특징을 가지다보니 시맨틱 커널을 사용하는 방법에 대한 최신 정보가 부족한 것이 당연한 것이라 생각합니다.

LLM 분야는 미국에서 정부, 민간 차원에서 하드웨어, 소프트웨어, 학술적으로 주도하고 있기 때문에, 한국에서는 이에 대응하여 더 많은 정보를 얻을 수 있는 특화된 분야의 연구가 이루어지고 있습니다.

시맨틱 커널 시작하기

시맨틱 커널을 사용하기 위해서는 먼저 공식 문서를 참고하는 것이 가장 좋습니다.

LLM 분야가 빠르게 발전하는 중이어서 영어로만 공식 문서를 제공하고 있으니, 문서를 읽는 것이 부담스러우시다면, DeepL를 설치하여 번역을 참고하시면 됩니다.

공식 문서의 내용은 큰 그림이나 개념을 설명하는 데 중점을 두고 있어, C# 개발 언어에 익숙하지 않더라도 LLM 기능을 프로그램에 적용하기 위한 개념을 학습하는데 도움이 됩니다. (랭체인의 문서를 보는데도 도움이 됩니다.)

하지만 실제로 프로그램에 적용하기 위해서는 공식 문서보다도 Github의 예제 코드를 직접 참고하는 것이 더 도움이 됩니다.

시맨틱 커널의 C# 소스 코드는 거의 매일 업데이트 되고 있으며, 이에 대한 예제 또한 같이 업데이트가 되고 있어서 로컬에 git clone을 통해 소스 코드를 다운로드 받아서 사용하는 것이 좋습니다.

# git clone을 통해 소스 코드를 다운로드 받을 수 있습니다.
git clone microsoft/semantic-kernel

# git pull을 통해 최신 소스 코드를 받아올 수 있습니다.
git pull

# samples 해당 디렉토리로 이동하여 예제 코드를 확인할 수 있습니다.
cd \microsoft.semantic-kernel\dotnet\samples

개인적으로 Visual Studio 2022 통합 개발 도구를 설치해서 SK-dotnet.sln 실행하여 소스 코드를 확인하고, 예제를 확인 하는 것이 가장 편리하다고 생각합니다. 그 이유는 다음과 같습니다.

  • 주요 기능에 대한 단위 테스트가 포함되어 있어서, 소스 코드를 수정하거나, 새로운 기능을 추가할 때 테스트를 통해 검증할 수 있습니다.
  • 공식 문서에는 언급되지 않는 추가적인 내용이 많아서, 소스 코드를 확인하는 것이 더 도움이 됩니다.
  • 공식적으로 Open AI, Azure Open AI를 지원하지만 내부적으로 Google, HuggingFace, MistralAI, Onnx 등의 다양한 API를 사용 할 수 있도록 개발되고 있는 것을 알 수 있습니다.
  • 빠르게 변경되는 소스 코드에 대한 안정적인/실험적인 기능을 확인 할 수 있습니다. 실험적인 기능들은 다음 버전에 사라질 수 있으니 사용에 주의해야 합니다.

시맨틱 커널에 대한 문서는 많이 부족하지만, 소스 코드를 통해 확인하면서 이해하는 것이 가장 빠르게 프로그램에 적용하는 방법이라고 마이크로소프트 시맨틱 커널 개발팀이 말하고 있는듯 합니다.

프롬프트 엔지니어링

시맨틱 커널을 학습 하기 전에는 개인적으로 프롬프트를 작성하여 Copilot 이나 ChatGPT 에게 어떻게 하면 효과적인 질문을 할 수 있을지 고민하고 있었습니다.

그러나 개인(사람)이 아닌 프로그램에서 프롬프트를 작성하고, 더 효과적인 질문을 할 수 있게 하는것은 개인보다 더 상호 보완적인 관계를 가지고 있습니다.

프롬프트 엔지니어링은 사용자의 요청에 대한 응답을 생성하는 데 사용되는 기술로, 크게 다음과 같이 분류할 수 있습니다.

  • 사전 정의 프롬프트 템플릿
  • RAG (Retrieval Augmented Generation) 기반 프롬프트
  • Memory (Storage & Indexing) 기반 프롬프트

시맨틱 커널을 학습 하면서 느낀것은 RAG와 Memory는 의도적으로 안정화 되기 전까지 도입하기 힘들겠다는 것이었습니다. 그 이유는 RAG와 Memory는 LLM AI와 VectorDB 핵심 기능에서 주요 변경 사항이 있거나 새로운 기능을 추가할 때 시맨틱 커널에서 영향을 받을 경우 변경 가능성이 높은 기능들이기 때문입니다.

RAG를 지원하기 위해서는 적어도 로컬 또는 원격에서 오피스 문서, PDF 와 같은 파일들을 읽어와 임베딩을 생성하는 기능이 필요하고, Memory를 지원하기 위해서는 VectorDB 기반의 임베딩된 데이터를 인덱싱, 검색 기능이 필요합니다. 이러한 기능들은 시맨틱 커널에서 지원하는 기능이 아니라 별도의 라이브러리를 사용해야 하기 때문에 시맨틱 커널을 사용할 때 당분간은 프롬프트 템플릿을 활용하는 방법에 집중하는 것이 좋다고 생각합니다.

시맨틱 커널 소스에 RAG, Memory 기능을 사용하는 예제 코드가 있지만, 아직 실험적인 기능이 많기 때문에 안정화 되기 전까지는 사용에 주의해야 합니다.

사전 정의 프롬프트 템플릿

사전 정의 프롬프트 템플릿은 미리 정의한 문장에 사용자의 요청을 더해 응답을 생성하는 데 사용되는 기법으로, 특화된 업무에 따라 사용자의 요청에 대한 응답을 생성하는 데 사용됩니다.

예를 들면 "건강을 위해 칼로리 맞춤 요리 추천"을 위해 다음과 같은 프롬프트 템플릿을 사용할 수 있습니다.

너는 맛있는 음식을 쉽게 만들어 먹을 수 있는 레시피를 개발하는 요리 연구가야.
나는 1,800 칼로리 수준에서 맛있는 음식을 만들어 먹고 싶어.
매일 만들어 먹을 수 있는 5가지 초보 요리사를 위한 요리 레시피를 참고해서 제안해줘.

${UserMessage}

여기 ${UserMessage} 부분에 사용자의 질문을 더해 응답을 생성하는 데 사용됩니다. 예를 들어 사용자가 이렇게 질문을 요청합니다.

  • 나는 30대 남자이고 조금 살쪘어 어떤 요리가 좋을까?
  • 다이어트를 하는중인데, 여성을 위한 칼로리가 적은 음식을 추천해줘

어떠한 질문이든 사용자의 질문을 기반으로 맛있고 건강한 성인 남자 기준 하루 권장량인 1,800 칼로리 이내의 요리 레시피를 제안해 줍니다.

프롬프트 텍스트를 작성하는 기법은 다양하게 있습니다만 기본적으로 원칙을 준수하는 게 필요합니다. LLM 을 데이터베이스라고 생각하고 프롬프트 기법을 SQL 문법이라고 생각하는게 좋습니다.

구체적 지시 > 명확한 단어 > 맥락을 제공 > 응답 구조를 정의 > 일관성 유지

예시로 제공된 "건강을 위해 칼로리 맞춤 요리 추천" 텍스트는 제로샷(Zero Shot) 기법이고, 개인적으로 선호하는 방법은 다음과 같습니다.

  • Few Shot: 기본적이고 핵심적인 내용에 대한 예시를 제공하는 방법
  • 역할 지정: AI 모델에 특정한 역할을 부여하는 방법
  • 마크다운 활용: 텍스트를 구조화하여 질문을 생성하는 방법
  • 단락 구분 기법: 요청, 제약, 입력, 출력 등등 단락을 구분하여 질문을 생성하는 방법
  • 변수 활용: 프롬프트를 변수를 활용하여 동적으로 질문을 생성하는 방법
  • Q&A 기법: AI 모델이 질문에 대한 답변을 유도하여 생성하는 방법
  • 응답 형식 지정: 자연어 응답이 아닌 Json, Xml, Csv, Markdown 등등 특정 형식으로 템플릿 기반 응답을 생성하는 방법

구글 검색으로 각각의 키워드에 대해 알아보시면 다양한 정보를 확인할 수 있을겁니다. 다만 프롬프트에 대한 기법은 정답이 없습니다. 동일한 질문에 대해 GPT-3, GPT-4 모델과 매개변수 (TopP, Temperature, PresencePenalty, FrequencyPenalty) 설정에 따라 다른 결과를 생성할 수 있습니다. 이에 대한 것은 본인의 경험을 통해 효과적인 프롬프트를 작성하는 방법을 찾아보시길 권장합니다.

프롬프트 템플릿은 영어로 작성하는 게 더 좋은 결과를 만들어냅니다. 그 이유는 영어의 기본 흐름인 대화의 5형식을 기반으로 학습 데이터들이 제공되었기도 하지만 한국어만의 맛깔스러운(?) 뉘앙스를 영어로 번역하는 데 한계가 있어 다양한 질문을 번역되는 와중에 요청 의도와는 다른 응답을 생성하는 데 사용될 수 있기 때문입니다.

프롬프트 템플릿은 영어로 작성하고 질의는 한국어로 해도 어느정도 만족스러운 결과를 만들어냅니다. 그러나 한국어로 작성한 프롬프트 템플릿은 한국어로 질의하는 경우에만 사용하는 것이 좋습니다.

예제로 만든 프롬프트 템플릿

HandStack 프로그램에서 생산성에 도움이 될 만한 예제로 만든 프롬프트 템플릿은 gpt-3.5-turbo 를 기반으로 작성되었습니다. 프롬프트 템플릿 작성 참고용으로 봐주시면 좋을듯합니다. 여기에 있는 템플릿은 단일 대화 기능입니다.

프롬프트 엔지니어링에서 좀 더 실용적인 기능을 구현하기 위해서는 프롬프트를 실행하기 전에 도메인 데이터를 활용하여 동적으로 Few Shot을 구성하는 것과 이전 대화의 이력을 유지하는 것이 중요합니다. 이에 대한 예제는 다음에 작성하도록 하겠습니다.

prompter 모듈 시작하기

appsettings.json LoadModules 설정에 prompter 추가

dbclient, function 과 같이 이번에 추가된 prompter 모듈은 시맨틱 커널 기반으로 Open AI와 같은 LLM AI 연동 기능을 위해 프롬프트 템플릿 문법을 그대로 사용할 수 있도록 설계되었습니다. 이를 통해 다음과 같은 장점을 가집니다.

  • 클라이언트 요청에 전달되는 값은 프롬프트 템플릿내의 값 치환과 매개 변수로 매핑 둘다 가능합니다.
  • Open AI, Azure Open AI 등등 서비스를 지원합니다.
  • FewShow, History 기능을 지원합니다.
  • 프롬프트 템플릿을 동적으로 구성 가능하도록 설계되었습니다.

prompter 모듈을 활성화하기 위해 ack 서버 프로그램이 있는 디렉토리에 있는 appsettings.json 파일을 열고 LoadModules 설정에 prompter 추가합니다.

{
"AppSettings": {
......
"LoadModules": [
"wwwroot",
"transact",
"dbclient",
"function",
"repository",
"logger",
"checkup",
"prompter" <-- ack 서버 프로그램 실행시 로드할 모듈 추가
],
......
}
}

prompter module.json LLMSource 설정에 OpenAI ApiKey 추가

prompter 모듈내 Open AI을 API를 사용하기 위해 modules/prompter 디렉토리에 있는 module.json 파일을 열고 LoadModules 설정에 prompter 추가합니다.

{
"ModuleConfig": {
......
"LLMSource": [
{
"ApplicationID": "HDS",
"ProjectID": "*",
"DataSourceID": "LLM1",
"LLMProvider": "OpenAI",
"ApiKey": "[sk-proj-API...키]", <-- Open AI에서 발급한 API Key 추가
"ModelID": "gpt-3.5-turbo",
"IsEncryption": "N",
"Comment": "OpenAI 프롬프트 API"
}
]
......
}
}

업무 프로그램에 필요한 프롬프트 템플릿에 대한 분류는 다음과 같이 정리했습니다.

  • Classification (CLS): 사용자의 의도를 분류하고 파악하는 역할을 합니다. 질문이나 요청을 적절한 카테고리로 분류하여 적절한 응답을 생성하는 데 도움을 줍니다.
  • Grounding (GRD): 질문의 맥락을 이해하고, 그에 따라 엔터티를 추론하는 역할을 합니다. 이를 통해 대화가 자연스럽고 일관성 있게 이어질 수 있습니다.
  • Generater (GEN): 새로운 계획, 아이디어, 변환 등을 생성하는 역할을 합니다. 사용자의 요청에 따라 창의적인 아이디어를 제시하거나, 특정 문제에 대한 해결책을 제안하는 데 사용됩니다.
  • Coding (COD): 개발 관련 질문에 대한 예제나 소스 코드를 생성하는 역할을 합니다. 사용자가 요청하는 코드를 작성하거나, 특정 코드에 대한 품질을 올리는 데 사용됩니다.
  • Summarize (SMZ): 회의록, 요약, 대화 주제 등을 생성하는 역할을 합니다. 긴 대화나 문서를 요약하여 핵심 내용을 간략하게 전달하는 데 사용됩니다.
  • Writer (WTR): 보고서, 문서 등을 생성하는 역할을 합니다. 사용자의 요청에 따라 특정 주제에 대한 보고서나 문서를 작성하는 데 사용됩니다.

프롬프트 템플릿은 서로 다른 역할을 가지고 있지만, 함께 작동하여 사용자의 다양한 요청에 대응하고, 효과적인 대화를 위해 필요한 기능들을 제공합니다.

prompter 모듈 데모

prompter에 등록된 XXXXXX.xml 파일은 화면 및 모듈에서 사용됩니다. 다음은 화면에서 prompter 모듈을 사용하는 데모입니다. 화면 소스는 다음과 같습니다.

CLS010: 문장 대화의 의도를 파악

CLS020: IT 시스템 장애 등급 수준을 파악

GRD010: 지정된 주제와 관련된 엔티티를 추출

GEN010: 제로샷 프롬프트 확인

GEN020: 국가 언어 번역기

GEN030: 회의 전 스몰 토크 주제 생성

COD010: 소스 코드 버그 수정 및 개선

COD020: 소스 코드 주석 추가

COD030: 데이터베이스 SQL 생성

SMZ010: 회의록 요약 정리

WTR010: 당신의 명언 또는 인용구

WTR020: 프롬프트 엔지니어링을 위한 한국어 문장 영어 번역


한 주간의 여정 (2024-05-13 ~ 2024-05-22)

  • 프롬프트 템플릿 추가
  • prompter 모듈 추가
  • 버그 수정 및 기능 개선
  • 공통 기능 개선 및 DataSource에 LLM 서비스 정보 추가
  • 문법 개선
  • 오류 처리 개선
  • 처리 되지 않은 오류를 전역 변수에 기록
  • 거래 응답 결과를 DataSet 으로 변환 기능 추가
  • 소스 코드 정리
  • 변수명 변경
  • 함수 설정 값 타입 변경
  • 테스트 기능 개선
  • CSharp, Javascript 함수 테스트 호출 기능 개선
  • 거래 로그 삭제 주기 개선
  • DummyFile 데이터로 transact 응답을 내려줄 수 있는 기능 추가
  • 종속 패키지 버전 업데이트

· 약 7분
조준철

개발자는 코드를 작성하거나 문제를 해결할 때 숙고하며 알고리즘을 구상하는 논리적인 사고에 익숙합니다. 그래서 특정 주제를 가지고 사람들 앞에서 발표하거나 회의에서 자신이 주장하는 내용에 유연한 사고를 해야 하는 상황을 어려워하는 경우가 있습니다.

여기에는 여러 가지 원인이 있겠지만 이때, 툴민의 논증 모델을 활용하면 주장을 더 명확하게 표현하고, 그 주장을 지지하는 증거와 논거를 제시하며, 반론을 예상하고 대응할 수 있습니다.

툴민의 논증 모델은 영국의 철학자인 스티븐 툴민이 개발한 논증법으로, 어려운 내용은 제쳐두고 당장 써먹을 만한 실용적인 논증법을 제시합니다.

핵심은 주장하고자 바의 설득력을 높이려면 단순히 근거를 몇 개 제시하기보다는 자신이 제시한 정당한 이유를 반박하는 반론을 본인이 구상하고 그것을 재반박해서 얻게 된 결론이 설득력을 얻게 된다는 겁니다.

개발자의 숙고하며 논리적인 사고에 익숙한 장점을 활용하여 발표나 회의 전에 주제에 대해 미리 생각해 보고, 툴민의 논증 모델을 활용해 보세요. 그러면 주장을 더 명확하게 표현하고, 그 주장을 지지하는 증거와 논거를 제시하며, 반론을 예상하고 대응할 수 있습니다.

툴민의 논증 모델은 다음과 같이 6개의 구성 요소로 이루어져 있습니다.

  • 주장 (Claim): 주장은 논증의 목표로, 증명하려는 주제나 판단입니다.
  • 증거 (Data/Frame/Evidence): 증거는 주장을 지지하는 사실이나 정보입니다.
  • 논거 (Warrant): 논거는 주장과 증거 사이의 논리적 연결고리입니다.
  • 보강 (Backing): 보강은 논거를 지지하는 추가적인 정보나 설명입니다.
  • 조건 (Qualifier): 조건은 주장의 힘을 약화하거나 한정하는 역할을 합니다.
  • 반론 (Rebuttal): 반론은 주장이나 논거에 대한 예외 사항이나 반대 의견을 제시하는 것입니다.

논증 모델은 크게 기본구조 (4) + 보조구조 (2)로 구성합니다. 기본구조는 (주장, 증거, 논거, 보강)으로 이루어져 있고, 보조구조는 (조건, 반론)으로 이루어져 있고, 상황에 따라 필요한 구성 요소를 추가하거나 수정해서 사용하면 됩니다.

논증의 구성 요소에 대한 주요 흐름을 이렇게 구성하면 좋습니다. & (AND) | (OR) 는 각 구성 요소를 구분하기 위한 구분자입니다.

  1. 주장 (Claim)
  2. 근거 - 증거 (Data/Grounds/Evidence)
  3. 왜냐하면 - 논거 (Warrant) & 때문에 - 보강 (Backing)
  4. 그래서 So (So) | 어쩌면 - 조건 (Qualifier) | 예외로 - 반론 (Rebuttal)
  5. 주장 (Claim)

주요 흐름에 대한 예시를 들면 다음과 같습니다. 본인 성향에 따라 필요한 구성 요소를 추가하거나 수정해 보세요.

  1. 나는 우리 반 학생들이 모두 A 학점을 받을 것이라고 믿는다. "주장 (Claim)"
  2. 왜냐하면 우리 반 학생들은 모두 열심히 공부했기 때문이다. "증거 (Data/Grounds/Evidence)"
  3. 우리 반 학생들은 좋은 시험 성적을 거두었으며, 과제물에서도 좋은 평가를 받았다. "논거 (Warrant)" & 시험성적과 과제물 점수가 높은 학생은 학칙에 따라 좋은 점수를 부여하게 되어 있다. "보강 (Backing)"
  4. 그래서 "So (So)" | 어쩌면 대부분의 학생은 "조건 (Qualifier)" | 따라서 시험에서 부정을 저지르거나 수업시간에 불성실한 태도를 보인 경우가 아니라면, "반론 (Rebuttal)"
  5. A 학점을 받게 될 것이다 "주장 (Claim)"

한두 번만 활용해 보면 동료들에게 더 명확하게 주장하고 설득하는 사람으로 인지되어, 향후 예상하지 못한 돌발 상황에서는 좀 더 생각해 보고 다시 예기할 수 있는 상황을 만들 수 있습니다.


한 주간의 여정 (2024-05-06 ~ 2024-05-10)

  • 프로젝트 빌드에 필요한 시간을 줄이는 MSBuild 옵션 추가
  • 종속 패키지 버전 업데이트
  • 변수명 변경
  • Node.js 함수 테스트 기능 개선
  • 스크립트 로더 기능 개선
  • 공통 리소스 BindingAction (Replace, Append, None) 옵션 추가
  • 배치 스크립트 디렉토리명 변경
  • 디자인 개선
  • LoadOptions 중복 방지를 위해 시스템에서 부여하는 키에 '$' 접두어 사용
  • 거래 실행시 접근 권한 정보를 dbclient, function 모듈에 전달하도록 개선
  • JSON 데이터 쿼리 및 변환 라이브러리 jsonata 추가
  • C# 서버리스 함수 개발 테스트 API Controller 추가
  • Node.js 서버리스 함수 개발 테스트 서버 추가

· 약 8분
조준철

살다보면 가끔 내적인 이유든 외적인 이유던지간에 가볍게 또는 진지하게 그냥 막막하거나 무엇이 맞는 것인지, 어떻게 시작해야 할지 도저히 모를 때가 있는 슬럼프가 찾아옵니다.

그럴때 용기와 희망을 주는 의미를 담고 있는 자기관리 명언이나 책들을 보면 머리로는 이해가 되는데 생각보다 내 상황에 도움이 되지 않는 데 그 이유는 대부분 "성공"이라는 목표를 가지고 있기 때문입니다.

성공이라는 목표를 가지고 있으면 그 목표를 달성하지 못했을 때 좌절하게 되고, 그 좌절로 인해 더 막막해지고, 무엇을 해야할지 모르게 힘든 시기를 겪게 되는데, 이를 극복하고 성장하는 과정을 통해 더 강해지고 성숙해질 수 있습니다.

"본인의 칼은 본인이 갈아야 한다" 라는 말은 지인이 제게 자주 하는 말입니다. 성공의 기반이 되는 것은 자신의 노력과 끈기로 경험을 통해 얻는 것들을 말합니다만, 여기에는 좀 더 생각 해볼 만한 철학적인 의미를 가지고 있습니다.

내 경험을 쌓기 어려운 시대

예전에는 "젊어서 고생은 사서한다." 라는 속담이 있을정도로 경험을 쌓기 위해 노력하고 경험을 통해 성장하는 과정을 거쳤지만, 현재는 인터넷과 스마트폰, 결정적으로 AI 기술이 발달하면서 정보를 얻기 쉬워졌습니다. 이 말은 이러한 정보를 통해 얻는 지식은 경험을 통해 얻는 지식보다 덜 가치가 있다는 것일까요? 아니요. 그렇지 않습니다. 사실에 근접한 정보는 가치에 우위가 있을 수 없습니다.

문제는 경험을 쌓기 위해 노력하고 성장하는 과정의 기회가 점점 줄어들고 있다는 것입니다. 학습(지식을 습득)을 한다는 것은 누군가 잘 정리해둔 정보를 받아들이는 것이지만, 경험을 통해 성장한다는 것은 그 정보를 받아들이고, 이를 토대로 자신만의 결과와 지혜를 만들어내는 것입니다. 분명히 아는 것과 전달 하는 영역은 다릅니다.

습관적으로 미디어, 책, 강의 등을 통해 정보를 얻는 것만 한다면 그 정보를 토대로 자신만의 지혜를 만들어내는 것은 뇌과학적으로도 어렵습니다. 사람은 본능적으로 시각 + 청각적인 자극에서 80% 에 가까운 집중력을 보인다고 합니다. 문제는 새로운 자극을 받아들이기 위해 수많은 정보들은 잊혀집니다. 그래서 본인의 칼을 만들어야합니다.

성공이 아닌 성장을 목표로 삼는 것

한번 쯤은 내가 성공했을 때의 모습을 상상해보았을 것입니다. 그리고 그 상상을 통해 당신이 어떤 사람이 되고 싶은지, 어떤 모습을 가지고 싶은지 생각해보았을 것입니다. 그리고 그 모습을 향해 나아가기 위해 노력하고 있을 것입니다.

그런데 성공을 하면 그 이후에는 무엇을 할 것인가요? 성공을 위해 칼을 갈고, 닦고, 쓰고, 다시 갈았는데, 성공을 하고 나면 그 칼은 더 이상 갈 필요가 없어집니다. 그리고 그 칼을 버리고 새로운 칼을 만들어야 할 지 모릅니다.

먹고 사는 것은 기초적인 삶을 위해 기본적으로 필요한 것이지만, 그 이상의 삶을 살기 위해서는 좋아 하는 일, 해야 하는 일, 할 수 있는 일을 찾아내고, 그것을 통해 좀 더 편하게 해낼 수 있는 본인의 칼을 갈아야 하는 과정을 자연스럽게 해야합니다.

나를 만들어가는 것

그런데 제일 어렵고 중요한 것은 칼을 버릴 줄 알아야 하는 것입니다. 칼은 성장을 위한 도구이지 무기가 아닙니다. 그래서 성장에 더 도움이 된다면 더 많은 칼을 만들고 사용할 수 있도록 언제든 본인의 칼을 버릴 수 있어야합니다.

칼을 바꾸거나 버린다는 것은 어떤 이에겐 자신이 그동안 해온 것들을 부정하는 것 같아 더욱 쉽지 않습니다. 그래서 평생 한 직장에서 근무한 직장인이나 스포츠 선수들이 전성기를 지나 은퇴 이후에는 무엇을 할지 고민하는 것은 당연한 일입니다.

칼을 버린다는 것은 당신이 성공하지 못했다는 것이 아닙니다. 오히려 칼을 무기로 생각한다면 내가 나의 칼로 다칠 수도 있다는 것입니다.

사람들은 나의 칼을 보고 신기해 하거나 부러워 할 수 있어도 그것만으로 알아주거나 인정하지 않습니다. 오히려 크기에 상관없이 그 사람만이 할 수 있는 결과나 능력 또는 고민하지 않고 믿고 맡길 수 있는 신뢰를 쌓아야합니다.

증명하거나 설득할 필요없이 작더라도 하나씩 하나씩 자신만의 더 나은 내일을 만들기 위해 노력하는 당신은 이미 성공한 사람입니다.


한 주간의 여정 (2024-04-29 ~ 2024-05-03)

  • 환경설정 자동화 기능 개선
  • 배치 스크립트 호출 후 로그 출력을 콘솔, 파일로 출력하는 기능 추가
  • 운영체제에 따라 사전에 정의된 배치 스크립트 업무를 수행 기능 추가

· 약 9분
조준철

작년부터 개발을 하면서 ChatGPT 도움을 많이 받다 보니 프롬프트 엔지니어링에 대한 관심이 생겨 최근에 마이크로소프트의 Semantic Kernel을 사용해서 HandStack 프로그램에서 생산성에 도움이 될 만한 다양한 문법을 테스트 해보고 있습니다.

몇 년 전에 머신러닝을 기초 레벨에서부터 학습을 해본 적이 있습니다. 회귀, 분류, 군집, 예측, 추천 기능을 활용해서 업무 프로그램에 적용해야 하는 미션을 부여받아 진행했는데, 그 당시 고생한 거에 비하면 의미 있는 성과를 내지는 못했습니다.

머신러닝은 기본적으로 적용하려는 수학적 알고리즘에 의한 매개변수 값에 따라 의도한 결과가 달라지다 보니 만족할 만한 학습 모델을 만들기 까지 반복되는 살짝 지겨운 (?) 학습 과정을 많이 거쳐야 하는데, 이렇게 만들어진 학습 모델을 운영 서비스에 적용해서 클라이언트에서 확인하기 위한 자동화된 MLOps 프로세스와 그에 필요한 인력이 필요합니다. 지금에서 생각해보니 크게 2개의 이슈가 있었네요.

  1. 업무 시나리오에 따라 필요한 학습 데이터의 수량이 부족하거나 불균형하게 되어 있으면 학습 모델의 성능이 떨어지게 되어 실제 운영 환경에서는 예측한 결과가 실제 결과와 다르게 나타나는 경우가 종종 발생합니다. 학습 모델은 학습 시점의 과거 데이터를 기반으로 하기 때문에 정기적으로 최신 데이터를 추가한 학습 데이터의 재학습이 필요하게 되는데 이 부분을 얼마나 자동화 할 수 있는지가 중요합니다.

  2. 그렇게 고생하며 얻은 지식이 1년도 안 되어 Auto ML로 불리는 학습 데이터의 크기와 그에 적절한 학습 시간만 넣으면 알아서 최적의 수학 알고리즘과 매개변수의 재학습을 통해 결과로 만들어주는 솔루션이 나왔습니다. Auto ML의 학습 모델 성능이 좋다는 것을 보고 그 당시에 AI의 발전 속도가 개인이 기초 분야에서 학습하는 속도보다 빠르다는 것에 놀랐습니다.

그동안 딥러닝 기반의 AI로 음성인식, 영상 객체 인식, 자율주행, 상담원 챗봇 등 사람이 하는 업무 보조 역할을 대체하는 기술들로 발전하고 일반사람들이 쉽게 접근하지 못하는 스며드는 방식으로 도입이 되었었다고 한다면, 최근에는 다양한 좋은 품질의 학습 모델을 내려받거나 API로 호출할 수 있는 서비스를 제공하는 허깅페이스(https://huggingface.co) 를 보며 이전보다 초기 접근성이 좋아졌다는 것을 새삼 느꼈습니다.

그 중에서 LLM(Large Language Model)은 기존의 AI와는 다르게 상상할 수 없는 대규모의 데이터를 학습하여 텍스트 생성, 번역, 요약 등 다양한 언어 처리 작업을 수행하는 데 사용됩니다. 큰 변화의 핵심은 수요자가 필요한 업무에 따라 활용 용도에 따라 학습 곡선의 선택지가 생겼다는 것인데, 접근성이 좋아진 만큼 더 많은 사람이 쉽게 AI 기술을 활용하고 있습니다.

예를 들어 최근 Meta에서 ChatGPT 4 와 유사한 성능을 보여줄 것으로 보이는 Llama3 학습 모델을 오픈소스로 공개했습니다. 당연히 영어로 학습된 모델을 발 빠르게 야놀자에서 한국어로 파인 튜닝해서 공개를 해주었고, 이제 AVX2 명령어를 지원하는 최신 CPU를 탑재하고 NVIDIA의 RTX 3060+ 또는 AMD 의 RX 7800+ 그래픽 카드를 가지고 있는 개인 PC에서도 파이썬이나 랭체인 같은 기술을 모르더라도 LM Studio (https://lmstudio.ai) 와 같은 도구를 활용하거나 랭서브(https://www.langchain.com/langserve) 를 이용해서 셀프 호스트로 ChatGPT 서비스를 실행할 수 있습니다.

Open AI에서 제공하는 ChatGPT API를 사용하려면 유료 API 키를 발급받아야 하는데, 셀프 호스트로 동일한 품질의 서비스를 운영하고 ChatGPT 질문과 결과값을 벡터 값으로 임베딩하여 저장하고 검색할 수 있는 벡터 DB들을 사용 가능하면 기업에서는 물론 개인이나 학생들도 쉽게 AI 기술을 활용할 수 있을 것입니다.

그런 의미에서 학생, 직장인에 상관없이 누구나 프롬프트에 필요한 문법을 정리하고 이를 활용해서 ChatGPT를 사용하는 방법을 알아두면 앞으로 써먹을 게 많을 거로 보여집니다.

문법을 학습하기 위한 참고 웹 사이트로 랭스미스 (https://smith.langchain.com/hub) 를 추천드립니다. 예를 들어 데이터베이스 쿼리를 생성하기 위한 프롬프트에 대한 예로 https://smith.langchain.com/hub/rlm/text-to-sql/playground 를 참고하시면 괜찮을 것 같네요. 굳이 Open AI의 유로 API 키가 없더라도 여기에 있는 문법을 ChatGPT에 그대로 적용해도 됩니다.

영어로 되어 있지만 DeepL로 번역해서 얻은 프롬프트를 ChatGPT에 붙여서 사용해 보면 확실히 기존보다 좀 더 나은 답변을 얻으실 수 있으실 겁니다.

랭스미스와 유사한 방식으로 기업 또는 개인이 프롬프트에 대한 문법을 정리하고 이를 테스트 하기 위한 셀프 호스트 가능한 오픈소스로 랭퓨즈 (https://github.com/langfuse/langfuse) 를 추천드립니다.


한 주간의 여정 (2024-04-22 ~ 2024-04-26)

  • arm64 빌드 ack 프로그램 삭제
  • Http 응답 상태 코드 표준화 정리
  • 환경변수 비밀키 로드 및 조회 기능 개선
  • 환경변수, 포함 리소스 조회 기능 개선
  • 배포 스크립트 개선
  • HandStack 개발 환경 설치가 완료 후 실행 방법 개선
  • checkup.sln 솔루션 파일 삭제
  • C# 함수 반환 결과가 Task 일 경우 대응 수정
  • WordWrap 확장 메서드 추가
  • Semantic Kernel 기본 패키지 추가
  • CLI list 에 명령 인수가 출력되도록 개선

· 약 4분
조준철

최근 HandStack 을 실행하기 위한 필수 프로그램 설치 및 종속 라이브러리를 다운로드 하고 번들링을 구성하는 install 배치 스크립트에 버그가 있다는 피드백을 받고 이번 기회에 버그도 잡을 겸, 다음의 클린 설치 운영체제에서 설치 스크립트 점검하고 개선되었습니다.

  • Windows 10
  • Windows 11
  • Ubuntu 22.04
  • macOS 11 (Big Sur): Intel CPU
  • macOS 14 (Sonoma): Arm CPU

개발 환경과 실행 환경에 필요한 필수 프로그램과 도구를 설치하는 과정은 각 운영 체제의 관리 정책과 버전에 따른 보안 수준에 따라 설치 프로그램을 만들때 각 운영 체제의 특성과 설치 절차를 이해하는 것을 필요로 합니다.

사실 제공되는 install 설치 스크립트는 설치 프로그램 이라기 보다 매뉴얼 작업에 가까운 설치 과정인데, Windows, macOS, Linux에 따라 인스톨러를 개발하는 것은 시간과 비용면에서 부담스럽고 좀 더 동일한 설치 경험을 제공해야 향후 유지보수에 도움이 될거라는 판단이 들었습니다.

Linux 서버를 다루는 분들은 패키지 매니저를 사용하는 CLI (Command-Line Interface) 명령으로 필요한 프로그램을 설치하는 것이 익숙하실 겁니다. Windows나 macOS 에서는 GUI (Graphical User Interface) 방식의 설치 관리자를 이용한 설치가 편하실거구요.

그런데 점차 Windows, macOS 에서도 업무에 필요한 대부분의 프로그램을 패키지 매니저를 사용하여 설치 하는 것이 일반화 되고 있습니다.

Windows에서는 winget, macOS에서는 Homebrew, Linux에서는 apt-get 와 같은 CLI 명령으로 자동화된 설치 프로세스를 수행하게 되는데 한번 적응되면 편리하게 사용할 수 있습니다.

제가 Windows 기반에서 HandStack 을 개발하는 데 필요한 개발 및 도구 프로그램을 설치하는 스크립트를 추가로 정리했습니다. 매번 공식 웹 사이트가 가서 프로그램을 받고 설치하고 하는 과정없이 명령 프롬프트에서 동일한 프로그램을 빠르게 설치합니다. 자세한 내용은 Winget 추천 개발 도구 설치하기 문서를 확인하세요.

개선된 프로그램 설치 스크립트는 빠른 시작에서 확인 가능합니다.


한 주간의 여정 (2024-04-15 ~ 2024-04-19)

  • 의미 없는 alpha, beta 릴리즈 삭제
  • publish, install 설치 스크립트 기능 개선
  • 버그 수정 및 안정성 기능 개선
  • 화면 개발 프로젝트 템플릿 추가
  • libman.json 에 정의된 파일을 압축 파일로 제공
  • 번들링 기본값 변경
  • HandStack CLI 기능 개발자 문서 추가
  • publish 과정에 HandStack CLI 추가
  • assetsCachingID 적용 기준 수정
  • 공통/화면 브라우저 캐시 적용 기능 분리

· 약 7분
조준철

"Simple is Best" 라고 문장을 쓰니, "But, it's not easy. It's HardCore." 라고 AI 가 제안을 해주네요...

ChatGPT 의 대부분의 학습 데이터가 영어권으로 되어 있는 걸 생각해보면 Simple is Best 에 대한 생각은 동서고금 비슷한가 봅니다. ^^;

제품이나 서비스를 사용자가 고민하지 않고 사용 가능하도록 직관적으로 만드는 것. 그것이 진정한 간단함이라고 생각합니다.

비즈니스 SW의 경우 꼭 필요한 개인화 된 기능을 선택 옵션을 제거하면 어느정도 간단하게 만드는 것이 가능합니다. 다만 이러한 다품종 소량 개발 방식은 여러가지 이유로 개발 비용이 비싸지고 확장성은 나빠질 가능성이 높습니다.

HandStack 을 만들어야 겠다고 생각 했을때 우선적으로 고려했던 것은 기존 운영중인 프로그램에 고객의 신규 요구를 반영하는 시간을 어떻게 하면 더 줄일 수 있을까? 였습니다.

비즈니스 SW의 큰 특징은 고객의 요구를 반영한 추가/변경에 있기 때문에 VOC (Voice of Customer) 처리를 줄이는 것이 중요하다고 생각했습니다.

모놀리식 기반의 패키지 SW나 웹 서비스들은 배포 과정에서 아무리 신중하게 스테이징 테스트를 하더라도 다양한 운영 상황에 따라 장애가 발생시 장애 등급에 따라 프로그램 다운타임이 필연적으로 길어지기 때문에 장애로 인한 비용 보상에 민감한 프로젝트 일수록 고객 요구를 반영하는 작업은 기본적으로 어렵습니다.

거기에 최근 마이크로서비스 아키텍처를 지향하는 클라우드 네이티브 기반의 서비스들과 SaaS 제품들은 이러한 문제를 더욱 복잡하게 만들었다고 생각합니다.

그래서 HandStack 은 다른 솔루션에는 없는 차별화된 3개의 방안을 제시합니다.

1. 개발과 배포 과정을 단순화

복잡한 코딩 및 배포 과정을 단순화해서 적은 학습 비용으로 업무 화면을 개발 가능하게 합니다. 이러한 방식은 개발 및 유지보수, 인수인계에 유리하며 일반적인 비즈니스 SW를 업무를 처리하는 데 적합합니다.

화면 개발 > 쿼리 개발 > 무중단 배포 > 변경 항목 즉시 확인

2. 업무 모듈로 패키징 및 실행

비즈니스 앱에 필요한 모든 설정과 소스는 다음과 같이 구성됩니다.

디렉토리설명
dbclient데이터베이스 SQL을 XML 문서로 관리
functionC# 또는 Node.js 기반 Function 개발 기능 관리
repository단일, 다중, 이미지, 첨부파일 등등 파일 업로드/다운로드 관리
transact거래 요청 검증 및 접근 제어 관리와 요청 정보를 dbclient, function 등등 module로 라우팅 기능 관리
wwwroot웹 공통 static assets 및 화면 단위 소스 호스팅 관리

위와 같은 소스코드 구조 단위 묶음으로 업무 모듈을 패키징하고 실행할 수 있습니다. 예를 들어 회원관리, 제품관리, 주문관리, 배송관리 등등 업무 비즈니스 SW들을 기능 단위로 모듈화하여 업무 규모에 따른 스케일링이 가능하도록 서버를 구성해서 가용성, 확장성 보장할 수 있습니다.

3. 특화 요구사항이 반영되는 확장 서비스

제조, 설비 실행에 필요한 하드웨어 연계, 다양한 네트워크 통신 프로토콜에 특화된 전문 처리 기능을 2번 방식과 동일한 방식으로 모듈화하여 기존 프로그램을 수정하지 않고 기능을 확장 가능하며 사전에 제작된 프로젝트 템플릿 기반의 업무 화면들을 만들어 적용 가능합니다.

최근에 피드백을 받아 HandStack 을 기반으로 필수 프로그램 설치 및 종속 라이브러리를 다운로드 하고 번들링을 구성하는 install 배치 스크립트에 버그가 있는 것을 확인했습니다. Windows 10, 11 클린 설치 기반에서 테스트 후 GitHub에 커밋 하겠습니다.


한 주간의 여정 (2024-04-08 ~ 2024-04-14)

  • 네임스페이스 변경
  • handstack CLI purgecontracts 기능 추가 및 개선
  • 컴파일 경고 문구 및 오류 대응 수정
  • HandStack 라이선스 v1.0 게시

· 약 4분
조준철

공공 데이터 포털에 올라온 주요 오픈 API에 대한 프로토콜 문서를 학습하는 도중에 공공 분야 뿐만 아니라 의미 있는 데이터를 제공하는 쪽 입장에서 가지고 있는 정보를 간단하게 Open API 형태로 서비스 할 수 있는 기능이 있으면 좋겠다는 생각이 들었습니다.

그래서 본래 예정에 없었던 도메인의 데이터베이스의 정보를 Open API 형태로 서비스 할 수 있는 openapi 모듈을 개발했습니다.

openapi 모듈로 별도의 개발 없이 다양한 포맷(JSON, XML, SOAP, RSS 2.0, ATOM 1.0)들을 지원하는 Endpoint를 관리 할 수 있는데 별도의 개발 없이 5개의 테이블의 정보를 구성하여 간단하게 Open API 서비스를 구성 가능합니다.

요약하면 다음과 같습니다.

  • Open API 서비스 개발 인력 없이 단기간에 구축이 가능합니다.
  • SqlServer, Oracle, MySQL, PostgreSQL, SQLite DBMS의 SQL을 사용하여 도메인 데이터를 외부에 노출합니다.
  • Open API 서비스 설정 변동 시 무중단 으로 실시간으로 반영됩니다.
  • OWASP 10대 취약점에 대응하여 안전하게 운영이 가능합니다.

Open API 서비스를 관리하기 위해 테이블의 데이터를 추가하거나 변경해야 하는데 웹 기반의 UI는 향후 forbes 로 제공됩니다.

그 전까지는 데이터 엔티티 정보와 초기 데이터 SQL을 참고하여 데이터를 직접 관리해야 자신만의 Open API를 관리 가능합니다.

openapi 모듈은 SqlServer, SQLite 데이터베이스에서 테스트 했으며 Oracle, MySQL, PostgreSQL에서 운영 동작은 확인이 필요 할 수 있습니다.

좀 더 자세한 내용은 SQL만으로 Open API 생성하기를 참고하세요.


한 주간의 여정 (2024-04-01 ~ 2024-04-05)

openapi 주요 기능

  • API 서비스 관리
  • 회원 정보 관리
  • 서비스 키 발급
  • 접근 권한 제어
  • API 메타 정보 캐시 관리
  • 로깅 및 거래 횟수 업데이트
  • 거래 제한 조건 적용
  • Json, Xml, Soap, Rss/Atom 출력 포맷 지원
  • 필수 매개변수 및 기본 매개변수 적용 확인
  • 공개, 비밀 키, IP 주소 접근 제어
  • 기간 내 호출 수 제한 및 제한 조건 일별/월별 자동 갱신
  • 응답 결과 캐싱
  • 시간 단위 API 사용 통계 수집
  • SqlServer, Oracle, MySQL, PostgreSQL, SQLite 데이터베이스 지원

· 약 7분
조준철

SNS에 올릴 만한 나를 위한 플렉스나 행운은 좋은 경험인가요? 자신에 대한 부당한 처우, 열정 페이를 강요 받는 것은 나쁜 경험인가요?

논증의 여지가 있고 관점을 바꾸면 같은 경험도 다르게 받아들여 집니다.

같은 경험도 사람들의 개인적인 관점에 따라 다르게 해석될 수 있습니다. 이는 우리가 각자의 생각, 감정, 경험, 가치관 등을 가지고 있기 때문입니다. 이러한 다양성은 우리가 세상을 이해하고 해석하는 방식을 풍부하게 만듭니다.

서로 다른 관점을 이해하고 존중하면서, 자신의 견해를 명확하게 표현하고 논리적으로 논증하는 것은 대화와 의사소통에서 중요한 역할을 합니다. 물론 사람은 감정의 동물이기 때문에 감정적인 부분을 배려하면서 대화를 이어가는 것도 중요합니다.

그러나 반론의 여지가 없거나 적다면 좋은 것은 좋은 것이고 나쁜 것은 나쁜 것이라는 사실은 변하지 않기 때문에 현실을 정확하게 인식하고, 사실에 기반한 결정을 내릴 때 후회할 일이 적어집니다.

현 상황을 객관적인 시각을 유지하면서도 다양한 관점을 고려하는 습관을 길러야 하는 이유입니다. 특히 주입식 교육에 익숙하고 현장 경험이 적은 사람일수록 다음과 같은 의문에 대해 연습 삼아서 생각해 볼 수 있습니다.

  • 직장에서 얻는 안정적인 월급은 마약일까?
  • 과외 선생님의 던지는 돌직구는 학생을 위한 것일까?
  • 누군가를 도와주는 것은 상대가 불편해서일까?

생소한 질문에 대해 객관적인 시각을 가지기 어렵다면 개인적으로 2개의 방법으로 시작 해보는 것을 권장합니다.

의문에 대해 제삼자에게 도움을 구하기

  • 가족이나 친구의 의견 보다 나랑 관계없는 동종 업계의 선배나 커뮤니티가 좋습니다.
  • 동종 업계의 다양한 선배에게 본인의 상황을 진솔하게 써서 개인 DM을 보내보세요.
  • 컨퍼런스, 세미나, 학회 등 강연자에게 진솔하게 질문을 해보세요.
  • 진심을 담아 솔직하게 도움을 구하면 상대방도 가능하면 진심을 담아 답변해 줄 것입니다.
  • 상대방이 나의 고민에 대해 시간을 내주었다면 물질로 성의 표시하세요. 금액이 중요한 것이 아니라 감사의 마음이 중요합니다.

저의 경우 익명성의 다양한 의견을 받을 수 있는 커뮤니티에 질문을 올리는 것 보다, 직접적인 대화를 통해 의견을 듣는 것을 선호합니다.

상대방 관점에서 바라보기

  • 내가 즐겨보는 연예인 광고, SNS 게시글, 유튜브 등등 콘텐츠를 수요자가 아닌 공급자의 관점에 생각해 보세요.
  • 아무리 간단해 보여도 대부분 정기적인 콘텐츠는 혼자서 만들 수 없고 대략 3명 이상의 스텝이 참여하게 됩니다.
  • 얼마나 많은 사람들이 해당 콘텐츠를 만들었을지 그 사람들의 월급을 역으로 비용 추산해보세요.
  • 그만한 비용을 지급하면서 해당 콘텐츠로 공급자가 수요자에게 얻어 가려는 가치는 무엇일까요?

저의 경우 "콘텐츠를 보며 웃고 있다면 그 웃음을 만들어주는 사람에게 좋은 것이고, 심각하거나 진지해진다면 그게 내 예기이기 때문이다." 라고 생각합니다.

제가 생각하는 좋은 경험은 내가 이겨내야 할 시련에서 얻을 수 있다고 보입니다. 다른 사람들은 쉽게 쉽게 하는 것 같은데 나는 일 복이 많아서인지 매번 어렵고 힘든 과정이 많다고 느껴진다면, 이것을 자신만의 경제학 개념의 "해자"를 쌓아가는 삶의 여정이라고 생각해 보세요.

그러므로 나에게 나쁜 경험을 피하고 적절한 스트레스 해소 방법을 찾아서 좋은 경험을 만드는 것이 중요합니다.


한 주간의 여정 (2024-03-25 ~ 2024-03-29)

  • HandStack에 대한 비즈니스 모델 초안 작성 완료
  • 데이터베이스를 Open API로 만들어주는 openapi 모듈 개발 진행중 차주 오픈 예정