923 posts
Custom GPT: 나만의 맞춤형 AI 만들기

Custom GPT: 나만의 맞춤형 AI 만들기

ChatGPT를 사용하다 보면 이런 생각 해보셨나요? "이 작업을 위해 매번 똑같은 프롬프트를 입력하는 게 너무 번거로운데, 미리 설정해둘 수는 없을까?" 혹은 "우리 팀만의 특별한 용도로 커스터마이징된 ChatGPT가 있으면 좋겠는데..." 같은 생각 말이죠. OpenAI가 2023년 11월에 발표한 Custom GPT와 GPT Store가 바로 이런 니즈를 해결해주는 기능입니다. 코드를 한 줄도 작성하지 않고도 나만의 맞춤형 AI 어시스턴트를 만들고, 다른 사람들과 공유할 수 있게 된 거예요. 이 글에서는 Custom GPT가

GitHub Sponsors로 오픈소스 개발자 후원하고 후원받기

GitHub Sponsors로 오픈소스 개발자 후원하고 후원받기

오픈소스 프로젝트를 만들고 유지하는 건 생각보다 손이 많이 갑니다. 주말마다 이슈를 처리하고, 새벽에 PR을 리뷰하고, 버전 업데이트에 맞춰 코드를 고치죠. 이렇게 매일 시간을 쏟는 개발자에게 "고마워요"라는 말 대신 커피 한 잔이라도 사줄 수 있다면 어떨까요? GitHub Sponsors는 바로 이 목적으로 만들어진 GitHub의 공식 후원 프로그램이에요. 오픈소스에 기여하는 개발자나 조직이 GitHub 안에서 바로 후원을 받을 수 있게 해주죠. 이번 글에서는 후원을 받는 쪽, 후원을 하는 쪽 양쪽 관점에서 GitHub Spons

Piscina로 자바스크립트 멀티 쓰레딩 쉽게 하기

Piscina로 자바스크립트 멀티 쓰레딩 쉽게 하기

지난 포스팅에서 Node.js의 worker_threads 모듈을 통해 이제 자바스크립트에서도 멀티 쓰레딩이 가능하다는 것을 배웠는데요. 이번 포스팅에서는 워커 스레드 풀링(pooling)을 도와주는 라이브러리인 Piscina에 대해서 알아보겠습니다. Piscina란? 상용 애플리케이션을 개발할 때는 Node.js의 worker_threads 모듈을 그대로 쓰기는 곤란한 경우가 많은데요. 필요할 때 마다 매번 새로운 워커 스레드를 생성하면 서버에 부하를 주어 오히려 성능을 떨어뜨릴 수도 있죠. 그래서 스레드 풀(pool)을 사용하여

Cloudflare D1으로 서버리스 데이터베이스 시작하기

Cloudflare D1으로 서버리스 데이터베이스 시작하기

Cloudflare Workers로 서버리스 API를 만들다 보면 결국 데이터를 어딘가에 저장해야 하는 순간이 옵니다. KV는 단순한 키-값 저장에는 좋지만 관계형 쿼리가 필요해지면 한계가 드러나죠. 그렇다고 외부 데이터베이스를 연결하면 엣지에서 실행되는 Workers의 속도 이점이 사라집니다. D1은 이 문제를 해결하기 위해 Cloudflare가 만든 서버리스 SQL 데이터베이스예요. SQLite를 기반으로 Workers에서 바인딩 하나로 바로 접근할 수 있고, 별도의 서버 관리나 연결 풀링 없이 SQL 쿼리를 실행할 수 있습니다

워커 스레드를 통한 자바스크립트 멀티 쓰레딩

워커 스레드를 통한 자바스크립트 멀티 쓰레딩

worker_threads는 싱글 스레드 언어로 알려진 자바스크립트로도 멀티 스레드 프로그래밍을 가능하게 해주는 Node.js의 내장 모듈입니다. 이번 포스팅에서는 worker_threads 모듈을 사용하여 어떻게 멀티 스레드 프로그래밍을 할 수 있는지 예제를 통해서 설명드리겠습니다. 싱글 스레드의 한계 자바스크립트는 태성적으로 하나의 스레드로 동작하는 여러 작업을 처리할 수 있는 비동기 프로그래밍 언어였는데요. 이러한 특징은 작은 하드웨어 리소스로 여러 개의 IO 작업을 동시에 처리하는데 유리했으며 특히 브라우저 환경에서 빛을 발

