<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Coder38611</title>
    <link>https://coder38611.tistory.com/</link>
    <description>아직 잘 모르겠는 학생의 파이썬/노드/플러터/알고리즘 공부 일지</description>
    <language>ko</language>
    <pubDate>Sun, 12 Jul 2026 05:26:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Coder38611</managingEditor>
    <image>
      <title>Coder38611</title>
      <url>https://tistory1.daumcdn.net/tistory/3796704/attach/58f86b698fcd48648c98001a2366153a</url>
      <link>https://coder38611.tistory.com</link>
    </image>
    <item>
      <title>NETAMlog[7] GraphQL을 통해 데이터 불러오기</title>
      <link>https://coder38611.tistory.com/153</link>
      <description>&lt;h2&gt;한 일&lt;/h2&gt;
&lt;p&gt;저번 글에서 GraphQL을 사용하게 된 것에 대해 작성하였는데 오늘은 GraphQL을 통해 실제로 데이터를 가져오는 기능을 구현하였습니다.(저번에는 셋업이라고 볼 수 있죠)&lt;/p&gt;
&lt;p&gt;사용방법은 크게 어렵지 않고 apollo 서버의 클라이언트를 만든 다음 GraphQL 쿼리를 통해 데이터를 가져오기만 하면 되는 것으로 기존의 로컬 마크다운 파일을 파싱하는 코드를 수정하였습니다.&lt;/p&gt;
&lt;p&gt;생각보다 더 쉽게 데이터를 불러올 수 있고 무거운 gray-matter 라이브러리(마크다운 파일에서 메타데이터와 실제 내용을 구분해서 반환해줌)을 더이상 사용할 필요가 없어져 기분이 좋았습니다.&lt;/p&gt;
&lt;p&gt;또한, &lt;a href=&quot;https://dev.to/a7u/how-to-protect-nextjs-api-routes-from-other-browsers-3838&quot;&gt;이 글&lt;/a&gt;을 통해 api 경로를 같은 사이트에서만 사용할 수 있도록 바꿨습니다.&lt;/p&gt;
&lt;p&gt;원래는 api를 딱히 쓸 생각이 없었는데 프론트 쪽에서 데이터를 전송하게 되니 보안을 어느정도 고려를 안 할 수가 없더라고요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpnwak/btrjkyTrnnC/GZnpRiONSy5D8NynW4SwFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpnwak/btrjkyTrnnC/GZnpRiONSy5D8NynW4SwFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpnwak/btrjkyTrnnC/GZnpRiONSy5D8NynW4SwFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpnwak%2FbtrjkyTrnnC%2FGZnpRiONSy5D8NynW4SwFk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;해야할 일&lt;/h2&gt;
&lt;p&gt;검색 기능을 Fuse.JS라는 라이브러리를 통해 프론트에서 처리하도록 수정할 계획이고 관리자 페이지를 구성해야 합니다.&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>GraphQL</category>
      <category>markdown blog</category>
      <category>mutation</category>
      <category>nextjs</category>
      <category>nextjs 블로그</category>
      <category>query</category>
      <category>마크다운 블로그</category>
      <category>블로그</category>
      <category>블로그 개편</category>
      <category>자바스크립트</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/153</guid>
      <comments>https://coder38611.tistory.com/153#entry153comment</comments>
      <pubDate>Sat, 30 Oct 2021 23:32:48 +0900</pubDate>
    </item>
    <item>
      <title>NETAMlog[6] Prisma와 GraphQL 추가하기</title>
      <link>https://coder38611.tistory.com/152</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;오늘의 한 일(이라 적고 지난주에 한 일이라 읽는다)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트를 위해 여러가지를 검색하다 &lt;a href=&quot;https://vercel.com/guides/nextjs-prisma-postgres&quot; target=&quot;_self&quot;&gt;&lt;span&gt;Vercel의 Prisma 연동&lt;/span&gt;&lt;/a&gt;와 &lt;a href=&quot;https://www.prisma.io/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw&quot; target=&quot;_self&quot;&gt;&lt;span&gt;Prisma의 GraphQL 연동&lt;/span&gt;&lt;/a&gt;를 찾게 되었고 역시 로컬 파일만 가지고 블로그를 만드는 건 좀 별로인 것 같아서 외부 데이터베이스를 사용하기로 결정했습니다.&lt;br&gt;특히, 평소에 사용해보고 싶었던 GraphQL를 사용해보고 싶어 이에 대한 부분도 공부하여 추가하였습니다.&lt;br&gt;그리고 데이터를 외부 DB에서 가져오게 되면서 사이트 내부에서 글을 추가하기 위해 로그인 기능도 next-auth를 통해 추가하였습니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/buQa6S/btrjoQkKa7M/k9JNYI9OPonnks8iUgn44K/img.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buQa6S/btrjoQkKa7M/k9JNYI9OPonnks8iUgn44K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buQa6S/btrjoQkKa7M/k9JNYI9OPonnks8iUgn44K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buQa6S/btrjoQkKa7M/k9JNYI9OPonnks8iUgn44K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuQa6S%2FbtrjoQkKa7M%2Fk9JNYI9OPonnks8iUgn44K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/buQa6S/btrjoQkKa7M/k9JNYI9OPonnks8iUgn44K/img.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prisma 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prisma는 ORM 중 하나로 관계형 데이터베이스와 더 편하게 소통할 수 있는 방법으로 관계형 데이터베이스를 NoSQL 데이터베이스같은 느낌으로 사용할 수 있게 해준다고 보시면 됩니다.&lt;br&gt;관계형 데이터베이스로는 Postgresql을 사용했는데 다른 것을 써도 되지만 postgresql 데이터베이스를 무료로 호스팅해주는 서비스가 있어 사용하게 되었습니다.&lt;br&gt;저는 테스트용으로는 Heroku에서 호스팅하고 실제 블로그를 호스팅할때는 Supabase에서 호스팅할 생각입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GraphQL 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GraphQL은 REST와 같은 API를 정의하는 방법 중 하나이지만 REST와는 다르게 원하는 데이터를 특정해서 가져올 수 있다는 장점이 있습니다.&lt;br&gt;예를 들어 유저의 정보를 가져올 때 REST는 전부 가져온 다음 필요한 것들을 사용하지만 GraphQL은 애초에 필요한 것들만 가져오는 것입니다.&lt;br&gt;GraphQL은 데이터 전송량과 처리 과정을 줄일 수 있어 많은 관심을 가지고 있는 기술 중 하나입니다.&lt;br&gt;GraphQL을 사용하기 위해서는 이 API를 돌릴 서버 프레임워크가 필요한 데 이중 가장 유명한 것은 Apollo라는 것으로 Next.JS의 경우 apollo-server-micro를 사용합니다.&lt;br&gt;그리고 GraphQL 엔드포인트(통신 방법을 정의한 것)을 그냥 작성해도 되지만 코드 우선 방식을 통해 더 예측가능하고 타입 지정을 더 명확하게 할 수 있는 nexus를 통해 각종 스키마와 통신 방법을 정의하였습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Next-Auth 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next-Auth는 Next.JS에서 각종 데이터베이스와 로그인 방법을 쉽게 사용하기 위한 라이브러리로 저는 깃허브와 Prisma를 기본으로 사용하였습니다. (참고로 카카오와 네이버도 지원합니다.)&lt;br&gt;이 라이브러리는 사용 자체는 간단해서 개발자 문서만 보고 바로 사용하는데 큰 무리는 없지만 글을 작성하고 있는 시점에서 v3에서 v4로 전환하는 과정인데 아직 v4에 살짝 문제가 있는지 로그인 기능이 왔다갔다하네요.&lt;br&gt;로그인 기능에서 한 가지 추가한 점은 저만 로그인할 수 있게 해놓았다는 점입니다.&lt;br&gt;기본적으로 next-auth는 이런 기능이 없지만 깃허브는 동일 유저네임을 지원하기 않기 때문에 제 깃허브 유저네임이 아니면 로그인이 안 되도록 막아놓았습니다.&lt;br&gt;(근데 살짝 야매라서 좀 더 좋은 방법이 있는지 계속 찾아보는 중입니다. 그래도 잘 작동하긴 합니다.)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;과정에 대한 생각&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 Prisma가 워낙 잘 되어있어서 굳이 GraphQL까지 쓸 필요는 없었을 것 같은데 그래도 공부하기 위한, 그리고 (나름의?) 최신 기술들을 사용해보기 위한 프로젝트여서 최대한 넣어보자 라는 느낌으로 추가해보았습니다.&lt;br&gt;그런데 역시 자바스크립트는 라이브러리가 많은 만큼 건드릴 수 없는 에러가 많은 것이 참 마음을 불편하게 만드네요.&lt;br&gt;그리고 이거 하다가 마지막에 커밋을 해야하는데 vscode의 깃 탭에서 뭘 잘못 건드려서 아직 푸시를 안한 커밋들이 날라갔더라고요(아마 fetch나 pull과 같은 걸 눌렀나봅닌다).&lt;br&gt;그래서 계속 당황하면서 깃 커밋들 불러오는 법, 사라진 깃 커밋 찾는 법들을 찾다가 git reflog (&lt;a href=&quot;https://stackoverflow.com/questions/10099258/how-can-i-recover-a-lost-commit-in-git&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://stackoverflow.com/questions/10099258/how-can-i-recover-a-lost-commit-in-git&lt;/span&gt;&lt;/a&gt; 참고)를 찾고 겨우 새 브랜치를 만들어서 해결했습니다.&lt;br&gt;보통 커맨드라인을 조심하라고 하는데 전 GUI를 조심해야할 것 같네요…&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>GraphQL</category>
      <category>markdown blog</category>
      <category>next-auth</category>
      <category>nextjs</category>
      <category>PostgreSQL</category>
      <category>Prism</category>
      <category>블로그</category>
      <category>블로그 개편</category>
      <category>외부 데이터베이스</category>
      <category>자바스크립트</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/152</guid>
      <comments>https://coder38611.tistory.com/152#entry152comment</comments>
      <pubDate>Sat, 30 Oct 2021 23:30:52 +0900</pubDate>
    </item>
    <item>
      <title>NETAMlog[5] 타입스크립트 사용하기</title>
      <link>https://coder38611.tistory.com/151</link>
      <description>&lt;h2&gt;타입스크립트&lt;/h2&gt;
