메인 콘텐츠로 이동하기
  1. Posts/

리얼그루브 리뉴얼(1) - 커뮤니티에서 콘텐츠 중심 사이트로 변경 후 운영 비용 65% 줄이기

·8 분

작년부터 개발·운영 중인 록 음악 커뮤니티 리얼그루브를 개편하고, 9월 1일에 적용했다. 1년여간 쌓인 데이터와 운영 추이를 바탕으로 필요한 기능을 추가하거나 보완하고, 불필요한 기능은 정리했다.

개요 #

리얼그루브를 1년여간 운영하며 약 3,500건의 글을 작성하고 공유했다. 감사하게도 사이트에 가입해 주신 분들도 있었다. 글은 직접 작성하면서, AI를 활용해 카드뉴스와 주간소식 제작 과정을 자동화했다.

하지만 사이트는 회원들의 참여보다 내가 콘텐츠를 발행하는 일이 중심이 되었고, 회원들의 참여도 늘지 않았다.

당초 생각했던 운영 기간인 1년이 지나 현업에 복귀할 시기도 다가왔다. 복귀 후에는 기존 구조를 유지하면서 장애가 발생할 때마다 즉시 대응하기 어려울 것으로 판단했다.

회원들의 참여가 활발했다면 기존 구조를 유지했겠지만, 콘텐츠 발행이 중심인 상황에서는 이를 그대로 유지할 필요가 크지 않았다. 그래서 운영 부담을 줄이고 콘텐츠 발행에 집중할 수 있도록, 사이트 구조를 간소화하고 정적 사이트로 전환하기로 했다.

전환 과정에서는 코드 구현과 데이터 마이그레이션에 AI를 적극적으로 활용해 작업 시간을 줄일 수 있었다.

개편 기간 및 범위 #

회원 안내는 7월 31일에 시작했고, 사이트 구현과 전환 준비는 8월 1일부터 31일까지 진행했다. 사이트 구현 자체는 2주가 채 걸리지 않았으며, 9월 1일 공개 이후에는 운영 상태를 확인하고 외부 서비스를 정리했다. 소스 코드와 데이터 관리, 회원 기능, AI 자동화 등 리얼그루브의 개발·운영 전반을 개편 대상으로 삼았다. 주요 변경 사항은 아래와 같다.

항목변경 사항세부 내용
웹 애플리케이션(Laravel + Vue, Docker 환경)정적 사이트로 전환기존 애플리케이션을 정적 사이트로 재구현하고 Cloudflare Pages에서 운영
데이터베이스(PostgreSQL)사용 종료저장된 게시글을 마크다운(.md) 파일로 변환
회원회원 기능 제거 및 전체 회원 탈퇴 처리탈퇴 처리 한 달 전 기존 회원들에게 이메일로 사전 안내
소셜 로그인기능 제거유일하게 지원하던 구글 로그인과 관련 인증 API 제거
댓글외부 댓글 서비스로 대체기존 댓글 기능을 GitHub Discussions 기반의 댓글 서비스로 대체
검색정적 사이트용 검색 도입기존 검색 기능을 정적 사이트용 오픈 소스 검색 도구인 Pagefind로 대체
이메일 발송 서비스사용 종료Amazon SES를 통한 이메일 발송 중단
미디어 제공 서비스(Cloudflare Images Stream Bundle Basic)사용 종료미디어 파일을 정적 사이트에 포함해 Cloudflare Pages에서 제공
Google Workspace해지기존 이메일 주소는 Cloudflare의 이메일 라우팅 기능으로 유지
카드뉴스·주간소식 제작변경된 데이터 구조에 맞춰 수정AI가 변환된 마크다운 파일을 활용하도록 제작 과정 수정

Hugo를 선택한 이유 #

사이트 구조를 단순화하고 콘텐츠 발행 중심으로 운영하기 위해 정적 사이트 생성 도구인 Hugo를 선택했다. 선택한 이유는 다음과 같다.

  • 개발자 블로그를 비롯한 여러 사이트에서 활용하고 있어 참고할 수 있는 사례가 많았다.
  • 마크다운 파일로 콘텐츠를 관리할 수 있어, 데이터베이스의 게시글을 .md 파일로 옮기려는 방향에 적합했다.
  • React나 Vue 같은 프런트엔드 프레임워크 없이 HTML 중심으로 사이트를 구성할 수 있어 구조를 단순하게 유지하기 좋았다.
  • Cloudflare Pages에서 빌드와 배포 과정을 간단하게 구성할 수 있었다.

