<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>u-ryu-00.log</title>
        <link>https://velog.io/</link>
        <description>티스토리로 블로그를 이전했습니다. 😂 구경 오세요! 👉🏻 https://u-ryu-logs.tistory.com</description>
        <lastBuildDate>Sat, 28 Dec 2024 16:57:35 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>u-ryu-00.log</title>
            <url>https://velog.velcdn.com/images/u-ryu-00/profile/b97530a5-4f7d-4cbc-98de-ceea9af74302/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. u-ryu-00.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/u-ryu-00" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[대학생 인턴이었던 내가 정신 차려보니 풀타임 개발자? (2024년 회고록)]]></title>
            <link>https://velog.io/@u-ryu-00/%EB%8C%80%ED%95%99%EC%83%9D-%EC%9D%B8%ED%84%B4%EC%9D%B4%EC%97%88%EB%8D%98-%EB%82%B4%EA%B0%80-%EC%A0%95%EC%8B%A0-%EC%B0%A8%EB%A0%A4%EB%B3%B4%EB%8B%88-%ED%92%80%ED%83%80%EC%9E%84-%EA%B0%9C%EB%B0%9C%EC%9E%90-2024%EB%85%84-%ED%9A%8C%EA%B3%A0%EB%A1%9D</link>
            <guid>https://velog.io/@u-ryu-00/%EB%8C%80%ED%95%99%EC%83%9D-%EC%9D%B8%ED%84%B4%EC%9D%B4%EC%97%88%EB%8D%98-%EB%82%B4%EA%B0%80-%EC%A0%95%EC%8B%A0-%EC%B0%A8%EB%A0%A4%EB%B3%B4%EB%8B%88-%ED%92%80%ED%83%80%EC%9E%84-%EA%B0%9C%EB%B0%9C%EC%9E%90-2024%EB%85%84-%ED%9A%8C%EA%B3%A0%EB%A1%9D</guid>
            <pubDate>Sat, 28 Dec 2024 16:57:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/2f62b128-fbd6-4218-bfc6-631eea9b3f06/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/d3c6a8ac-2d8e-4752-82d0-a7a80dbcd3cd/image.png" alt=""></p>
<p>학업과 직장 생활을 병행한 2024년은 저에게 많은 변화와 새로운 도전을 가져다주었습니다. 1년이 정말 빨리 지나갔는데, 이상하게 지난달에 있었던 일은 한참 전에 있었던 일처럼 느껴지네요. 정신없었던 한 해를 마무리하고 2025년을 기대하는 마음으로 지난 12월 27일 금요일, 회사에서 기년회가 열렸습니다. 기년회를 준비하며 2024년을 쭉 돌아보고 연말 회고록을 작성했는데요, 그 내용을 공유해 드립니다. 연말 회고 방법도 간단히 메모로 남겼으니 참고해 주세요! 😉</p>
<blockquote>
<p><strong>🌱 신입 개발자가 연말 회고하는 법 🌱</strong></p>
</blockquote>
<ul>
<li><strong>1년 간의 기록 전부 모아서 정리</strong><ul>
<li><strong>데일리 로그</strong></li>
<li><strong>주간 회고</strong></li>
<li><strong>프로젝트 회고</strong></li>
<li><strong>개인 기술 블로그</strong></li>
<li><strong>캘린더, 갤러리 사진</strong></li>
</ul>
</li>
<li><strong>시간 순서대로 있었던 일 쭉 나열</strong></li>
<li><strong>아래 3가지 중심으로 회고</strong><ul>
<li><strong>작년과 비교해서 개선된 것, 새롭게 배운 것</strong></li>
<li><strong>어려웠던 것, 아쉬웠던 것</strong></li>
<li><strong>내년에 실천할 Action Plan</strong></li>
</ul>
</li>
<li><strong>신년 계획 세우기 (내년 목표, TO-DO, 기대하는 것 등)</strong></li>
<li><strong>회사 동료나 지인과 회고한 내용 공유, 내년 목표 공표</strong></li>
</ul>
<p>2024년 3월 프론트엔드 개발자로서의 커리어를 본격적으로 시작하며 경험한 개발자의 길은 도전의 연속이었습니다. 올해의 경험을 되돌아보며, 3가지 키워드를 꼽아보았습니다. </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/9740b608-6a45-4985-9d4c-152eb7e264d0/image.png" alt=""></p>
<h2 id="1-작업-프로세스-확립">1. 작업 프로세스 확립</h2>
<p>여러 개의 프로젝트에 참여하면서, 저만의 작업 프로세스를 확립했습니다. 작업을 정돈된 흐름으로 일관되게 진행하니 동일한 시간 내에 더 많은 작업을 처리할 수 있었어요. 제가 구성한 작업 프로세스는 아래와 같습니다.</p>
<blockquote>
<ul>
<li><strong>Jira에 작업 리스팅 및 우선순위 설정</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>프로젝트 세팅</strong></li>
<li><strong>퍼블리싱 작업 준비</strong><ul>
<li><strong>레이아웃 설계</strong></li>
<li><strong>공통 컴포넌트로 뺄 수 있는 것들 고민</strong></li>
<li><strong>전체적인 디자인 체크 후 빠진 것들은 챙겨서 디자이너님께 요청</strong><ul>
<li><strong>반응형 break point</strong></li>
<li><strong>컨텐츠 너비</strong></li>
<li><strong>다양한 사용자 브라우저 너비와 높이에 따른 처리 방향</strong></li>
</ul>
</li>
</ul>
</li>
<li><strong>퍼블리싱 작업</strong></li>
<li><strong>작업 일지 작성하면서 기능 하나씩 작업 시작</strong><ul>
<li><strong>작업 단위는 작게</strong></li>
<li><strong>어떤 작업인지 알 수 있게 Git Branch 네이밍</strong></li>
</ul>
</li>
<li><strong>기능 하나씩 구현 끝날 때마다 셀프 리뷰 후 코드 리뷰 요청 → 피드백 수정 반영 후 merge</strong></li>
<li><strong>프로젝트 회고</strong></li>
</ul>
<p>이 프로세스를 근간으로 삼아 지속적으로 개선하고 더 나은 작업 프로세스를 만들어가려 합니다.  </p>
<h2 id="2-커뮤니케이션과-협업">2. 커뮤니케이션과 협업</h2>
<p>혼자 개발할 때와 팀으로 협업할 때의 차이는 생각보다 컸습니다. 개인 작업에서는 모든 결정을 스스로 내리고, 속도와 방향을 스스로 조율할 수 있었지만, 협업에서는 서로 다른 의견을 조율하고 소통하며 일해야 했습니다. 이 과정에서 단순히 코드를 작성하는 것뿐만 아니라 명확한 커뮤니케이션과 효율적인 협업 방식의 중요성을 크게 느꼈습니다.</p>
<p>협업을 위해 신입이었던 저에게 주어진 미션은 4가지 정도였습니다. </p>
<ol>
<li>회사 내부 컨벤션 적응</li>
<li>효율적인 협업을 위한 Git 숙달</li>
<li>적절한 질문과 상황 공유는 필수</li>
<li>지식 전파<h3 id="2-1-회사-내부-컨벤션-적응">2-1. 회사 내부 컨벤션 적응</h3>
팀의 구성원으로서 가장 먼저 해야 했던 것은 회사 내부 컨벤션에 익숙해지는 일이었습니다. 저는 회사 내부 컨벤션을 실수 없이 지키기 위해 하나의 문서로 정리하고 이를 셀프 리뷰 시 체크리스트로 활용했습니다. </li>
</ol>
<p>회사 내부 컨플루언스 문서에도 추가해서 새로운 컨벤션이 생기거나 수정될 때마다 수시로 업데이트하고 있어요! 언젠가 만나게 될 <strong>✨미래의 New 동료✨</strong>에게 이 문서가 꼭 도움이 되었으면 좋겠습니다. 😊
<img src="https://velog.velcdn.com/images/u-ryu-00/post/7d541e44-4308-499d-8a7c-dae9dbcac80f/image.png" alt=""></p>
<h3 id="2-2-효율적인-협업을-위한-git-숙달">2-2. 효율적인 협업을 위한 Git 숙달</h3>
<p>혼자 개발을 했을 때는 Git을 개인적인 버전관리와 히스토리 추적 정도로만 사용했습니다. 하지만 팀으로 개발할 때는 Git이 훨씬 더 큰 역할을 해주었습니다. 처음에는 여러 명이 동시에 작업하는 환경 속에서 Git 충돌 해결에 어려움을 겪기도 했지만, 동료들의 도움으로 점점 익숙해졌습니다. 그리고 어려움을 겪은 상황과 해결법은 모두 개인 notion에 기록으로 남겼습니다. 올 한 해는 오직 기록만이 살길이었습니다. 😂 그래도 경험과 기록이 점점 쌓이니 비슷한 상황이 다시 발생했을 때 이전보다 빠르게 대처할 수 있었습니다.
<img src="https://velog.velcdn.com/images/u-ryu-00/post/a4dd9e35-b44e-4a4f-a023-c02716814b4e/image.png" alt=""></p>
<h3 id="2-3-적절한-질문과-상황-공유는-필수">2-3. 적절한 질문과 상황 공유는 필수</h3>
<p>회사의 동료들은 제가 오랜 시간 동안 질문 없이 혼자 작업하고 있으면 종종 너무 조용해서 불안하다고 하셨습니다. ㅋㅋㅋㅋㅋ 실제로 제가 조용히 작업한 걸 들고 코드 리뷰를 받으러 가면 뭔가 크게 잘못되었다는 걸 그제야 깨달았던 적이 많았습니다. 적절한 타이밍에 질문해서 작업이 지체되지 않도록 하는 게 중요한 것 같아요. 하지만 <strong>👉 적절한 질문 👈</strong> 을 하는 건 어려웠습니다. 적절한 타이밍을 찾는 것도, 작업 방향과 문제를 명확히 설명하는 것도 쉽지 않았어요. 그래도 매일의 업무량 달성을 1순위 목표로 두고 열심히 질문했습니다. </p>
<blockquote>
<p><strong>❓ 질문 잘 하는 법 ❗️</strong></p>
</blockquote>
<ul>
<li><strong>질문드리기 전 개인적으로 해결해 볼 마감 시간을 정하고 그 시간까지 최대한 해결해 본다.</strong></li>
<li><strong>해결되지 않으면 아래의 정보와 함께 질문드린다.</strong><ul>
<li><strong>어떤 작업을 하고 있는지</strong></li>
<li><strong>예상되는 원인은 무엇인지</strong></li>
<li><strong>해결을 위해 시도해 본 것들이 있다면 무엇인지</strong></li>
</ul>
</li>
</ul>
<p>추가로 사무실에서 질문하기엔 좀 애매한 사소한 궁금증이나 개인적인 조언은 밥 먹을 때, 퇴근할 때 등 사무실 외부에서 질문드렸습니다. 제 질문 잘 받아주셔서 진심으로 감사했어요. 🥹🥹🥹</p>
<h3 id="2-4-지식-전파의-중요성">2-4. 지식 전파의 중요성</h3>
<p>지식을 공유하면 팀원 모두가 특정 문제를 이해하고 있어서 동일한 문제가 발생했을 때 빠르게 해결할 수 있습니다. 저희 회사에서는 컨플루언스에 [지식 전파소] 라는 페이지를 만들어서 기능 구현이나 에러 해결 경험을 문서화하여 공유하고 있어요! 지식 전파소에 다른 동료 분이 작성한 글을 보고 큰 도움을 받았던 경험이 있습니다. 도움을 받은 만큼 저도 누군가에게 도움이 될 수 있게 내년에도 적극적으로 공유해볼게요!
<img src="https://velog.velcdn.com/images/u-ryu-00/post/321623cb-1550-4565-be57-ab04416dc163/image.png" alt=""></p>
<h2 id="3-불확실성">3. 불확실성</h2>
<p>이제 마지막 키워드 불확실성입니다. 실무에서 스스로 통제할 수 없는 상황들이 너무 많았습니다. </p>
<ul>
<li>요구사항이나 우선순위의 갑작스러운 변경</li>
<li>디자인, 기획 등 다른 팀 의존성으로 인해 발생하는 지연</li>
<li>새로운 기술 스택으로 인한 러닝 커브</li>
</ul>
<p>불확실한 요소들이 많아질수록 작업이 언제 끝날지, 어떤 방향으로 바뀔지.. 불안은 무한대로 커졌습니다. 매일 쓰는 데일리 로그에 기분 점수를 0점으로 쓰는 날도 있었습니다. 그 날 제 데일리 로그 스레드에는 댓글이 13개 달렸습니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 제 힘듦에 함께 공감해주셨어요..😭😭😭
<img src="https://velog.velcdn.com/images/u-ryu-00/post/9b2bb355-a759-4564-a89f-b31ee23d2c23/image.jpg" alt=""></p>
<p>이런 상황들을 여러 번 겪으면서 내린 결론입니다.</p>
<blockquote>
<p><strong>1. 완벽한 계획보다 유연한 계획을 세우는 연습 필요 (매번 생기는 시행착오들을 최대한 예상해서 일정 계획)
2. 변동이나 불확실한 상황이 생기면 팀원이나 리더와 공유
3. 우선순위 관리 필요 (모든 문제를 한꺼번에 해결하려 하지 말고 중요하고 시급한 문제에 우선순위를 두기)
4. 모든 책임을 혼자 짊어지려 하지 말고 도움을 요청
5. 회고와 개선 (다음에 어떻게 대응할지 개선점 찾아보기 → 무엇이 예상 밖이었는가? 어떻게 더 잘 대응할 수 있었나?)</strong></p>
</blockquote>
<p>이렇게 키워드로 올 한 해를 정리하니 정말 올해가 끝났다는 게 실감 나고 내년이 더욱더 기대됩니다. 비록 올 한 해 기분 점수가 0점인 날도 있었지만, 기년회 날 제 기분은 10점을 넘어 20점이었습니다! 지나고 나면 별거 아니라는 말이 다 맞는 말인 것 같네요 😅😅😅</p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/200ea33f-3b83-4abc-b9cd-7eed7fdc7fc0/image.png" alt=""></p>
<p><strong>저와 함께 2024년을 달려온 모든 동료분들께 감사드리며, 다가오는 2025년에는 더 성장하고 배우겠습니다. 감사합니다.</strong></p>
<blockquote>
<p><strong>🤗 링크드인이랑 GitHub에도 놀러오세요! 🤗</strong>
<strong>링크드인 👉🏻 <a href="http://www.linkedin.com/in/u-ryu">http://www.linkedin.com/in/u-ryu</a></strong>
<strong>GitHub 👉🏻 <a href="https://github.com/u-ryu-00">https://github.com/u-ryu-00</a></strong></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Tool] React를 위한 Storybook 도입하기 1탄]]></title>
            <link>https://velog.io/@u-ryu-00/Tool-React%EB%A5%BC-%EC%9C%84%ED%95%9C-Storybook-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@u-ryu-00/Tool-React%EB%A5%BC-%EC%9C%84%ED%95%9C-Storybook-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 15 Jun 2024 08:23:09 GMT</pubDate>
            <description><![CDATA[<h3 id="📖-storybook이란">📖 Storybook이란?</h3>
<p>Storybook은 UI 컴포넌트 개발 도구입니다. UI 컴포넌트를 격리된 환경에서 개발할 수 있도록 하여, 컴포넌트의 동작을 개별적으로 확인하고 테스트하는 데 도움을 줍니다.</p>
<h3 id="✨-활용-사례">✨ 활용 사례</h3>
<ol>
<li>컴포넌트 개발
Storybook을 사용하면 UI 컴포넌트를 독립적으로 개발할 수 있어, 애플리케이션 전체를 실행하지 않고도 컴포넌트를 개발하고 테스트할 수 있습니다. </li>
<li>디자인 시스템구축
Storybook을 통해 모든 UI 컴포넌트를 한 곳에 모아 디자인 시스템을 구축하고, 일관된 UI를 유지할 수 있습니다. </li>
<li>문서화 및 공유
Storybook의 스토리를 통해 컴포넌트 사용법과 예제를 문서화하여 팀 내에서 쉽게 공유할 수 있습니다. </li>
<li>테스트 자동화
UI 컴포넌트가 예상대로 보이는지 확인하는 테스트가 쉽습니다.</li>
</ol>
<h4 id="storybook은-ui-컴포넌트-개발을-더-쉽고-효율적으로-만들어주는-강력한-도구입니다-독립된-개발-환경-실시간-업데이트-다양한-문서화-기능을-통해-개발자와-디자이너-모두에게-유용한-도구로-특히-컴포넌트-기반의-프론트엔드-개발에서-큰-가치를-제공합니다">Storybook은 UI 컴포넌트 개발을 더 쉽고 효율적으로 만들어주는 강력한 도구입니다. 독립된 개발 환경, 실시간 업데이트, 다양한 문서화 기능을 통해 개발자와 디자이너 모두에게 유용한 도구로, 특히 컴포넌트 기반의 프론트엔드 개발에서 큰 가치를 제공합니다.</h4>
<h4 id="📚-참고-자료">📚 참고 자료</h4>
<ul>
<li><a href="https://storybook.js.org/tutorials/intro-to-storybook">스토리북 튜토리얼</a></li>
<li><a href="https://storybook.js.org/tutorials/intro-to-storybook/react/ko/get-started/">리액트를 위한 스토리북 튜토리얼</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Tool] Sequel Pro로 MariaDB 쉽게 관리하기]]></title>
            <link>https://velog.io/@u-ryu-00/Tool-Sequel-Pro%EB%A1%9C-Maria-DB-%EC%89%BD%EA%B2%8C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@u-ryu-00/Tool-Sequel-Pro%EB%A1%9C-Maria-DB-%EC%89%BD%EA%B2%8C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 15 Jun 2024 07:46:15 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/90030884-947e-4d93-b485-dd5b4c26ecab/image.png" alt=""></p>