&lt;p&gt;타입스크립트는 기존의 자바스크립트에 타입을 명시할 수 있게 해주는 자바스크립트의 슈퍼셋으로 굉장히 많은 기업과 사람들이 자바스크립트 대신 타입스크립트를 사용하고 있습니다.&lt;/p&gt;
&lt;p&gt;대신 사용한다곤 하지만 사실 타입스크립트는 브라우저가 이해할 수 없기 때문에 전부 자바스크립트로 변환된 다음 실행되는 방식을 취합니다.&lt;/p&gt;
&lt;p&gt;Next.JS에서는 기존의 프로젝트에 tsconfig.json이라는 파일을 생성한 다음 npm run dev를 실행하면 타입스크립트 사용 절차를 거치게 됩니다.&lt;/p&gt;
&lt;p&gt;더 자세한 내용은 &lt;a href=&quot;https://nextjs.org/docs/basic-features/typescript&quot;&gt;Next.JS 공식 타입스크립트 문서&lt;/a&gt;를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ec3JEh/btrjoPsCCUL/ho7PC4uRliVSBpbC6natOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ec3JEh/btrjoPsCCUL/ho7PC4uRliVSBpbC6natOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ec3JEh/btrjoPsCCUL/ho7PC4uRliVSBpbC6natOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fec3JEh%2FbtrjoPsCCUL%2Fho7PC4uRliVSBpbC6natOk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;개인적인 생각&lt;/h2&gt;
&lt;p&gt;솔직히 작은 규모의 프로젝트 - 파일 한 두개 정도로 거의 단순 스크립트 정도의 프로젝트 - 가 아니라면 타입스크립트는 무조건 도움이 된다고 생각합니다.&lt;/p&gt;
&lt;p&gt;컴파일 언어를 사용할 때처럼 코드의 거의 모든 과정을 거의 꿰뚫어야 하기 때문에 코드에 대한 이해도가 높아지고 코드의 안전성 또한 올라간다는 것이 굉장히 큰 장점이라고 생각합니다.&lt;br&gt;(원래 컴파일 언어보단 인터프리터 언어들(파이썬이나 자바스크립트 등)이 더 편해서 더 선호했는데 요즘은 컴파일 언어의 안전성을 무시할 수가 없어서 자꾸 Go같은 언어로 눈길이 가네요)&lt;/p&gt;
&lt;p&gt;물론 단점도 있는데요, 기존의 프로젝트에서 타입스크립트로 바꾸려니 여간 귀찮은게 아니라서 기왕이면 처음부터 타입스크립트를 사용하시고 아니라면 하루라도 빨리 바꾸시는 것을 추천합니다.&lt;/p&gt;
&lt;p&gt;나중에 바꾸려고 하면 귀찮음만 늘어납니다.&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>markdown blog</category>
      <category>nextjs</category>
      <category>nextjs 블로그</category>
      <category>TypeScript</category>
      <category>마크다운 블로그</category>
      <category>블로그</category>
      <category>블로그 개편</category>
      <category>자바스크립트</category>
      <category>타입스크립트</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/151</guid>
      <comments>https://coder38611.tistory.com/151#entry151comment</comments>
      <pubDate>Sat, 30 Oct 2021 23:27:51 +0900</pubDate>
    </item>
    <item>
      <title>NETAMlog[4] 검색 기능과 에러덩어리 이미지 컴포넌트</title>
      <link>https://coder38611.tistory.com/150</link>
      <description>&lt;h2&gt;오늘의 한 일&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2Hi8/btrgA5lp1Ry/voUEKbqGkxBxcbacEcEylk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2Hi8/btrgA5lp1Ry/voUEKbqGkxBxcbacEcEylk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2Hi8/btrgA5lp1Ry/voUEKbqGkxBxcbacEcEylk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2Hi8%2FbtrgA5lp1Ry%2FvoUEKbqGkxBxcbacEcEylk%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;오늘은 검색 기능을 완성시켰다.&lt;/p&gt;
