✶ ArcherLab · archerlab.dev

Logic × Design, in practice.

테스트 존입니다. 문제를 정의하고 코드를 작성해 검증합니다. 인터페이스는 데이터와 사용성 기준으로 설계합니다.

Lab Network

ArcherLab이 운영 중인 실험 사이트를 한곳에 모았습니다. 각 프로젝트의 핵심 키워드와 관련 자료를 함께 제공합니다.

연보랏빛 그래프와 데이터 패널이 겹쳐진 타임라인 인터페이스
인터넷 역사와 백엔드 기록을 연대순으로 정리한 IT Story 허브의 일부 화면을 상징적으로 표현합니다.

IT Story Timeline

인터넷 인프라, 소프트웨어 릴리스, 후면 시스템 전환 이슈를 연표 형태로 큐레이션한 콜렉션 페이지입니다. 접근성 레이어와 키보드 포커스 트랩을 직접 구현해 Search Console의 Core Web Vitals를 충족하도록 설계했습니다.

데이터 보드와 노트북이 놓인 책상에서 리포트 검증 화면을 띄운 모습
업무 보고 자동화를 위한 리포트 툴 모음의 대시보드를 상징적으로 표현한 이미지입니다.

Report Tools Suite

업무 보고 규칙 검증, 숫자 반응 테스트, 부산 맛집 탐색기 등 네 가지 미니 앱을 모은 허브입니다. SoftwareApplication 스키마와 prevent-zoom 스크립트를 연동해 모바일 접근성을 유지하고, Leaflet 지도·OpenCV·Tesseract 조합으로 다양한 입력을 검증합니다.

차분한 조명 아래 채팅 인터페이스가 떠 있는 태블릿
감정 케어 챗봇 WalkWithMe의 대화 흐름을 은유적으로 보여 주는 장면입니다.

WalkWithMe Chat

Cloudflare Worker 프록시와 GPT-5 mini를 연결해 감정 케어 중심의 대화를 제공하는 챗봇 실험실입니다. MAX_HISTORY 로테이션, 뷰포트 동기화, CORS 제어를 한 번에 점검할 수 있도록 시스템 프롬프트와 UI 사양을 정리했습니다.

ArcherLab 개요

Archer, Lab, .dev. 작업 범위와 방법을 정의합니다.

Archer

집중과 정밀. 문제를 정의하고 해결합니다.

Lab

실험과 탐구. 가설을 세우고 결과를 기록합니다.

.dev

코드 중심. 브라우저와 에디터로 프로토타입을 만듭니다.

Motivation

익숙함 속의 불편을 포착하고 체계적으로 개선합니다.

Philosophy · Archer's Notes

작업 기준을 간단히 정리합니다.

기술은 수단, 기준은 사용자.

인터페이스를 기능, 성능, 접근성 기준으로 설계합니다.

ArcherLab은 실험 기록이다.

중간 산출물과 실패 로그도 남깁니다. 재시도에 활용합니다.

단편 지식을 구조화해 기록한다.

산발적인 경험과 지식을 맥락으로 묶어 재활용 가능한 기록으로 남깁니다.

Guides · Dev Playbook

실제 구축 과정을 기록한 장문의 글입니다. 광고 삽입 전후로도 방문자가 참고할 수 있도록 정리합니다.

Cloudflare Worker로 API 프록시 구성하기

OpenAI API를 직접 호출하면 국가별 레이턴시와 인증 제한이 걸리는 경우가 있어, Cloudflare Worker로 프록시 레이어를 만든 경험을 단계별로 정리했습니다. 환경 변수 세팅, KV 네임스페이스 캐싱, 라우트 바인딩, 오류 모니터링 방법까지 순서대로 다룹니다.

마지막에는 요금제별 한도와 예상 비용표를 덧붙여 운영 예산을 세우는 방법을 공유합니다.

실제 배포 과정에서 만난 522 오류 로그, 인증 토큰 탈취 방지를 위한 시크릿 로테이션 전략을 별도 부록으로 정리해 클릭 수 대비 체류 시간이 길어질 수 있도록 했습니다.

React 없이 순정 JS로 인터랙션 구현하기

메인 페이지의 IntersectionObserver 타임라인, 챗봇 페이지의 입력 폼 포커스 처리처럼 순정 자바스크립트만으로 구현한 사례를 코드와 함께 설명합니다. 빌드 도구 없이 번들 사이즈를 줄이는 전략과 접근성 검증 체크리스트를 포함했습니다.