<p>저번 포스트에서는 <a href="https://velog.io/@u-ryu-00/Docker%EB%A1%9C-MariaDB-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0">Docker로 MariaDB에 접속하는 법</a>을 다뤘습니다. 이번 포스트에서는 Docker로 접속한 MariaDB를 쉽게 다루기 위해 Sequel Pro라는 도구를 사용하는 법을 기록합니다. </p>
<h3 id="🥞-sequel-pro-왜-쓰나요">🥞 Sequel Pro 왜 쓰나요?</h3>
<ul>
<li>직관적인 UI: Sequel Pro는 직관적이고 사용하기 쉬운 그래픽 사용자 인터페이스 (GUI)를 제공하여, 명령줄 인터페이스 (CLI)보다 데이터베이스 관리를 더 쉽게 할 수 있습니다. </li>
<li>시각적 데이터 관리: 데이터베이스, 테이블, 행 등을 시각적으로 관리할 수 있어, 복잡한 SQL 쿼리를 직접 작성하지 않고도 데이터 조작이 가능합니다. </li>
</ul>
<h3 id="👩🏻💻-sequel-pro-쓰지-않고-sql-명령어로-데이터베이스-작업-수행하기">👩🏻‍💻 Sequel Pro 쓰지 않고 SQL 명령어로 데이터베이스 작업 수행하기</h3>
<ol>
<li>데이터베이스 목록 확인<pre><code class="language-sql">SHOW DATABASES;</code></pre>
</li>
<li>새로운 데이터베이스 생성<pre><code class="language-sql">CREATE DATABASE daisy_database;</code></pre>
</li>
<li>사용할 데이터베이스 선택<pre><code class="language-sql">USE daisy_database;</code></pre>
</li>
<li>선택된 데이터베이스의 테이블 목록 확인<pre><code class="language-sql">SHOW TABLES;</code></pre>
이외에도 여러 SQL 명령어를 사용하여 다양한 작업(테이블 생성, 테이블 구조 확인, 데이터 삽입, 데이터 조회, 데이터 업데이트, 데이터 삭제 등)을 수행할 수 있습니다. </li>
</ol>
<h3 id="🤍-sequel-pro로-mariadb-쉽게-관리하기">🤍 Sequel Pro로 MariaDB 쉽게 관리하기</h3>
<ol>
<li>Sequel Pro 설치<pre><code class="language-bash">brew install sequel-pro</code></pre>
</li>
<li>connect
<img src="https://velog.velcdn.com/images/u-ryu-00/post/19db7bb5-8227-44d3-9ecf-fe553d7ec1e1/image.png" alt=""></li>
</ol>
<ul>
<li><code>Name</code>: 원하시는 이름으로 설정하시면 됩니다. </li>
<li><code>Host</code>: 데이터베이스 서버의 주소를 입력합니다. 로컬 서버의 경우 <code>127.0.0.1</code>을 입력합니다. </li>
<li><code>Username</code>: 데이터베이스 사용자 이름을 입력합니다. 여기서는 <code>root</code> 입니다. 이전 포스트에서 root로 설정했기에 root로 입력해주었습니다. </li>
<li><code>Password</code>: 데이터베이스 사용자의 비밀번호를 입력합니다. 이전 포스트에서 1324로 설정했기에 1324로 입력해주었습니다. </li>
</ul>
<p>입력이 모두 끝나면 Connect 버튼을 누릅니다.</p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/a8c98cc1-aadd-414e-a72f-dded32630bfd/image.png" alt=""></p>
<p>Choose Database 셀렉트 박스에서 방금 입력한 이름의 database를 선택해서 사용하면 됩니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Tool] Docker로 MariaDB 접속하기]]></title>
            <link>https://velog.io/@u-ryu-00/Docker%EB%A1%9C-MariaDB-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@u-ryu-00/Docker%EB%A1%9C-MariaDB-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 15 Jun 2024 07:02:10 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/67cfa5d2-7982-4a38-b21a-16c396b71af6/image.png" alt=""></p>
<h4 id="docker로-mariadb에-접속하는-방법을-기록합니다-docker에-대해서-궁금한-분들은-👉🏻-docker란-👈🏻-이-글을-참고해주세요">Docker로 MariaDB에 접속하는 방법을 기록합니다. Docker에 대해서 궁금한 분들은 👉🏻 <a href="https://velog.io/@u-ryu-00/Docker%EB%9E%80">Docker란</a> 👈🏻 이 글을 참고해주세요!</h4>
<h3 id="🫧-docker로-mariadb-접속하기">🫧 Docker로 MariaDB 접속하기</h3>
<h4 id="1-mariadb-이미지-가져오기">1. MariaDB 이미지 가져오기</h4>
<pre><code class="language-bash">docker pull mariadb</code></pre>
<h4 id="2-mariadb-컨테이너-생성하고-실행하기">2. MariaDB 컨테이너 생성하고 실행하기</h4>
<pre><code class="language-bash">docker run -p 3306:3306 --name {컨테이너 이름 작성} -e MARIADB_ROOT_PASSWORD={비밀번호} -d mariadb

// 예시
docker run -p 3306:3306 --name daisy-mariadb -e MARIADB_ROOT_PASSWORD=1324 -d mariadb</code></pre>
<ul>
<li><code>docker run</code>: 새로운 컨테이너를 생성하고 실행합니다.</li>
<li><code>-p 3306:3306</code>: 로컬 호스트의 포트 3306을 컨테이너의 포트 3306에 매핑합니다. (mariaDB의 기본 포트 번호가 3306이어서 이를 사용함.)</li>
<li><code>--name daisy-mariadb</code>: 컨테이너의 이름을 <code>daisy-mariadb</code>로 지정합니다. </li>
<li><code>-e MARIADB_ROOT_PASSWORD=1324</code>: MariaDB의 root 사용자 비밀번호를 <code>1324</code>로 설정합니다.</li>
<li><code>-d</code>: 컨테이너를 백그라운드 모드에서 실행합니다.</li>
<li><code>mariadb</code>: 공식 MariaDB 이미지를 사용합니다.</li>
</ul>
<pre><code class="language-bash">// 실행 중인 컨테이너만 조회
docker ps

// 모든 컨테이너 조회
docker ps -a</code></pre>
<p>조회해서 내가 생성한 컨테이너가 잘 뜨면 컨테이너 만들고 실행 시키기까지는 성공입니다!! ✨</p>
<h4 id="3-mariadb-접속하기">3. MariaDB 접속하기</h4>
<pre><code>docker exec -it {컨테이너 이름 작성} mariadb -uroot -p

// 예시
docker exec -it daisy-mariadb mariadb -uroot -p</code></pre><ul>
<li><code>docker exec</code>: 이미 실행 중인 Docker 컨테이너 내에서 명령어를 실행할 때 사용합니다.</li>
<li><code>-it</code>:
  ✔️ <code>-i</code> (interactive): 표준 입력(STDIN)을 활성화하여 터미널에서 사용자 입력을 받을 수 있게 합니다.
  ✔️ <code>-t</code> (tty): TTY (teletypewriter)를 할당하여, 터미널과 상호작용할 수 있게 한다. 이는 사용자에게 친숙한 셸 환경을 제공합니다.</li>
<li><code>daisy-mariadb</code>: 명령어를 실행할 대상 Docker 컨테이너의 이름입니다. 2번 단계에서 컨테이너를 생성할 때 <code>daisy-mariadb</code> 라는 이름으로 생성했기 때문에 여기서는 <code>daisy-mariadb</code> 라는 이름의 컨테이너에서 명령어를 실행합니다. </li>
<li><code>mariadb</code>: 컨테이너 내에서 실행할 명령어입니다. 여기서는 MariaDB 클라이언트를 실행합니다. <code>-uroot</code>: MariaDB 클라이언트에 전달되는 인자입니다. <code>-u</code> 옵션은 데이터베이스 사용자명을 지정하며 <code>root</code> 사용자를 의미합니다. </li>
<li><code>-p</code>: MariaDB 클라이언트에 전달되는 인자입니다. <code>-p</code> 옵션은 비밀번호 입력을 요청하는 옵션입니다. 이 옵션을 사용하면 MariaDB 클라이언트가 접속 시 비밀번호를 묻습니다. </li>
</ul>
<h4 id="4-enter-password">4. Enter password</h4>
<p>2번 단계에서 설정한 <code>MARIADB_ROOT_PASSWORD</code> 비밀번호를 입력하시면 됩니다. 저는 1324로 설정했기 때문에 1324를 입력해주었습니다. </p>
<h4 id="5-접속-완료-👍🏻">5. 접속 완료!! 👍🏻</h4>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/c7e20518-01cc-461a-940d-eff74adec642/image.png" alt=""></p>
<h4 id="✨-docker로-연결한-mariadb-쉽게-관리하는-법-보러가기-👉🏻-sequel-pro로-mariadb-쉽게-관리하기">✨ Docker로 연결한 MariaDB 쉽게 관리하는 법 보러가기! 👉🏻 <a href="https://velog.io/@u-ryu-00/Tool-Sequel-Pro%EB%A1%9C-Maria-DB-%EC%89%BD%EA%B2%8C-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0">Sequel Pro로 MariaDB 쉽게 관리하기</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Tool] Docker란?]]></title>
            <link>https://velog.io/@u-ryu-00/Docker%EB%9E%80</link>
            <guid>https://velog.io/@u-ryu-00/Docker%EB%9E%80</guid>
            <pubDate>Sat, 15 Jun 2024 06:18:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/52f4cb87-1c4f-4a0d-a6e3-9e5ce5b6ab9f/image.png" alt=""></p>