&lt;p&gt;코드는 &lt;a href=&quot;https://github.com/bradtraversy/devspace-blog&quot;&gt;Brad Traversy&amp;#39;s Devspace&lt;/a&gt;에서 가져와 일정 부분 내 필요에 맞게 고쳤다.&lt;/p&gt;
&lt;p&gt;그리고 본문에서 검색하는 것도 일단은 빠르게 계산할 수 있을 것 같아서 결국 마크다운 파일 자체를 파싱하는 것과 다름없다.(그러고 보니 나중에 vercel로 deploy하고 나면 이렇게 하기 힘들거 같은데 따로 방법을 찾아봐야겠다.)&lt;/p&gt;
&lt;h2&gt;Z-index는 이상하다&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/blog/netamlog3-mobile-support&quot;&gt;이전 글&lt;/a&gt;에 katex가 목차 위로 렌더링되는 현상이 있었는데 이번에는 이미지가 그런 현상을 일으키길래 원래 이런 일을 담당하는 z-index에 대해 더 깊게 알아보았다.&lt;/p&gt;
&lt;p&gt;알고보니 부모 태그가 자식의 z-index를 막지 않아야 하며 position이 z-index와 함께 설정되어 있어야 한다는 것이다.&lt;/p&gt;
&lt;p&gt;그래서 필요한 태그들에 적절하게 z-index를 걸어주니 katex와 이미지 모두 검색 결과와 목차 밑으로 렌더되었다.&lt;/p&gt;
&lt;h2&gt;이래서 코드를 뜯어봐야하는건가...&lt;/h2&gt;
&lt;p&gt;위에서 이미지가 갑자기 맨 위로 렌더링 되었던 이유는 기존에 img 태그를 쓰는 것에서 next/image 태그를 사용하였기 때문이다.&lt;/p&gt;
&lt;p&gt;이 컴포넌트는 자동으로 이미지 사이즈와 lazy loading을 지원하는 성능에 매우 좋은 컴포넌트이지만 사이즈를 명시하지 않으면 사용할 수 없다는 것이다. &lt;/p&gt;
&lt;p&gt;최적화를 해야하니 정보가 많아야 하는 것은 이해하지만 모든 이미지마다 크기 확인해가며 사용하고 싶지는 않았기 때문에 찾고 찾아 &lt;a href=&quot;https://dev.to/tanahmed/next-image-make-image-fill-available-space-272o&quot;&gt;이 글&lt;/a&gt;을 찾게 되어 원하는 대로 사용할 수 있게 되었다. &lt;a href=&quot;https://dev.to/tanahmed/next-image-make-image-fill-available-space-272o&quot;&gt;내가 사용한 방법&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;mdx에서 버그나면 어쩌라는거지?&lt;/h2&gt;
&lt;p&gt;이렇게 이미지를 힘들게 넣고 나니 콘솔에 뜨는 &lt;strong&gt;p 태그 안에는 div가 들어갈 수 없습니다&lt;/strong&gt;에러.&lt;/p&gt;
&lt;p&gt;알고보니 mdx의 버그(가 아니라 의도된 거라고 하지만 에러인데...?).&lt;/p&gt;
&lt;p&gt;결국 찾다가 &lt;strong&gt;&lt;a href=&quot;https://github.com/remarkjs/remark-unwrap-images&quot;&gt;remark-unwrap-images&lt;/a&gt;&lt;/strong&gt;라는 플러그인을 찾아 추가하니 정상적으로 작동하는 것을 확인했다.&lt;/p&gt;
&lt;h2&gt;해야할 일&lt;/h2&gt;
&lt;p&gt;일단 계속 적고 있지만 메인 페이지를 만들어야 하는데 이게 가장 쉬운 거라 계속 미루고 있다.&lt;/p&gt;
&lt;p&gt;기능적인 부분만 끝내면 UI 부분은 금방 되지 않을까...?&lt;/p&gt;
&lt;p&gt;그리고 사실 이 프로젝트의 가장 시간 걸리고 힘든 일은 이전 블로그의 글들을 전부 옮겨오는 것이다. &lt;/p&gt;
&lt;p&gt;예전 블로그를 없앨 것은 아니지만 어쨌든 이 블로그가 메인이고 웬만해서는 이 블로그에서 다 해결되었으면 하는 마음이다.&lt;/p&gt;
&lt;h2&gt;소감&lt;/h2&gt;
&lt;p&gt;마치 끝나지 않는 일같은 느낌이 든다.&lt;/p&gt;
&lt;p&gt;글은 굉장히 짧게 표현하지만 위의 일을 하는데 7시간 정도 걸렸다.&lt;/p&gt;
&lt;p&gt;진짜 자바스크립트는 이상한 버그의 총 집합인 것 같다.&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>Image 해결 블로그</category>
      <category>markdown blog</category>
      <category>nextjs</category>
      <category>nextjs 블로그</category>
      <category>검색</category>
      <category>마크다운 블로그</category>
      <category>모바일 지원</category>
      <category>블로그 개편</category>
      <category>자바스크립트</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/150</guid>
      <comments>https://coder38611.tistory.com/150#entry150comment</comments>
      <pubDate>Fri, 1 Oct 2021 23:46:49 +0900</pubDate>
    </item>
    <item>
      <title>NETAMlog[3] 드디어 진전이...? 모바일 지원</title>
      <link>https://coder38611.tistory.com/149</link>
      <description>&lt;h2&gt;오늘의 한 일&lt;/h2&gt;
&lt;p&gt;오늘 메인으로 한 일은 모바일 지원입니다.&lt;/p&gt;
&lt;p&gt;아직 할일이 많이 남았고 안 만든 페이지도 많은데 이건 비교적 천천히 해도 되는 일이라 가장 중요한 블로그 페이지와 네비게이션을 사이즈에 맞게 조정되도록 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zejb3/btrf1iYIx4B/v7znMZgE4sVC2pdll3t0CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zejb3/btrf1iYIx4B/v7znMZgE4sVC2pdll3t0CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zejb3/btrf1iYIx4B/v7znMZgE4sVC2pdll3t0CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzejb3%2Fbtrf1iYIx4B%2Fv7znMZgE4sVC2pdll3t0CK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;보시다시피 디자인 자체는 간단하고 좌측 상단의 아이콘을 통해 토글할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이 부분에서 시간을 많이 잡아먹었는데 여기엔 두 가지 이유가 있습니다.&lt;/p&gt;
&lt;p&gt;첫 번째로는 이거 어떻게 만들지 찾다가 결국 그냥 useState로 버튼 만드는 방법을 자각하는데 시간이 많이 들었습니다.&lt;br&gt;리액트에 좀 더 익숙해질 필요가 있나 봅니다.&lt;/p&gt;
&lt;p&gt;두 번째로는 화면 크기가 변할 때 네비게이션이 자동으로 열리는 것이었습니다.&lt;/p&gt;
&lt;p&gt;이제와서 생각해보면 굳이 유저가 화면 크기를 조절할 필요가 있을까 싶지만 어쨌든 이런 디테일할 부분에서 그냥 무시하고 넘어가는게 싫어서 고친다고 이것저것 왔다갔다 하다가 결국 성공했습니다.&lt;/p&gt;
&lt;p&gt;이거 한다고 대략 1시간 정도 소모한 거 같네요.&lt;/p&gt;
&lt;h2&gt;목차 디자인 결정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ1CLK/btrfWNd4UWf/WR9yJqmXYYdi3aJyW1GhY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ1CLK/btrfWNd4UWf/WR9yJqmXYYdi3aJyW1GhY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ1CLK/btrfWNd4UWf/WR9yJqmXYYdi3aJyW1GhY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ1CLK%2FbtrfWNd4UWf%2FWR9yJqmXYYdi3aJyW1GhY0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;목차는 몇주째 제 발목을 잡았던 컴포넌트인데 드디어 디자인을 결정하게 되었습니다.&lt;/p&gt;
&lt;p&gt;일단 태블릿 사이즈 부터는 목차가 뜨지 않도록 했습니다.&lt;br&gt;그 정도부터는 그냥 손으로 스크롤링 하는게 더 빠르기도 하고 화면 상단으로 네비게이션이랑 목차 둘 다 있는 것도 이상해서 그냥 뺐습니다.&lt;/p&gt;
&lt;p&gt;목차도 네비게이션처럼 useState로 구성되고 디자인은 전과 동일합니다.&lt;/p&gt;
&lt;h3&gt;이상한 에러&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tOgXv/btrfUOdZo6C/Ez2zzHM2YbgB5WqTN7vcXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tOgXv/btrfUOdZo6C/Ez2zzHM2YbgB5WqTN7vcXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tOgXv/btrfUOdZo6C/Ez2zzHM2YbgB5WqTN7vcXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtOgXv%2FbtrfUOdZo6C%2FEz2zzHM2YbgB5WqTN7vcXK%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;왜인지는 모르겠는데 katex/latex가 렌더링되면 다른 요소들과 관계없이 그 위로 렌더되더라고요.&lt;/p&gt;
&lt;p&gt;이유를 찾을려고 CSS를 봤는데 &lt;strong&gt;position: absolute&lt;/strong&gt;가 문제인듯 싶다가도 그러면 그 위를 덮으면 안보여야 하는데 그래도 보이길래 그냥 수학 기호를 되도록 적게 쓰자하고 넘겼습니다.&lt;/p&gt;
&lt;p&gt;고칠 수 있으면 고치겠는데 이유를 도저히 못 찾겠네요.&lt;/p&gt;
&lt;h2&gt;검색&lt;/h2&gt;
&lt;p&gt;개인적으로 블로그를 돌아다니면 주로 네비게이션 부분에 어떤 종류의 글들이 있는지 보고 여기저기 둘러보는 편입니다.&lt;/p&gt;
&lt;p&gt;그래서 검색 기능을 잘 안쓰긴 하는데 그래도 다른 분들이 블로그를 만들 때 검색을 웬만하면 추가하시길래 저도 &lt;a href=&quot;https://www.youtube.com/watch?v=G7_0VxMRJe4&quot;&gt;유튜브&lt;/a&gt;에서 적당한 코드를 찾아 사용해 보기로 했습니다.&lt;/p&gt;
&lt;p&gt;코드 자체는 그냥 생으로 전부 찾는 방법이라 속도를 보고 글 전체에서 찾을지 아니면 제목과 카테고리 위주로 찾을지는 좀 더 고민해봐야 할 것 같습니다.&lt;/p&gt;
&lt;h2&gt;후에 할 일&lt;/h2&gt;
&lt;p&gt;일단 처음에 언급했다시피 카테고리 페이지, 메인페이지, 쇼케이스 페이지 등을 만들어야 하고 그에 맞는 전용 함수들도 따로 추가해야 합니다.&lt;/p&gt;
&lt;p&gt;검색 기능도 아직 UI가 없기 때문에 만들어줘야 하고 SEO 부분도 좀 더 손을 대야합니다.&lt;/p&gt;
&lt;p&gt;그리고 CSS 리팩토링이 시급합니다.&lt;/p&gt;
&lt;p&gt;보고 있자니 tailwind랑 일반 CSS가 같이 상생 중인데 뭔가 어지러워서 파일 분리와 함께 좀 통일감을 줄 필요가 있어 보입니다.&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>markdown blog</category>
      <category>nextjs</category>
      <category>nextjs 블로그</category>
      <category>마크다운 블로그</category>
      <category>모바일 지원</category>
      <category>블로그</category>
      <category>블로그 개편</category>
      <category>자바스크립트</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/149</guid>
      <comments>https://coder38611.tistory.com/149#entry149comment</comments>
      <pubDate>Sat, 25 Sep 2021 23:48:52 +0900</pubDate>
    </item>
    <item>
      <title>NETAMlog[2] 삽질과 에러</title>
      <link>https://coder38611.tistory.com/148</link>
      <description>&lt;h2&gt;오늘의 여정&lt;/h2&gt;