Cloudflare R2로 이그레스 비용 없는 오브젝트 스토리지 사용하기

Cloudflare R2로 이그레스 비용 없는 오브젝트 스토리지 사용하기

클라우드에 파일을 저장하려면 보통 AWS S3를 떠올립니다. 문제는 비용이에요. S3에 파일을 올리는 건 저렴한데 사용자가 그 파일을 다운로드할 때마다 이그레스(egress) 비용이 붙습니다. 트래픽이 늘어나면 이 비용이 생각보다 빠르게 커지죠. Cloudflare R2는 이 문제를 정면으로 해결합니다. S3 호환 API를 제공하면서 이그레스 비용이 아예 없어요. 데이터를 얼마나 자주 내려받든 추가 비용이 발생하지 않습니다. 게다가 Cloudflare Workers에서 바인딩으로 직접 접근할 수 있어서 파일 업로드 API나 이미지

Cloudflare Workers KV로 전역 키-값 저장소 사용하기

Cloudflare Workers KV로 전역 키-값 저장소 사용하기

Cloudflare Workers로 애플리케이션을 만들다 보면 어딘가에 데이터를 저장해야 할 때가 옵니다. 설정값을 관리하거나 API 응답을 캐싱하거나 세션 토큰을 저장하는 등 간단한 키-값 패턴이 필요한 경우가 많죠. Workers KV는 이런 용도에 딱 맞는 서버리스 키-값 저장소입니다. Cloudflare의 전역 네트워크에 데이터가 분산 저장되어 있어서 세계 어디서든 빠르게 읽을 수 있고 Workers에서 바인딩 하나로 바로 접근할 수 있어요. Workers KV란 Workers KV는 Cloudflare의 엣지 네트워크 전체

innerHTML, innerText, textContent

innerHTML, innerText, textContent

DOM API에는 많은 웹 개발자들을 헷갈리게 하는 3가지 속성이 있습니다. 바로 느낌이 비슷한 innerHTML, innerText, textContent인데요. 모두 HTML 요소의 내용을 접근할 때 사용하는 속성이지만 알고 보면 중요한 차이점이 있죠. 이번 포스팅에서는 이 알쏭달쏭한 HTML 요소의 3가지 속성에 대해서 알아보겠습니다. innerHTML 속성 innerHTML 속성은 HTML 요소 내부에 있는 HTML 코드를 있는 그대로 문자열 형태로 접근할 수 있도록 해줍니다. 예를 들어, 다음과 같이 3개의 <li> 요소로

Wrangler: Cloudflare의 CLI

Wrangler: Cloudflare의 CLI

Cloudflare Workers로 서버리스 애플리케이션을 개발해보신 분이라면 Wrangler라는 CLI 도구를 한 번쯤 써보셨을 거예요. 프로젝트 생성부터 로컬 개발 서버, 배포까지 터미널 하나로 해결할 수 있거든요. 그런데 Wrangler는 단순히 Workers를 배포하는 도구가 아닙니다. KV, R2, D1 같은 Cloudflare 서비스도 관리할 수 있고 환경별 설정 분리나 시크릿 관리 기능까지 갖추고 있어요. 최근에는 Cloudflare 계정에 로그인하지 않고도 임시로 배포한 뒤 결과를 확인할 수 있게 됐습니다. 이번 글에

Shiki로 코드 하이라이팅하기

Shiki로 코드 하이라이팅하기

개발 블로그나 기술 문서를 작성할 때 코드를 예쁘게 보여주는 것은 생각보다 중요한 문제입니다. 읽기 좋은 코드 하이라이팅은 독자가 내용을 빠르게 파악하는 데 큰 도움이 되기 때문이죠. 이번 포스팅에서는 VS Code와 동일한 문법 엔진을 사용해서 아름답고 정확한 코드 하이라이팅을 제공하는 Shiki에 대해서 알아보겠습니다. Shiki란? Shiki(式, 일본어로 "스타일"이라는 뜻)는 코드를 구문 강조(syntax highlighting)해주는 JavaScript 라이브러리입니다. VS Code에서 사용하는 것과 동일한 TextMa