<h3 id="🩵-docker란">🩵 Docker란?</h3>
<p>개발자가 컨테이너를 빌드, 배포, 실행, 업데이트, 관리할 수 있는 오픈 소스 플랫폼이다.</p>
<h4 id="docker의-핵심-개념은-이미지와-컨테이너다-docker-이미지에는-소프트웨어-실행에-필요한-모든-것-즉-코드-런타임-드라이버-도구-스크립트-라이브러리-배치-등이-포함된다-docker-컨테이너는-이미지를-실행한-상태라고-볼-수-있다">Docker의 핵심 개념은 이미지와 컨테이너다. Docker 이미지에는 소프트웨어 실행에 필요한 모든 것, 즉 코드, 런타임, 드라이버, 도구, 스크립트, 라이브러리, 배치 등이 포함된다. Docker 컨테이너는 이미지를 실행한 상태라고 볼 수 있다.</h4>
<h3 id="👩🏻💻-docker-이미지란">👩🏻‍💻 Docker 이미지란?</h3>
<p>Docker 이미지에는 실행 가능한 애플리케이션 소스 코드는 물론, 이 애플리케이션 코드가 컨테이너 형태로 실행되는 데 필요한 모든 툴, 라이브러리 및 종속 항목이 포함되어 있다.
Docker 이미지를 완전히 새로 빌드하는 것도 가능하지만, 대부분 개발자는 공통 저장소에서 해당 이미지를 가져온다. </p>
<h3 id="🎁-컨테이너란">🎁 컨테이너란?</h3>
<p>이미지를 실행한 상태를 컨테이너라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.</p>
<h3 id="🪛-docker-왜-쓰나요">🪛 Docker 왜 쓰나요?</h3>
<p>Docker를 사용하면 개발 환경을 쉽게 설정할 수 있다. 새로운 개발자가 프로젝트에 참여할 때, Docker 이미지를 실행하는 것만으로 개발 환경을 즉시 구축할 수 있다. 복잡한 환경 설정 없이, 컨테이너만 실행하면 필요한 모든 것이 준비된다.</p>
<h4 id="✨-docker로-mariadb-접속하러-가기-👉🏻-docker로-mariadb-접속하기">✨ Docker로 MariaDB 접속하러 가기! 👉🏻 <a href="https://velog.io/@u-ryu-00/Docker%EB%A1%9C-MariaDB-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0">Docker로 MariaDB 접속하기</a></h4>
<h4 id="📚-참고-자료">📚 참고 자료</h4>
<ul>
<li><a href="https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/">Docker란 무엇인가?</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)">도커 (소프트웨어)</a></li>
<li><a href="https://www.ibm.com/kr-ko/topics/docker">Docker란?</a></li>
<li><a href="https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html">초보를 위한 도커 안내서 - 도커란 무엇인가?</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ChatGPT] ChatGPT-4o로 엑셀 데이터 정리하기]]></title>
            <link>https://velog.io/@u-ryu-00/ChatGPT-ChatGPT-4o%EB%A1%9C-%EC%97%91%EC%85%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@u-ryu-00/ChatGPT-ChatGPT-4o%EB%A1%9C-%EC%97%91%EC%85%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%95%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 21 May 2024 13:21:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/9e2094c6-3047-4615-ab9f-dd1ed2e7d8b9/image.png" alt=""></p>
<p>프로젝트를 진행하던 중 건강보험심사평가원에서 관리하는 병원 정보 데이터를 활용할 일이 생겼다. 
엑셀 파일로 데이터를 다운로드 받았는데 이 중에서 필요한 데이터들을 json 형식으로 변환해서 가져다 쓰고 싶었다. </p>
<p>엑셀 파일의 데이터를 골라내어 json 형식으로 변환하기 위한 도구로 <strong>ChatGPT-4o</strong>를 사용했다. </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/cabfe11a-56cf-4b68-8389-ee607729d461/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/f6d52cbd-0ce8-4f85-842b-13c3c3a658e0/image.png" alt=""></p>
<p>ChatGPT-4o에 xls 확장자 파일을 업로드 했을 때 오류가 발생해서 xls 파일을 xlsx 형식으로 변환해서 다시 업로드 해주었더니 파일이 성공적으로 업로드 되었다! ✨</p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/7252750b-ff84-44f6-aadb-fc9ed2c5a5f8/image.png" alt=""></p>
<p>내가 원하는 결과대로 데이터가 변환되어서 출력되고 있는 모습이다. </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/c80171f3-f633-48c4-8fc8-233f8788f28e/image.png" alt=""></p>
<p>아무래도 데이터가 많다보니 빠진 부분도 있었는데 사진처럼 추가로 요청했더니 정확한 데이터를 돌려주었다. </p>
<p>ChatGPT-4o에 Excel 파일 업로드 해서 json 형식으로 데이터 정리하기 성공!!! ✨✌️</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[web] 절대 URL vs 상대 URL]]></title>
            <link>https://velog.io/@u-ryu-00/web-%EC%A0%88%EB%8C%80-URL-vs-%EC%83%81%EB%8C%80-URL</link>
            <guid>https://velog.io/@u-ryu-00/web-%EC%A0%88%EB%8C%80-URL-vs-%EC%83%81%EB%8C%80-URL</guid>
            <pubDate>Tue, 21 May 2024 01:06:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/8950e1a5-0c6c-4367-b3ca-ce8d6b597058/image.png" alt=""></p>
<h3 id="🧭-절대-url-vs-상대-url">🧭 절대 URL vs 상대 URL</h3>
<p>URL의 맥락에서 절대와 상대의 차이가 무엇을 의미하는지 살펴보자. </p>
<p>URL의 필수 부분은 URL이 사용되는 context에 따라 크게 달라진다. 브라우저의 주소 표시줄에서 URL은 아무 맥락이 없으므로 전체(또는 절대) URL을 제공해야 한다. 프로토콜이나 포트를 포함할 필요는 없지만 URL의 다른 모든 부분은 필요하다. </p>
<p>URL이 HTML 페이지와 같은 문서 내에서 사용되는 경우, 상황이 약간 다르다. 브라우저에는 이미 문서 고유의 URL이 있기 때문에 이 정보를 사용하여 해당 문서 내에서 사용할 수 있는 URL의 누락된 부분을 채울 수 있다. *<em>URL의 경로 부분만 보면 절대 URL과 상대 URL을 구별할 수 있다. URL의 경로 부분이 &quot;<code>/</code>&quot; 문자로 시작하는 경우 브라우저는 현재 문서에서 제공하는 맥락을 참조하지 않고 서버의 최상위 루트에서 해당 리소스를 가져온다. *</em></p>
<h3 id="🩶-절대-url의-예시">🩶 절대 URL의 예시</h3>
<pre><code>✅ 전체 URL
https://developer.mozilla.org/ko/docs/Learn

✅ 절대 경로는 / 부터 시작합니다.
/images/main/photo.jpg</code></pre><h3 id="🩶-상대-url의-예시">🩶 상대 URL의 예시</h3>
<pre><code>✅ 디렉터리 트리로 돌아가기
../CSS/display</code></pre><h4 id="👩🏻💻-참고-자료">👩🏻‍💻 참고 자료</h4>
<ul>
<li><a href="https://developer.mozilla.org/ko/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL">mdn URL이란?</a></li>
<li><a href="https://www.inflearn.com/blogs/1284">절대주소 vs 상대주소 개념 정확히 이해하기</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Next.js] 이미지 불러오기]]></title>
            <link>https://velog.io/@u-ryu-00/Next.js-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@u-ryu-00/Next.js-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Sun, 19 May 2024 10:33:28 GMT</pubDate>
            <description><![CDATA[<h3 id="🖇️-static-assets">🖇️ Static Assets</h3>
<p>Next.js는 이미지와 같은 정적 파일을 루트 디렉터리의 public 이라는 폴더 아래에 제공할 수 있다. 그러면 기본 URL(/)에서 시작하는 코드에서 public 내부의 파일을 참조할 수 있다. </p>
<p>예를 들어, <code>public/avatars/me.png</code> 파일은 <code>/avatars/me.png</code> 경로로 이동하여 볼 수 있다. 해당 이미지를 표시하는 코드는 다음과 같다. </p>
<pre><code class="language-javascript">import Image from &#39;next/image&#39;

export function Avatar({ id, alt }) {
  return &lt;Image src={`/avatars/${id}.png`} alt={alt} width=&quot;64&quot; height=&quot;64&quot; /&gt;
}

export function AvatarOfMe() {
  return &lt;Avatar id=&quot;me&quot; alt=&quot;A portrait of me&quot; /&gt;
}</code></pre>
<h3 id="✅-nextjs에서-이미지-파일-제대로-불러오기">✅ Next.js에서 이미지 파일 제대로 불러오기!</h3>
<ol>
<li>Next.js의 루트 디렉토리에 public 이라는 이름의 폴더 생성</li>
<li>public 폴더 안에 불러오려고 하는 이미지 파일 넣기</li>
<li>/ 경로를 통해 public 폴더 안에 저장된 파일에 접근해서 이미지 불러오기
폴더구조가 아래와 같은 경우 <code>&lt;img src=&quot;/images/example.jpg&quot; alt=&quot;Example&quot; /&gt;</code> 이렇게 불러오면 됨!</li>
</ol>
<pre><code class="language-text">my-next-app/
├── public/
│   └── images/
│       └── example.jpg
├── pages/
│   └── index.js
└── ...</code></pre>
<h4 id="👩🏻💻-참고자료">👩🏻‍💻 참고자료</h4>
<ul>
<li><a href="https://nextjs.org/docs/pages/building-your-application/optimizing/static-assets">Static Assets</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[에러 메시지] Error: Hydration failed because the initial UI does not match what was rendered on the server.]]></title>
            <link>https://velog.io/@u-ryu-00/%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80-Error-Hydration-failed-because-the-initial-UI-does-not-match-what-was-rendered-on-the-server</link>
            <guid>https://velog.io/@u-ryu-00/%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80-Error-Hydration-failed-because-the-initial-UI-does-not-match-what-was-rendered-on-the-server</guid>
            <pubDate>Wed, 15 May 2024 08:55:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/fd99c98f-8023-4ac3-9822-4c0ad7f8ec63/image.png" alt=""></p>
<p>에러가 발생했는데 nextjs <a href="https://nextjs.org/docs/messages/react-hydration-error">공식 문서 링크</a>와 함께 나타나고 있어서 공식 문서 링크로 들어갔다. </p>
<h3 id="text-content-does-not-match-server-rendered-html">Text content does not match server-rendered HTML</h3>
<h3 id="👾-이-에러가-발생한-이유">👾 이 에러가 발생한 이유</h3>
<p>애플리케이션을 렌더링하는 동안 서버에서 미리 렌더링 된 React 트리와 브라우저에서 처음 렌더링하는 동안 렌더링 된 React 트리 사이에 차이가 있었기 때문이다. (hydration)</p>
<p>Hydration은 React가 이벤트 핸들러를 첨부하여 서버에서 미리 렌더링된 HTML을 완전한 interactive 애플리케이션으로 변환하는 것이다. </p>
<p><em>** 위의 hydration 설명이 이해가 안된다면 따로 공부한 내용을 정리해서 글로 남겨두었으니 참고! ✍️ <a href="https://velog.io/@u-ryu-00/web-development-Hydration%EC%9D%B4%EB%9E%80">hydration</a> **</em></p>
<h3 id="👾-일반적인-원인">👾 일반적인 원인</h3>
<ol>
<li>잘못된 HTML 태그 중첩<ul>
<li>다른 <code>&lt;p&gt;</code> 태그에 중첩된 <code>&lt;p&gt;</code></li>
<li><code>&lt;div&gt;</code> 태그 안에 중첩된 <code>&lt;p&gt;</code> 태그</li>
<li><code>&lt;p&gt;</code> 태그 안에 중첩된 <code>&lt;ul&gt;</code> 또는 <code>&lt;ol&gt;</code></li>
<li>Interactive Content가 중첩된 경우 (<code>&lt;a&gt;</code>, <code>&lt;button&gt;</code>)</li>
</ul>
</li>
<li>렌더링 로직에서 <code>typeof window !== &#39;undefined&#39;</code> 과 같은 check 사용</li>
<li>렌더링 로직에 <code>window</code> 또는 <code>localStorage</code>와 같은 browser-only API 사용</li>
<li>렌더링 로직에서 <code>Date()</code> 생성자와 같은 time-dependent API 사용</li>
<li>HTML을 수정하는 Brower extensions</li>
<li>잘못 구성된 CSS-in-JS 라이브러리</li>
<li>Cloudflare 자동 축소와 같이 html 응답 수정을 시도하는 잘못 구성된 Edge/CDN.<h4 id="나의-경우는-3번-원인-때문에-해당-에러가-발생하고-있었다">나의 경우는 3번 원인 때문에 해당 에러가 발생하고 있었다.</h4>
</li>
</ol>
<h3 id="✨-해결-방법">✨ 해결 방법</h3>
<h4 id="useeffect-를-사용하여-클라이언트에서만-실행하기"><code>useEffect</code> 를 사용하여 클라이언트에서만 실행하기</h4>
<p>hydration mismatch를 방지하기 위해 컴포넌트가 초기 클라이언트 측 렌더링(CSR) 시와 동일한 콘텐츠를 서버 측에서 렌더링하는지 확인한다. <code>useEffect</code> 훅을 사용하여 의도적으로 클라이언트에서 다른 콘텐츠를 렌더링할 수 있다. </p>
<pre><code class="language-javascript">import { useState, useEffect } from &#39;react&#39;

