blog.stackframe.dev

블로그 개발 삽질기 1 - 설계

  1. 블로그 개발 삽질기 0 - 발단
  2. 블로그 개발 삽질기 1 - 설계
  3. 블로그 개발 삽질기 2 - reStructuredText 파서 구현
  4. 블로그 개발 삽질기 3 - 템플릿 구현
  5. 블로그 개발 삽질기 4 - Service Worker
  6. 블로그 개발 삽질기 5 - 파서 리팩토링

자체제작을 선택했으니 이제 설계를 해야한다. 초기에는 정말 의욕이 넘쳐서 온갖 아이디어가 막 떠오른다. 서비스형 블로그처럼 회원가입을 하면 블로그가 생성되고 여러 사람이 함께 하나의 블로그에 글을 쓸 수 있게 한다거나, Webauthn을 사용해서 하드웨어 2차 인증 로그인을 지원한다던가... 상상만으로는 벌써 블로그를 다 만든 기분이었다.

하지만 현실은 매우 각박하다. 무엇보다 시간과 인력이 부족하다. 연동없이 광고를 띄울 수 없게 되는 날이 처음엔 2월 말이라고 공지가 나왔었다. 1개월도 안되는 기간 안에 블로그를 혼자서 밑바닥부터 만들 수 있을까 생각을 해봐도 이건 아닌 것 같았다. 다행히 카카오 쪽에서도 이런저런 문제가 있었는지 이후에 6월 말로 미뤄졌지만. 물론 기존에 나와있는 CMS를 사용하면 순식간에 뚝딱이다. 하지만 애초에 공부하려는 목적도 있고 나는 바퀴의 재발명을 매우 좋아하기 때문에 CMS는 사용하지 않았다.

아이디어는 마구 튀어나왔지만 현실적으로 그걸 모두 구현하려면 6개월은 잡아야 하기 때문에 적당히 걸러내서 아래와 같이 정리했다.

  • 도메인 CNAME 설정을 통한 블로그 등록 요청
  • 한 블로그에 다중 사용자 로그인
  • 블로그 글 포맷은 reStructuredText
  • 다크모드 토글
  • 템플릿을 사용하여 사용자가 블로그 디자인을 수정
  • Webauthn을 통해 하드웨어 인증키 사용 가능
  • 답글에 답글을 달 수 있는 댓글

먼저 개발언어는 PHP, 사용할 데이터베이스는 PostgreSQL로 정했다. 그리고 프레임워크는 예전에 다른 사이트와 함께 만들었던 자작 프레임워크를 사용했다. 프레임워크라고 부르긴 하지만 라라벨처럼 거대한게 아니라 라우팅, 미들웨어, 데이터베이스 쿼리, 캐싱, 세션 정도만 관리해주는 마이크로 프레임워크다. 기능은 많지 않지만 마이크로답게 성능은 만족스럽다.

글 포맷을 reStructuredText로 선정한 이유는 여러가지가 있다. 내가 reStructuredText를 처음 접하게 된 것은 친구의 일이 계기였다. 어떤 프로그램을 문서화 하는 작업을 하면서 나한테 이 마크업을 보여줬는데 처음에는 이게 뭐 이렇게 복잡한건지 매우 까다로웠다. 그래도 열심히 스펙 문서를 읽으면서 어찌저찌 이미지 크기를 설정할 수 있었다. 이후 이 블로그를 만들게 되었을 때 어떻게 해야 XSS 같은 문제가 생기지 않으면서 일관성있고 작성할 때도 보기 쉬울 수 있을까 고민을 하던 차에 이게 생각나서 선정하게 되었다. 후보로는 마크다운과 BBCode, 나무위키 문법, 그냥 HTML이 있었다. HTML을 그대로 쓰는건 아무래도 보안상 문제가 많고 글마다 스타일이 들쭉날쭉해지기 때문에 바로 탈락이었고, 나무위키 문법은 매개변수나 스타일 쪽으로 가면 너무 복잡해진다. BBCode는 거의 HTML에서 <>를 []로 바꾼 형태이지만 여전히 코드만 본다면 읽기 어렵다. 마크다운은 꽤 간단하고 읽기도 편해서 고민을 했지만 reStructuredText 쪽이 directiveinterpreted text 같이 확장성있는 요소가 있어서 결과적으로 reStructuredText를 선택했다.

아이디어 정리가 끝나고 데이터베이스 구조를 설계했다. 기본적으로 PostgreSQL이니까 테이블 용도에 따라 스키마로 구분해주고 테이블 간의 연관관계에 따라서 외래키와 인덱스를 설정하는 정도이지만 꼭 초기에는 필요한 컬럼이 한 두 개씩 추가되거나 두 테이블 중에 어디에 이걸 넣어야 나을지, 아예 새로운 테이블을 만들어서 더 확장성있게 구현하는게 좋을지 고민이 되는 부분이 생긴다. 이렇게 하나 둘 고치다보면 점점 커지는 데이터베이스와 덩달아 늘어나는 코드의 양을 보게된다.

여기까지 하는데 벌써 1주일이 지나가버린다.

댓글