&lt;p&gt;지난 주에 마크다운을 처리하고 주중에 목차를 만들고 나서 오늘은 굉장히 많은 일을 하려고 했습니다.&lt;/p&gt;
&lt;p&gt;블로그 페이지의 메인 화면과 메타 태그 정리, 웹사이트의 메인 페이지, 블로그 글별 레이아웃 정리 등 거의 끝낼 수 있을 거라고 생각했죠.&lt;/p&gt;
&lt;p&gt;근데 &lt;strong&gt;목차&lt;/strong&gt;가 누르면 페이지를 다시 로딩하고 href가 바뀌더라고요?&lt;/p&gt;
&lt;p&gt;그래서, &amp;#39;음, remark나 rehype 플러그인을 쓰자&amp;#39; 해서 가져와서 써봤는데 얘는 제대로 만들지를 않더라고요? (한글 때문인가...)&lt;/p&gt;
&lt;p&gt;결국 직접 만들어야 해서 &lt;a href=&quot;https://www.emgoto.com/react-table-of-contents/&quot;&gt;이 분의 블로그&lt;/a&gt;에서 코드를 가져와 생성했습니다.&lt;/p&gt;
&lt;p&gt;그리고 얘를 렌더를 해야 하는데 여기서부터 온갖 삽질과 에러가 시작됩니다...&lt;/p&gt;
&lt;h2&gt;mdx 파싱은 싫어요&lt;/h2&gt;
&lt;p&gt;커스텀 목차 코드를 실행하면 &amp;#39;ul&amp;#39;이 만들어지는데 이게 html이 로딩한 뒤에야 만들 수 있어서 얘를 어떻게 집어넣지 고민을 하다가 appendChild 함수를 통해 넣으려고 했습니다.&lt;/p&gt;
&lt;p&gt;근데 얘는 리액트 컴포넌트를 못 쓰더라고요?(어찌보면 당연하긴 합니다만)&lt;/p&gt;
&lt;p&gt;그래서 mdx 파싱 결과를 html로 받을 수는 없는지 찾다가 &lt;strong&gt;mdx-bundler&lt;/strong&gt;라는 모듈을 알게 되어 얘는 좀 다를까 해서 기존의 &lt;strong&gt;next-mdx-remote&lt;/strong&gt;를 잠시 주석 처리하고 코드를 바꿔봤습니다.&lt;/p&gt;
&lt;p&gt;그런데 갑자기 아무 문제 없던 fs 모듈이 webpack에서 없다고 뜹니다.&lt;/p&gt;
&lt;p&gt;그래도 이건 자주 듣던 일이라 처리를 해줬어요.&lt;/p&gt;
&lt;p&gt;근데 이젠 함수가 존재하지 않는다네요? 심지어 에러 내용도 역추적이 안되서 그 상태로 학원 갔다가 와서 2시간 반을 때려 넣었습니다.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;결과적으로&lt;/em&gt; 못 고쳤습니다.&lt;/p&gt;
&lt;p&gt;그냥 다시 &lt;strong&gt;next-mdx-remote&lt;/strong&gt;으로 돌아오고 나니 갑자기 생각이 들더라고요?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;아!&lt;/em&gt; 리액트는 조건별로 렌더링이 가능하지!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;답은 언제나 간단하다&lt;/h2&gt;
&lt;p&gt;리액트에는 &lt;code&gt;useState&lt;/code&gt;와 &lt;code&gt;useEffect&lt;/code&gt;, &lt;code&gt;useRef&lt;/code&gt;라는 훅이 존재합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;useState&lt;/code&gt;는 변수를 바꾸고 리로딩, &lt;code&gt;useEffect&lt;/code&gt;는 모든 엘리먼트가 다 로딩되고 나서 코드를 실행하기 위한 용도, &lt;code&gt;useRef&lt;/code&gt;는 로딩 사이에 변수가 값을 유지하는데 쓰입니다.&lt;/p&gt;
&lt;p&gt;이를 통해 HTML이 전부 로딩되고 나면 useEffect가 실행되어 useState를 통해 변수를 true로 바꿔 목차를 로딩하면 되는 것이죠. useRef는 목차 정보는 한 번만 가져오면 되는 거라 그 값을 두 번 이상 가져오지 않게 합니다.&lt;/p&gt;
&lt;p&gt;이러고 나니까 실행이 잘 되더군요. 스타일링이 끝난 뒤 모습입니다. &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EDxDU/btrePVQ3Vpo/7NLSq7ouVx8D6C3bQlSHB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EDxDU/btrePVQ3Vpo/7NLSq7ouVx8D6C3bQlSHB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EDxDU/btrePVQ3Vpo/7NLSq7ouVx8D6C3bQlSHB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEDxDU%2FbtrePVQ3Vpo%2F7NLSq7ouVx8D6C3bQlSHB0%2Fimg.png&quot; width=&quot;100%&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;그래서 오늘 한 일&amp;amp;결론&lt;/h2&gt;
&lt;p&gt;결국 쓸데없는 일에 시간 다 뺏기고 &lt;code&gt;npm install&lt;/code&gt;을 약 10번을 하고 하다가 &lt;strong&gt;목차&lt;/strong&gt;만들고 &lt;strong&gt;메타 태그 정리&lt;/strong&gt;하는거 밖에 못했습니다.&lt;/p&gt;
&lt;p&gt;진짜 자바스크립트는 프로젝트를 할때마다 쓸데없는 일에 시간을 뺏기는 일이 많은거 같은데 이건 웹개발의 숙명이라 생각하고 안고 가는 방법 외엔 없는 것 같습니다. &lt;/p&gt;
&lt;p&gt;제가 프레임워크 다 뜯어보는거 아니면 문제가 안 풀리는 경우도 있는데 이건 뭐 일부 포기하거나 우회하며 가야죠.&lt;/p&gt;
&lt;h2&gt;남은 일&lt;/h2&gt;
&lt;p&gt;일단 메인 페이지들 구성을 해줘야 합니다.&lt;/p&gt;
&lt;p&gt;그런 다음에 모바일 지원을 해줘야 하는데 이것도 시간을 많이 잡아먹을 것 같습니다.&lt;br&gt;윈도우 사이즈 테스트겸 몇 번 바꿔봤는데 딱히 희망이 보이지 않아요.&lt;/p&gt;
&lt;p&gt;다 만들고 나면 배포한 다음에 댓글 기능과 조회수 기능을 추가해야합니다.&lt;br&gt;배포한 다음 추가하는 이유는 외부에서 사용하는데 배포 후에 할 수 밖에 없기 때문입니다.(그 주에 올릴 글에 더 자세한 설명이 있을 겁니다.)&lt;/p&gt;
&lt;p&gt;배포하고 나서 PWA, 즉 모바일 웹앱 기능도 추가할 예정입니다.&lt;br&gt;누가 굳이 제 사이트를 웹앱으로 쓸까 싶지만 그냥 써보고 싶어서 넣을 예정입니다.&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>Blog</category>
      <category>error</category>
      <category>markdown</category>
      <category>nextjs</category>
      <category>마크다운 블로그</category>
      <category>블로그</category>
      <category>삽질</category>
      <category>에러</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/148</guid>
      <comments>https://coder38611.tistory.com/148#entry148comment</comments>
      <pubDate>Sat, 11 Sep 2021 22:53:16 +0900</pubDate>
    </item>
    <item>
      <title>NETAMlog[1] 마크다운 처리와 여러 결정들</title>
      <link>https://coder38611.tistory.com/147</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;블로그 글 쓰기에 대한 결정 feat. Headless CMS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글을 쓰고 나서 블로그 글 관리에 대해서 CMS(Content Management Software), 즉 콘텐츠 관리 소프트웨어를 사용하는 것을 고민해보았고 &lt;a href=&quot;https://ghost.org&quot;&gt;Ghost&lt;/a&gt;를 사용하기로 마음을 먹었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ghost를 설치하고 사용하는데 어떻게 호스팅을 할까 고민하다 Heroku는 무료 버전이 하루 중 18시간만 사용 가능하고 다른 VPS(간단하게 말하면 클라우드로 컴퓨터를 빌리는 것)를 사용하기에는 굳이 쓸데없이 돈을 쓰기는 싫어 제 라즈베리파이에 호스팅을 하기로 결심했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;그러나&lt;/i&gt; 문제가 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ghost는 우분투 20.04까지만 지원하는데 제 라즈파이 세팅이 외장하드를 사용하는데 20.04는 ARM기반 시스템(라즈파이 포함)은 외장하드 같은 USB 대용량 스토리지(USB Mass Storage)는 부팅이 되지 않는다는 것이었죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 결국 다른 CMS를 사용할 바에는 원래 계획이었던 마크다운 파서를 사용하는 블로그를 만들기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어차피 CMS를 써도 파서를 사용한 버전을 만들 계획이었기 때문에 딱히 상관은 없는데 좀 아쉽긴 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Ghost가 굉장히 기능이 많고 실제로 블로그를 만드는 데 자주 사용되는 블로그 전용 CMS입니다. Ghost만으로도 블로그로 쓸 수 있고요-워드프레스와 비슷한데 더 간편한 방법인 것이죠)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마크다운 파서&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 글에서 언급하였듯이 기본적으로는 MDX, 더 정확히는 &lt;a href=&quot;https://github.com/hashicorp/next-mdx-remote&quot;&gt;next-mdx-remote&lt;/a&gt;를 사용하여 마크다운을 HTML로 변환하고 그 과정에서 remark(마크다운에서 전처리)와 rehype(HTML에서 후처리) 플러그인을 통해 코드 하이라이팅과 katex 지원을 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 하이라이팅도 저번 글에서는 shiki라는 라이브러리를 사용한다고 했는데 next-mdx-remote와 함께 쓰려고 보니 그냥 remark-prism을 사용하는 게 더 편하고 빨라서 바꾸게 되었습니다. (테마로는 nord를 사용합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;katex 지원은 &lt;a href=&quot;https://mdxjs.com/guides/math-blocks&quot;&gt;mdx&lt;/a&gt;에서 추천하는 remark-math와 rehype-katex를 사용하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 플러그인의 사용방법은 serialize 함수에서 불러오기만 하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const markdown = await serialize(content, {
    scope: frontmatter,
    mdxOptions: {
      remarkPlugins: [
        require('remark-prism'), 
        require('remark-math'),
    ],
      rehypePlugins: [require('rehype-katex')],
    },
})&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기타 추가한 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미디엄이나 다른 블로그들을 보면 글을 읽는데 걸리는 시간이 표시된 경우가 많은데 저도 그런 기능이 있으면 좋을 것 같아서 찾아보니 $Math.ceil((글의 길이)/200)$라는 간단한 수식이어서 추가했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마크다운을 HTML로 변환한 후에 각 태그 별로 CSS를 넣어줘야 하는데 처음에는 Tailwind의 플러그인 중 하나인 &lt;a href=&quot;https://github.com/tailwindlabs/tailwindcss-typography&quot;&gt;Typography&lt;/a&gt;를 쓰려 하다가 딱히 마음에 들지 않기도 하고 다크모드를 지원하지 않아서 global.css에서 각 태그마다 간단한 CSS를 설정해주었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결과 사진&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;3800&quot; data-origin-height=&quot;1920&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxg5P/btrd3bOpXTe/nfP2d8AYbKp0gKyQdPRNrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxg5P/btrd3bOpXTe/nfP2d8AYbKp0gKyQdPRNrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxg5P/btrd3bOpXTe/nfP2d8AYbKp0gKyQdPRNrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frxg5P%2Fbtrd3bOpXTe%2FnfP2d8AYbKp0gKyQdPRNrk%2Fimg.png&quot; width=&quot;100%&quot; data-origin-width=&quot;3800&quot; data-origin-height=&quot;1920&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해야할 일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 변환된 HTML에 대한 CSS 설정이 끝나지 않아 이를 마무리 해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 마크다운에는 frontmatter라는 메타데이터를 설정할 수 있는데 이를 어떻게 화면에 표시할 건지 결정할 후 코딩해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그들에 있는 목차를 만드는 방법을 찾아 기능을 추가할 생각입니다. 현재 블로그도 목차가 제공되는데 있는게 개인적으로는 굉장히 편리하다고 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 왼쪽의 네비게이션 바가 별로여서 유튜브에서 찾아놓은 더 예쁘고 쓰기 편한 걸로 바꿀 계획입니다. 티스토리처럼 블로그의 카테고리를 보여주는 방식과 유사할 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열람 횟수 기능도 추가할까 고민중인데 외부 DB를 redis와 firebase중에 고민중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;댓글 서비스를 깃허브 이슈 기반으로 바꿀 계획입니다. 이유는 CMS를 쓰지 않은 이유와 비슷합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;소감&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰다보니 왠지 그냥 안되니까 포기한 것 같은데...하드웨어가 안되는 것을 굳이 돌아가는 것은 보안 문제도 있고 해서 굳이 어렵게 가진 않겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 CMS도 있기는 한데 그건 나중에 필요할 것 같으면 추가하면 될 것 같습니다. 지금은 이정도로도 충분한 것 같네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 이 프로젝트를 진행하며 느끼지만 저는 프론트보다는 백엔드가 더 좋은 것 같습니다. 아마 다음 프로젝트는 백엔드 기반이지 않을까 싶네요.(사실 이미 기획중인 것이 있습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하루빨리 이 프로젝트를 호스팅까지 끝내고 쓰고 싶은데 시간이 없어 천천히 진행되는게 아쉽지만 그래도 혼자 이렇게 진행하니 재밌기도 하네요.&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>next-mdx-remote</category>
      <category>nextjs</category>
      <category>TailwindCSS</category>
      <category>마크다운</category>
      <category>마크다운 블로그</category>
      <category>블로그 개편</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/147</guid>
      <comments>https://coder38611.tistory.com/147#entry147comment</comments>
      <pubDate>Sat, 4 Sep 2021 22:52:11 +0900</pubDate>
    </item>
    <item>
      <title>[VIM] 더 효율적인 프로그래머가 되자!</title>
      <link>https://coder38611.tistory.com/146</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1202&quot; width=&quot;400&quot; height=&quot;401&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/x9hau/btrb8f6d5xS/JHlKewtfp3dGALUG7np1e0/img.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x9hau/btrb8f6d5xS/JHlKewtfp3dGALUG7np1e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x9hau/btrb8f6d5xS/JHlKewtfp3dGALUG7np1e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x9hau/btrb8f6d5xS/JHlKewtfp3dGALUG7np1e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx9hau%2Fbtrb8f6d5xS%2FJHlKewtfp3dGALUG7np1e0%2Fimg.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1202&quot; width=&quot;400&quot; height=&quot;401&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/x9hau/btrb8f6d5xS/JHlKewtfp3dGALUG7np1e0/img.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;h1&gt;VIM으로 효율적인 프로그래머가 될 수 있을까?&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VIM이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIM은 VI라는 소프트웨어의 강화 버전이라고 생각하시면 되는데, 결국 키보드로 문서 편집을 한다는 뜻입니다.&lt;br&gt;처음 VI가 등장하게 된 배경은 마우스가 없거나 지원되지 않던 시절 키보드를 통해서만 작업을 해야 했던 프로그래머들이 더 나은 UX를 위해 만들었으며 지금도 UNIX 계열 OS(리눅스, 맥)에서는 기본적으로 깔려서 옵니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VIM의 단점&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;428&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/wFUdZ/btrb9Qx6xVd/gYYvxdhj538Q4D7aZ8QKOk/img.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFUdZ/btrb9Qx6xVd/gYYvxdhj538Q4D7aZ8QKOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFUdZ/btrb9Qx6xVd/gYYvxdhj538Q4D7aZ8QKOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFUdZ/btrb9Qx6xVd/gYYvxdhj538Q4D7aZ8QKOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFUdZ%2Fbtrb9Qx6xVd%2FgYYvxdhj538Q4D7aZ8QKOk%2Fimg.jpg&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;428&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/wFUdZ/btrb9Qx6xVd/gYYvxdhj538Q4D7aZ8QKOk/img.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;이런 밈이 있을 정도로 VIM은 진입장벽이 매우 큽니다.(VIM에서 저장하지 않고 나가려면 :q를 누르시면 됩니다.)&lt;br&gt;저도 한 3번 포기했다가 이번에 드디어 손에 익어서 사용하게 되었는데 진짜 생각보다 너무 편하고 좋더라고요.&lt;br&gt;근데 이 벽만 한 번 넘으면 그다음부터는...&lt;br&gt;더 많은 것들이 기다립니다.&lt;br&gt;아무래도 한정된 키들을 가지고 다양한 일들을 하려고 하니 살짝 복잡해지는데 사실 커맨드 몇 개만 알아 둬도 능률이 확 올라갑니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VIM의 장점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 대부분의 분들이 IDE나 텍스트 에디터를 사용할 것이라고 생각됩니다.&lt;br&gt;파이참, VSC, CodeBlocks 같은 것들 말이죠.&lt;br&gt;이런 에디터들은 키보드 단축키가 존재하고 이 단축키들을 많이 알아두면 인생이 편리해진다는 것은 다 아실 겁니다.&lt;br&gt;VIM은 여기서 하나 더 나아가서 마우스에 손을 대지 않고 파일에서 커서를 움직이고, 줄을 선택하고, 지우고, 되돌리고, 단어 교체하고 등등 다양한 것을 하게 해 줍니다.&lt;br&gt;즉 마우스로 왔다 갔다 하는 시간을 아예 없애버릴 수 있다는 뜻이죠.&lt;br&gt;실제로 전 데탑 없이 맥북으로 개발하고 다 하는데 기본적으로도 글 선택하는 것 아니면 마우스를 잘 쓰지 않았는데 VIM을 쓰기 시작하고부터는 거의 손이 키보드를 떠나질 않게 되더라고요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VIM 쓰는 법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIM은 기본적으로는 콘솔 창에서 쓰이도록 개발되었지만 실제로 콘솔 창에서 작업하는 것은 어느 정도 불편함이 따르기 때문에 NeoVim 같은 VIM 전용 IDE를 쓰거나 VSC 같은 에디터에 VIM 확장팩을 설치해서 쓰는 것이 더 일반적입니다. (저도 VSC에서 쓰고 있습니다)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;VIM 배우기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIM은 배울 양이 꽤 큰 편이라 제대로 배우려면 적지 않은 시간이 걸릴 텐데요, 이 글에서는 간단히 자주 쓰일만한 커맨드만 소개하고 추가적인 기능은 직접 찾아보시는 것을 추천드립니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커서 이동하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 VIM에서는 &lt;b&gt;h, j, k, l&lt;/b&gt;을 통해 각각 상, 하, 좌, 우로 이동하며 &lt;b&gt;gg&lt;/b&gt;를 통해 글 맨 위로, &lt;b&gt;G&lt;/b&gt;를 통해 글 맨 아래로 움직입니다.&lt;br&gt;&lt;b&gt;0&lt;/b&gt;을 통해 해당 줄의 맨 앞으로 갈 수 있고 &lt;b&gt;$&lt;/b&gt;를 통해 해당 줄의 맨 끝으로 갈 수 있습니다.&lt;br&gt;&lt;b&gt;w&lt;/b&gt;를 통해 다음 단어의 첫 글자로, &lt;b&gt;e&lt;/b&gt;를 통해 다음 단어의 맨 뒷글자로, &lt;b&gt;b&lt;/b&gt;를 통해 이전 글자로 이동할 수 있습니다.&lt;br&gt;&lt;b&gt;t&lt;/b&gt;에 찾고 싶은 글자를 입력하면 커서 뒤의 글 중 가장 가까운 곳 바로 앞으로 커서를 이동하며 &lt;b&gt;f&lt;/b&gt;에 찾고 싶은 글자를 입력하면 커서 뒤의 글 중 가장 가까운 곳으로 커서를 이동시킵니다.&lt;br&gt;&lt;b&gt;T&lt;/b&gt;와 &lt;b&gt;F&lt;/b&gt;는 소문자 형태와 유사한데 뒤가 아닌 앞에서 찾는다는 차이점이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글 쓰고 지우기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 VIM을 처음 접하시면 가장 당황스러운 게 키가 안 먹히는 것 같다는 느낄 일 텐데요, 이는 VIM이 노멀 모드, 간단히 커맨드 모드에 있어서 그렇습니다.&lt;br&gt;글을 입력하기 위해서는 인서트 모드에 들어가야 하는데 이를 위해 &lt;b&gt;i&lt;/b&gt;를 누르시면 입력이 정상적으로 들어갑니다.&lt;br&gt;&lt;b&gt;i&lt;/b&gt;는 커서의 앞에서 입력을 시작하고 &lt;b&gt;a&lt;/b&gt;는 커서의 뒤에 입력을 시작합니다.&lt;br&gt;&lt;b&gt;I&lt;/b&gt;를 통해 맨 앞의 텍스트에서 입력을 시작할 수 있고 &lt;b&gt;A&lt;/b&gt;를 통해 맨 뒤의 텍스트에서 입력을 시작할 수 있습니다.&lt;br&gt;ESC 키를 통해 다시 커맨드 모드로 돌아갈 수 있습니다.&lt;br&gt;지우기 기능은 &lt;b&gt;d&lt;/b&gt;를 통해서 사용할 수 있습니다.&lt;br&gt;물론 d하나만 가지고 하는 것은 아니고 숫자, w, e, b, t, f, T, F 등과 결합하여 원하는 형태로 지울 수 있습니다.&lt;br&gt;예를 들어 괄호 안의 글을 모두 지우고 싶다면 'dt)'를 통해 할 수 있으며 단어 2개를 지우고 싶으시면 'd2w'를 통해 하실 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글 저장하고 나가기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;:w&lt;/b&gt;를 통해 글을 저장할 수 있고 &lt;b&gt;:q&lt;/b&gt;를 통해 나갈 수(닫을 수) 있습니다.&lt;br&gt;&lt;b&gt;:wq&lt;/b&gt;를 하면 저장하고 닫을 수 있고요.&lt;br&gt;&lt;b&gt;:q! 를&lt;/b&gt; 통해 모든 것을 무시하고 나갈 수도 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단어 교체하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;:s/교체될 단어/교체할 단어&lt;/b&gt;를 통해 현재 커서 뒤에 있는 가장 가까운 단어를 교체할 수 있습니다.&lt;br&gt;뒤에 /g를 붙여 해당 줄에서 전부 교체할 수 있고 앞의 s를 %s로 교체하고 /g를 붙여 글 전체에서 교체할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글쓴이의 생각&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIM을 전부 배우려 하기보다는 필요한 기능들 위주로 배워나가도 충분히 처리 속도가 빨라진 것을 느끼실 수 있을 것 같습니다.&lt;br&gt;이건 타자연습처럼 꾸준히 하지 않으면 처음에는 오히려 평소보다 느려져서 답답하실 수 있는데 그래도 계속하시면 어느 순간 '아, 난 지금까지 손해보고 살았구나!'를 느끼시게 될 겁니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;지금 티스토리가 마크다운 에디터가 한글 입력이 제대로 안 먹히고 VSC도 한글이 씹혀서 옵시디언이라는&lt;a href=&quot;https://obsidian.md&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://obsidian.md&lt;/span&gt;&lt;/a&gt; 마크다운 노트 앱을 쓰고 있는데 VIM을 지원해서 너무 좋습니다 진짜&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;팁&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캡스락 키를 잘 사용하지 않으시는 분들은 캡스락을 ESC로 키 바인딩을 해서 쓰시거나 jk를 ESC로 바꾸시는 것을 추천드립니다.&lt;br&gt;*VSC에서 jk 바인딩하기:&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;&quot;vim.insertModeKeyBindings&quot;: [
        {
            &quot;before&quot;: [&quot;j&quot;, &quot;k&quot;],
            &quot;after&quot;: [&quot;&amp;lt;Esc&amp;gt;&quot;]
        }
    ],&lt;/code&gt;&lt;/pre&gt;</description>
      <category>기타</category>
      <category>Vim</category>
      <category>vim 나가기</category>
      <category>vim 에디터</category>
      <category>vim 커맨드</category>
      <category>visual studio code에서 vim 사용하기</category>
      <category>vsc에서 vim 사용하기</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/146</guid>
      <comments>https://coder38611.tistory.com/146#entry146comment</comments>
      <pubDate>Sat, 14 Aug 2021 00:11:48 +0900</pubDate>
    </item>
    <item>
      <title>NETAMlog[0]  블로그 개편의 시작 - Next.JS, TailwindCSS</title>
      <link>https://coder38611.tistory.com/145</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;neonbrand-3GZNPBLImWc-unsplash.jpg&quot; width=&quot;700&quot; height=&quot;467&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KMMmQ/btrb6TJxNpE/cw7jU3derpsbshIqkh2FV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KMMmQ/btrb6TJxNpE/cw7jU3derpsbshIqkh2FV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KMMmQ/btrb6TJxNpE/cw7jU3derpsbshIqkh2FV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKMMmQ%2Fbtrb6TJxNpE%2Fcw7jU3derpsbshIqkh2FV0%2Fimg.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;neonbrand-3GZNPBLImWc-unsplash.jpg&quot; width=&quot;700&quot; height=&quot;467&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;블로그 새로 만들기&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 티스토리로도 충분한데, 요즘 프로젝트를 안 한 거 같아서 Next.JS랑 TailwindCSS를 배운 김에 블로그를 새로 만들면 어떨까 해서 이 프로젝트를 진행하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 몇 주 전에 글을 올렸어야 하는데 이런저런 일들이 있어서 어느 정도 프로젝트가 윤곽이 잡히고 나서야 글을 올리게 되네요.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기술 스택&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Next.JS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nextjs.org&quot;&gt;Next.JS&lt;/a&gt;는 리액트 프레임워크로 기존의 리액트에 서버 관련 기능을 갖추고 SSR과 SSG를 간편하게 구현할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰다 보면 확실히 편리한데, 아주 디테일하게 들어가면 살짝 옵션 설정이 안 되는 게 아쉽더라고요(물론 지원하는 게 많아서 충분히 다른 방법을 찾을 수 있긴 합니다).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TailwindCSS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tailwindcss.com&quot;&gt;TailwindCSS&lt;/a&gt;는 부트스트랩 같은 UI를 미리 선언해놓은 프레임워크가 아니라 일반적인 CSS를 작성하는데 클래스만으로 작성할 수 있도록 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 버튼이 원래는 보라색인데 커서를 가져다대면 파란색으로 변하게 하고 싶다면 다음과 같이 작성하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;button className='bg-purple-100 hover:bg-blue-100' /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 실제로 지속적으로 사용하기 위해 만드는 거라 조사를 좀 했고 결론적으로 &lt;b&gt;마크다운&lt;/b&gt;을 지원하는 블로그를 만들기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rich-Text 에디터를 가져와볼까 생각해보지 않은 것은 아닌데, 제 글쓰기 특성상 마크다운으로도 충분할 거 같아서 그렇게 결정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글쓰기 방식은 저처럼 블로그를 직접 만드신 다른 분들의 사례를 보니까 마크다운 파일을 로컬에서 만들고 git으로 깃허브로 푸시하는 방식을 많이들 쓰시더라고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 저도 어떻게 할지 고민하다가 블로그 사이트에 Next.JS의 Preview기능을 통해 마크다운 에디터를 만들고 서버에 마크다운 파일을 만드는 형식으로 가볼까 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안으로는 구글 로그인 같은 것을 통해 저만 에디터 페이지로 갈 수 있도록 구현할 계획입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마크다운은 브라우저에서 바로 파싱되지 않기 때문에 &lt;a href=&quot;https://mdxjs.com/&quot;&gt;mdx&lt;/a&gt;라는 라이브러리에다가 코드 하이라이팅을 해주는 &lt;a href=&quot;https://github.com/shikijs/shiki&quot;&gt;shiki&lt;/a&gt;라는 mdx 플러그인을 사용하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Tailwind가 다크 모드를 지원해서 저도 진정한 개발자(?)처럼 다크 모드 지원을 추가하기로 마음먹었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;현재 진행상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 404/500 에러 페이지와 내비게이션 바, about 페이지가 완성되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마크다운 에디터를 만들까 말까 결정을 내린 지 얼마 안돼서 아직 그 부분은 건드리지 않았는데 이 부분만 잘 해결되면 금방 끝날 것 같습니다.(물론 그럴리는...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다크 모드도 토글 버튼을 통해 전환할 수 있도록 설정해 놓았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;희망사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 블로그 글을 잘 안 적고 있긴 한데..앞으로는 매주 적어도 한 개의 글을 올리는 것을 목표로 하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;댓글 기능은 따로 &lt;a href=&quot;https://commento.io&quot;&gt;Commento&lt;/a&gt;라는 서비스를 통해 셀프 호스팅으로 구현할 계획입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 문제풀이 글을 제외한 글들은 영어로도 작성할까 고민이 돼서 그 부분은 어떻게 할지 고민해봐야 할 것 같습니다.&lt;/p&gt;</description>
      <category>프로젝트/블로그 만들기 - NETAM</category>
      <category>commento</category>
      <category>markdown</category>
      <category>nextjs</category>
      <category>nextjs 블로그</category>
      <category>TailwindCSS</category>
      <category>마크다운 블로그</category>
      <category>블로그</category>
      <category>블로그 코딩하기</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/145</guid>
      <comments>https://coder38611.tistory.com/145#entry145comment</comments>
      <pubDate>Fri, 13 Aug 2021 23:23:52 +0900</pubDate>
    </item>
    <item>
      <title>[팁|TIP] 맥OS에서 bits/stdc++.h 사용하기</title>
      <link>https://coder38611.tistory.com/144</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이번에 새롭게 알고리즘을 공부할 각오를 다지며 책을 샀는데, 첫 장에 떡하니 #include &amp;lt;bits/stdc++.h&amp;gt;가 있더라고요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;2692&quot; data-origin-height=&quot;1242&quot; data-filename=&quot;IMG_7246.JPG&quot; width=&quot;500&quot; height=&quot;231&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ssREC/btq89vEn3sv/fkScYkWKfScRz3SyRAg1T0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ssREC/btq89vEn3sv/fkScYkWKfScRz3SyRAg1T0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ssREC/btq89vEn3sv/fkScYkWKfScRz3SyRAg1T0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FssREC%2Fbtq89vEn3sv%2FfkScYkWKfScRz3SyRAg1T0%2Fimg.jpg&quot; data-origin-width=&quot;2692&quot; data-origin-height=&quot;1242&quot; data-filename=&quot;IMG_7246.JPG&quot; width=&quot;500&quot; height=&quot;231&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;사실 이 헤더가 존재하고, 알고리즘 사이트와 대회에서 지원되는 경우가 많다고 들어서 전에 쓰려고 했다가 MacOS에서는 자동으로 설치되는 헤더가 아니라서 쓰려고 해도 헤더파일을 못찾는다고 나오더라고요.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 어떻게 추가하는지 찾아보니 Xcode의 헤더파일 폴더 안에 넣는 방법이 가장 많이 떠서 이 방법을 시도해봤는데 여전히 헤더파일이 없다고 해서 2시간 정도의 학교 동아리 시간을 날렸습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러다가 유튜브를 찾아보니 /usr/local/include에 bits라는 폴더를 만들고 그 안에 stdc++.h 파일을 넣으라는 영상을 찾았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 방법은 실행해보니까 인식은 하는 것 같은데 굉장히 긴 에러 메세지가 출력되서 순간 매우 당황했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 에러 메세지를 보니까 제가 아까 Xcode 안에 있는 stdc++.h를 찾고 있더라고요?&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;확인해보니 제가 /usr/local/include/bits에 넣을때 Xcode의 헤더를 끌어와서 복사가 아닌 참조로 저장되어 있었는데 제가 Xcode 쪽 헤더를 그 뒤에 바로 지워버려서 없는 파일에 참조해서 에러가 나던 것이더라고요.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 다시 파일을 만들고 실행해보니 잘 되었습니다.&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;순서:&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*참고: 저는 Xcode와 homebrew가 설치되어 있으며 homebrew를 통해 gcc가 설치되어진 상태입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**원래 중간에 using namespace std;가 아래 텍스트에 있는데 컴파일러에서 경고가 뜨길래(아마 두 번 선언해서 그런거 같아요) 지웠습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;터미널을 통해 cd /usr/local/include를 쳐서 해당 경로로 들어갑니다.&lt;/li&gt;