Cloudflare Workers로 서버리스 애플리케이션 만들기

Cloudflare Workers로 서버리스 애플리케이션 만들기

서버리스 애플리케이션을 만들고 싶은데 AWS Lambda는 너무 복잡하고, 배포도 번거롭다고 느껴본 적 있으신가요? 🤔 Cloudflare Workers를 사용하면 간단한 자바스크립트 코드 몇 줄로 전 세계 300개 이상의 엣지 로케이션에서 실행되는 서버리스 함수를 만들 수 있습니다. 이번 포스팅에서는 Cloudflare Workers의 기본 개념부터 실제 배포까지 단계별로 알아보겠습니다. Cloudflare Workers란? Cloudflare Workers는 Cloudflare의 엣지 네트워크에서 실행되는 서버리스 플랫폼입니다

uv로 파이썬 프로젝트를 빠르게 관리하기

uv로 파이썬 프로젝트를 빠르게 관리하기

파이썬으로 개발하다 보면 패키지 설치와 가상 환경 관리가 의외로 번거롭다는 걸 느끼게 되는데요. pip으로 패키지를 설치하고, venv로 가상 환경을 만들고, pyenv로 파이썬 버전을 바꾸고... 도구를 여러 개 써야 한다는 점이 특히 불편합니다. uv는 이런 고민을 한 방에 해결해주는 도구입니다. Rust로 작성되어 pip보다 10~100배 빠르고 패키지 설치부터 가상 환경, 파이썬 버전 관리까지 하나의 도구로 전부 처리할 수 있습니다. 이번 글에서는 uv를 설치하고 실제 프로젝트에서 활용하는 방법을 하나씩 살펴보겠습니다. uv

Himalaya: 터미널에서 이메일을 관리하는 CLI 도구

Himalaya: 터미널에서 이메일을 관리하는 CLI 도구

터미널에서 작업하다가 이메일 하나 확인하려고 브라우저를 여는 게 은근 번거롭지 않나요? 코드 리뷰 알림이 왔는지 확인하려고 Gmail 탭을 열었다가 어느새 유튜브까지 넘어가 있는 자신을 발견하곤 합니다. 😅 Himalaya는 이런 상황에 딱 맞는 CLI 이메일 클라이언트예요. IMAP과 SMTP를 지원하기 때문에 터미널을 떠나지 않고도 이메일을 읽고, 보내고, 정리할 수 있습니다. Rust로 만들어져서 빠른 건 물론이고 TUI가 아닌 CLI라 다른 도구와 엮어 쓰기에도 좋아요. 이번 글에서는 설치부터 실제로 이메일을 주고받는 데까

Gradle 시작하기

Gradle 시작하기

