분류 전체보기 45

Docker 환경에서 OpenClaw와 Ollama 연결

OpenClaw와 Ollama를 각각 Docker 컨테이너로 실행할 때, 두 컨테이너가 서로 통신하도록 네트워크를 연결하는 과정을 정리했다.환경OS: Windows 11 + WSL2 (Ubuntu)Docker DesktopOpenClaw: docker-compose로 실행 (/mnt/c/clawdbot)Ollama: 별도 Docker 컨테이너로 실행문제 상황OpenClaw와 Ollama를 각각 독립된 Docker 컨테이너로 실행하면, 기본적으로 서로 다른 네트워크에 속하게 된다. 이 상태에서는 OpenClaw가 Ollama에 접근할 수 없어 연결 오류가 발생한다.트러블슈팅 과정1단계: 네트워크 확인먼저 현재 Docker 네트워크 상태를 확인한다.docker network lsNETWORK ID N..

AI 2026.02.24

Docker 환경에서 Ollama + OpenClaw(Clawdbot) 설치하기

개요환경: Windows 10/11, Docker Desktop, WSL2(Ubuntu)목표: Ollama 로컬 LLM 모델을 AI 백엔드로 사용하는 OpenClaw를 Docker로 구성참고: Clawdbot → Moltbot → OpenClaw 순서로 이름이 변경됨 (2026년 기준 공식 명칭은 OpenClaw)1. WSL2 설치PowerShell을 관리자 권한으로 실행 후:wsl --install설치 완료 후 PC 재시작. 재시작 후 Ubuntu 터미널이 자동으로 열리면 사용자 이름과 비밀번호를 설정한다.2. Docker Desktop 설치https://www.docker.com/products/docker-desktop 에서 다운로드설치 완료 후 PC 재시작WSL2 연동 설정Docker Deskto..

AI 2026.02.23

sQuiry: AI 서버와 통신하는 프론트엔드 개발

서론이전글: https://egg-stone.tistory.com/43 이전 글에서는 sQuiry의 백엔드 구조와 RAG 기반 SQL 생성 엔진에 대해 다뤘다. 이번 글에서는 프론트엔드 아키텍처와 백엔드와의 통신 구조를 다룬다. 프레임워크 없이 구현한 이유와 전체적인 데이터 플로우를 중심으로 설명한다. 기술 스택과 선택 이유바닐라 JavaScriptReact나 Vue 같은 프레임워크를 사용하지 않고 바닐라 JavaScript를 선택했다.선택 이유:프로젝트 규모가 작음 (3개 페이지, 독립적인 기능)빌드 도구 불필요, 즉시 배포 가능빠른 초기 로딩 속도복잡한 상태 관리가 필요 없음프레임워크는 강력하지만 모든 프로젝트에 필요한 것은 아니다. sQuiry는 페이지별로 독립적인 기능을 제공하므로 단순한 구조가 ..

AI 2026.02.10

sQuiry: 오픈소스 LLM과 RAG 기반 자연어-SQL 변환 서비스

서론자연어로 쿼리를 생성하자 데이터베이스를 다루다 보면 비개발자가 원하는 데이터를 조회하기 위해 개발자에게 요청하거나, SQL을 배워야 하는 상황이 발생한다. "지난 달 매출이 가장 높은 상위 10개 제품을 보여줘"라는 간단한 요청도 복잡한 SQL 쿼리로 변환해야 한다.이런 문제를 해결하기 위해 자연어를 SQL로 변환하는 시스템 sQuiry를 개발했다.특히 상용 API 대신 Huggingface의 오픈소스 모델을 로컬에서 실행하고, RAG 기법으로 데이터베이스 스키마와 예제를 학습시켜 정확도를 높이는 것이 핵심이다. 프로젝트 개요sQuiry는 자연어 질문을 SQL 쿼리로 변환하고 실행하는 API 서비스다. 사용자는 "지난 주 주문 수는?"과 같이 자연어로 질문하면, 시스템이 이를 SQL로 변환하여 실행하..

AI 2026.02.09

SpeakSH: Claude AI로 서버 관리 (시나리오)

서론이 글은 SpeakSH를 어떻게 사용할 수 있는지에 대한 몇 가지 시나리오를 만들어서 공유하는 것에 목적을 둔다.테스트해 볼 시나리오는 다음과 같다.개발환경 구축보안상태 점검서비스 제거로그 확인 이전글: https://egg-stone.tistory.com/41 개발환경 구축 보안상태 점검 서비스 제거 로그확인로그확인은 웃긴게, 로그를 보여달라니까 로그의 내용을 요약정리해서 보여줬다.엉뚱한 답이긴한데, 실제 로그가 패키지 설치로그이기에 별 의미가 없다고 생각했는지 가독성 좋게 정리해서 출력하는 모습을 보여줬다.