개편 진행 #

7월에 개편 계획을 세우고, 9월 1일 공개를 목표로 8월 한 달간 작업했다. 먼저 기존 회원들에게 회원제 종료와 탈퇴 처리 일정을 안내한 뒤, 사이트 구현과 약관 변경을 순서대로 진행했다.

개편한 사이트를 공개한 뒤에는 안정적으로 운영되는지 확인하고, 더 이상 사용하지 않는 외부 서비스를 정리했다. 카드뉴스와 주간소식 제작 자동화도 변경된 사이트 구조에 맞춰 수정했다.

회원 탈퇴 안내 #

회원 기능을 제거하기로 결정하면서, 기존 회원들이 종료 일정과 자료 요청 방법을 미리 확인할 수 있도록 안내했다. 7월 31일에 회원제 종료 및 신규 회원가입 중단 공지를 게시하고, 회원들에게 이메일로도 같은 내용을 알렸다.

주요 내용은 아래와 같다.

  • 사이트 구조를 단순화하기 위해 회원제를 종료하며, 신규 회원가입은 7월 31일부터 중단한다.
  • 기존 회원은 8월 31일까지 로그인과 글쓰기를 이용할 수 있으며, 9월 1일에 계정과 개인정보를 삭제할 예정이다.
  • 본인이 작성한 글과 댓글을 전달받고 싶은 회원은 8월 30일까지 안내 이메일에 기재된 주소로 요청할 수 있다.

구현 #

Laravel + Vue로 만든 사이트를 Hugo로 옮기는 작업이라 구현이 까다로울 것으로 예상했지만, 생각보다 수월했다. 기존 디자인을 유지한 덕분에 렌더링된 HTML을 재사용할 수 있었고, 구현 과정에서는 바이브 코딩을 적극적으로 활용했다.

기존 화면을 옮기는 과정에서 검색 기능의 이용 대상을 넓히고, 태그를 탐색할 수 있는 기능도 추가했다.

  • 검색: 기존에는 로그인한 회원만 검색할 수 있었지만, 개편 후에는 모든 방문자가 이용할 수 있도록 했다. 검색 기능은 Pagefind로 구현했다.
  • 태그: 게시글에 사용한 태그를 모아 볼 수 있는 목록 페이지를 만들고, 사이트 오른쪽에 ‘랜덤 태그’와 ‘최근 본 태그’ 영역을 추가했다.

회원 기능을 제거하면서 기존 댓글 시스템도 대체해야 했다. 여러 외부 댓글 서비스를 비교한 끝에, giscus를 도입해 댓글을 GitHub Discussions에 저장하고 관리하도록 했다. 서비스를 선택할 때는 광고 유무와 비용, 별도로 관리해야 할 요소가 있는지를 고려했다.

  • Disqus: 처음에는 도입을 고려했지만, 광고로 인해 이용 경험이 저하될 수 있다는 점이 리얼그루브의 운영 방향과 맞지 않는다고 판단했다.
  • Cusdis: 클라우드 서비스가 불안정했고, 직접 설치해 운영하려면 별도의 관리가 필요해 부담이 있었다.
  • LiveRe: 국내 서비스라는 점에서 검토했지만, 당시 무료로 제공되는 요금제가 없어 선택하지 않았다.

이런 조건을 종합했을 때 giscus가 가장 적합하다고 판단했다. GitHub이 일반 사용자에게는 익숙하지 않을 수 있지만, 댓글 화면이 깔끔하고 무료로 안정적으로 운영할 수 있다는 점이 선택 이유였다.

자체 회원 기능 없이 이용할 수 있는 익명 댓글 시스템을 직접 구현하는 방안도 고려했다. 다만 스팸 관리에 드는 부담이 커질 것으로 판단해 도입하지 않았다.

사이트 구현에 걸린 시간은 2주가 채 되지 않았다.

게시글 마이그레이션 #

데이터베이스에 저장된 약 3,500건의 게시글은 마크다운(.md) 파일로 변환했다. AI를 활용해 변환 작업을 수행하는 스킬을 만들었고, 이를 이용해 큰 어려움 없이 마이그레이션을 진행했다.