&lt;li&gt;mkdir bits를 통해 bits라는 폴더를 생성합니다.&lt;/li&gt;
&lt;li&gt;touch stdc++.h를 쳐서 stdc++.h라는 파일을 생성합니다.&lt;/li&gt;
&lt;li&gt;원하는 에디터를 통해 아래 텍스트를 넣은 다음 저장하면 바로 사용할 수 있습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1625738538399&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// C++ includes used for precompiling -*- C++ -*-

// Copyright (C) 2003-2013 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// &amp;lt;http://www.gnu.org/licenses/&amp;gt;.

/** @file stdc++.h
 *  This is an implementation file for a precompiled header.
  */




  // 17.4.1.2 Headers

  // C
#ifndef _GLIBCXX_NO_ASSERT
#include &amp;lt;cassert&amp;gt;
#endif
#include &amp;lt;cctype&amp;gt;
#include &amp;lt;cerrno&amp;gt;
#include &amp;lt;cfloat&amp;gt;
#include &amp;lt;ciso646&amp;gt;
#include &amp;lt;climits&amp;gt;
#include &amp;lt;clocale&amp;gt;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;csetjmp&amp;gt;
#include &amp;lt;csignal&amp;gt;
#include &amp;lt;cstdarg&amp;gt;
#include &amp;lt;cstddef&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;cstring&amp;gt;
#include &amp;lt;ctime&amp;gt;