AI 2026.02.07

SpeakSH: Claude Desktop 연동

서론이 글은 SpeakSH를 실제로 Claude Desktop 에 연동하는 방법에 대해서 다룬다. 이전글: https://egg-stone.tistory.com/40 1. MCP 등록좌측 하단 "설정" 아이콘을 클릭하면 연동 설정창이 뜨게된다. "Claude Desktop 연동" 을 클릭하면 진행여부를 체크한다. 더 진행해보면..claude_desktop_config.json 에 "speaksh" 가 성공적으로 등록된 것을 확인할 수 있다.이제 claude desktop 에서도 확인을 해보자. 연결 성공! 2. 서버추가SpeakSH의 서버 연결 테스트를 위해서 테스트서버를 만들어놨다. 이제 사이드바 하단에 있는 "서버 추가" 버튼을 클릭해서 해당 서버에 대한 정보를 입력 및 등록해보자. 이제 Cl..

AI 2026.02.06

SpeakSH: Claude AI로 자연어 기반 SSH 서버 관리 도구 개발기

서론 Claude AI와 MCP를 활용한 자연어 기반 SSH 서버 관리 도구 나는 코딩을 할 때 AI를 적극적으로 활용하고 있다.특히 퇴근후에는 집에서 MCP나 Claude Code 등을 이용해서 바이브코딩 가깝게 서비스를 만들어내기도 한다.이걸 서버작업에도 적용하고 싶었다. 그래서 Claude AI를 활용한 자연어 기반 SSH 서버 관리 도구 SpeakSH를 개발했다.*** 거의 대부분 Claude 를 이용해서 개발했다. 이 글에서는 MCP를 활용하여 Claude와 SSH를 연동한 과정과 기술적 구현 내용을 공유한다. 다만 최근 PC에 대한 제어권을 가지고 모든 것에 대한 작업을 진행하는 에이전트가 대두되고 있는 것 같은데 곧 MCP를 활용하는 서비스는 퇴물이 되지 않을까싶긴하다.내 기억상 작년에 나온..

AI 2026.02.05

#1 미래에도 개발자는 가치가 있는가?

[근황]이번 한 주는 블로그를 아예 작성하지 못했다.작성할 시간이 있어야말이지 원..이번주 내내 자는 시간 이외에는 프로그램을 만들었다. 어머니의 업무를 도와줄 간단한 웹 서비스부터, 여러 용도로 사용할 수 있는 유용한 서버, 개발할 때 도움이 될 프로그램까지.일주일 내내 이러다보니 눈이 빠지는 것 같은 느낌이든다.일상생활에서 눈을 감고 다니고 싶다랄까.차라리 손 바닥에 눈을 이식하면 어떨까? 기초적인 임플란트다아아 나는 눈을 감고 걸어도 되는 자율주행이 필요하단말이다.. 사실 개발하면서 블로그 작성할 것들이 굉장히 많이 생겼는데, 너무 많이 생겨서 언제 다 정리할 수 있으려나. [개발자 VS AI]프로그램 개발에서 가장 큰 도움이 된건 AI였다.나는 막연히 AI에 대한 두려움이 있었다. 그도그럴게 개발..

사유하다 2025.06.29

[Spring Boot] 스케줄러 등록

1. Application 의 클래스에 @EnableScheduling 가 있어야한다.2. 스케줄러 파일 작성간단하게 메서드를 만들고 @Scheduled 어노테이션을 붙여주면된다. 이후 괄호안의 내용으로 반복시간을 지정해준다.@Scheduled(cron = "* * * * * *") 시간지정에는 규칙이 있다. 5초마다 실행하려면 */5 * * * * * * * * *초 분 시 일 월ex1) 5초마다 반복@Scheduled(cron = "*/5 * * * * *")ex2) 하루마다 반복@Scheduled(cron = "0 0 0 * * *")package kr.test.scheduler;import lombok.RequiredArgsConstructor;import lom..

Spring Boot 2025.06.20

[AG-Grid] 전체 목록 페이징 옵션 주기

AG-Grid 가 제공하는 기본 페이지네이션 기능을 사용하던 차에 페이지네이션+전체데이터 를 볼 수 있게 수정 요청을 받았다.AI는 paginationPageSizeSelector 에 false 를 주라니, "All", null, 0 등을 넣어보라고 했으나 모두 실패했다.찾은 해답은, 간단하게 변수를 만들고 데이터의 사이즈를 넣은 후 변수를 paginationPageSizeSelector 에 입력하면 되었다. function setData(obj){ let data = obj.dataList; let AllData = data.length; const gridOptions = { rowData: data, rowStyle: { cursor: 'pointer' }, columnDefs: [ //..

AG-Grid 2025.06.19
반응형