export default function App() {
  const [isClient, setIsClient] = useState(false)

  useEffect(() =&gt; {
    setIsClient(true)
  }, [])

  return &lt;h1&gt;{isClient ? &#39;This is never prerendered&#39; : &#39;Prerendered&#39;}&lt;/h1&gt;
}</code></pre>
<p>React가 hydration되는 동안 <code>useEffect</code> 가 호출된다. 즉. <code>window</code> 와 같은 브라우저 API를 hydration mismatch 없이 사용할 수 있다. </p>
<h4 id="공식-문서만-보고서는-이해가-잘-안-갔다-보충-설명">공식 문서만 보고서는 이해가 잘 안 갔다.. 보충 설명!</h4>
<ul>
<li><code>useEffect</code> 훅은 클라이언트 측에서만 실행된다. 이 훅은 컴포넌트가 렌더링된 후에 실행되므로, 브라우저 환경에서만 동작하는 코드(ex:<code>window</code> 객체에 접근하는 코드)를 안전하게 사용할 수 있다. </li>
<li><code>useEffect</code> 훅을 사용하여 클라이언트에서만 상태를 변경함으로써, 서버와 클라이언트의 초기 렌더링 결과를 동일하게 유지할 수 있다. </li>
<li>이는 hydration mismatch를 방지하고, React가 서버에서 받은 HTML과 클라이언트에서 렌더링된 HTML이 일치하도록 보장한다. </li>
<li>따라서 <code>useEffect</code> 를 사용하여 클라이언트에서만 실행하는 것이 해당 에러의 해결책이 될 수 있는 것이다. </li>
</ul>
<h3 id="📚-참고-자료">📚 참고 자료</h3>
<ul>
<li><a href="https://nextjs.org/docs/messages/react-hydration-error">Text content does not match server-rendered HTML
</a></li>
<li><a href="https://velog.io/@u-ryu-00/web-development-Hydration%EC%9D%B4%EB%9E%80">hydration</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[web] Hydration 이란?]]></title>
            <link>https://velog.io/@u-ryu-00/web-development-Hydration%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@u-ryu-00/web-development-Hydration%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Wed, 15 May 2024 08:06:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/332d4756-1c6d-42bf-bc5f-5b6ea62f53d0/image.png" alt=""></p>