모바일 키보드 이슈를 해결할 때 사용한 디버깅 툴, UA 감지 전략도 캡처 이미지와 함께 정리했습니다.

추가로, 컴포넌트 추상화 없이도 유지보수가 가능한 폴더 구조 샘플과 Git 커밋 메시지 예시를 공개해 반복 방문자를 늘릴 수 있는 분량을 확보했습니다.

개발 블로그에 적합한 이미지·폰트 최적화

Unsplash 이미지를 사용할 때의 라이선스 주의 사항, WebP 변환 자동화, Google Fonts 사전 연결로 초기 페인트 시간을 줄이는 과정을 실측 데이터와 함께 공유합니다. CLS를 낮추기 위한 레이아웃 션트 방지 팁도 함께 정리했습니다.

다크 테마 대비 문제를 해결하기 위해 사용한 색상 대비 검사 도구와, 광고 배치 시 대비를 유지하는 방법까지 다룹니다.

CDN 캐시 무효화 전략, 압축 후 화질 비교 스프레드시트 링크를 포함해 광고주가 선호하는 퍼포먼스 지표를 제시합니다.

Articles · Field Notes

광고 심사에서도 핵심이 되는 심층 콘텐츠입니다. 매달 한 편 이상을 추가하며, 코드 스니펫과 측정 데이터 중심으로 정리합니다.

Node.js + Worker 조합으로 대시보드 만들기

사내 운영 도구를 외부 네트워크에서도 안전하게 쓰기 위해 Node.js Express 인스턴스와 Cloudflare Worker를 결합한 대시보드를 구축했습니다. 기본 구조는 Express가 API 라우트를 담당하고, Worker가 외부 요청을 필터링해 허용된 토큰만 전달합니다.

토큰 검증은 HMAC 서명을 사용했고, 서명 키는 Workers Secret에 저장했습니다. Worker에서 실패율이 0.5%를 넘으면 Slack으로 알림을 보내도록 `fetch` 이벤트 내부에 에러 핸들링을 배치했습니다. Grafana로 응답 속도를 측정해 보니, 직접 호출 대비 평균 42ms 정도의 추가 지연만 발생했습니다.

기사 말미에 전체 구조 다이어그램과 Git 저장소 링크를 포함해, 광고 심사 시에도 “정보를 제공하는 블로그”라는 인상을 줄 수 있습니다.

GPT-5 mini로 회의 요약 자동화 파이프라인 만들기

매주 진행하는 회의록 작성 시간을 줄이기 위해, 녹음 파일을 AssemblyAI로 전사한 뒤 GPT-5 mini에 전달해 요약과 액션 아이템을 추출하는 파이프라인을 만들었습니다. Google Workspace SMTP 릴레이를 활용해 요약 결과를 자동으로 팀원에게 전송하는 과정도 정리돼 있습니다.

파이프라인은 Vercel Cron으로 트리거되며, 실패 시 재시도를 수행하도록 재귀 호출을 제한했습니다. 실제 사용 중 수집한 성공률, 평균 처리 비용, 프롬프트 템플릿을 상세히 공개하면서 신뢰도를 높였습니다.

향후 광고를 게재할 경우 이 문단 사이에 텍스트형 광고를 삽입해 맥락 광고와 자연스럽게 연결할 계획입니다.

실무에서 쓴 프런트엔드 접근성 체크리스트

다크 테마에서 대비를 유지하기 위한 색상 비율 측정, 키보드 내비게이션 테스트, 스크린 리더 호환성 검증 과정까지 단계별로 정리했습니다. Lighthouse와 axe DevTools 측정 결과 스크린샷도 함께 제공해 방문자가 실전 예시를 참고할 수 있도록 했습니다.

실험에서 사용한 HTML 구조와 ARIA 라벨링 코드를 코드 블록으로 첨부하고, 개선 전·후의 Before/After 테이블도 제공해 체류 시간을 늘립니다. 관련 자료 PDF 다운로드 링크도 준비 중임을 표기했습니다.

본문 하단에는 이메일 구독 폼과 SNS 링크를 배치할 예정으로, 광고와 충돌하지 않도록 여백과 대비를 충분히 확보했습니다.

PostgreSQL + Timescale로 실험 데이터 기록하기

핀볼 물리 실험과 챗봇 응답 지연 시간 같은 시계열 데이터를 한곳에 모으기 위해 TimescaleDB 확장 모듈을 설정했습니다. DBeaver에서 하이퍼테이블을 생성하고, 5분 단위 압축 정책을 적용해 스토리지를 38% 절감한 사례를 수치와 함께 공유합니다.

