all-in-one wordpress migration exodus

이전 포스트에서도 밝혔듯, all-in-one wp migration의 복원 유료화 이슈로 wordpress에서 hashnode로 이주해왔습니다. 기존에 가지고 있던 백업본으로부터 살리고 싶은 몇 개의 포스트만 살리고 나머지는 그냥 조용히 백업의 상태로 두려고 합니다.

복원하려는 포스트는 아래와 같습니다.

  • Introduction to LLVM (1) ~ (3)
  • Bootstrapping
  • Vue & Vuex Convention
  • Callback naming convention for Front-end

위 4개의 시리즈(포스트 숫자로는 6개)를 복구할 예정이며, 다른 포스트를 클릭해서 블로그에 들어왔지만 찾을 수 없는 경우, 댓글로 남겨주시면 시간이 날 때 복구해보겠습니다. (메일 남겨주시면 메일로도 알려드릴게요.)


wordpress, ghost, hugo, gatsby 등 많은 블로그 플랫폼을 써보거나 시도해봤는데, 지금까지는 hashnode의 글쓰기 경험이 가장 마음에 드는 것 같네요. markdown으로 바로 publishing이 가능하다는 것이 좋은 것 같습니다. 이전에도 typora를 유료 버전으로 구입해서 글쓰기 툴로 썼을정도로 markdown을 선호하는 편인데, 깔끔한 markdown 에디터가 있어서 무척 마음에 듭니다.

cover image가 기본적으로 들어가는 것도 좋고, unsplash에서 제가 따로 이미지를 다운받아서 업로드하지 않고 바로 unsplash에서 고를 수 있는 것도 좋습니다.

console.log('hello, world!');

code snippet도 나쁘지 않게 동작하는 것 같고

gist embedding도 정상적으로 동작하네요.

firefox에서 darkmode extension을 사용 중인데 깔끔하게 변환되는 것도 좋습니다.

medium도 잠깐 고민했었는데, 최근부터 더 이상 커스텀 도메인을 연결할 수 없다고 하더라구요. 거기에 개발자 친화적인 에디터는 아니어서 gist를 필수적으로 가져다 써야했던 것이 조금 아쉬웠는데, 그런점까지 hashnode는 잘 커버해주는 것 같습니다.

단점도 없는 것은 아닙니다. 예약을 걸어놓은 포스트를 수정하기 위해서는, 먼저 예약을 취소해서 포스트를 draft로 전환한 뒤에 바꿀 수 있으며, 이 ux가 직관적이지 않네요. 현재 포스트를 보고 있는 페이지에서 수정 버튼이 보이지 않는 것도 조금 아쉬운 느낌입니다. 혹시 제가 있는데 발견하지 못한 것이라면 댓글로 알려주세요 😅

위 이슈는 hashnode의 일시적인 이슈였던 것 같기도? intercom으로 해결했습니다.

또한, 하나의 Gist에서 여러 개의 소스파일을 가진 경우, 하나의 소스파일만 임베딩 할 수는 없네요. 코드 스니펫이 나쁘지 않게 지원되니까 적당히 넘어가려고 합니다.


일단 운영 중인 블로그가 이미 있는 경우에는 export를 해서 깔끔하게 빼올 수 있으니 그것을 사용하는 것이 좋고, 저처럼 블로그를 날려버린 뒤 wpm의 restore가 유료화되었다는 것을 뒤늦게 깨달아버린 경우에는 아래와 같이 대처하시면 됩니다.

unzip

npx wpress-extract your_file.wpress

wpress-extract를 이용해서 압축을 해제할 수 있습니다.

images

압축을 해제하면 사진은 uploads 폴더 하위에 위치합니다.

posts

포스트같은 경우 database.sqlSERVMASK_PREFIX_posts 테이블에 저장되며, insert문 하나당 하나의 레코드를 삽입하는 식으로 쓰여져 있기 때문에, 어디선가 restore하다가 터지더라도 "row1에서 뻑났다." 라며 힌트도 없이 죽습니다. 저는 vscode에서 SERVMASK_PREFIX_posts 테이블 ddl과 dml을 제외한 나머지 sql들을 모두 지우고, INSERT INTO를 regex replace를 사용해서 multiple record insert문으로 전환해서 migration을 실행했습니다.

터지는 record가 있으면 지우거나 터진 문자열을 보고 적당히 수정해줬고, 제가 살리려는 포스트가 많지 않았기에 터진 record는 전부 삭제하고 database에 restore할 수 있었습니다. 이후, import가 완료된 mysql database를 다시 export하고, 그것을 압축해서 제 개인 구글 드라이브에 업로드하여 아카이브를 완료했습니다.

image.png

복구하려는 6개의 포스트들은 현재 이 restore된 mysql table에서 post_content 컬럼값을 읽어 uploads 폴더 하위의 이미지와 조합해서 hashnode에 업로드 예정입니다.