#if __cplusplus &amp;gt;= 201103L
#include &amp;lt;ccomplex&amp;gt;
#include &amp;lt;cfenv&amp;gt;
#include &amp;lt;cinttypes&amp;gt;
#include &amp;lt;cstdbool&amp;gt;
#include &amp;lt;cstdint&amp;gt;
#include &amp;lt;ctgmath&amp;gt;
#include &amp;lt;cwchar&amp;gt;
#include &amp;lt;cwctype&amp;gt;
#endif

// C++
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;bitset&amp;gt;
#include &amp;lt;complex&amp;gt;
#include &amp;lt;deque&amp;gt;
#include &amp;lt;exception&amp;gt;
#include &amp;lt;fstream&amp;gt;
#include &amp;lt;functional&amp;gt;
#include &amp;lt;iomanip&amp;gt;
#include &amp;lt;ios&amp;gt;
#include &amp;lt;iosfwd&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;istream&amp;gt;
#include &amp;lt;iterator&amp;gt;
#include &amp;lt;limits&amp;gt;
#include &amp;lt;list&amp;gt;
#include &amp;lt;locale&amp;gt;
#include &amp;lt;map&amp;gt;
#include &amp;lt;memory&amp;gt;
#include &amp;lt;new&amp;gt;
#include &amp;lt;numeric&amp;gt;
#include &amp;lt;ostream&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;set&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;stack&amp;gt;
#include &amp;lt;stdexcept&amp;gt;
#include &amp;lt;streambuf&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;typeinfo&amp;gt;
#include &amp;lt;utility&amp;gt;
#include &amp;lt;valarray&amp;gt;
#include &amp;lt;vector&amp;gt;

