[Flask로 블로그 만들기] 1. 블로그를 설계하자!
문득 블로그를 만들고 싶었습니다. 제가 만들었던 서비스를 한 눈에 모아보고 제 경험과 생각을 정리하 수 있는 블로그 말입니다. 그 블로그가 지금 여러분이 보시는 바로 이 블로그인데, 이를 만들기까지의 여정을 글로 정리해보겠습니다.
앞서, 이는 블로그를 제작하는 경험을 담은 수기이며 Flask를 이용한 웹 개발의 자세한 기술적인 내용은 담지 않았습니다. 따라서 Flask를 이용한 웹 개발에 관한 힌트를 얻으시려면 다른 글을 참조하시기 바랍니다.
블로그를 '직접' 만들자!
블로그 서비스를 이용하려 하니 선택지는 몇 개 없었습니다. 가장 대표적인 네이버 블로그나 티스토리는 대기업 산하에 있는 서비스형 블로그이기 때문에 제 개인 정보를 저장하기 싫었으며, 그마저도 자유도가 심히 떨어집니다. 티스토리의 자유도에 관한 제 생각은, 네이버 블로그보단 자유롭지만 여전히 카카오 관련 CDN을 이용하고, 그쪽 DB에 저장된 정보로 로그인해야하며, 기업과 뗄 수 없는 에셋이 있다는 생각이었습니다. 막연히 제가 통제할 수 없는 서버에 제 자료가 저장되는 것이 싫었던 것이죠.
결국 서비스형 블로그는 이용을 피했고, WordPress(설치형)를 서버에 직접 설치하여 사용하거나 Jekyll을 이용한 정적 사이트형 블로그를 만들까 했었습니다. WordPress는 묘하게 끌리지 않았고, 예전에 GitHub Pages + Jekyll을 이용하여 운영했던 블로그는 글 작성이나 관리가 어려워서 글을 잘 쓰지 않게 되었던 적이 있습니다. 그도 그럴게, 매 글을 쓸 때마다 글을 따로 작성해서 커밋&푸시를 해야하니까요. 게다가 GitHub는 '빅테크' 마이크로소프트 산하의 서비스죠.
그래서 '직접' 만들기로 했습니다. 간편하게 웹에서 글을 작성할 수 있으며, 제가 통제할 수 있는 서버에 모든 자료를 올릴 수 있고, 쓸데없는 원격 측정(Telemetry)을 하지 않는 그런 블로그 말입니다. 게다가 제 웹 프로그래밍 경험에도 도움이 되니, 얼마나 좋습니까!
어떤 언어로 프로그래밍 할까?
보통 HTML + CSS + JS는 알아야 웹 사이트를 만들 수 있습니다. 선택해야 할 점은 서버 측 플랫폼을 무엇을 쓸지였습니다. 흔히 APM으로 불리는, Apache + PHP + MySQL을 이용할 수 있었지만, PHP를 사용했었을 때 경험이 그리 좋진 않았어서 이번에는 Ngnix + Flask + MySQL을 사용해보기로 했습니다. PostgreSQL을 사용해보려 했지만 소규모 데이터엔 MySQL이 오히려 더 빠르다는 이야기도 있길래 일단 MySQL을 사용하기로 했습니다.
Flask말고도 같은 파이썬인 Django를 쓸 수도 있었고, 아예 ASP나 JSP를 쓸 수도 있었지만 이중에 제일 덜 대중적인(?) Flask를 이용해보기로 하였습니다. 자바는 제가 별로 좋아하지 않으며, 닷넷은 좋아하나 일개 블로그 만드는덴 과한 것이 아닌가 생각이 들었고 Django랑 Flask 중에 고른 것입니다. 풀 스택 프레임워크보단 마이크로 프레임워크를 이용하여 모듈을 하나씩 불러오는 재미가 있을 것 같아서 Flask로 골랐습니다.
번외: 정적 웹 생성기를 사용하면?
요즘 또 유행이라고 하는 정적 웹 생성기(Static Site Generator)는 논외였습니다. 블로그는 굉장히 정적인 사이트이기 때문에 문제는 없었겠지만, Jekyll을 썼을 때 댓글창 구현에 아쉬운 점이 많았기 때문입니다. giscus라는 오픈소스 프로젝트를 이용하여 외부 서버에 구현된 댓글 창을 iframe방식으로 불러오는 방식이었는데, 이것이 썩 마음에 드는 방식은 아니었기 때문입니다. 마음대로 커스텀하기도 힘들었고요.
만들어야 하는 레이아웃과 기능
레이아웃
먼저 레이아웃을 설계했습니다. 첫 화면인 '프론트 페이지'와 글을 보여주는 '뷰 페이지'의 레이아웃이 별도로 필요할 것입니다. 프론트 페이지는 상단에 Header, 가운데에 Main, 하단에 Footer를 두는 고전적인 레이아웃을 사용하기로 했습니다.
위와 같은 구조의 뷰 페이지는 프론트 페이지와 전체적인 모양은 같지만 Main부를 세 개의 열로 쪼개서 각각 글 정보, 본문, 콘텐츠 내비게이션(ToC; Table of Contents ) 더 많은 정보를 제공하되 프론트 페이지와 통일감을 주도록 했습니다.
추가로 전체 글 목록을 보여주기 위한 아카이브 페이지는 뷰 페이지에서 포스트 정보와 콘텐츠 내비게이션 부분이 없는 형태로, 본문(글 목록) 부분만 집중적으로 보여지도록 했습니다.
기능
블로그에 들어가는 기능은 여타 서비스형 블로그와 같습니다. 관리자 페이지와 로그인을 구현한 후, 글을 작성하고 관리하는 기능을 넣습니다. 최근 댓글을 한번에 모아보는 기능도 관리자 페이지 안에 넣습니다. 그래야 여러 글에 흩어진 댓글 중 어느 글에 새 댓글이 달렸는지 알기 편하고, 나중에 알림 기능을 구현할 때도 용이합니다.
딱히 어려운 기능은 없는 것 같습니다. 페이징 기능도 만들 필요가 없습니다. 글 목록은 아카이브 페이지에 몽땅 한번에 표시하기 때문입니다. 대신 아카이브 페이지는 작성 날짜와 제목만 표시하는 간단한 페이지가 될 것입니다. 그래야 한번에 보여져도 로딩할 요소가 적기 때문입니다.
철학
설계 방향성을 미리 정해야 처음 아이디어와 다르지 않은 결과물이 나옵니다. 그래서 아래와 같은 '개발 철학'을 정했습니다.
방문자가 안심하고 탐색할 수 있는 환경을 만들기 위해 개인정보 친화적인 사이트를 만들 것.
외부 사이트로의 이동은 하이퍼링크에 목적지를 표시하고, referrer를 보내지 않을 것.
로그와 개인 정보는 최소한의 정보를 최소한의 기간으로만 남길 것.
서버 외부의 자원을 로드하지 않을 것. 모든 자원을 내 통제 하에 둘 것.
추적기와 제3자 광고를 게시하지 않을 것.
자바 스크립트를 사용하지 않더라도 주요 기능을 이용할 수 있을 것.
방문자가 불편하지 않게 탐색할 수 있는 사이트를 만들 것.
가능한 한 자원의 크기를 줄일 것.
웹 표준을 준수하고, 장애와 상관 없이 탐색할 수 있는 접근성이 뛰어난 사이트를 만들 것.
다크 모드를 지원할 것.
반응형 웹을 지원할 것.
관리하기 편한 사이트를 만들 것.
SSH 접속 툴 없이 사이트를 관리할 수 있도록 관리자 페이지를 만들 것
외부 프로그램 없이 웹 환경에서 자체적으로 글을 작성할 수 있게 할 것.
위와 같은 철학 하에 블로그를 만들기로 하였고, 개발에 착수했습니다.
다음 편에 계속됩니다.
시리즈: Flask로 완전 처음부터 블로그 만들기
1. 블로그를 설계하자! (현재)