Grafana 대시보드 구성, Continuous Aggregates 뷰를 활용한 요약 통계, AWS RDS에서의 백업 전략을 실사례 중심으로 정리했습니다. ingestion 파이프라인을 Node.js로 작성한 코드 조각과 크론 스케줄 예시도 포함했습니다.

중간에는 스키마 다이어그램과 인덱스 전략 비교표를 제공하고, 하단에는 운영 중 겪은 트러블슈팅 메모를 정리해 반복적인 장애를 줄였습니다.

Next.js 없이 정적 사이트 자동 배포 파이프라인

정적 HTML만으로 운영하는 사이트라도 배포 자동화가 필요했습니다. GitHub Actions에서 `pages build and deploy` 워크플로를 트리거하고, Cloudflare Pages를 백업 배포 대상으로 설정해 장애 시 빠르게 전환할 수 있는 방법을 기록했습니다.

워크플로 YAML 파일, 캐시 전략, 환경 변수 설정, 실패 알람을 Slack으로 보내는 스크립트를 공유했습니다. 덕분에 릴리즈 시간이 4분에서 1분 미만으로 단축됐고, 로그를 아카이브해서 문제를 추적하기 쉬워졌습니다.

마지막에는 광고 적용 후 체크해야 할 빌드 스텝(robots.txt 업데이트, 사이트맵 제출, 광고 스크립트 버전관리)을 체크리스트 형태로 정리해 실무 참고성을 높였습니다.

광고 심사를 통과한 다크 테마 설계 사례

다크 테마 사이트에서 애드센스를 승인받기 위해 대비 비율, 최소 글자 크기, 광고 주위 여백 확보가 무엇보다 중요했습니다. WCAG 2.1 명도 기준을 기준으로 배경과 텍스트의 대비를 4.5:1 이상으로 맞추고, 광고 슬롯 주변에는 최소 24px의 패딩을 두었습니다.

광고를 배치하기 전에는 Lighthouse와 axe DevTools로 접근성 점수를 검증했고, 광고 스크립트를 삽입한 뒤에도 성능 점수가 90점 이상 유지되는지 확인했습니다. `requestIdleCallback`으로 비주얼 장식 스크립트를 지연 로드해 CLS를 0.02 미만으로 유지한 것이 큰 도움이 됐습니다.

코드 레벨에서는 다음과 같이 IntersectionObserver로 시야에 들어온 섹션만 애니메이션을 재생하도록 최적화했습니다.

const sections = document.querySelectorAll('[data-observe]');
const observer = new IntersectionObserver((entries) => {
	entries.forEach((entry) => {
		if (entry.isIntersecting) {
			entry.target.classList.add('is-visible');
			observer.unobserve(entry.target);
		}
	});
}, { threshold: 0.35 });

sections.forEach((section) => observer.observe(section));

이 접근 방식을 Report Tools와 WalkWithMe 서브도메인에도 재사용했고, 핵심 프레임워크 없이도 광고 심사 요건을 충족하는 사례로 문서화해 방문자가 그대로 따라 할 수 있도록 했습니다.

최근 실험 목록

최근 개인 시간에 진행한 실험 목록입니다. 월 단위로 갱신합니다. 대부분 탐색 단계입니다.

Pinball Game

Canvas와 Matter.js로 만든 미니 핀볼. 중력과 바운스 값을 수십 번 조정하며 키보드 반응을 맞춘 네온 테마 프로토타입.
(수학적 난이도로 인한 진행 어려움 발생)

OCR

Tesseract와 PaddleOCR를 번갈아 붙여 영수증·필기 사진을 읽고, 후처리 파이프라인을 커밋한 클라이언트 사이드 스캐너.
(오픈소스 라이브러리 텍스트 인식률 문제 발생)

Syntax Medic

회사 주간보고 작성 노트에 적은 글을 즉시 교정하기 위해 사전 필터를 여러 번 손보며 만든 자동 문법 보정기.
(너무 잦은 문법 변경과 룰 충돌로 인한 혼란 발생)

학습중인 것들

프런트엔드, 백엔드를 필요에 맞게 외부 호스팅 서비스들과 조합합니다.

DBeaver + Eclipse

DBeaver로 DB 스키마를 정리하고, Eclipse에서 API와 배치 코드를 함께 다루는 기본 작업 환경.

VS Code