#if __cplusplus &amp;gt;= 201103L
#include &amp;lt;array&amp;gt;
#include &amp;lt;atomic&amp;gt;
#include &amp;lt;chrono&amp;gt;
#include &amp;lt;condition_variable&amp;gt;
#include &amp;lt;forward_list&amp;gt;
#include &amp;lt;future&amp;gt;
#include &amp;lt;initializer_list&amp;gt;
#include &amp;lt;mutex&amp;gt;
#include &amp;lt;random&amp;gt;
#include &amp;lt;ratio&amp;gt;
#include &amp;lt;regex&amp;gt;
#include &amp;lt;scoped_allocator&amp;gt;
#include &amp;lt;system_error&amp;gt;
#include &amp;lt;thread&amp;gt;
#include &amp;lt;tuple&amp;gt;
#include &amp;lt;typeindex&amp;gt;
#include &amp;lt;type_traits&amp;gt;
#include &amp;lt;unordered_map&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;730&quot; data-filename=&quot;스크린샷 2021-07-08 오후 6.59.04.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMcTi5/btq89kJAHKb/otT9Wod8PJ3EcwgrpQmMw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMcTi5/btq89kJAHKb/otT9Wod8PJ3EcwgrpQmMw0/img.png&quot; data-alt=&quot;이렇게 생겼습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMcTi5/btq89kJAHKb/otT9Wod8PJ3EcwgrpQmMw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMcTi5%2Fbtq89kJAHKb%2FotT9Wod8PJ3EcwgrpQmMw0%2Fimg.png&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;730&quot; data-filename=&quot;스크린샷 2021-07-08 오후 6.59.04.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 생겼습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘 공부/알고리즘과 자료구조</category>
      <category>Algorithm</category>
      <category>bits/stdc++</category>
      <category>macos bits/stdc++</category>
      <category>동아리</category>
      <category>맥에서 bits/stdc++.h 헤더 추가하기</category>
      <category>알고리즘 팁</category>
      <author>Coder38611</author>
      <guid isPermaLink="true">https://coder38611.tistory.com/144</guid>
      <comments>https://coder38611.tistory.com/144#entry144comment</comments>
      <pubDate>Thu, 8 Jul 2021 19:05:43 +0900</pubDate>
    </item>
  </channel>
</rss>