이 프로젝트에서 가장 큰 변화는 저자의 역할이었습니다. 저자는 코드를 문자 단위로 직접 입력하는 대신, 아키텍트이자 코드 검토자의 역할을 수행했으며, Cursor AI가 실제 구현 팀 역할을 담당했습니다.
아키텍트 워크플로우
-
Composer Mode 활용: 기능 구현 시 Cursor의 Composer Mode를 적극 활용했습니다. 예를 들어, “블로그 게시물 및 프레젠테이션에 대한 전체 CRUD 작업을 허용하는 관리 인터페이스를 생성하고, public 디렉터리의 사용 가능한 Markdown 파일에서 선택할 수 있는 드롭다운을 포함하라”와 같은 프롬프트를 사용하여 모델, 컨트롤러, 뷰를 자동으로 생성했습니다.
-
AI Agent 활용: UI 문제(예: 바닥에 고정되지 않는 푸터, 모바일 반응형 문제) 발생 시 Cursor의 AI Agent를 사용했습니다. 특정 파일에 대해 “모바일에서 푸터가 하단에 고정되도록 수정하라”고 지시하면, AI가 Tailwind 클래스를 분석하여 자동으로 수정 사항을 적용했습니다.
기술 스택: Rails 8 & SQLite
저자는 유지보수가 적고 성능이 뛰어난 블로그를 목표로 다음 스택을 선택했습니다.
-
프레임워크: Rails 8.1.1 (“One Person Framework” 철학)
-
데이터베이스: 개발 및 프로덕션 모두 SQLite3 (Rails 8에서 프로덕션용으로 충분히 활용 가능해짐)
-
프론트엔드: 스타일링을 위한 Tailwind CSS, 최소한의 JavaScript 상호작용을 위한 Hotwire (Turbo)
-
콘텐츠 관리: 파일 기반. 블로그 게시물은 Kramdown을 통해 렌더링되는 Markdown 파일, 프레젠테이션은 슬라이드 덱으로 저장.
AI로 구축된 기능
Cursor를 사용하여 단기간에 다음과 같은 다양한 기능을 구현했습니다.
-
커스텀 관리 인터페이스: 생체 정보, 연락처, 블로그 게시물을 관리하는 보안 백엔드.
-
스마트 콘텐츠 로딩:
public/blog_posts/에서 Markdown 파일을 자동으로 읽고 발췌문을 자동 생성. -
스티키 UI: 프로필 사진과 생체 정보가 있는 고정 헤더, 호버 시 강조되는 SVG 소셜 아이콘이 있는 스티키 푸터를 포함한 반응형 레이아웃.
-
GitHub 통합: 프레젠테이션 페이지가 슬라이드 덱 다운로드와 함께 관련 GitHub 저장소로 자동 연결.
배포: Kamal 2 & DigitalOcean
Rails 8에서는 Kamal 2가 기본 배포 도구로 채택되어 배포 과정을 혁신적으로 간소화했습니다.
-
환경: NYC3 지역의 월 $6 DigitalOcean Droplet에 배포.
-
Kamal 작동 방식: Kamal은 Docker를 사용하여 애플리케이션을 컨테이너화하고, 서버 설정부터 Let’s Encrypt를 통한 SSL 인증서 획득까지 모든 것을 자동 처리합니다.
-
SQLite 영구 볼륨: Docker 컨테이너의 휘발성 특성을 고려하여,
config/deploy.yml에/var/lib/my-blog-storage:/rails/storage와 같은 영구 볼륨을 구성하여 프로덕션 데이터베이스가 배포 간에도 유지되도록 했습니다.