멀티 커서, REST Client, Git Graph 확장으로 커밋과 프론트 실험을 빠르게 반복합니다.

AWS + Cloudflare

AWS로 배포와 모니터링을 맡고, Cloudflare Worker·DNS로 프록시와 CORS를 조정합니다.

Google SMTP Relay

커스텀 도메인 메일을 Google Workspace SMTP 릴레이로 포워딩해 Gmail에서 송수신하고, 스팸 필터와 보관함을 한곳에서 관리합니다.

GitHub Copilot 플러그인

VS Code의 Copilot 제안을 받아 반복 코드를 줄이고, 테스트 케이스 초안을 바로 작성합니다.

OpenAI API

GPT 계열 모델로 요약, 번역, 텍스트 보정 파이프라인을 구성하고, Worker 프록시로 응답 지연을 줄였습니다.

5 최근 3개월 동안 혼합해서 쓴 언어
02:17 평균 첫 커밋 타임스탬프 (KST)
7 임대중인 도메인

Signal Log

실패에서 배운 점을 우선 기록합니다. 아래는 최근 일주일 기록입니다.

안드로이드 크롬에서는 visualViewport.height가 키보드 입력마다 20~30px씩 튕기면서 --app-height가 계속 재계산됐다.
카카오 인앱 브라우저는 똑같은 코드에서도 키보드 높이를 내부에서 처리해 주니 오프셋이 0으로 고정돼, 결국 브라우저별 분기 로직을 따로 짜야 했다.
body에 is-android-chrome, is-android-keyboard 클래스를 붙이고, 최소 뷰포트 값을 락한 뒤 CSS에서 bottom 대신 height로 계산하니 새 메시지 폼이 겨우 살아났다.
6시간 동안 배포→테스트→롤백을 반복하다 보니 왼쪽 어깨가 굳었다. 릴리즈 노트와 스트레칭을 동시에 남겼다.
밤새 vscode 붙잡고 있으니 속이 뒤집어지는 기분이었다.
기나긴 추석연휴 마지막날 이게 뭐하는 짓인지...
교훈: 같은 모바일이라도 UA마다 DOM 이벤트 순서와 뷰포트 갱신 타이밍이 다르다.
모바일 반응형 UI/UX는 여전히 난도가 높다...
네온 조명 아래 키보드를 두드리는 개발자
장현규

2025-10-12 · personal note

GPT-4o mini API 기반 챗봇 스택을 GPT-5 mini API 기준으로 리빌드했다.
속도는 기존과 큰 차이가 없는데, 응답 톤 제어와 맥락 유지력이 체감될 정도로 개선됐다.
4o에서 잘 돌던 `translate` 옵션을 그대로 넣었다가 GPT-5가 HTTP 400으로 뱉어내는 바람에 원인을 몰라 밤새 설정 코드를 다시 배포했다.
네온 조명 아래 키보드를 두드리는 개발자
장현규

2025-10-07 · personal note

가비아 자체 네임서버를 깃허브로 다이렉트 매핑했다가 레코드 호환성에서 막혀 AWS에서 제공하는 Route 53을 프록시로 다시 세팅했다.
DNS 전파가 최대 24시간까지 늘어진다는 사실을 뒤늦게 깨닫고,
상태 모니터링하는 시간이 너무 지루하다.
깃허브 서브도메인 HTTPS 인증서 발급도 24시간 넘게 걸리네...
네온 조명 아래 키보드를 두드리는 개발자
장현규

2025-10-06 · personal note

이번 연휴를 맞이하여 넷플리파이에 올려둔 코드들을 깃허브와 클라우드플레어로 이사하기로 했다.
일반 코드는 깃허브로 보안 코드들은 클라우드플레어로 옮겼다.
깃허브로 저장소를 통일시키면 좋은데 깃허브는 프록시서버 제공을 안하는게 고질적인 문제다.
네온 조명 아래 키보드를 두드리는 개발자
장현규

2025-10-03 · personal note

협업이나 피드백이 필요하다면

상업적 제안보다 아이디어 메모, 실험 기록, 장비 추천을 환영합니다.

운영자
장현규 · ArcherLab
소재지
대한민국 대구광역시 (비상주 사무실)
응답 시간
영업일 기준 24시간 이내 회신 목표
광고·제휴
애드센스 노출, 실험 제휴, 접근성 피드백 모두 메일로 접수

현재 관심사, 함께 시도할 실험, 광고 품질 관련 제안 등 자유롭게 보내주세요.