먼저 제목, 본문, 생성일, 참조 링크, 태그, 분류 등을 담은 마크다운 템플릿을 준비하고, 이 형식에 맞춰 게시글을 변환하도록 스킬을 구성했다. 이후 게시글을 1,000개 단위로 JSON 파일로 내보낸 뒤, 스킬을 실행해 변환했다. 변환 규칙은 다음과 같다.

  • 파일명은 {게시글ID}-{UUID}.md 형식으로 지정하고, YYYY/MM/DD 형식의 폴더에 저장했다.
  • YouTube와 Instagram 임베드는 Hugo에서 제공하는 쇼트코드(shortcode)로 변환했다.
  • 게시글의 댓글 설정값(true/false)에 따라 giscus 댓글 창을 활성화할 수 있도록 했다.

파일 저장 구조는 바뀌었지만, 기존 게시글 주소는 그대로 유지해 이전에 공유한 링크로도 접근할 수 있도록 했다. 본문에 사용한 이미지는 대부분 커버 이미지였는데, 저작권 문제가 있을 수 있다고 판단해 이번 마이그레이션에서는 제외했다. 기존 회원이 작성한 글과 댓글은 없어 별도로 옮길 데이터는 없었다.

이번 개편에서는 코드 구현보다 게시글 마이그레이션에서 AI의 도움을 더 크게 체감했다. 예전 같았으면 변환 코드를 작성하는 데만도 상당한 시간이 들었을 텐데, AI가 스킬을 만드는 과정에서 변환 스크립트까지 작성해 활용했다. 스크립트를 실행해 전체 게시글을 변환하는 데는 5분이 채 걸리지 않았고, 스킬 작성과 결과 검수도 1시간 안에 마쳤다.

약관 변경 #

회원제 폐지와 외부 댓글 서비스 도입 등 개편 내용을 반영해 이용약관개인정보처리방침을 수정했다. 개편한 사이트를 공개하기 일주일 전에 변경된 문서를 게시하고, 공지를 통해 주요 변경 사항을 안내했다.

주요 변경 사항은 다음과 같다.

  • 회원제 폐지와 외부 댓글 서비스 도입에 따른 관련 내용 수정
  • 웹사이트 이용 통계 관련 내용 수정
  • 웹사이트 운영에 사용하는 외부 서비스 관련 내용 수정

사이트 공개 #

Hugo로 구현한 리얼그루브는 예정대로 9월 1일에 공개했다. Cloudflare Pages에 사이트를 배포한 뒤, 메인 도메인을 연결해 개편을 마무리했다.

기존에는 컨테이너를 빌드하고 배포하는 데 오랜 시간이 걸렸다. 개편 후에는 main 브랜치에 변경 사항을 푸시하면 Cloudflare Pages에서 자동으로 빌드와 배포가 진행되도록 구성해, 배포 관리도 한결 편해졌다.

다만 Pagefind 검색 인덱스 등을 포함한 빌드 결과물의 파일 수가 20,000개를 넘어, 배포 당시 무료 요금제의 파일 수 제한을 초과했다. 이 때문에 25달러인 Pro 요금제를 사용했다.

공개 후 운영 #

공개 후 약 10일간 운영 상태를 확인했으며, 사이트는 별다른 문제 없이 동작했다.

가장 눈에 띈 변화는 응답 시간이었다. 리얼그루브 상태 페이지에 표시되는 응답 시간(Response Time)을 기준으로, 기존에는 평균 1,000ms 이상 걸렸지만 개편 후에는 약 100~200ms로 줄었다.

기존에 사용하던 Fly.io 인스턴스의 성능과 데이터베이스 입출력이 응답 시간에 영향을 주었던 것으로 보인다. 이전에도 웹과 데이터베이스 성능을 높인 뒤 속도가 개선된 경험이 있었다. 이번에는 미리 생성한 정적 페이지를 제공하면서 요청마다 데이터베이스에 접근할 필요가 없어졌고, 이 점이 응답 시간 단축에 기여한 것으로 보인다.

사이트가 안정적으로 운영되는 것을 확인한 뒤에는 더 이상 사용하지 않는 외부 서비스를 정리하고, 필요한 서비스는 대체하는 작업을 진행했다.

외부 서비스 해지 및 대체 #

개편 후 필요 없어진 서비스는 순차적으로 사용을 종료했다. 이미지 제공과 이메일 수신은 기존 서비스를 해지하고 Cloudflare로 옮겼다.

