<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dl_rjsdn.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 10 Nov 2025 13:43:01 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dl_rjsdn.log</title>
            <url>https://velog.velcdn.com/images/dl_rjsdn/profile/e1f18c32-f089-43f7-b176-8829473f9535/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dl_rjsdn.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dl_rjsdn" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[함수 표현식과 함수 선언문]]></title>
            <link>https://velog.io/@dl_rjsdn/%ED%95%A8%EC%88%98-%ED%91%9C%ED%98%84%EC%8B%9D%EA%B3%BC-%ED%95%A8%EC%88%98-%EC%84%A0%EC%96%B8%EB%AC%B8</link>
            <guid>https://velog.io/@dl_rjsdn/%ED%95%A8%EC%88%98-%ED%91%9C%ED%98%84%EC%8B%9D%EA%B3%BC-%ED%95%A8%EC%88%98-%EC%84%A0%EC%96%B8%EB%AC%B8</guid>
            <pubDate>Mon, 10 Nov 2025 13:43:01 GMT</pubDate>
            <description><![CDATA[<p>함수표현식</p>
<ul>
<li>함수를 변수에 담아 필요할 때만 사용 ex) 콜백, 이벤트 핸들러</li>
<li>다른 함수의 인수로 함수 전달, 동적으로 함수가 결정될때 ex) map, filter</li>
</ul>
<p>함수표현문</p>
<ul>
<li>전체에 반복적으로 쓰는 유틸, 초기화 함수</li>
<li>읽는 순서와 무관하게 호출되어야 할 때</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[return]]></title>
            <link>https://velog.io/@dl_rjsdn/return</link>
            <guid>https://velog.io/@dl_rjsdn/return</guid>
            <pubDate>Mon, 10 Nov 2025 13:33:32 GMT</pubDate>
            <description><![CDATA[<p><em>코드를 작성하다 보면 다양한 함수를 만들게 된다. 자료형과 함수를 공부하면서 습관적으로 쓰던 return에 대해서 명확하게 어떤 경우에 사용하는지 정의하고 싶었다.</em></p>
<p>일반적으로 return을 명시하지 않더라도 모든 함수는 return 값으로 <strong>undefined</strong>를 반환한다.
그럼 그 이외 어떤 경우 return을 명시해 활용할 수 있을까?</p>
<p><strong>1. 값을 반환하는 경우</strong></p>
<pre><code>function sum(a, b) {
  return a + b; // 결과값 반환
}
let result = sum(3, 5);</code></pre><p><strong>2. 함수의 종료</strong></p>
<pre><code>function divide(a, b) {
  if (b === 0) {
    return; // 0으로 나눌 때 함수 즉시 종료
  }
  return a / b;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[한 입 크기로 잘라먹는 리액트(React.js) 시작]]></title>
            <link>https://velog.io/@dl_rjsdn/%ED%95%9C-%EC%9E%85-%ED%81%AC%EA%B8%B0%EB%A1%9C-%EC%9E%98%EB%9D%BC%EB%A8%B9%EB%8A%94-%EB%A6%AC%EC%95%A1%ED%8A%B8React.js-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@dl_rjsdn/%ED%95%9C-%EC%9E%85-%ED%81%AC%EA%B8%B0%EB%A1%9C-%EC%9E%98%EB%9D%BC%EB%A8%B9%EB%8A%94-%EB%A6%AC%EC%95%A1%ED%8A%B8React.js-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Sun, 09 Nov 2025 14:42:23 GMT</pubDate>
            <description><![CDATA[<p>재직 중에 퇴근 후 공부를 꾸준하게 하기란 참 쉽지 않은 것 같다.
체력 이슈도 있고, 예상치 못한 스케줄이 생겨 루틴이 깨지다보면 흐름이 깨지기 일수였다.</p>
<p>하지만, 평소에 해놓은 공부가 면접 뿐만 아니라 한 사람의 기초 체력처럼 기초 지식이 되기 때문에 오늘부터 꾸준하게 해보려고 한다.</p>
<p>개인 공부는 새로 알게 된 부분만 적고, 실무에 적용하거나 개인 프로젝트에 응용한 기술 위주로 블로그를 채워갈 생각이다.</p>
<p>러닝처럼 길게 보고 빠르게 달리기보다 천천히 꾸준하게 달리자🙂</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GSAP을 활용한 clip-path 애니메이션]]></title>
            <link>https://velog.io/@dl_rjsdn/GSAP%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-clip-path-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98</link>
            <guid>https://velog.io/@dl_rjsdn/GSAP%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-clip-path-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98</guid>
            <pubDate>Mon, 03 Feb 2025 08:34:27 GMT</pubDate>
            <description><![CDATA[<p>오늘은 GSAP을 사용하여 clip-path 애니메이션을 만들어보았습니다.</p>
<p><img src="https://velog.velcdn.com/images/dl_rjsdn/post/51c536c0-d881-4e5f-b29f-930333f8bf0a/image.gif" alt=""></p>
<hr>
<p>우선 위에 영상과 같이 만들기 위해서는</p>
<h3 id="html">HTML</h3>
<p>HTML에서 배경 부모를 만들고 안에 배경을 몰아 넣어주었다.</p>
<hr>
<h3 id="css">CSS</h3>
<pre><code class="language-css">.bg {
    position: absolute; // positon:absolute로 한 곳에 모아두기
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    clip-path: inset(0% 0 0% 0); // 초기 clip-path 설정

    @for $i from 1 through 14 {
        &amp;:nth-child(#{$i}) {
            z-index: -#{$i}; // 초기 z-index 역순으로 하여 첫 이미지가 위로
            @include bg(&#39;파일명&#39;);
        }
    }
}</code></pre>
<ul>
<li><code>positon:absolute</code>: 배경 한 곳에 모아두기</li>
<li><code>clip-path: inset(0)</code>: 첫 이미지 보이게 설정</li>
<li><code>z-index</code>: - 숫자로 역순으로 배치하여 첫 이미지가 위로 올라오게 설정</li>
</ul>
<hr>
<h3 id="js">JS</h3>
<p>우선 전체적으로 mouseenter 이벤트가 필요했고, 각 item에 이벤트가 필요하여 반복문을 돌려주었다.</p>
<h4 id="이벤트">이벤트</h4>
<pre><code class="language-js">$bgItem.each((idx, item) =&gt; {
    $(item).on(&#39;mouseenter&#39;, function() {
        ``` 생략 ```
    });
});</code></pre>
<h4 id="up--down-감지">Up &amp; Down 감지</h4>
<p>애니메이션을 낮은 순서에서 높은 순서의 아이템으로 이동 시, 높은 순서에서 낮은 순서로 이동 시를 다르게 표현하기 위해서 인덱스의 높낮이를 감지할 필요가 있었다.</p>
<p>그래서 <strong>변수를 설정하여 이전 인덱스와 현재 인덱스를 비교하고 저장</strong>하는 방법이 필요했다.</p>
<pre><code class="language-js">let activeIdx = 0;  // 현재 활성화된 index를 저장하는 변수

// 이벤트 콜백 함수 내
const dir = idx &gt; activeIdx ? &#39;up&#39; : &#39;down&#39;; // 현재 idx가 기존 activeIdx보다 크면 &#39;up&#39;, 아니면 &#39;down&#39;

activeIdx = idx; // 현재 활성화된 인덱스를 갱신
</code></pre>
<h4 id="애니메이션">애니메이션</h4>
<p>애니메이션은 <code>clip-path</code>로 이미지를 크롭시키는 방향으로 진행하였다.</p>
<pre><code class="language-js">const except = `.sc-work__bg-area .bg:not(:nth-child(${idx + 1}))`;
const target = `.sc-work__bg-area .bg:nth-child(${idx + 1})`;</code></pre>
<p>현재 <strong>이벤트를 받는 대상과 아닌 대상을 구분</strong>할 필요가 있었고, GSAP은 CSS 선택자를 활용할 수 있기 때문에 <code>:nth-child</code>와 <code>:not</code>을 사용하여 구분지었다.</p>
<pre><code class="language-js">const bgAnimation = gsap.timeline({ overwrite: &#39;auto&#39; })
.to(except, { 
    clipPath: () =&gt; dir === &#39;up&#39; ? &#39;inset(100% 0 0% 0)&#39; : &#39;inset(0% 0 100% 0)&#39;, 
    onComplete: () =&gt; {
        gsap.set(target, { zIndex: ++count })
    }
})
.fromTo(target, { 
    clipPath: () =&gt; dir === &#39;up&#39; ? &#39;inset(0% 0 100% 0)&#39; : &#39;inset(100% 0 0% 0)&#39;,  
}, {
    clipPath: &#39;inset(0% 0 0% 0)&#39; 
}, &#39;&lt;&#39;);</code></pre>
<p>clip-path(top right bottom left); 중
올라갈 때</p>
<ul>
<li>except : <code>top: 0 -&gt; 100%</code></li>
<li>target : <code>bottom: 100% -&gt; 0%</code> || <code>top: 100% -&gt; 0%</code></li>
</ul>
<p>내려올 때는 반대로 설정하여 애니메이션을 완성했다.</p>
<p>그리고 이벤트가 자주 많이 일어날때 이전 애니메이션이 끝나기 전에 실행될 수 있으므로</p>
<p><code>overwrite: auto</code>로 설정하여 <strong>이벤트 중복 방지 설정</strong>까지 해줬다.</p>
<hr>
<p>최종 코드</p>
<pre><code class="language-js">$workItem.each((idx, item) =&gt; {
    let activeIdx = -1; // 처음에는 어떤 항목도 활성화되지 않음
    let isFirstHover = true; // 처음 hover인지 확인하는 변수

    $(item).on(&#39;mouseenter&#39;, function() {
        const dir = idx &gt; activeIdx ? &#39;up&#39; : &#39;down&#39;;
        const except = `.sc-work__bg-area .bg:not(:nth-child(${idx + 1}))`;
        const target = `.sc-work__bg-area .bg:nth-child(${idx + 1})`;

        if (isFirstHover) {
            // 처음 hover하는 경우 애니메이션 없이 바로 보이게 설정
            gsap.set(target, { clipPath: &#39;inset(0% 0 0% 0)&#39;, zIndex: ++count });
            isFirstHover = false; // 첫 hover 처리가 끝났음을 표시
        } else {
            // 기존 동작 (애니메이션 실행)
            gsap.timeline({ overwrite: &#39;auto&#39; })
                .to(except, { 
                    clipPath: () =&gt; dir === &#39;up&#39; ? &#39;inset(100% 0 0% 0)&#39; : &#39;inset(0% 0 100% 0)&#39;, 
                    onComplete: () =&gt; {
                        gsap.set(target, { zIndex: ++count });
                    }
                })
                .fromTo(target, { 
                    clipPath: () =&gt; dir === &#39;up&#39; ? &#39;inset(0% 0 100% 0)&#39; : &#39;inset(100% 0 0% 0)&#39;,  
                }, {
                    clipPath: &#39;inset(0% 0 0% 0)&#39; 
                }, &#39;&lt;&#39;);
        }

        activeIdx = idx;
    });
});</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[스크롤스파이 만들기]]></title>
            <link>https://velog.io/@dl_rjsdn/%EC%8A%A4%ED%81%AC%EB%A1%A4%EC%8A%A4%ED%8C%8C%EC%9D%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@dl_rjsdn/%EC%8A%A4%ED%81%AC%EB%A1%A4%EC%8A%A4%ED%8C%8C%EC%9D%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Fri, 31 Jan 2025 17:11:43 GMT</pubDate>
            <description><![CDATA[<p>오늘은 스크롤스파이를 <code>Jquery</code>를 사용해서 만들어보았다.</p>
<h3 id="html">HTML</h3>
<pre><code class="language-html">&lt;!-- 네비게이션 영역 --&gt;
&lt;nav class=&quot;snb&quot;&gt;
    &lt;ol class=&quot;snb__list&quot;&gt;
        &lt;li class=&quot;snb__item snb__item--active&quot;&gt;
            &lt;a href=&quot;#&quot; role=&quot;button&quot; class=&quot;snb__link&quot;&gt;&lt;span class=&quot;snb__txt&quot;&gt;2024&lt;/span&gt;&lt;/a&gt;
        &lt;/li&gt;
        &lt;li class=&quot;snb__item&quot;&gt;
            &lt;a href=&quot;#&quot; role=&quot;button&quot; class=&quot;snb__link&quot;&gt;&lt;span class=&quot;snb__txt&quot;&gt;2023&lt;/span&gt;&lt;/a&gt;
        &lt;/li&gt;
        &lt;li class=&quot;snb__item&quot;&gt;
            &lt;a href=&quot;#&quot; role=&quot;button&quot; class=&quot;snb__link&quot;&gt;&lt;span class=&quot;snb__txt&quot;&gt;2022&lt;/span&gt;&lt;/a&gt;
        &lt;/li&gt;
    &lt;/ol&gt;
&lt;/nav&gt;</code></pre>
<pre><code class="language-html">&lt;!-- 네비게이션 컨텐츠 영역 --&gt;
&lt;li id=&quot;year2024&quot; class=&quot;sc-work__item&quot;&gt;  &lt;!-- 위치 찾기용 ID --&gt;
    &lt;a href=&quot;#&quot; target=&quot;_blank&quot; class=&quot;work-card&quot;&gt;
        &lt;div class=&quot;work-card__title-area&quot;&gt;
            &lt;strong class=&quot;work-card__title&quot;&gt;lamiche&lt;/strong&gt;
            &lt;p class=&quot;work-card__desc&quot;&gt;swiper를 사용하여 제작한 신규 홈페이지입니다.&lt;/p&gt;
        &lt;/div&gt;
    &lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;sc-work__tag--review tag--review&quot;&gt;code reivew&lt;/a&gt;
&lt;/li&gt;

... 생략 ...</code></pre>
<p><code>HTML</code>은 일반 네비게이션과 컨텐츠 영역처럼 잡고, 컨텐츠 리스트 중 특정 컨텐츠의 위치로 이동해야해서 구분하기 편하게 <code>ID</code>를 부여하였다.</p>
<h3 id="스크립트">스크립트</h3>
<p>스크립트는 크게 스크롤 이벤트, 클릭 이벤트 두 가지가 필요하였다.</p>
<h4 id="1-변수">1. 변수</h4>
<pre><code class="language-js">let flag = false; // 클릭하여 이동하는 동안 스크롤 이벤트 막기 위한 flag 변수 설정

const $workNavItem = $(&#39;.snb__item&#39;);
const $workItem = $(&#39;.sc-work__item[id]&#39;);

let workNavPadding = Math.abs($(&#39;.sc-work__right&#39;).offset().top - $(&#39;.sc-work__list&#39;).offset().top); 

// 타겟 offset top 값 배열로 저장
let workItemPosY = $workItem.map((idx, item) =&gt; {
    return ($(item).offset().top - workNavPadding).toFixed(0);
}).get();
</code></pre>
<h4 id="2-스크롤-이벤트">2. 스크롤 이벤트</h4>
<pre><code class="language-js">$(window).on(&#39;scroll&#39;, () =&gt; {
    if (flag) return; // 클릭 애니메이션 중 작동 X
    let wTop = $(window).scrollTop().toFixed(0);

    // 성능을 위해서 each문 대신 for문 사용 
    for (let i = 0; i &lt; workItemPosY.length; i++) {
        if (wTop &gt;= workItemPosY[i] - 1) { // 스크롤이 타겟 offset().top 보다 높으면
            $workNavItem.eq(i).addClass(&quot;snb__item--active&quot;).siblings().removeClass(&#39;snb__item--active&#39;);
        }
    }
})
</code></pre>
<p>스크롤 이벤트는 <code>workItemPosY</code>에 담긴 값보다 스크롤이 높을 시 클래스를 부여하였다.
오차가 있어서 <code>toFixed()</code>를 사용했고, 아직 - 1을 해야 해당 요소로 이동했을 때 네비게이션에 active가 맞게 작동하는데 이유는 더 고민해봐야겠다...</p>
<h4 id="3-클릭-이벤트">3. 클릭 이벤트</h4>
<pre><code class="language-js">$workNavItem.on(&#39;click&#39;, function(e) {
    flag = true;
    e.preventDefault();

    let navIdx = $(this).index();

    if ($workItem.length) {
        $(this).addClass(&#39;snb__item--active&#39;).siblings().removeClass(&#39;snb__item--active&#39;);
        $(&#39;html, body&#39;).animate({ scrollTop: workItemPosY[navIdx] }, 300, function() {
            flag = false; // 애니메이션 종료 시 flag false로 변환
        });
    } else {
        flag = false;
    }
});</code></pre>
<p>클릭하여 이동하는 애니메이션은 Jquery animate로 만들었다.
처음에 html, body를 선택자로 잡아야하는 이유가 궁금했는데,
JS에선 <code>window</code>를 잡아서 사용하지만, Jquery 사용 시 <code>html, body</code>를 사용해야 스크롤 이동이 가능하다고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS counter()]]></title>
            <link>https://velog.io/@dl_rjsdn/CSS-counter</link>
            <guid>https://velog.io/@dl_rjsdn/CSS-counter</guid>
            <pubDate>Thu, 30 Jan 2025 17:11:11 GMT</pubDate>
            <description><![CDATA[<p>순서가 있는 목록을 만들 때 제목 앞에 숫자를 붙여야하는 상황이 많다.</p>
<p><img src="https://velog.velcdn.com/images/dl_rjsdn/post/19e5362e-38ff-46f0-aa19-d5fe377bda82/image.png" alt=""></p>
<p>이때 <code>HTML</code>에서 하드코딩하지 않고 <code>CSS</code>로 목록의 갯수를 세어 붙여주는 기능을 발견했다!</p>
<hr>
<h3 id="counter-increment">counter-increment</h3>
<p>순서를 붙이기 위해 몇 가지 단계를 거쳐야한다. 그 중 첫 번째는 <strong>증가할 목록에 이름 붙이기</strong>.</p>
<pre><code class="language-css">.counter-item {
  counter-increment: section; /* &#39;section&#39; 카운터를 1 증가 */
}</code></pre>
<h3 id="counter">counter()</h3>
<p><strong>카운터의 값을 가져오는 함수</strong>. <code>content</code> 속성에서 사용한다. counter-increment에 적은 값을 적어주면 완료.</p>
<pre><code class="language-css">.counter-item::before {
  content: counter(section);
}</code></pre>
<h3 id="counter-reset">counter-reset</h3>
<p>카운터를 <strong>초기화</strong>하는 속성. <strong>특정 값으로 초기화</strong> 할 수도 있다.</p>
<pre><code class="language-css">.counter-container {
  counter-reset: section 5; /* 카운터 초기값을 5로 설정 */
}</code></pre>
<hr>
<h3 id="응용">응용</h3>
<pre><code class="language-css">.counter-item::before {
  content: counter(num);
}

.counter-item:nth-child(-n+9)::before { /* 9이하 값에 0 붙이기 */
  content: &quot;0&quot; counter(num);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[gsap xPercent 오류]]></title>
            <link>https://velog.io/@dl_rjsdn/gsap-xPercent-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@dl_rjsdn/gsap-xPercent-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Wed, 29 Jan 2025 16:24:53 GMT</pubDate>
            <description><![CDATA[<p><em>어느 날 gsap으로 인터렉션을 만들던 중, <code>css</code>로 초기값 세팅을 하고 <code>xPercent</code>로 요소를 움직이려고 코드를 작성했다.</em></p>
<p>우선, <code>css</code>로 </p>
<pre><code class="language-css">transform: translateX(-100%);</code></pre>
<p>를 주고 같은 <code>%</code>단위를 사용하니</p>
<pre><code class="language-js">xPercent: 0</code></pre>
<p>으로 만들 생각이었다.</p>
<p>하지만 결과는 제자리에서 움직이지 않았다. 이유가 뭘까하고 개발자도구를 살펴보니 분명 %단위를 입력했는데 들어간 값은 <code>px</code>...</p>
<p><img src="https://velog.velcdn.com/images/dl_rjsdn/post/c7fe38ee-af00-4748-b336-0130268eb02b/image.png" alt=""></p>
<p>신기하게 같은 이름의 클래스 중 반만 되고 반만 안되는 거였다.</p>
<hr>
<h3 id="첫번째-시도">첫번째 시도</h3>
<ul>
<li>x: &#39;0%&#39;<pre><code class="language-js">gsap.to($textTranslateX, { x: &#39;0%&#39;})</code></pre>
이렇게 하니 잘 작동했지만, <code>gsap</code> 강의를 들었을 때 <strong><code>x</code>는 기본적으로 <code>px</code>로 계산하기 때문에 <code>%</code> 사용을 추천하지 않는다고 했다</strong>. gsap공식문서에서도 <strong>기술적인 혼란을 야기</strong>할 수 있기 때문에 <code>%</code> 단위는 <code>xPercent</code> 사용을 권고했다.</li>
</ul>
<p>(참고) <a href="https://gsap.com/resources/mistakes/">https://gsap.com/resources/mistakes/</a></p>
<p>그리고 gsap 커뮤니티에서 다른 사람들의 질문들을 보다가 가능하면 초기값 세팅을 gsap으로 세팅하길 바란다는 답변을 보고 그렇게 변경하기로 했다.</p>
<hr>
<h3 id="최종-코드">최종 코드</h3>
<pre><code class="language-js">초기값
gsap.set(target, { xPercent: idx =&gt; idx === 0 || idx === 3 ? -100 : 100 })

애니메이션
gsap.to(target, { xPercent: 0})</code></pre>
<p>원래도 이렇게 작업을 많이 했지만 글리치 현상을 겪기 싫어서 다른 스타일로 해보려다가 결국 원래 하던대로 하는 게 맞았다... ( 글리치도 autoAlpha로 처리하기로! )</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML5 form 요소]]></title>
            <link>https://velog.io/@dl_rjsdn/HTML5-form-%EC%9A%94%EC%86%8C</link>
            <guid>https://velog.io/@dl_rjsdn/HTML5-form-%EC%9A%94%EC%86%8C</guid>
            <pubDate>Sun, 10 Nov 2024 14:52:21 GMT</pubDate>
            <description><![CDATA[<p>HTML <code>form</code> 태그는 사용자로부터 데이터를 입력받아 서버로 전송할 때 사용합니다.</p>
<h2 id="form-태그-속성-및-사용-방법"><code>form</code> 태그 속성 및 사용 방법</h2>
<table>
<thead>
<tr>
<th>속성</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>method</code></td>
<td>폼 전송 방식을 지정합니다. <code>GET</code>과 <code>POST</code>가 있으며 각기 다른 특성이 있습니다.</td>
</tr>
<tr>
<td><code>name</code></td>
<td>폼의 이름을 설정합니다. 서버로 제출된 데이터를 참조할 때 사용합니다.</td>
</tr>
<tr>
<td><code>action</code></td>
<td>폼 데이터를 전송할 서버의 URL 또는 파일 경로를 지정합니다.</td>
</tr>
</tbody></table>
<h3 id="method-전송-방식"><code>method</code> 전송 방식</h3>
<table>
<thead>
<tr>
<th>전송 방식</th>
<th>특징</th>
</tr>
</thead>
<tbody><tr>
<td><code>GET</code></td>
<td>데이터가 URL에 노출되며 보안에 취약합니다. 전송 용량은 256~4096바이트로 제한됩니다.</td>
</tr>
<tr>
<td><code>POST</code></td>
<td>URL에 노출되지 않고 보안에 유리합니다. 전송 용량 제한이 없습니다.</td>
</tr>
</tbody></table>
<blockquote>
<p><strong>주의!</strong> <code>&lt;form&gt;</code> 태그 내부에는 다른 <code>&lt;form&gt;</code> 태그를 중첩할 수 없으며, 한 페이지 내에서 동일한 <code>name</code> 속성값을 가진 폼을 중복 사용해서는 안 됩니다.</p>
</blockquote>
<h2 id="fieldset--legend"><code>&lt;fieldset&gt;</code> &amp; <code>&lt;legend&gt;</code></h2>
<h3 id="fieldset"><code>&lt;fieldset&gt;</code></h3>
<p><code>&lt;fieldset&gt;</code> 태그는 관련된 입력 요소들을 그룹화할 때 사용합니다. 시각적으로 구분을 제공해 폼의 구성을 명확히 할 수 있습니다.</p>
<h3 id="legend"><code>&lt;legend&gt;</code></h3>
<p><code>&lt;legend&gt;</code> 태그는 <code>&lt;fieldset&gt;</code> 내에서 그룹의 제목을 정의합니다. <code>&lt;fieldset&gt;</code> 내에 반드시 포함되어야 하며, 폼의 특정 섹션을 설명합니다.</p>
<pre><code class="language-html">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;Login&lt;/legend&gt;
    ID: &lt;input type=&quot;text&quot; /&gt; &lt;br&gt;
    Password: &lt;input type=&quot;password&quot; /&gt;
  &lt;/fieldset&gt;

  &lt;br&gt;

  &lt;fieldset&gt;
    &lt;legend&gt;Sign Up&lt;/legend&gt;
    Email: &lt;input type=&quot;email&quot; /&gt; &lt;br&gt;
    Password: &lt;input type=&quot;password&quot; /&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<h3 id="button"><code>&lt;button&gt;</code></h3>
<p>button 태그의 기본 타입은 <code>button</code>이며,
폼 요소 내부에서 기본 타입은 <code>submit</code>입니다. 그리고 폼 전송 버튼으로 작동합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML에서 `inline`과 `inline-block` 요소 사이에 공백이 생기는 이유와 해결 방법]]></title>
            <link>https://velog.io/@dl_rjsdn/HTML%EC%97%90%EC%84%9C-inline%EA%B3%BC-inline-block-%EC%9A%94%EC%86%8C-%EC%82%AC%EC%9D%B4%EC%97%90-%EA%B3%B5%EB%B0%B1%EC%9D%B4-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%99%80-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@dl_rjsdn/HTML%EC%97%90%EC%84%9C-inline%EA%B3%BC-inline-block-%EC%9A%94%EC%86%8C-%EC%82%AC%EC%9D%B4%EC%97%90-%EA%B3%B5%EB%B0%B1%EC%9D%B4-%EC%83%9D%EA%B8%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0%EC%99%80-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Fri, 08 Nov 2024 05:11:03 GMT</pubDate>
            <description><![CDATA[<p> inline 요소는 컨텐츠의 너비만큼 크기를 가져서 줄바꿈이 일어나지 않기 때문에 가로 배열이 됩니다. 하지만, <code>margin</code>, <code>padding</code>을 0으로 설정해도 두 요소 사이 공백이 존재하는 경우가 있습니다.</p>
<hr>
<h2 id="inline과-inline-block-요소의-특성"><code>inline</code>과 <code>inline-block</code> 요소의 특성</h2>
<ol>
<li><p><strong><code>inline</code> 요소</strong></p>
<ul>
<li><code>inline</code> 요소는 텍스트의 한 부분처럼 취급됩니다. 따라서 한 줄에 연속해서 배치되며, 줄을 넘어가지 않는 한 옆에 다른 <code>inline</code> 요소가 바로 붙습니다.</li>
<li>예시: <code>&lt;a&gt;</code>, <code>&lt;span&gt;</code>, <code>&lt;em&gt;</code>, <code>&lt;strong&gt;</code> 등이 있습니다.</li>
</ul>
</li>
<li><p><strong><code>inline-block</code> 요소</strong></p>
<ul>
<li><code>inline-block</code> 요소는 <code>inline</code> 요소처럼 한 줄에 배치되지만, 자체적으로 높이와 너비를 가질 수 있다는 점에서 차이가 있습니다.</li>
<li>블록처럼 영역을 가지면서도, 다른 <code>inline</code> 요소처럼 한 줄에 배치되는 특성을 가지고 있습니다.</li>
</ul>
</li>
</ol>
<hr>
<h2 id="공백이-발생하는-이유">공백이 발생하는 이유</h2>
<p>HTML에서는 코드상에서 <code>inline</code>이나 <code>inline-block</code> 요소 사이에 공백(스페이스, 탭, 줄바꿈 등)이 있으면 이 공백이 화면에 그대로 반영됩니다. 이는 HTML 렌더링 엔진이 공백 문자들을 공백으로 인식하기 때문에 발생합니다. 즉, HTML 코드에서 다음과 같은 코드가 있을 때,</p>
<pre><code class="language-html">&lt;div&gt;
  &lt;span style=&quot;display: inline-block;&quot;&gt;Box 1&lt;/span&gt;
  &lt;span style=&quot;display: inline-block;&quot;&gt;Box 2&lt;/span&gt;
&lt;/div&gt;</code></pre>
<p><code>Box 1</code>과 <code>Box 2</code>사이에 있는 공백이 그대로 렌더링됩니다. 그 결과 두 요소 사이에 간격이 생기게 됩니다.</p>
<hr>
<h2 id="공백-문제-해결-방법">공백 문제 해결 방법</h2>
<h3 id="1-부모-요소에-font-size-0-적용하기">1. 부모 요소에 font-size: 0; 적용하기</h3>
<p>부모 요소에 font-size: 0; 스타일을 지정하면 공백이 사라집니다. 이 방식은 공백을 발생시키는 원인인 텍스트 사이즈를 0으로 만들어 공백이 화면에 표시되지 않도록 하는 원리입니다.</p>
<pre><code class="language-html">&lt;div style=&quot;font-size: 0;&quot;&gt;
  &lt;span style=&quot;display: inline-block; width: 100px; height: 50px; background-color: red;&quot;&gt;&lt;/span&gt;
  &lt;span style=&quot;display: inline-block; width: 100px; height: 50px; background-color: blue;&quot;&gt;&lt;/span&gt;
&lt;/div&gt;</code></pre>
<blockquote>
<p><strong>주의</strong> <code>font-size: 0;</code>을 설정하면 자식 요소에 텍스트가 있을 경우 보이지 않기 때문에, 자식 요소들에 별도로 font-size를 지정해 주어야 합니다.</p>
</blockquote>
<h3 id="2-flex-레이아웃을-사용하기">2. flex 레이아웃을 사용하기</h3>
<p>부모 요소에 display: flex;를 적용하면 inline-block 요소를 사용할 때 발생하는 공백 문제를 쉽게 해결할 수 있습니다. flex 레이아웃에서는 요소들 사이에 불필요한 공백이 자동으로 제거되므로, 간격을 원하는 대로 설정할 수 있습니다.</p>
<pre><code class="language-html">&lt;div style=&quot;display: flex;&quot;&gt;
  &lt;span style=&quot;width: 100px; height: 50px; background-color: red;&quot;&gt;&lt;/span&gt;
  &lt;span style=&quot;width: 100px; height: 50px; background-color: blue;&quot;&gt;&lt;/span&gt;
&lt;/div&gt;</code></pre>
<p>flex 레이아웃을 적용하면 공백 문제뿐 아니라 요소 간 간격을 gap 속성으로 쉽게 제어할 수 있어 레이아웃 관리가 수월해집니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[
Flexbox와 `text-overflow: ellipsis` 문제 해결 방법]]></title>
            <link>https://velog.io/@dl_rjsdn/Flexbox%EC%99%80-text-overflow-ellipsis-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@dl_rjsdn/Flexbox%EC%99%80-text-overflow-ellipsis-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Thu, 07 Nov 2024 04:17:08 GMT</pubDate>
            <description><![CDATA[<p>CSS에서 Flexbox 레이아웃을 사용할 때, 텍스트가 요소의 너비를 초과하는 경우 <code>text-overflow: ellipsis;</code>로 말줄임 처리를 하는 경우가 많습니다.</p>
<h2 id="문제의-원인">문제의 원인</h2>
<p>Flexbox에서 <code>flex: 1;</code>은 다음의 단축 속성을 포함합니다:</p>
<pre><code class="language-css">flex: 1; /* === flex-grow: 1; flex-shrink: 1; flex-basis: 0; */</code></pre>
<p>문제는 <code>text-overflow: ellipsis;</code>가 제대로 작동하려면 <strong>요소의 너비가 고정</strong>되어야 말줄임이 가능해집니다. <code>flex: 1;</code>은 <strong>요소의 너비를 유연하게 설정</strong>하여 <strong>너비가 고정되지 않으므로</strong>, 말줄임(ellipsis) 처리가 제대로 작동하지 않는다는 것입니다.</p>
<h3 id="해결-방법-min-width-0-설정">해결 방법: min-width: 0; 설정</h3>
<p>Flexbox 요소에 <strong><code>min-width: 0;</code></strong>를 추가하면 됩니다.</p>
<pre><code class="language-css">.container {
  display: flex;
}

.flex-item {
  flex: 1;
  min-width: 0; /* 말줄임 처리를 위해 필수 */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}</code></pre>
<ul>
<li><code>min-width: 0</code>을 설정하여 마치 너비를 설정한 것과 같은 효과를 낼 수 있습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[DOCTYPE 선언 이해하기]]></title>
            <link>https://velog.io/@dl_rjsdn/DOCTYPE-%EC%84%A0%EC%96%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dl_rjsdn/DOCTYPE-%EC%84%A0%EC%96%B8-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 06 Nov 2024 05:04:45 GMT</pubDate>
            <description><![CDATA[<h2 id="doctype-선언의-역할">DOCTYPE 선언의 역할</h2>
<p><code>DOCTYPE</code>은 브라우저에게 이 HTML 문서가 어떤 표준을 따르는지 알려주는 역할을 합니다. </p>
<p>HTML5에서는 <code>&lt;!DOCTYPE html&gt;</code> 형태로 간단하게 지정할 수 있습니다. </p>
<table>
<thead>
<tr>
<th>모드</th>
<th><!DOCTYPE html></th>
</tr>
</thead>
<tbody><tr>
<td><code>표준 모드</code></td>
<td>O</td>
</tr>
<tr>
<td><code>쿼크 모드</code></td>
<td>X</td>
</tr>
</tbody></table>
<p>쿼크 모드는 오래된 브라우저와의 호환성을 위해 남아있는 모드로, HTML4 이전의 레거시 문서에 맞춘 해석 방식입니다. 이를 사용하면 현재 CSS 표준과 다른 방식으로 스타일을 렌더링하기 때문에, 의도한 대로 페이지가 보이지 않을 가능성이 큽니다.</p>
<p>width / height, 테이블 레이아웃, 마진 상쇄, 이미지 요소 크기 차이, <strong>글꼴 크기 및 줄 간격 문제</strong> 등 여러가지 문제가 발생할 수 있습니다.</p>
<p>제가 처음 찾아보게 된 계기는 로컬과 서버 간 줄 간격 문제 때문이었습니다. 서버에 반영된 코드에 선언이 빠져서 로컬에서 의도한대로 반영이 되지 않았습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[<strong>과 <em> 태그의 차이점]]></title>
            <link>https://velog.io/@dl_rjsdn/strong%EA%B3%BC-em-%ED%83%9C%EA%B7%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@dl_rjsdn/strong%EA%B3%BC-em-%ED%83%9C%EA%B7%B8%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Tue, 05 Nov 2024 02:08:34 GMT</pubDate>
            <description><![CDATA[<p>HTML에서 <code>&lt;strong&gt;</code>과 <code>&lt;em&gt;</code> 태그는 각각 <strong>중요성</strong>과 <strong>어조</strong>를 표현하기 위해 사용됩니다. 두 태그는 시각적인 강조를 위한 것이 아니라 <strong>의미론적 역할</strong>에 중점을 둡니다.</p>
<h2 id="strong-태그"><code>&lt;strong&gt;</code> 태그</h2>
<ul>
<li>텍스트의 <strong>중요성을 강조</strong>하는 데 사용됩니다.</li>
<li>브라우저에서는 <strong>굵은 글씨</strong>로 표시됩니다.</li>
<li><strong>의미적으로 중요한 정보</strong>를 전달할 때 적합합니다.</li>
<li>스크린 리더기에서는 텍스트를 <strong>더욱 강조하여 읽도록</strong> 합니다.</li>
</ul>
<h2 id="em-태그"><code>&lt;em&gt;</code> 태그</h2>
<ul>
<li>텍스트의 <strong>어조나 뉘앙스를 강조</strong>하는 데 사용됩니다.</li>
<li>브라우저에서는 일반적으로 <strong>이탤릭체</strong>로 렌더링됩니다.</li>
<li>문장 속에서 <strong>감정적이거나 강조된 어조</strong>를 표현할 때 유용합니다.</li>
<li>스크린 리더기는 <strong>어조를 변화</strong>하여 텍스트를 읽어 의미를 부각시킵니다.</li>
</ul>
<h2 id="요약-비교">요약 비교</h2>
<table>
<thead>
<tr>
<th>태그</th>
<th>의미</th>
<th>기본 스타일</th>
<th>스크린 리더기 동작</th>
</tr>
</thead>
<tbody><tr>
<td><code>&lt;strong&gt;</code></td>
<td>문맥상 중요한 내용 강조</td>
<td>굵은 글씨</td>
<td>중요한 정보로 인식하여 강조</td>
</tr>
<tr>
<td><code>&lt;em&gt;</code></td>
<td>문장에서 어조나 뉘앙스 강조</td>
<td>이탤릭체</td>
<td>어조를 변화하여 강조</td>
</tr>
</tbody></table>
<h3 id="결론">결론</h3>
<p><code>&lt;strong&gt;</code>과 <code>&lt;em&gt;</code> 태그는 시각적 효과보다는 <strong>문맥의 의미를 전달</strong>하는 데 초점이 맞춰져 있으므로, 문서의 의미와 용도에 따라 <strong>적절히 사용</strong>하는 것이 중요합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[절대경로와 상대경로의 차이점 이해하기]]></title>
            <link>https://velog.io/@dl_rjsdn/%EC%A0%88%EB%8C%80%EA%B2%BD%EB%A1%9C%EC%99%80-%EC%83%81%EB%8C%80%EA%B2%BD%EB%A1%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@dl_rjsdn/%EC%A0%88%EB%8C%80%EA%B2%BD%EB%A1%9C%EC%99%80-%EC%83%81%EB%8C%80%EA%B2%BD%EB%A1%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 04 Nov 2024 02:49:32 GMT</pubDate>
            <description><![CDATA[<p>파일 시스템에서 특정 파일이나 디렉토리를 참조할 때 사용하는 <strong>절대경로</strong>와 <strong>상대경로</strong>는 개발에 필수적인 개념입니다. 로컬 환경과 서버 환경을 예시로 들며 절대경로와 상대경로의 차이를 쉽게 설명해보겠습니다.</p>
<hr>
<h2 id="1-절대경로란">1. 절대경로란?</h2>
<p>절대경로는 <strong>파일 시스템의 최상위 디렉토리부터 파일이나 폴더까지의 전체 경로</strong>를 지정합니다. 이 경로는 위치가 고정적이며, 항상 특정 파일에 대한 정확한 위치를 알려줍니다.</p>
<h3 id="예시">예시</h3>
<ul>
<li><p><strong>로컬 환경</strong><br>만약 파일이 <code>C:\project\images\logo.png</code>에 있다면, 이 경로가 절대경로입니다. 이 경로는 <strong>항상 동일하게</strong> 해당 파일을 가리킵니다.</p>
</li>
<li><p><strong>서버 환경</strong><br>서버에서 프로젝트가 <code>/var/www/html/project</code>에 있다고 가정하면, <code>logo.png</code> 파일의 절대경로는 <code>/var/www/html/project/images/logo.png</code>가 됩니다. <strong>서버에서 일반적으로 <code>/</code>로 시작하는 경로는 절대경로</strong>로 취급됩니다.</p>
</li>
</ul>
<hr>
<h2 id="2-상대경로란">2. 상대경로란?</h2>
<p>상대경로는 <strong>현재 작업 중인 디렉토리를 기준으로 파일이나 폴더 위치를 지정</strong>합니다. 파일이나 폴더가 프로젝트 내부에서 이동하거나 환경이 달라져도 쉽게 적응할 수 있는 유연한 경로 방식입니다.</p>
<h3 id="예시-1">예시</h3>
<ul>
<li><p><strong>로컬 환경</strong><br>현재 디렉토리가 <code>C:\project</code>라면, <code>images</code> 폴더 내 <code>logo.png</code> 파일에 접근할 때 <code>.\images\logo.png</code>로 지정할 수 있습니다. 여기서 <code>.</code>는 <strong>현재 디렉토리를 의미</strong>합니다.</p>
</li>
<li><p><strong>서버 환경</strong><br>서버에서 현재 파일이 <code>/var/www/html/project</code>에 있을 때, <code>images/logo.png</code>로 상대경로를 사용하여 접근할 수 있습니다. <strong>웹 경로에서는 <code>./</code>를 생략</strong>해도 무방합니다.</p>
</li>
</ul>
<hr>
<h2 id="3-절대경로와-상대경로의-사용-시기">3. 절대경로와 상대경로의 사용 시기</h2>
<h3 id="절대경로가-유리한-경우">절대경로가 유리한 경우</h3>
<ul>
<li>파일의 <strong>위치가 고정적</strong>이어서 시스템 전체에서 공통으로 참조해야 할 때</li>
<li>외부에서 링크를 통해 <strong>절대적인 경로가 필요한 경우</strong></li>
</ul>
<h3 id="상대경로가-유리한-경우">상대경로가 유리한 경우</h3>
<ul>
<li><strong>프로젝트 내부 파일의 위치가 자주 변경</strong>될 때</li>
<li><strong>다양한 환경에서 동일한 코드</strong>를 적용해야 할 때</li>
<li>경로 변경의 <strong>유지보수성을 높이고 싶을 때</strong></li>
</ul>
<hr>
<h2 id="절대경로와-상대경로-비교-정리">절대경로와 상대경로 비교 정리</h2>
<table>
<thead>
<tr>
<th></th>
<th>절대경로</th>
<th>상대경로</th>
</tr>
</thead>
<tbody><tr>
<td><strong>정의</strong></td>
<td>루트 디렉토리부터의 전체 경로</td>
<td>현재 디렉토리를 기준으로 지정</td>
</tr>
<tr>
<td><strong>로컬 환경 예시</strong></td>
<td><code>C:\project\images\logo.png</code></td>
<td><code>.\images\logo.png</code></td>
</tr>
<tr>
<td><strong>서버 환경 예시</strong></td>
<td><code>/var/www/html/project/images/logo.png</code></td>
<td><code>images/logo.png</code></td>
</tr>
<tr>
<td><strong>사용 시기</strong></td>
<td>고정된 경로가 필요한 경우</td>
<td>유연한 경로가 필요한 경우</td>
</tr>
</tbody></table>
<hr>
<blockquote>
<p><strong>Tip</strong>: 웹사이트에서 <code>img/logo.png</code>처럼 상대경로를 사용하면 로컬과 서버 모두에서 <strong>동일한 방식으로</strong> 작동하므로, 이식성이 높아집니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[<section> 태그와 <article> 태그 차이점]]></title>
            <link>https://velog.io/@dl_rjsdn/section-%ED%83%9C%EA%B7%B8%EC%99%80-article-%ED%83%9C%EA%B7%B8-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@dl_rjsdn/section-%ED%83%9C%EA%B7%B8%EC%99%80-article-%ED%83%9C%EA%B7%B8-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Sun, 03 Nov 2024 04:31:11 GMT</pubDate>
            <description><![CDATA[<p> 퍼블리싱을 공부하면서 시맨틱 태그가 중요하다는 말을 많이 듣고 공부하면서 다른 태그들은 이해가 되었지만 section과 article의 차이는 와닿지 않았습니다.</p>
<p>  실제 작업하면서 section 태그를 많이 사용하면서 두 태그의 차이에 대해서 깊이 생각해보지 않았던 것 같습니다.</p>
<p>  그래서 이번 기회에 두 태그의 차이를 알아보려고 합니다.</p>
<h3 id="1-section-태그">1. section 태그</h3>
<blockquote>
<p>웹 페이지에서 주제를 구분하는 <strong>논리적 구역</strong>을 정의하기 위한 태그입니다.</p>
</blockquote>
<ul>
<li><p>페이지 내에서 <strong>관련 있는 콘텐츠를 그룹화</strong>하는 역할을 합니다. section태그 안의 컨텐츠는 특정 주제와 관련된 콘텐츠로, 페이지의 다른 구역과 연결된 맥락을 가집니다.</p>
</li>
<li><p>예: 소개, 서비스 설명, 팀 프로필, 연락처 정보 등으로 구획을 나누는 페이지의 특정 영역.</p>
</li>
</ul>
<h3 id="2-article-태그">2. article 태그</h3>
<blockquote>
<p><strong>독립적이고 재사용 가능한 콘텐츠</strong>를 나타내기 위한 태그로, 다른 문서나 페이지에서도 이해될 수 있는 내용이 들어갑니다.</p>
</blockquote>
<ul>
<li>article에 포함된 콘텐츠는 페이지의 맥락에 종속되지 않고, <strong>독립적으로 의미</strong>가 통할 수 있는 콘텐츠입니다. 블로그 글, 뉴스 기사, 제품 리뷰 등이 대표적입니다.</li>
<li>예: 블로그 포스트, 뉴스 기사, 사용 설명서 등 독립적인 정보가 담긴 콘텐츠.</li>
</ul>
<h3 id="차이점">차이점</h3>
<blockquote>
<p><strong>section</strong> <strong>현재 페이지</strong>에서만 의미가 있는 구획. <strong>논리적인 주제별</strong> 그룹을 나누는 데 적합.
<strong>article</strong> <strong>독립적이고 재사용 가능한 콘텐츠</strong>. 다른 문서나 페이지에서도 온전히 이해될 수 있는 내용.</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>