<h3 id="💧-hydration-이란">💧 Hydration 이란?</h3>
<p>웹 개발에서 hydration 또는 rehydration은 클라이언트 측 JavaScript가 정적 호스팅 또는 server-side rendering을 통해 전달된 정적 HTML 웹 페이지를 이벤트 핸들러를 HTML 요소에 첨부하여 동적 웹 페이지로 변환하는 기법이다. </p>
<p>HTML이 서버에서 미리 렌더링되기 때문에 &quot;첫 번째 콘텐츠가 빠르게 표시&quot;(유용한 데이터가 사용자에게 처음 표시되는 시점)되지만 클라이언트 측 JavaScript가 실행되고 이벤트 핸들러가 첨부될 때까지는 일정 시간이 걸린다. </p>
<p>hydration을 사용하는 프레임워크에는 Next.js 및 Nuxt.js가 있다. </p>
<h3 id="❗️-이해한-내용">❗️ 이해한 내용</h3>
<p>Hydration 기법</p>
<ol>
<li>SSR로 만들어진 정적 HTML 웹 페이지</li>
<li>JavaScript로 수분 보충 (ㅋㅋ) </li>
<li>동적 웹 페이지로 변환</li>
</ol>
<h4 id="📚-참고자료">📚 참고자료</h4>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Hydration_(web_development)">Hydration (web development)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] table tbody scroll 하는 법]]></title>
            <link>https://velog.io/@u-ryu-00/css-table-tbody-scroll-%ED%95%98%EB%8A%94-%EB%B2%95</link>
            <guid>https://velog.io/@u-ryu-00/css-table-tbody-scroll-%ED%95%98%EB%8A%94-%EB%B2%95</guid>
            <pubDate>Thu, 22 Feb 2024 04:34:54 GMT</pubDate>
            <description><![CDATA[<h4 id="👩🏻💻-예시-코드">👩🏻‍💻 예시 코드</h4>
<pre><code class="language-html">  &lt;table&gt;
    &lt;colgroup&gt;
      &lt;col span=&quot;1&quot; style=&quot;width: 30%&quot;&gt;
      &lt;col span=&quot;1&quot; style=&quot;width: 20%&quot;&gt;
      &lt;col span=&quot;1&quot; style=&quot;width: 15%&quot;&gt;
      &lt;col span=&quot;1&quot; style=&quot;width: 35%&quot;&gt;
    &lt;/colgroup&gt;
    &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;
        Band
      &lt;/th&gt;
      &lt;th&gt;
        Year
      &lt;/th&gt;
      &lt;th&gt;
        formed No. of Albums
      &lt;/th&gt;
      &lt;th&gt;
        Most famous song
      &lt;/th&gt;
    &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;
        Buzzcocks
      &lt;/td&gt;
      &lt;td&gt;
        1976
      &lt;/td&gt;
      &lt;td&gt;
        9
      &lt;/td&gt;
      &lt;td&gt;
        Ever fallen in love (with someone you shouldn&#39;t&#39;ve)
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        The Clash
      &lt;/td&gt;
      &lt;td&gt;
        1976
      &lt;/td&gt;
      &lt;td&gt;
        6
      &lt;/td&gt;
      &lt;td&gt;
        London Calling
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        The Damned
      &lt;/td&gt;
      &lt;td&gt;
        1976
      &lt;/td&gt;
      &lt;td&gt;
        10
      &lt;/td&gt;
      &lt;td&gt;
        Smash it up
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        Sex Pistols
      &lt;/td&gt;
      &lt;td&gt;
        1975
      &lt;/td&gt;
      &lt;td&gt;
        1
      &lt;/td&gt;
      &lt;td&gt;
        Anarchy in the UK
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        Sham 69
      &lt;/td&gt;
      &lt;td&gt;
        1976
      &lt;/td&gt;
      &lt;td&gt;
        13
      &lt;/td&gt;
      &lt;td&gt;
        If The Kids Are United
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        Siouxsie and the Banshees
      &lt;/td&gt;
      &lt;td&gt;
        1976
      &lt;/td&gt;
      &lt;td&gt;
        11
      &lt;/td&gt;
      &lt;td&gt;
        Hong Kong Garden
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        Stiff Little Fingers
      &lt;/td&gt;
      &lt;td&gt;
        1977
      &lt;/td&gt;
      &lt;td&gt;
        10
      &lt;/td&gt;
      &lt;td&gt;
        Suspect Device
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        The Stranglers
      &lt;/td&gt;
      &lt;td&gt;
        1974
      &lt;/td&gt;
      &lt;td&gt;
        17
      &lt;/td&gt;
      &lt;td&gt;
        No More Heroes
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
    &lt;tfoot&gt;
    &lt;tr&gt;
      &lt;td colspan=&quot;2&quot;&gt;
        Total albums
      &lt;/td&gt;
      &lt;td colspan=&quot;2&quot;&gt;
        77
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tfoot&gt;
  &lt;/table&gt;</code></pre>
<pre><code class="language-css">table {
  width: 100%;
}

table thead {
  background: #000000;
  color: #FFFFFF;
}

table tbody {
  display: block;
  height: 200px;
  overflow-y: scroll;
}

table tfoot {
  background: #000000;
  color: #FFFFFF;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/4ddf530c-b008-41b1-96e8-ef4d9d0bd813/image.png" alt=""></p>
<p>위의 사진처럼 column의 width가 깨지는 문제가 발생한다. 
이 문제를 해결하기 위해서는 아래의 css 코드를 추가해주어야 한다.</p>
<pre><code class="language-css">table thead tr, table tbody tr, table tfoot tr {
  display: table;
  width: 560px;
}

table thead tr th {
  width: 140px
}

table tbody tr td {
  width: 140px
}

table tfoot tr td {
  width: 140px
}</code></pre>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/8a733c0a-46d1-4e62-b027-aee87bf3a4e5/image.png" alt=""></p>
<h4 id="참고-자료">참고 자료</h4>
<ul>
<li><a href="https://developer.mozilla.org/ko/docs/Learn/CSS/Building_blocks/Styling_tables">mdn 표 스타일링</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[jQuery UI] 🗓️ Datepicker 라이브러리 사용법]]></title>
            <link>https://velog.io/@u-ryu-00/jQuery-UI-Datepicker-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@u-ryu-00/jQuery-UI-Datepicker-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Wed, 21 Feb 2024 08:19:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/59ad5bef-f9e2-4a7f-bb16-39fea333e9f3/image.png" alt=""></p>
<h3 id="🗓️-datepicker란">🗓️ Datepicker란?</h3>
<p>사용자가 캘린더에서 날짜를 선택할 수 있는 jQuery 기반의 라이브러리</p>
<h3 id="🗓️-datepicker-위젯-적용하기">🗓️ Datepicker 위젯 적용하기</h3>
<h4 id="1-jquery-jquery-ui-파일을-다운받아-웹-페이지에-로드">1. jQuery, jQuery UI 파일을 다운받아 웹 페이지에 로드</h4>
<ul>
<li>jQuery는 자바스크립트 라이브러리이므로, jQuery 파일은 자바스크립트 파일(.js 파일) 형태로 존재한다. 따라서 웹 페이지에서 jQuery를 사용하기 위해서는 jQuery 파일을 먼저 웹 페이지에 로드(load)해야 한다. </li>
<li>최신 버전의 jQuery 파일은 <a href="https://jquery.com/download/">공식 사이트</a>에서 다운받을 수 있다. </li>
<li>최신 버전의 jQuery UI 파일도 마찬가지로 <a href="https://jqueryui.com/download/all/">공식 사이트</a>에서 다운받을 수 있다.</li>
<li>다운받은 파일을 서버에 저장하고 <code>&lt;script&gt;</code> 태그와 <code>&lt;link&gt;</code>    태그를 웹 페이지의 <code>&lt;head&gt;</code> 태그 내에 삽입하면 된다.</li>
<li><em><strong>🚨 jQuery UI는 jQuery를 기반으로 만들어졌기 때문에 jQuery UI를 사용하려면 먼저 jQuery를 load 해야 한다. 🚨</strong></em></li>
</ul>
<h4 id="👩🏻💻-예제-코드">👩🏻‍💻 예제 코드</h4>
<pre><code class="language-html">&lt;head&gt;
  &lt;link href=&quot;파일경로/제이쿼리-ui-css-파일명.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;/&gt;
  // jQuery 먼저 load
  &lt;script src=&quot;/파일경로/제이쿼리-파일명.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
  // jQuery UI load
  &lt;script src=&quot;/파일경로/제이쿼리-UI-파일명.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/head&gt;</code></pre>
<h4 id="2-datepicker를-적용할-input-요소에-대해-datepicker를-호출">2. datepicker를 적용할 input 요소에 대해 datepicker를 호출</h4>
<h4 id="👩🏻💻-예제-코드-1">👩🏻‍💻 예제 코드</h4>
<pre><code class="language-html">&lt;script&gt;
  $(function () {
    $(&quot;#datepicker&quot;).datepicker({
      showOn: &quot;both&quot; // button &gt; 버튼을 클릭할 때 datepicker 표시. focus &gt; input 필드가 포커스를 받을 때 표시. both &gt; 두 이벤트 중 하나가 발생할 때 표시.
      , buttonImage: &quot;../images/calender.svg&quot; // datepicker를 사용할 버튼 이미지의 URL
      , buttonImageOnly: true // 위에서 설정한 buttonImage를 button 요소 안에 렌더링 하지 않고 단독으로 렌더링
      , buttonText: &quot;선택&quot; // 버튼에 표시되는 글자
      , changeYear: true // dropdown으로 year 선택 가능
      , changeMonth: true // dropdown으로 month 선택 가능
      , dateFormat: &#39;yy-mm-dd&#39; // 표시되는 날짜의 형식
      , dayNames: [&#39;일요일&#39;, &#39;월요일&#39;, &#39;화요일&#39;, &#39;수요일&#39;, &#39;목요일&#39;, &#39;금요일&#39;, &#39;토요일&#39;] // 일요일부터 시작하는 요일 이름 목록
      , dayNamesMin: [&#39;일&#39;, &#39;월&#39;, &#39;화&#39;, &#39;수&#39;, &#39;목&#39;, &#39;금&#39;, &#39;토&#39;] // Datepicker 내에서 열 머리글로 사용할 수 있도록 일요일부터 시작하는 최소화된 요일 이름 목록 
      , maxDate: &quot;+5y&quot; // 선택할 수 있는 최대 날짜 (+1D:하루후, -1M:한달후, -1Y:일년후)    
      , minDate: &quot;-5Y&quot; // 선택할 수 있는 최소 날짜 (-1D:하루전, -1M:한달전, -1Y:일년전)
      , monthNames: [&#39;1월&#39;, &#39;2월&#39;, &#39;3월&#39;, &#39;4월&#39;, &#39;5월&#39;, &#39;6월&#39;, &#39;7월&#39;, &#39;8월&#39;, &#39;9월&#39;, &#39;10월&#39;, &#39;11월&#39;, &#39;12월&#39;] // 1월부터 시작하는 월 이름 목록
      , monthNamesShort: [&#39;1월&#39;, &#39;2월&#39;, &#39;3월&#39;, &#39;4월&#39;, &#39;5월&#39;, &#39;6월&#39;, &#39;7월&#39;, &#39;8월&#39;, &#39;9월&#39;, &#39;10월&#39;, &#39;11월&#39;, &#39;12월&#39;] // Datepicker header의 month에 사용되는 월 이름 목록
      , showMonthAfterYear: true // Datepicker header에서 표시 순서가 연도-월이 되도록
      , showOtherMonths: true // 현재 월의 시작 또는 끝에 다른 월의 날짜를 표시하겠다. (선택은 불가. 이러한 날짜를 선택할 수 있게 하려면 selectOtherMonths 옵션을 사용할 것)
      , yearSuffix: &quot;년&quot; // Datepicker header의 연도 뒤에 표시할 추가 텍스트
    });
    // Datepicker의 default 날짜를 설정
    $(&#39;#datepicker&#39;).datepicker(&#39;setDate&#39;, &#39;today&#39;); // (-1D:하루전, -1M:한달전, -1Y:일년전), (+1D:하루후, -1M:한달후, -1Y:일년후)
  });
&lt;/script&gt;</code></pre>
<pre><code class="language-html">&lt;input id=&quot;datepicker&quot;&gt;</code></pre>
<h3 id="🗓️-검색할-날짜의-범위를-선택하는-경우">🗓️ 검색할 날짜의 범위를 선택하는 경우</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/fb9570b0-2f7d-497b-863d-da423ba3b065/image.png" alt=""></p>
<h4 id="👩🏻💻-예제-코드-2">👩🏻‍💻 예제 코드</h4>
<pre><code class="language-html">&lt;script&gt;
  $(function () {
    $(&quot;#datepicker-from&quot;).datepicker({
      showOn: &quot;both&quot; // button &gt; 버튼을 클릭할 때 datepicker 표시. focus &gt; input 필드가 포커스를 받을 때 표시. both &gt; 두 이벤트 중 하나가 발생할 때 표시.
      , buttonImage: &quot;../images/calender.svg&quot; // datepicker를 사용할 버튼 이미지의 URL
      , buttonImageOnly: true // 위에서 설정한 buttonImage를 button 요소 안에 렌더링 하지 않고 단독으로 렌더링
      , buttonText: &quot;선택&quot; // 버튼에 표시되는 글자
      , changeYear: true // dropdown으로 year 선택 가능
      , changeMonth: true // dropdown으로 month 선택 가능
      , dateFormat: &#39;yy-mm-dd&#39; // 표시되는 날짜의 형식
      , dayNames: [&#39;일요일&#39;, &#39;월요일&#39;, &#39;화요일&#39;, &#39;수요일&#39;, &#39;목요일&#39;, &#39;금요일&#39;, &#39;토요일&#39;] // 일요일부터 시작하는 요일 이름 목록
      , dayNamesMin: [&#39;일&#39;, &#39;월&#39;, &#39;화&#39;, &#39;수&#39;, &#39;목&#39;, &#39;금&#39;, &#39;토&#39;] // Datepicker 내에서 열 머리글로 사용할 수 있도록 일요일부터 시작하는 최소화된 요일 이름 목록 
      , maxDate: &quot;+5y&quot; // 선택할 수 있는 최대 날짜 (+1D:하루후, -1M:한달후, -1Y:일년후)    
      , minDate: &quot;-5Y&quot; // 선택할 수 있는 최소 날짜 (-1D:하루전, -1M:한달전, -1Y:일년전)
      , monthNames: [&#39;1월&#39;, &#39;2월&#39;, &#39;3월&#39;, &#39;4월&#39;, &#39;5월&#39;, &#39;6월&#39;, &#39;7월&#39;, &#39;8월&#39;, &#39;9월&#39;, &#39;10월&#39;, &#39;11월&#39;, &#39;12월&#39;] // 1월부터 시작하는 월 이름 목록
      , monthNamesShort: [&#39;1월&#39;, &#39;2월&#39;, &#39;3월&#39;, &#39;4월&#39;, &#39;5월&#39;, &#39;6월&#39;, &#39;7월&#39;, &#39;8월&#39;, &#39;9월&#39;, &#39;10월&#39;, &#39;11월&#39;, &#39;12월&#39;] // Datepicker header의 month에 사용되는 월 이름 목록
      , showMonthAfterYear: true // Datepicker header에서 표시 순서가 연도-월이 되도록
      , showOtherMonths: true // 현재 월의 시작 또는 끝에 다른 월의 날짜를 표시하겠다. (선택은 불가. 이러한 날짜를 선택할 수 있게 하려면 selectOtherMonths 옵션을 사용할 것)
      , yearSuffix: &quot;년&quot; // Datepicker header의 연도 뒤에 표시할 추가 텍스트
    });
    // Datepicker의 default 날짜를 설정
    $(&quot;#datepicker-to&quot;).datepicker({
      showOn: &quot;both&quot; // button &gt; 버튼을 클릭할 때 datepicker 표시. focus &gt; input 필드가 포커스를 받을 때 표시. both &gt; 두 이벤트 중 하나가 발생할 때 표시.
      , buttonImage: &quot;../images/calender.svg&quot; // datepicker를 사용할 버튼 이미지의 URL
      , buttonImageOnly: true // 위에서 설정한 buttonImage를 button 요소 안에 렌더링 하지 않고 단독으로 렌더링
      , buttonText: &quot;선택&quot; // 버튼에 표시되는 글자
      , changeYear: true // dropdown으로 year 선택 가능
      , changeMonth: true // dropdown으로 month 선택 가능
      , dateFormat: &#39;yy-mm-dd&#39; // 표시되는 날짜의 형식
      , dayNames: [&#39;일요일&#39;, &#39;월요일&#39;, &#39;화요일&#39;, &#39;수요일&#39;, &#39;목요일&#39;, &#39;금요일&#39;, &#39;토요일&#39;] // 일요일부터 시작하는 요일 이름 목록
      , dayNamesMin: [&#39;일&#39;, &#39;월&#39;, &#39;화&#39;, &#39;수&#39;, &#39;목&#39;, &#39;금&#39;, &#39;토&#39;] // Datepicker 내에서 열 머리글로 사용할 수 있도록 일요일부터 시작하는 최소화된 요일 이름 목록 
      , maxDate: &quot;+5y&quot; // 선택할 수 있는 최대 날짜 (+1D:하루후, -1M:한달후, -1Y:일년후)    
      , minDate: &quot;-5Y&quot; // 선택할 수 있는 최소 날짜 (-1D:하루전, -1M:한달전, -1Y:일년전)
      , monthNames: [&#39;1월&#39;, &#39;2월&#39;, &#39;3월&#39;, &#39;4월&#39;, &#39;5월&#39;, &#39;6월&#39;, &#39;7월&#39;, &#39;8월&#39;, &#39;9월&#39;, &#39;10월&#39;, &#39;11월&#39;, &#39;12월&#39;] // 1월부터 시작하는 월 이름 목록
      , monthNamesShort: [&#39;1월&#39;, &#39;2월&#39;, &#39;3월&#39;, &#39;4월&#39;, &#39;5월&#39;, &#39;6월&#39;, &#39;7월&#39;, &#39;8월&#39;, &#39;9월&#39;, &#39;10월&#39;, &#39;11월&#39;, &#39;12월&#39;] // Datepicker header의 month에 사용되는 월 이름 목록
      , showMonthAfterYear: true // Datepicker header에서 표시 순서가 연도-월이 되도록
      , showOtherMonths: true // 현재 월의 시작 또는 끝에 다른 월의 날짜를 표시하겠다. (선택은 불가. 이러한 날짜를 선택할 수 있게 하려면 selectOtherMonths 옵션을 사용할 것)
      , yearSuffix: &quot;년&quot; // Datepicker header의 연도 뒤에 표시할 추가 텍스트
    });
    // Datepicker의 default 날짜를 설정  
    $(&#39;#datepicker-from&#39;).datepicker(&#39;setDate&#39;, &#39;today&#39;); // (-1D:하루전, -1M:한달전, -1Y:일년전), (+1D:하루후, -1M:한달후, -1Y:일년후)
    $(&#39;#datepicker-to&#39;).datepicker(&#39;setDate&#39;, &#39;today&#39;); // (-1D:하루전, -1M:한달전, -1Y:일년전), (+1D:하루후, -1M:한달후, -1Y:일년후)  
  });
&lt;/script&gt;</code></pre>
<pre><code class="language-html">&lt;label for=&quot;datepicker-from&quot;&gt;From&lt;/label&gt;
&lt;input id=&quot;datepicker-from&quot;&gt;
&lt;label for=&quot;datepicker-to&quot;&gt;to&lt;/label&gt;
&lt;input id=&quot;datepicker-to&quot;&gt;</code></pre>
<p>**<a href="https://api.jqueryui.com/datepicker/">jQuery API documentation</a>에 options와 methods에 대한 설명이 자세히 나와있으니 참고해서 알맞게 custom하면 된다! 😊 **</p>
<h4 id="참고-자료">참고 자료</h4>
<ul>
<li><a href="https://jqueryui.com/datepicker/">jQuery UI Datepicker</a></li>
<li><a href="https://api.jqueryui.com/datepicker/">jQuery API documentation</a></li>
<li><a href="https://www.tcpschool.com/jquery/jq_intro_apply">TCP SCHOOL 제이쿼리 적용</a></li>
<li>(이미지) <a href="https://kr.freepik.com/free-vector/calendar-icon-on-white-background_23722481.htm#query=%EB%8B%AC%EB%A0%A5&position=2&from_view=search&track=ais&uuid=40c85643-0e34-42d3-9de5-b7647f0cb575">작가 brgfx</a> 출처 Freepik</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] 사용자 지정 CSS 속성 사용하기 (변수)]]></title>
            <link>https://velog.io/@u-ryu-00/CSS-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A7%80%EC%A0%95-%EB%B3%80%EC%88%98Variable-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@u-ryu-00/CSS-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A7%80%EC%A0%95-%EB%B3%80%EC%88%98Variable-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Wed, 21 Feb 2024 05:58:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/5d664abe-6bc0-4eaf-94c8-e966b145a42f/image.png" alt=""></p>
<h3 id="💡-사용자-지정-속성이란-css-변수">💡 사용자 지정 속성이란? (CSS 변수)</h3>
<ul>
<li>CSS 저작자가 정의하는 개체로, 문서 전반적으로 재사용할 임의의 값을 담는다.  </li>
<li>전용 표기법을 사용해 정의한다. (<code>--main-color: black;</code>)</li>
<li><code>var()</code> 함수를 사용해 접근할 수 있다. (<code>color: var(--main-color);</code>)</li>
</ul>
<h3 id="💡-사용자-지정-속성-왜-쓰나요">💡 사용자 지정 속성 왜 쓰나요?</h3>
<ul>
<li>첫번째 이유. 복잡한 웹사이트는 어마어마한 양의 CSS를 가지고 있는데, 종종 많은 값을 반복적으로 사용한다. 사용자 지정 속성을 사용하지 않는다면 여러 곳에 중복된 색상을 변경하기 위해 모든 CSS 파일에서 검색 및 바꾸기를 수행해야 한다. </li>
<li>두번째 이유. 의미를 가지는 식별자를 사용하기 때문에 특히 같은 색을 다른 맥락에서 사용할 때 유용하다. <code>#00ff00</code> 보다는 <code>--main-text-color</code> 가 이해하기 쉬울 것이다.  </li>
</ul>
<h3 id="💡-변수-선언-및-호출">💡 변수 선언 및 호출</h3>
<p>두 개의 붙임표로 시작하는 속성의 이름과 함께 유효한 CSS 값이라면 무엇이든지 그 값으로 지정해서 선언한다.</p>
<pre><code class="language-css">:root {
  --main-bg-color: brown;
}</code></pre>
<p>사용자 지정 속성의 값을 사용할 때에는 일반적인 값의 자리에 <code>var()</code> 함수를 지정하고, 그 매개변수로는 사용자 지정 속성의 이름을 제공한다. </p>
<pre><code class="language-css">element {
  background-color: var(--main-bg-color);
}</code></pre>
<h3 id="💡-root-css-pseudo-class">💡 <code>:root</code> CSS pseudo-class</h3>
<ul>
<li>문서 트리의 루트 요소를 선택한다. </li>
<li>HTML의 루트 요소는 <code>&lt;html&gt;</code> 요소이므로, <code>:root</code>의 specificity가 더 높다는 점을 제외하면 <code>html</code> 선택자와 똑같다. </li>
<li><code>:root</code>는 전역 CSS 변수 선언에 유용하게 사용할 수 있다. </li>
</ul>
<h3 id="💡-예시-코드">💡 예시 코드</h3>
<pre><code class="language-css">:root {
  --main-bg-color: brown;
}

.one {
  color: white;
  background-color: var(--main-bg-color);
  margin: 10px;
  width: 50px;
  height: 50px;
  display: inline-block;
}

.two {
  color: white;
  background-color: black;
  margin: 10px;
  width: 150px;
  height: 70px;
  display: inline-block;
}
.three {
  color: white;
  background-color: var(--main-bg-color);
  margin: 10px;
  width: 75px;
}
.four {
  color: white;
  background-color: var(--main-bg-color);
  margin: 10px;
  width: 100px;
}

.five {
  background-color: var(--main-bg-color);
}</code></pre>
<h4 id="참고-자료">참고 자료</h4>
<ul>
<li><a href="https://developer.mozilla.org/ko/docs/Web/CSS/Using_CSS_custom_properties">mdn 사용자 지정 CSS 속성 사용하기 (변수)</a></li>
<li><a href="https://developer.mozilla.org/ko/docs/Web/CSS/:root">mdn :root</a></li>
<li><a href="https://shahednasser.medium.com/css-variables-and-how-to-use-them-bd9724cb6566">CSS Variables and How To Use Them</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[지속 가능한 개발자 Chapter1] 함께 자라기 스터디 1회차 회고]]></title>
            <link>https://velog.io/@u-ryu-00/%EC%A7%80%EC%86%8D-%EA%B0%80%EB%8A%A5%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-Chapter1-%ED%95%A8%EA%BB%98-%EC%9E%90%EB%9D%BC%EA%B8%B0-%EC%8A%A4%ED%84%B0%EB%94%94-1%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@u-ryu-00/%EC%A7%80%EC%86%8D-%EA%B0%80%EB%8A%A5%ED%95%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90-Chapter1-%ED%95%A8%EA%BB%98-%EC%9E%90%EB%9D%BC%EA%B8%B0-%EC%8A%A4%ED%84%B0%EB%94%94-1%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 28 Jan 2024 14:38:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/82d55235-a657-4732-83ed-6367dd743544/image.png" alt=""></p>
<h4 id="📚-함께-자라기">📚 <a href="http://aladin.kr/p/wLch8">함께 자라기</a></h4>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/6b0f5b12-48f9-4a8a-b476-f0b8d142edd7/image.png" alt=""></p>
<p>🌷HSD 2기🌷와 함께 읽을 책은 <code>함께 자라기</code> 이고 1회차 때 다룬 주제는 <code>자라기</code> 였다. 1회차, 2회차 스터디에 참여하면서 함께 자라기를 &#39;실천&#39;하는 자신만의 방법을 수립하고, 2024년 1년 동안 각자의 방법을 &#39;실천&#39;하며 성장하는 것이 이번 스터디의 목표이다. 이번 스터디를 위해 총 12분이 모여주셨는데 체크인/회고 시트가 가득가득 채워지는 모습을 보면서 든든한 마음이 들었다. 2기 분들과 엄청난 성장을 기록하는 2024년을 만들어가고 싶다. </p>
<h4 id="1회차-스터디-회고를-하면서-나를-돌아보고-2024년을-어떻게-보낼지-고민하는-시간을-가졌다">1회차 스터디 회고를 하면서 나를 돌아보고 2024년을 어떻게 보낼지 고민하는 시간을 가졌다.</h4>
<h3 id="✨-나만의-실패-극복-루틴">✨ 나만의 실패 극복 루틴!</h3>
<p>1회차 스터디 때 <code>성장 사고관</code> 이라는 키워드가 언급되었다. 성장 사고관이란 시간과 경험을 통해 특성과 재능이 끊임없이 변화하며 성장할 수 있다고 믿는 마음가짐이다. 지난 2023년 꽤나 다양한 실패를 경험했고, 2024년에도 당연히 크고 작은 실패를 경험하게 될 것이다. 처음 실패를 마주했을 때는 그것을 어떻게 다루어야 할지 방법을 잘 몰랐던 것 같다. 여러 번 실패를 거듭한 끝에 나만의 실패 극복 루틴이 생긴 것 같아 글로 남겨보려 한다. 😂 </p>
<blockquote>
<p>step 1. 실패를 하고 나서 최대한 빨리 셀프 피드백을 한다. (왜 실패했는지 원인 찾기) 
step 2. 실패를 성공으로 바꾸기 위해 개선할 만한 Point 찾아서 Action Plan을 만든다.
step 3. 매번 성공만 할 수 없음을 인정하고 실패나 좌절을 성장을 위한 기회로 받아들인다. (성장 사고관 주입) 👈🏻 _이번 스터디 덕분에 추가된 step이다. _
step 4. 실패에 지치지 않고 Action Plan 적용해서 다시 도전해본다! 🌷</p>
</blockquote>
<p>실패하고 나서 피드백을 하지 않으면 Action Plan이 나오지 않고 그러면 똑같은 실패가 반복될 가능성이 크다. 실패를 외면하면 마음도 매우 불안하고 자신감도 뚝 떨어지게 된다. 하지만 실패한 후에 피드백을 하고 Action Plan 까지 세우면 실패를 했음에도 뭔가 든든하고 다음에는 더 잘할 수 있을 것 같은 자신감까지 생긴다!!! 이렇게 쓰고보니 뭔가 실패 전문가가 된 것 같지만 ㅋㅋㅋㅋㅋㅋㅋ 실패 극복 루틴 덕분에 2024년 실패도 두렵지 않다. ✌️</p>
<h3 id="🌱-효과적인-의도적-수련을-위해서">🌱 효과적인 의도적 수련을 위해서?</h3>
<p>효과적이지 못한 의도적 수련의 조건을 3가지 정도로 정리해보고 이것을 잘 보완해서 효과적인 의도적 수련으로 바꿔보려고 한다. </p>
<h4 id="1-동기의-부족---무언가-할-수-밖에-없는-상황을-만들자">1. 동기의 부족 -&gt; 무언가 할 수 밖에 없는 상황을 만들자.</h4>
<p>첫번째 포인트는 생각보다 쉽게 해결될 부분인 것 같다. </p>
<p>나는 개발자가 되기 위해 공부하던 시절 HTML과 CSS를 일주일만에 공부했다. 당연히 내 CSS 실력은 엉망이었다. 🫠 개발자가 되어 실무에 투입되었을 때도 내 CSS 실력은 썩 좋지 않았다. 하지만 나는 마감에 맞추어 작업을 해내야 했고 엄청난 집중력을 발휘해서 폭풍 검색을 하며 퍼블리싱을 해냈다. 동기가 분명했기 때문에 가능했던 일이라고 생각한다. 아무런 동기 없이 단순히 학습하는 것은 좋은 학습 효과를 내기 어렵다. 분명한 동기를 설정하는 것이 실천의 시작이 된다. </p>
<p>동기의 측면에 있어서는 HSD 스터디가 많은 부분을 충족해주고 있다. HSD 1기와 함께 했던 HTTP 스터디 때도 매주 스터디를 준비하다보니 HTTP를 깊이 공부할 수 밖에 없었다. </p>
<p>지금 회고를 쓰고 있는 것도 그렇다. 혼자였다면 일요일 밤에 이렇게 노트북을 켜고 글을 썼을까? 의문이다. 혼자보다는 둘이, 둘 보다는 여럿이. 좋은 동료들과 함께하면 그 시너지가 크게 작용하는 것 같다. </p>
<h4 id="2-부적절한-난이도">2. 부적절한 난이도</h4>
<p>의도적 수련이 되려면 나의 실력과 작업의 난이도가 비슷해야 한다. 이것은 미하이 칙센트미하이의 몰입이론과도 일치하는 부분이다. 미하이는 난이도와 실력이 엇비슷하게 맞는 부분에서 인간이 <code>몰입</code> 을 경험한다고 한다. 그리고 바로 이때 최고 수준의 집중력을 보이고, 그 덕분에 퍼포먼스나 학습 능력이 최대치가 될 수 있다고 한다. 또한 그때 최고 수준의 행복감을 경험한다는 흥미로운 사실을 발견하기도 했다. </p>
<p>효과적인 의도적 수련을 위해서 &#39;지루함&#39;을 느끼는 영역, &#39;몰입&#39;을 느끼는 영역, &#39;불안&#39;을 느끼는 영역을 꾸준히 탐색해 보고 이것들을 &#39;몰입&#39;으로 이동시킬 방법을 고민해 봐야겠다. 이건 단기간에 탐색하기엔 어려울 것 같아 조금 더 시간을 두고 탐색해 보려 한다.</p>
<h4 id="3-제-때-받지-못하는-피드백">3. 제 때 받지 못하는 피드백</h4>
<p>지금 당장 만들어 볼 수 있는 피드백 루프는 아무래도 셀프 피드백일 것 같다. 
회사에서 slack으로 매일 daliy-log를 작성하고 있다. 출근 하자마자 오늘 달성해야 할 목표를 세우고 기록한다. 퇴근 전에는 달성한 목표를 점검하고 그것을 바탕으로 Action Plan을 세운다. 덕분에 매일 회고하고 피드백하는 루틴은 잡혀있다. 여기서 중요한 포인트는 회고를 해서 이 문제를 해결하기 위한 Action Plan을 만드는 것이라고 생각한다. <code>내일은 어떻게 할지에 대한 명확한 Action Plan을 도출하는 것</code>이 회고(피드백)의 핵심이 아닐까. 
HSD 2기를 함께하면서 주간회고, 월간회고, 반년회고, 연간회고 등 끊임없이 회고와 피드백을 하면서 문제를 마주하고 그것을 적극적으로 개선하려는 습관을 잡아가고 싶다. </p>
<h3 id="🔥-action-plan">🔥 Action Plan</h3>
<p>다음 주에도 주간회고 작성하고 셀프 피드백.
2024년에 적용해 볼 의도적 수련 고민.</p>
<p>끝으로 HSD 1기, 원데이 스터디, HSD 2기까지 오면서 스터디 운영에 있어 방향성이나 기본적인 틀이 많이 잡혔다고 느낀다. 아직 더 공부하고 채워야 할 부분들이 많긴 하지만 2024년을 잘 보내면서 우리 스터디가 더욱 단단해지는 시간이 되었으면 좋겠다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[에러 메시지] Error: Invalid src prop on `next/image`, hostname is not configured under images in your `next.config.js`

]]></title>
            <link>https://velog.io/@u-ryu-00/%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80-Error-Image-with-src-httpscwmbknpuxfbndurkpmon.supabase.costoragev1objectpublicblog-imagebbe3efe899468a5098b4914001296a10b-7179-41b1-880d-8a06229f3901.png-is-missing-required-width-property</link>
            <guid>https://velog.io/@u-ryu-00/%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80-Error-Image-with-src-httpscwmbknpuxfbndurkpmon.supabase.costoragev1objectpublicblog-imagebbe3efe899468a5098b4914001296a10b-7179-41b1-880d-8a06229f3901.png-is-missing-required-width-property</guid>
            <pubDate>Mon, 22 Jan 2024 07:45:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/f20cf2b1-231a-4bbd-9814-3b7d1cf72296/image.png" alt=""></p>
<p>사진과 같은 에러 메시지를 마주했다. 오류 아래에 공식문서 링크가 있어서 링크를 타고 공식문서로 들어갔다.</p>
<p>🖇️ <a href="https://nextjs.org/docs/messages/next-image-unconfigured-host">공식문서 링크</a></p>
<h3 id="😂-이-오류가-발생한-이유">😂 이 오류가 발생한 이유</h3>
<ul>
<li><code>next/image</code> 컴포넌트를 활용하는 페이지 중 하나에서 <code>next.config.js</code>의 <code>images.remotePatterns</code>에 정의되지 않은 URL의 호스트명을 사용하는 <code>src</code> 값을 전달했다. </li>
</ul>
<h3 id="❤️🩹-오류-해결-방법">❤️‍🩹 오류 해결 방법</h3>
<ul>
<li>protocol, hostname, port, 그리고 pathname을 <code>next.config.js</code>의 <code>images.remotePatterns</code> 구성에 추가한다. <pre><code class="language-ts">module.exports = {
images: {
  remotePatterns: [
    {
      protocol: &#39;https&#39;,
      hostname: &#39;assets.example.com&#39;,
      port: &#39;&#39;,
      pathname: &#39;/account123/**&#39;,
    },
  ],
},
}</code></pre>
</li>
</ul>
<h3 id="👩🏻💻-내-코드에-적용">👩🏻‍💻 내 코드에 적용</h3>
<p><code>next.config.js</code> 파일 전체 코드</p>
<pre><code class="language-ts">const removeImports = require(&#39;next-remove-imports&#39;)();

/** @type {import(&#39;next&#39;).NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  images: {
    remotePatterns: [
      {
        protocol: &#39;https&#39;,
        hostname: &#39;cwmbknpuxfbndurkpmon.supabase.co&#39;,
        port: &#39;&#39;,
        pathname: &#39;/storage/v1/object/public/**&#39;,
      },
    ],
  },
};

module.exports = removeImports(nextConfig);</code></pre>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/88232036-a77f-45fd-ac9f-f65699019b6d/image.png" alt=""></p>
<p>오류가 해결되고 이미지가 정상적으로 로드된 모습이다. ✨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[에러 메시지] Error: Text content does not match server-rendered HTML.]]></title>
            <link>https://velog.io/@u-ryu-00/%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80-Error-Text-content-does-not-match-server-rendered-HTML.Warning-Text-content-did-not-match.-Server-1172024-Client-2024.-1.-17</link>
            <guid>https://velog.io/@u-ryu-00/%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80-Error-Text-content-does-not-match-server-rendered-HTML.Warning-Text-content-did-not-match.-Server-1172024-Client-2024.-1.-17</guid>
            <pubDate>Mon, 22 Jan 2024 06:21:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/6277a4fa-38c5-4635-85b3-32b5052c264e/image.png" alt=""></p>
<p>이런 에러 메시지를 마주했다. 아주 친절하게 공식문서 링크를 달아주어서 링크를 타고 공식문서로 들어갔다. </p>
<p>🖇️ <a href="https://nextjs.org/docs/messages/react-hydration-error">공식문서 링크</a></p>
<h3 id="😂-이-오류가-발생한-이유">😂 이 오류가 발생한 이유</h3>
<ul>
<li>애플리케이션을 렌더링하는 동안 서버에서 미리 렌더링된 React 트리와 브라우저에서 처음 렌더링되는 동안 렌더링된 React 트리 간에 차이가 발생했다. (하이드레이션)</li>
<li>하이드레이션이란 React가 이벤트 핸들러를 첨부하여 서버에서 미리 렌더링 된 HTML을 완전한 인터렉티브 애플리케이션으로 변환하는 것을 말한다. </li>
</ul>
<h3 id="❤️🩹-오류-해결-방법-using-suppresshydrationwarning">❤️‍🩹 오류 해결 방법: Using suppressHydrationWarning</h3>
<p>타임스탬프와 같이 서버와 클라이언트 간에 불가피하게 콘텐츠가 다를 수 있다. 요소에 <code>suppressHydrationWarning={true}</code>를 추가하여 hydration mismatch warning을 무음으로 설정할 수 있다. </p>
<pre><code class="language-ts">&lt;time datetime=&quot;2016-10-25&quot; suppressHydrationWarning /&gt;</code></pre>
<h3 id="👩🏻💻-내-코드에-적용">👩🏻‍💻 내 코드에 적용</h3>
<pre><code class="language-ts">&lt;div className=&quot;text-sm text-gray-500&quot; suppressHydrationWarning&gt;
  {new Date(created_at).toLocaleDateString()}
&lt;/div&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/050f1e48-1001-4ea2-8e9e-2719d99824b2/image.png" alt=""></p>
<p>오류가 해결되고 블로그 글 상세보기 페이지가 로드된 모습이다. ✨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[모르면 큰일나는 개발 상식 Chapter1] HTTP 스터디 5회차 회고]]></title>
            <link>https://velog.io/@u-ryu-00/%EB%AA%A8%EB%A5%B4%EB%A9%B4-%ED%81%B0%EC%9D%BC%EB%82%98%EB%8A%94-%EA%B0%9C%EB%B0%9C-%EC%83%81%EC%8B%9D-Chapter1-HTTP-%EC%8A%A4%ED%84%B0%EB%94%94-5%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@u-ryu-00/%EB%AA%A8%EB%A5%B4%EB%A9%B4-%ED%81%B0%EC%9D%BC%EB%82%98%EB%8A%94-%EA%B0%9C%EB%B0%9C-%EC%83%81%EC%8B%9D-Chapter1-HTTP-%EC%8A%A4%ED%84%B0%EB%94%94-5%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sat, 06 Jan 2024 07:17:28 GMT</pubDate>
            <description><![CDATA[<h3 id="5회차-주제---웹-공격-기술">5회차 주제 - 웹 공격 기술</h3>
<h3 id="3회차-http의-약점-🖇️-5회차-웹-공격-기술">(3회차) HTTP의 약점 🖇️ (5회차) 웹 공격 기술</h3>
<p>5회차 스터디의 주제인 웹 공격 기술을 학습하면서 3회차 때 공부했던 HTTP의 약점 3가지를 다시 한 번 떠올리면서 복습해볼 수 있었다. </p>
<p>HTTP의 약점 3가지는 다음과 같다.</p>
<ol>
<li>암호화하지 않은 평문이기 때문에 도청 가능하다. </li>
<li>통신 상대를 확인하지 않기 때문에 위장 가능하다.</li>
<li>완전성을 증명할 수 없기 때문에 변조 가능하다. </li>
</ol>
<p>이처럼 HTTP 보안 상의 약점이 있기 때문에 <strong>HTTP를 사용하는</strong> <em><strong>서버</strong>_와 _<strong>클라이언트</strong></em> 그리고 <strong>서버 상에서 동작하는</strong> _<strong>웹 애플리케이션</strong>_이 공격 대상이 될 수 있다. </p>
<h3 id="학습-목차-설정-웹-공격-기술-학습-→-공격-실습-→-공격-사례">학습 목차 설정 (웹 공격 기술 학습 → 공격 실습 → 공격 사례)</h3>
<p>웹 공격이나 보안과 관련된 실무적 경험이 없는데다 책에서도 자세히 설명하고 있지 않아서 학습이 쉽지 않았다. 그래서 다음과 같이 학습 목차를 설정하고 목차대로 웹 공격 기술을 학습했다.</p>
<pre><code>1. 웹 공격 기술 학습 (이론)
2. 웹 공격 실습 (해킹 연습을 위한 사이트 활용)
3. 공격 사례 조사</code></pre><p>학습 목차가 정해지고 나니 학습 속도도 빨라지고, 이해도 수월해졌다. </p>
<h3 id="마지막-회차인만큼-멤버들만을-위한-프라이빗-zep에서-스터디">마지막 회차인만큼 멤버들만을 위한 프라이빗 ZEP에서 스터디!</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/50354831-d9f2-4c60-a7a4-0e8df3f6c219/image.png" alt=""></p>
<p>마지막 스터디를 위한 ZEP을 꾸미고 그곳에서 조금은 특별한 온라인 모임을 가졌다! ✨ 멤버분들이 다들 좋아해주셔서 다행이었다. 홀맨님 특별 세션 시간에 각자 자리에 앉아 경청하는 모습부터 인증샷을 위해 무대 중앙으로 다같이 모인 모습까지 너무 귀여웠다 ㅋㅋㅋㅋㅋ 무대 위의 여러분들이 모두 주인공이었어요!! 마지막 5회차 스터디를 즐겨주셔서 감사해요! 🙇🏻‍♀️💜</p>
<h3 id="스터디-기획-및-운영을-해보면서❤️🔥">스터디 기획 및 운영을 해보면서..❤️‍🔥</h3>
<p>냉큼 되는 일이 없구나 다시 한 번 더 느꼈다. 😂 정말 많은 시간과 에너지가 필요했고, 처음 해보는 영역이었기 때문에 더 어렵고 힘들었던 것 같다. 그래도 짧은 시간 내에 많은 것을 경험할 수 있었기에 몰입해서 성장할 수 있었다. 그래서 마지막 스터디가 끝나고서 한 없이 행복했고 오랜만에 엄청난 희열을 느낄 수 있었다. 🤩</p>
<pre><code>❤️‍🔥 성과?! 경험?! ❤️‍🔥
1. HSD official 인스타그램 계정 OPEN 및 운영
2. HSD 디스코드 서버 OPEN 및 운영
3. HSD ZEP OPEN
4. HSD 스터디 정책, 커리큘럼 짜기
5. HSD 스터디 브랜딩 (네이밍, 로고 디자인, 정체성 등)
6. 스터디 Member 모집 및 선발
7. HTTP deep dive
8. 스터디 리딩 (퍼실리테이터) + 시각화 자료 제작 (keynote ppt)
9. 매주 스터디에 대한 피드백 + 회고 글 작성 (회고의 생활화 ^_^)
10. 운영진들끼리 긴밀한 소통 (notion, 점심시간 적극 활용)</code></pre><h3 id="🔥-action-plan">🔥 Action Plan</h3>
<ul>
<li>나는 어떤 개발자인지 고민해본다.</li>
<li>고민한 내용을 바탕으로 이력서 작성 + 퍼스널 브랜딩 컨텐츠 제작</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTTP] HTTP의 역사 0.9 / 1.0 / 1.1 / 2.0]]></title>
            <link>https://velog.io/@u-ryu-00/HTTP%EC%9D%98-%EC%97%AD%EC%82%AC-0.9-1.0-1.1-2.0</link>
            <guid>https://velog.io/@u-ryu-00/HTTP%EC%9D%98-%EC%97%AD%EC%82%AC-0.9-1.0-1.1-2.0</guid>
            <pubDate>Sun, 31 Dec 2023 04:31:51 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/d9e2416e-54c2-4419-b6f6-d604460c29c0/image.png" alt=""></p>
<h2 id="📍-http09">📍 HTTP/0.9</h2>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/7d2588dd-4cc6-4068-b178-f36f2c506f07/image.png" alt=""></p>
<pre><code class="language-text">- GET 메소드만 지원
- HTTP 헤더가 없어서 HTML 파일만 전송 가능 / 상태코드도 없었음.
- HTML 파일 자체를 응답으로 보내줌.</code></pre>
<p>초창기의 HTTP. 
HTTP/0.9 버전에서는 GET 메소드만 지원하고 HTTP 헤더가 없어서 HTML 파일만 전송 가능했다. 상태코드도 없었다.
응답 메시지를 보면 HTML 파일 자체를 응답으로 보내주고 있는 것도 확인할 수 있다.</p>
<p>*<em>HTTP/0.9 버전은 HTML 문서를 전송하기 위한 단순한 프로토콜이었다.
*</em></p>
<h2 id="📍-http10">📍 HTTP/1.0</h2>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/05d36af0-f567-440e-8fc3-8e091a4f12cd/image.png" alt=""></p>
<pre><code class="language-text">- GET, HEAD, POST 메소드 지원
- 각 요청 안에 버전 정보가 포함되어 전송되었음.
- 헤더의 도입 / 상태코드 추가
- HTTP 헤더(Content-Type)의 도움으로 HTML 이외의 파일도 전송할 수 있게 됨.
- Short-lived Connection (디폴트)</code></pre>
<h3 id="✔️-short-lived-connection">✔️ Short-lived Connection</h3>
<h4 id="http10에서-디폴트">HTTP/1.0에서 디폴트</h4>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/b234410c-879c-43d4-9abf-5219975614ff/image.png" alt=""></p>
<p>HTTP/1.0 버전에서는 short-lived Connection(단기 커넥션)이 디폴트였다. 
단기 커넥션은 커넥션 하나 당 하나의 요청, 하나의 응답 처리가 가능한 것을 말하는데 서버에 자원을 요청할 때마다 매번 새로운 연결을 해주어야 했다.</p>
<p>예를 들어 웹 페이지를 요청하면 html과 그에 딸린 css나 js 및 이미지 등등 수많은 자원들이 다운로드 되어 화면에 뜰텐데 각 자원들마다 따로따로 매번 연결하고 다운받고 끊고 다시 연결하고 다운 받고 끊는 것이다. 그래서 초기의 HTTP는 느릴수밖에 없었다. </p>
<h2 id="📍-http11">📍 HTTP/1.1</h2>
<pre><code>- 첫 번째 표준화 버전
- 연결 상태 유지(디폴트) &amp; 파이프라이닝</code></pre><h3 id="✔️-persistent-connection-keep-alive">✔️ Persistent Connection (keep-alive)</h3>
<h4 id="http11에서-디폴트">HTTP/1.1에서 디폴트</h4>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/d0282138-2429-460f-93e6-c7aca67e109d/image.png" alt=""></p>
<p>HTTP 1.1 버전에서 지속적 접속이 디폴트였다. 지속적 접속 덕분에 한 번 맺어졌던 연결을 끊지 않고 지속적으로 유지하여 성능을 개선할 수 있었다.</p>
<h3 id="✔️-http-pipelining">✔️ HTTP pipelining</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/24f2ffc4-5f3a-406a-997a-93fc53723924/image.png" alt=""></p>
<p>기본적으로 HTTP 요청은 순차적이다. 현재의 요청에 대한 응답을 받고 나서야 다음 요청을 실시한다. 이 경우 다음 요청을 보내는 데까지 상당한 딜레이가 발생할 수 있다.
그래서 파이프라이닝 기술이 도입되었다. 파이프라이닝은 같은 커넥션을 통해서 응답을 기다리지 않고 요청을 연속적으로 보내는 기능이다.
그런데 이 파이프라이닝도 문제가 있다. 첫번째 요청에 대한 응답이 오래 걸릴 경우 그 뒤의 응답도 같이 늦게 되어서 결과적으로 time이 길어지게 되는 비효율적인 상황이 발생하게 된다. </p>
<h2 id="📍-http20">📍 HTTP/2.0</h2>
<pre><code class="language-text">- 이진(binary 프로토콜)
- 응답 다중화(multiplexing)
- 헤더 필드 압축 + 중복 제거
- 서버 푸시</code></pre>
<h3 id="✔️-이진binary-프로토콜">✔️ 이진(binary 프로토콜)</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/5f08f53f-0862-4a2b-81f3-a4f8ed92f7e1/image.png" alt=""></p>
<p>HTTP/1.1은 텍스트 기반 프로토콜이기 때문에 사람이 읽기에는 편하지만 불필요하게 데이터가 커지는 문제가 있었다.
HTTP/2에서는 보내야 할 데이터를 바이너리로 변환하는 계층이 있기 때문에 단순 텍스트를 전송하는 것보다 훨씬 더 효율적으로 데이터를 전송할 수 있다. </p>
<h3 id="✔️-응답-다중화multiplexing">✔️ 응답 다중화(multiplexing)</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/11dde078-8797-45a3-95c2-fc13f58c5c3d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/d403c6dd-3be1-445b-a9ce-ff8c142a07d9/image.png" alt=""></p>
<p>HTTP/1.1에서는 TCP 연결에서 한 번에 하나의 요청만 처리 가능하며 요청 별 순서를 반드시 지켜야 했다. 
HTTP/2에서는 하나의 TCP 연결에서 여러 요청을 동시에 처리할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/ce0aab3c-caeb-4405-b858-df43187a716c/image.png" alt=""></p>
<p>HTTP/2에서는 순서를 지키지 않고 준비되는 대로 응답</p>
<h3 id="✔️-헤더-필드-압축--중복-제거">✔️ 헤더 필드 압축 + 중복 제거</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/646396e4-c023-424c-a1b3-b318cc63adea/image.png" alt=""></p>
<p>HTTP/1.1에서 헤더는 아무런 압축 없이 그대로 전송되었다. 이를 개선하기 위해 HTTP/2.0에서는 HTTP 메시지의 헤더를 압축하여 전송한다.
또한 HTTP/1.1에서는 연속적으로 요청되는 HTTP 메세지들에게서 헤더 값이 중복되는 부분이 많아 메모리가 낭비되었는데, HTTP/2.0에서는 이전 메시지의 헤더 내용 중 중복되는 필드를 재전송하지 않도록 하여 데이터를 절약할 수 있게 되었다. </p>
<h3 id="✔️-서버-푸시">✔️ 서버 푸시</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/76a4d5a3-023b-4934-9997-39c641963cd2/image.png" alt=""></p>
<p>HTTP/2에서는 클라이언트의 요청에 대해 미래에 필요할 것 같은 리소스를 미리 보낼 수 있다. 예를 들어 클라이언트로부터 HTML 문서를 요청하는 하나의 HTTP 메시지를 받은 서버는 그 HTML 문서가 링크하여 사용하고 있는 이미지, CSS 파일, JS 파일 등의 리소스를 스스로 파악하여 클라이언트에게 미리 push해서 미리 브라우저의 캐시에 가져다 놓는다.</p>
<h4 id="참고-자료">참고 자료</h4>
<ul>
<li>그림으로 배우는 HTTP&amp;Network Basic 도서 9장</li>
<li><a href="https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP">mdn HTTP의 진화</a></li>
<li><a href="https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP-09-HTTP-30-%EA%B9%8C%EC%A7%80-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-%ED%86%B5%EC%8B%A0-%EA%B8%B0%EC%88%A0?category=980052">Inpa Dev 👨‍💻:티스토리 HTTP 0.9 ~ HTTP 1.1 까지 알아보는 통신 기술</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Connection_management_in_HTTP_1.x#http_pipelining">mdn Connection management in HTTP/1.x</a></li>
<li><a href="https://yozm.wishket.com/magazine/detail/1686/">웹 개발자라면 알고 있어야 할 HTTP의 진화 과정</a></li>
<li><a href="https://hackbotone.com/http-1-1-vs-http-2-830f0364a8a4">http/1.1 vs http/2</a></li>
<li><a href="https://bluescoder.com/amazon-lightsail%EC%97%90-http2-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0/#google_vignette">Amazon Lightsail에 HTTP2 적용하기</a></li>
<li><a href="https://velog.io/@cjh8746/HTTP-Keep-Alive-%EC%99%80-pipelining-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Multiplexed-Streams%EC%9D%84-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8B%A4%EA%B0%80-%EC%95%8C%EA%B2%8C%EB%90%9C-%EB%B2%84%EC%A0%84%EC%97%B4-HTTP0.9-2.0-%EC%A0%95%EB%A6%AC">[HTTP] Keep-Alive 와 pipelining 그리고 Multiplexed Streams을 공부하다가 알게된 버전열 HTTP(0.9 ~ 2.0) 정리</a></li>
<li><a href="https://web.dev/articles/performance-http2?hl=ko">HTTP/2 소개</a></li>
<li><a href="https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP-20-%ED%86%B5%EC%8B%A0-%EA%B8%B0%EC%88%A0-%EC%9D%B4%EC%A0%9C%EB%8A%94-%ED%99%95%EC%8B%A4%ED%9E%88-%EC%9D%B4%ED%95%B4%ED%95%98%EC%9E%90">Inpa Dev 👨‍💻:티스토리 HTTP 2.0 소개 &amp; 통신 기술 알아보기
</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[모르면 큰일나는 개발 상식 Chapter1] HTTP 스터디 4회차 회고]]></title>
            <link>https://velog.io/@u-ryu-00/%EB%AA%A8%EB%A5%B4%EB%A9%B4-%ED%81%B0%EC%9D%BC%EB%82%98%EB%8A%94-%EA%B0%9C%EB%B0%9C-%EC%83%81%EC%8B%9D-Chapter1-HTTP-%EC%8A%A4%ED%84%B0%EB%94%94-4%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@u-ryu-00/%EB%AA%A8%EB%A5%B4%EB%A9%B4-%ED%81%B0%EC%9D%BC%EB%82%98%EB%8A%94-%EA%B0%9C%EB%B0%9C-%EC%83%81%EC%8B%9D-Chapter1-HTTP-%EC%8A%A4%ED%84%B0%EB%94%94-4%ED%9A%8C%EC%B0%A8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Sun, 31 Dec 2023 03:13:48 GMT</pubDate>
            <description><![CDATA[<h3 id="4회차-주제---http를-기본으로-하는-프로토콜-웹-콘텐츠에서-사용하는-기술">4회차 주제 - HTTP를 기본으로 하는 프로토콜, 웹 콘텐츠에서 사용하는 기술</h3>
<h3 id="✨-좋았던-점">✨ 좋았던 점</h3>
<h4 id="1회차-http의-역사-🖇️-4회차-http를-기본으로-하는-프로토콜">(1회차) HTTP의 역사 🖇️ (4회차) HTTP를 기본으로 하는 프로토콜</h4>
<p>4회차 스터디 내용을 학습하면서 HTTP의 역사에 대해 깔끔하게 정리해 볼 수 있어서 좋았다. 책에는 HTTP/2.0과 SPDY, WebSocket 등 HTTP를 기본으로 하는 프로토콜 이야기만 담겨 있었지만 이것들이 나오게 된 배경과 역사를 이해하기 위해서는 HTTP 0.9 / 1.0 / 1.1 에 대한 이야기가 꼭 필요할 것 같았다. 이에 1회차에서 아주 간단히 다루었던 <code>HTTP의 역사</code>에 대한 내용을 끌어와서 4회차에서는 깊은 수준으로 다루었다. 이미 알고 있는 내용을 새로운 내용과 계속해서 연결하는 방식으로 스터디를 구성하고 있는데 덕분에 각각의 회차들이 흩어지지 않고 하나의 흐름으로 잘 합쳐지고 있다. 나의 학습법을 공유하려고 시작한 스터디이지만 나도 스터디 덕분에 의식적으로 제대로 된 학습을 하려 신경쓰고 있다는 게 느껴진다. ✌️</p>
<h4 id="스터디-멤버분들께서-4회차-스터디에서-공유해주신-의문점과-추가-개념-❤️🔥">스터디 멤버분들께서 4회차 스터디에서 공유해주신 의문점과 추가 개념 ❤️‍🔥</h4>
<ul>
<li><a href="https://stackoverflow.com/questions/24041/markdown-vs-markup-are-they-related">마크다운과 마크업! 이름이 비슷한데 어떤 관련성이 있을까요?</a></li>
<li><a href="https://stomp.github.io/">Simple Text Oriented Messaging Protocol</a></li>
<li><a href="https://developer.mozilla.org/ko/docs/Web/API/Server-sent_events/Using_server-sent_events">Server-Sent Events</a></li>
<li>그 외 다수</li>
</ul>
<p>미처 생각해보지 못했던 의문점을 제시해주시거나 본인의 경험을 아낌없이 나눠주셔서 4회차도 반짝반짝한 눈으로 경청했다. 🌟</p>
<h3 id="🫠-개선된-point--여전히-아쉬운-point">🫠 개선된 point &amp; 여전히 아쉬운 point</h3>
<h4 id="스터디-리딩">스터디 리딩</h4>
<pre><code>- 시각자료 활용, ppt 구성이 아쉬웠음.
- 어려운 내용을 쉽게 설명하기 위한 고민이 부족했음.
- 스터디 멤버들의 참여를 이끌어내는 과정에서 어색했던 부분이 있었음.</code></pre><p>2회차 스터디 다음 날 피드백 시간에 정리했던 아쉬웠던 point다. 이 내용들을 생각하면서 개선할 부분을 명확히 정하고 4회차 스터디를 준비했다. 알아들을 수 있게, 간결하게 정보를 전달하려고 많이 노력했다. 그렇게 하기 위해서 스터디 내용 자체에 대한 공부도 꼼꼼하게 하고, 적절한 시각자료를 찾기 위해 구글링도 엄청 했다. 그래서 그 부분은 확실히 개선 되었다고 스스로 느낀다. 
하지만 아직도 능동적으로 상황을 대처하는 센스와 감각은 많이 부족하다. 침묵의 시간이 너무 길어진다거나 말끝을 흐리는 등의 태도는 여전히 아쉬운 point로 남았다. 그래도 여기서 멈추지 않고 발표나 퍼실리테이팅 기회를 끊임없이 만들고 그때 그때 상황을 대처하는 센스와 감각을 익혀가면 된다고 생각한다! ✨ </p>
<h3 id="🔥-action-plan">🔥 Action Plan</h3>
<ul>
<li>3회차 스터디 내용과 5회차 스터디 내용을 연결지어 하나의 흐름으로 정리하기</li>
<li>실제 사례와 5회차 스터디 내용을 함께 학습하기</li>
<li>4회차 스터디에서 다루었던 <a href="https://velog.io/@u-ryu-00/HTTP%EC%9D%98-%EC%97%AD%EC%82%AC-0.9-1.0-1.1-2.0"><code>HTTP의 역사</code>와 관련된 TIL</a> 작성 후 공유</li>
</ul>
<h3 id="✅-to-do">✅ TO-DO</h3>
<ul>
<li>5회차 스터디 학습 및 학습자료 완성하기</li>
<li>5회차 스터디 기획 및 준비</li>
<li>스터디 2기 기획</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[📸 사진으로 보는 데이지의 2023년 ❤️‍🔥]]></title>
            <link>https://velog.io/@u-ryu-00/%EC%82%AC%EC%A7%84%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EB%8D%B0%EC%9D%B4%EC%A7%80%EC%9D%98-2023%EB%85%84</link>
            <guid>https://velog.io/@u-ryu-00/%EC%82%AC%EC%A7%84%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EB%8D%B0%EC%9D%B4%EC%A7%80%EC%9D%98-2023%EB%85%84</guid>
            <pubDate>Fri, 29 Dec 2023 07:30:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>🗓️ 올 한 해를 돌아보고 내년에 해야 할 일을 착착 정리해봅니다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/01108012-c0fb-49c5-9a13-783088e4ada4/image.jpeg" alt=""></p>
<h3 id="✨-2023년-시작--개발">✨ 2023년 시작 &amp; 개발</h3>
<p>1년 내내 다니던 회사와의 계약이 끝나고 좋은 기회가 되어 올해 1월 말부터 개발 공부를 시작하게 됐다. 7월 말까지는 정말 개발 공부만 했다. 6개월 간의 과정은 상상 이상으로 쉽지 않았고 그만두고 싶다는 생각도 여러 번 했었다. 하지만 6개월만 버티자고 다짐하고 또 다짐하며 최종 프로젝트까지 무사히 마무리했다. </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/1944ad22-ff80-422a-8124-659fc5ff886f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/0b8334ed-8d35-4d29-a1e4-f284e43f2da3/image.png" alt=""></p>
<p>작고 귀여운 최종 프로젝트의 결과물 ✨</p>
<h3 id="👩🏻💻-첫-개발-프로젝트">👩🏻‍💻 첫 개발 프로젝트</h3>
<p>9월부터 11월까지 인생 처음으로 개발 프로젝트를 맡아서 하게 됐다. </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/ee63ed47-4456-4150-9d6b-c266b5737ff8/image.jpeg" alt=""></p>
<p>프로젝트를 다 끝내고 멋지게 회고 발표도 했다. ✌️</p>
<p>첫 번째 프로젝트이다 보니 일정 지키기도 버거웠던 탓에 배운 점, 깨달은 점을 TIL로 기록하지 못하고 흘려보낸 것 같아 아쉬웠다. 앞으로의 프로젝트에서는 새롭게 알게 되는 점들을 조금씩 매일 매일 정리하고 회사 슬랙으로 공유하자는 action plan과 함께 첫 프로젝트를 마무리했다.</p>
<h3 id="👾-feconf-2023-참석">👾 FEConf 2023 참석</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/08761e3f-6f78-4da3-ad34-db4f375aa22e/image.jpeg" alt=""></p>
<p>티켓팅 실패했는데 너무 가고 싶어 보였는지 회사에서 같이 일하는 개발자분이 양도해주셨다 ㅎㅎ 덕분에 신나게 즐기고 왔다! 🙇🏻‍♀️</p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/5179a8fd-51d9-4e34-ab9d-2fa1c0e3eab7/image.jpeg" alt=""></p>
<p>컨퍼런스는 롯데타워 31층에서 진행되었다. 롯데월드가 한 눈에 들어오는 뷰! ✨</p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/396fff03-5a64-42d9-89aa-ac4fca76ccfe/image.jpeg" alt=""></p>
<p>세션은 1시부터 시작이었지만 입장은 12시부터 가능해서 12시에 맞춰서 참석했다. 토스, 숨고, 당근, 현대, TWIP 등 다양한 기업들이 부스를 운영하고 있었는데 일찍 도착한 덕분에 여유롭게 모든 부스를 구경할 수 있었다. 다양한 팀들이 모여 즐겁게 부스를 운영하시는 게 느껴져서 좋은 에너지를 정말 많이 얻고 왔다. ❤️‍🔥</p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/36d744c6-8310-47ba-bd43-bf46ef63cf71/image.jpeg" alt=""></p>
<p>A 트랙, B 트랙 옮겨다니면서 세션도 열심히 들어주고! </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/fc3a7273-f903-4db2-9389-175670c28e85/image.png" alt=""></p>
<p>컨퍼런스 행사를 다 마치고 나니 밤이 되었다. 🌝</p>
<h3 id="🫧-『튜링의-사과』-클린코드-특강">🫧 『튜링의 사과』 클린코드 특강</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/193965d4-1f60-4fe8-ab9b-da72971f72c7/image.jpeg" alt=""></p>
<p>클린코드 특강을 들으러 성수동 <a href="https://turingapple.com/">『튜링의 사과』</a>도 방문했다. </p>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/feac62ad-45a8-4055-ab1a-a3b1a1229507/image.jpeg" alt=""></p>
<p>튜링의 사과는 개발 관련 도서를 구매하거나 주말에 refresh 하고 싶을 때 종종 방문했다. </p>
<h3 id="🌷-http-스터디-기획--리딩">🌷 HTTP 스터디 기획 &amp; 리딩</h3>
<p><img src="https://velog.velcdn.com/images/u-ryu-00/post/17b28f0f-de0b-49f6-a186-a45222e1b371/image.png" alt=""></p>
<p>2023년의 끝자락에 스터디 기획과 리딩의 경험이 주어져서 열정 넘치는 한 해의 마무리를 했다. 좋은 동료들과 함께 할 수 있어서 항상 감사한 마음이 크다. 🙏</p>
<h3 id="🔥-2024년-action-plan">🔥 2024년 Action Plan</h3>
<ul>
<li>프로젝트 진행하면서 배운 점, 깨달은 점을 조금씩 매일매일 정리 (TIL) -&gt; 최소 10회 공유</li>
<li>나의 성과를 정리하고 적극적으로 나누기 -&gt; 프로젝트가 끝날 때마다 회고하고 발표</li>
<li>발표나 퍼실리테이팅 기회를 만들고 능동적으로 상황을 대처하는 센스와 감각 익히기</li>
</ul>
<h3 id="✅-2024년-to-do">✅ 2024년 TO-DO</h3>
<ul>
<li>Next.js로 기술 블로그 만들기</li>
<li>개발 프로젝트</li>
<li>스터디 기획 및 운영 </li>
<li>대학 졸업</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>