Gradle은 Java와 Kotlin과 같이 JVM에서 돌아가는 프로그래밍 언어에서 거의 표준으로 자리집은 빌드 도구입니다. 이번 포스팅에서는 Kotlin 개발자 분들을 위해서 Gradle에 대해 간단히 소개해드리도록 하겠습니다. (출처: https://docs.gradle.org/current/userguide/gradle_basics.html) 기존 프로젝트 기존 Kotlin 프로젝트에 합류하시는 개발자이시라면 이미 Gradle로 빌드를 하고 있을 확률이 매우 높은데요. 이미 Gradle가 빌드 도구로 설정되어 있는 프로젝트에서

오픈 소스 라이선스 가이드

오픈 소스 라이선스 가이드

혹시 오픈 소스 프로젝트를 시작하시면서 어떤 라이선스를 선택할지 몰라서 고민해본 적이 있으신가요? 깃허브에서는 코드 저장소를 생성할 때 항상 어떤 라이선스를 사용하지 물어보죠. 이번 포스팅에서는 MIT, Apache, GPL 등 널리 사용되는 오픈 소스 라이선스를 소개해드리고, 각 라이선스를 언제 선택하면 좋은지 알아보겠습니다. 오픈 소스 라이선스란? 오픈 소스 라이선스는 오픈 소스 소프트웨어가 어떻게 사용될 수 있는지 명시해주는 문서입니다. 개발자는 오픈 소스 라이선스를 통해서 소프트웨어의 소스 코드를 사용, 수정, 배포할 수 있

Ghostty: GPU 가속 터미널 에뮬레이터

Ghostty: GPU 가속 터미널 에뮬레이터

소프트웨어 개발을 하다 보면 터미널 앱을 꽤 오래 고민하게 됩니다. 운영체제 기본 터미널부터 iTerm2, Kitty, Hyper, Warp까지 이것저것 써봤는데요. 요즘 개발자 커뮤니티에서 Ghostty라는 터미널에 대한 칭찬이 끊이질 않길래 한번 설치해봤더니, 완전히 취향저격이었습니다. Hyper나 Warp처럼 화려한 UI나 부가 기능이 잔뜩 달려 있지는 않아요. 대신 터미널 본연의 기능에 충실하면서 깔끔하고 직관적인 인터페이스를 갖추고 있어서, 쓸수록 만족감이 올라가는 유형의 도구입니다. 왜 또 새로운 터미널인가요? 기존 터미

나 같은 평범한 개발자가 쓴 블로그를 누가 읽어 주겠어?

나 같은 평범한 개발자가 쓴 블로그를 누가 읽어 주겠어?

9년 전, daleseo.com 블로그를 시작하기를 망설이며 제 자신에게 끊임없이 되 묻던 질문입니다. "망망대해 같은 인터넷에 좋은 자료가 이미 넘쳐나는데 사람들이 뭐하러 나 같은 평범한 개발자의 글을 읽으러 오겠어?"라는 생각 때문에 오랫동안 주저했습니다. 당시에 블로그는 주로 네이버나 다음과 같은 대형 포털에 있었기 때문에, 저처럼 개인이 직접 운영하는 블로그를 누가 찾아올지 의문이었습니다. 혹시나 하는 마음으로 조심스래 첫 포스팅을 해봤는데 역시 아무런 반응이 없었습니다. 두 번째 포스팅, 세 번째 포스팅, 네 번째 포스팅에

WorkOS Connect로 내 앱을 OAuth 제공자로 만들기

WorkOS Connect로 내 앱을 OAuth 제공자로 만들기

앱에 인증을 붙일 때 우리는 보통 한 방향만 생각합니다. 구글이나 회사 SSO 같은 외부 신원 제공자에 "우리 사용자 좀 로그인시켜 주세요" 하고 기대는 쪽이죠. WorkOS로 엔터프라이즈 SSO 붙이기에서 다룬 게 딱 이 방향입니다. 그런데 서비스가 자리를 잡으면 반대 요구가 들어오기 시작해요. "당신 서비스의 계정으로 우리 앱에 로그인하게 해주세요", "그 사용자의 데이터를 API로 가져가게 해주세요" 하고 이번엔 다른 앱들이 우리에게 기대오는 겁니다. "Google로 로그인"이나 "GitHub로 로그인" 버튼을 우리 서비스 이

Kotlin의 Scope 함수 정리

Kotlin의 Scope 함수 정리

Kotlin의 Scope 함수는 객체의 컨텍스트 내에서 코드 블록을 실행할 수 있게 해주는 강력한 기능입니다. Scope 함수에는 let(), run(), also(), apply(), with() 이렇게 5개가 있는데요. 얘네들이 비슷한 것 같으면서도 미묘하게 달려서 잘 정리해두지 않으면 언제 어떤 녀석을 써야 하는지 은근히 헷갈릴 수 있습니다. 이번 포스팅에서는 Kotlin의 Scope 함수 5종의 사용법을 정리해드리도록 하겠습니다. 예제 클래스 다음과 같이 간단한 클래스를 가지고 간단한 예제 코드를 작성하면서 각 Scope 함

OAuth 2.0 메타데이터와 엔드포인트 동적 발견

OAuth 2.0 메타데이터와 엔드포인트 동적 발견

OAuth 2.0 스펙은 /authorize나 /token 같은 엔드포인트가 존재해야 한다고는 말하지만, 실제로 어떤 경로에 두어야 하는지는 정하지 않습니다. 그래서 한동안 관행은 단순했어요. "구글은 accounts.google.com/o/oauth2/v2/auth, GitHub는 github.com/login/oauth/authorize" 같은 정보를 사람이 공식 문서에서 읽어다가 클라이언트 코드에 박아 넣는 방식이었죠. 이 방식은 금방 한계를 드러냈어요. 새로운 신원 공급자(Identity Provider, 이하 IdP)를 추

Discord