항목기존 서비스사용 용도조치 및 대체 방식
이메일 발송Amazon SES회원가입 안내 등 이메일 발송회원 기능 제거에 따라 사용 종료
서버Fly.io컨테이너 기반 웹 애플리케이션 운영Cloudflare Pages로 사이트를 이전한 뒤 사용 종료
이미지 제공Cloudflare Images Stream Bundle Basic썸네일 등 이미지 저장 및 제공기존 서비스를 해지하고 이미지를 Cloudflare Pages에서 제공
업무용 이메일Google Workspace이메일 수신 및 업무용으로 사용기존 서비스를 해지하고, 이메일 수신은 Cloudflare의 이메일 라우팅 기능으로 대체

카드뉴스·주간소식 제작 수정 #

사이트 구조가 바뀌면서 일일 카드뉴스와 주간소식 제작 과정도 수정했다. 기존 제작 방식은 유지하되, 프로젝트 구성과 소식 데이터를 가져오는 방법을 변경했다.

  • 별도로 관리하던 일일 카드뉴스와 주간소식 제작 프로젝트를 게시글의 마크다운(.md) 파일이 있는 사이트 프로젝트로 통합했다.
  • MCP를 통해 소식을 불러오던 방식을 마크다운 파일을 직접 읽고 분석하는 방식으로 바꿨다.
  • 개편 후 더 이상 사용할 수 없게 된 기존 MCP는 제거했다.

구체적인 변경 내용은 별도의 글에서 자세히 다루겠다.

개편 후 글 발행 과정 #

개편 후에는 새로운소식, 주간소식, 공지사항, 자유게시판에 사용할 마크다운(.md) 템플릿을 마련했다. AI를 활용해 게시판별 템플릿에 맞는 빈 글을 생성하는 스킬을 만들었고, 글 생성부터 작성·검수까지 다음 순서로 진행했다.

  1. 글 파일 생성: 파일명은 {id}-{uuid}.md 형식으로 지정했다. id는 마지막으로 생성한 글의 값에 1을 더하고, uuid는 파일을 만들 때 새로 생성했다.
  2. 본문 작성: 글은 직접 작성했다. 다만 단순한 소식 전달은 YouTube 동영상 URL을 입력하면 동영상과 본문을 분석해 내용을 채워 주는 스킬을 만들어 활용했고, 최종 검수는 직접 진행했다.
  3. 교정 및 표기 확인: 작성 후에는 오탈자와 문법, 고유명사 표기를 검사하고 수정하는 스킬을 사용했다. 처음 사용하는 고유명사는 별도의 마크다운 파일에 기록해, 이후에도 같은 표기를 사용할 수 있도록 했다.

검수를 마친 글은 main 브랜치에 반영해 Cloudflare Pages의 자동 빌드·배포 과정을 거쳐 발행했다.

구체적인 내용은 별도의 글에서 자세히 다루겠다.

비용 #

개편 전 월 운영 비용은 Fly.io의 웹·데이터베이스 운영에 58.77달러, Google Workspace에 8.32달러, Cloudflare에 5달러로, 총 72.09달러였다. Amazon SES는 이메일 발송량이 적어 비용이 발생하지 않았다. 개편 후에는 Cloudflare Pro 요금제 비용인 월 25달러로 줄어, 매월 47.09달러, 기존 대비 약 65.3%를 절감했다.

9월 18일 기준으로 적용한 환율인 1달러당 1,382.20원으로 환산하면, 약 99,643원에서 34,555원으로 줄어든 셈이다.

마치며 #

이번 개편은 1년여간의 운영 경험을 바탕으로 리얼그루브의 실제 이용 방식에 맞춰 사이트 구조를 정리하는 작업이었다. 회원 참여보다는 콘텐츠 발행이 중심이 된 상황에서, 현업에 복귀한 뒤에도 꾸준히 운영할 수 있는 구조가 필요했다.

정적 사이트로 전환하면서 직접 관리해야 할 서버와 데이터베이스, 외부 서비스를 줄였다. 응답 시간이 짧아지고 월 운영 비용도 약 65.3% 줄어들었다. AI는 구현과 데이터 마이그레이션에 드는 시간을 줄이는 데 도움이 됐고, 특히 게시글 변환 과정에서 그 효과를 크게 체감했다.

GitHub 기반 댓글처럼 일반 방문자에게 낯설 수 있는 부분은 남아 있다. 앞으로도 실제 이용 상황을 살피며 필요한 부분을 보완하고, 단순해진 운영 구조를 바탕으로 록 음악 소식을 꾸준히 발행하는 데 집중하려고 한다.