<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>boss_teemo.log</title>
        <link>https://velog.io/</link>
        <description>1인개발자가 되겠다</description>
        <lastBuildDate>Tue, 31 Dec 2024 18:54:15 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>boss_teemo.log</title>
            <url>https://velog.velcdn.com/images/boss_teemo/profile/85b22248-e64d-47bc-919f-609d357bdbf6/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. boss_teemo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/boss_teemo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[React에서 CSS를 효과적으로 관리하는 방법]]></title>
            <link>https://velog.io/@boss_teemo/React%EC%97%90%EC%84%9C-CSS%EB%A5%BC-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@boss_teemo/React%EC%97%90%EC%84%9C-CSS%EB%A5%BC-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C-%EA%B4%80%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 31 Dec 2024 18:54:15 GMT</pubDate>
            <description><![CDATA[<p>React로 프로젝트를 진행하다 보면 CSS를 관리하는 방법에서 여러 문제를 경험할 수 있습니다. 
특히 CSS 파일을 import했을 때 스타일이 전체 페이지에 적용되는 <strong>글로벌 범위</strong> 문제는 초보자에게 혼란을 줄 수 있습니다.</p>
<p>이번 글에서는 React에서 CSS의 기본 동작 방식을 이해하고, 이를 컴포넌트 단위로 제한하는 방법을 소개합니다.</p>
<hr>
<h2 id="react에서-css의-기본-동작">React에서 CSS의 기본 동작</h2>
<p>React에서 CSS 파일을 import하면, 해당 CSS는 애플리케이션 전체에 영향을 미칩니다. 
즉, 특정 컴포넌트에만 적용하고 싶어도 동일한 클래스 이름이 다른 컴포넌트에도 영향을 줄 수 있습니다.</p>
<h3 id="예제-css의-글로벌-범위-문제">예제: CSS의 글로벌 범위 문제</h3>
<pre><code class="language-css">/* styles.css */
.title {
    color: red;
}</code></pre>
<pre><code class="language-jsx">// App.js
import &#39;./styles.css&#39;;

const App = () =&gt; {
    return &lt;h1 className=&quot;title&quot;&gt;Hello&lt;/h1&gt;;
};</code></pre>
<p>이 경우, <code>className=&quot;title&quot;</code>을 사용하는 다른 컴포넌트에도 <code>color: red;</code>가 적용됩니다. 
<strong>React는 기본적으로 CSS의 범위를 특정 컴포넌트로 자동 제한하지 않습니다.</strong></p>
<hr>
<h2 id="css의-글로벌-문제를-해결하는-방법">CSS의 글로벌 문제를 해결하는 방법</h2>
<p>React에서 CSS 범위를 컴포넌트 단위로 제한하거나 관리하기 위한 몇 가지 전략이 있습니다.</p>
<hr>
<h3 id="1-css-모듈-css-modules">1. <strong>CSS 모듈 (CSS Modules)</strong></h3>
<p>CSS 모듈은 클래스 이름을 고유하게 만들어 CSS 충돌 문제를 방지합니다. 
파일 이름에 <code>.module.css</code>를 붙여 사용하며, React는 클래스 이름을 고유한 해시 값으로 변환합니다.</p>
<h4 id="사용-방법">사용 방법</h4>
<ol>
<li>CSS 파일 이름을 <code>파일명.module.css</code>로 작성합니다.</li>
<li>해당 CSS 파일을 import합니다.</li>
<li>클래스 이름을 객체처럼 사용합니다.</li>
</ol>
<pre><code class="language-css">/* styles.module.css */
.title {
    color: blue;
}</code></pre>
<pre><code class="language-jsx">import styles from &#39;./styles.module.css&#39;;

const App = () =&gt; {
    return &lt;h1 className={styles.title}&gt;Hello&lt;/h1&gt;;
};</code></pre>
<h4 id="결과">결과</h4>
<p><code>className</code>이 자동으로 고유한 이름으로 변환됩니다:</p>
<pre><code class="language-html">&lt;h1 class=&quot;title__abc123&quot;&gt;Hello&lt;/h1&gt;</code></pre>
<hr>
<h3 id="2-css-in-js와-styled-components">2. <strong>CSS-in-JS와 Styled-Components</strong></h3>
<p>CSS-in-JS는 CSS를 JavaScript 코드 내부에 작성하는 방식입니다.<br>이 방식은 스타일이 특정 컴포넌트에 국한되며, JavaScript 로직과 스타일을 같은 파일에서 관리할 수 있습니다. 가장 인기 있는 라이브러리로 <strong>styled-components</strong>가 있습니다.</p>
<h4 id="사용-방법-1">사용 방법</h4>
<ol>
<li><p><code>styled-components</code> 라이브러리를 설치합니다.</p>
<pre><code class="language-bash">npm install styled-components</code></pre>
</li>
<li><p>스타일을 정의한 뒤 컴포넌트처럼 사용합니다.</p>
<pre><code class="language-jsx">import styled from &#39;styled-components&#39;;

const Title = styled.h1`
    color: green;
`;

const App = () =&gt; {
    return &lt;Title&gt;Hello&lt;/Title&gt;;
};</code></pre>
</li>
</ol>
<h4 id="결과-1">결과</h4>
<p><code>&lt;Title&gt;</code>이라는 React 컴포넌트는 고유한 클래스 이름을 가진 DOM 요소로 렌더링됩니다:</p>
<pre><code class="language-html">&lt;h1 class=&quot;Title__xyz456&quot;&gt;Hello&lt;/h1&gt;</code></pre>
<hr>
<h3 id="3-scss-sass와-네이밍-규칙">3. <strong>SCSS (SASS)와 네이밍 규칙</strong></h3>
<p>SCSS(SASS)는 기존 CSS를 확장한 스타일 언어로, <strong>중첩 규칙</strong>과 <strong>변수</strong>를 지원하여 더 구조적인 CSS 작성이 가능합니다.</p>
<h4 id="사용-방법-2">사용 방법</h4>
<ol>
<li><p>SCSS 파일을 작성합니다.</p>
<pre><code class="language-scss">/* styles.scss */
.App {
    .title {
        color: purple;
    }
}</code></pre>
</li>
<li><p>해당 SCSS 파일을 import합니다.</p>
<pre><code class="language-jsx">import &#39;./styles.scss&#39;;

const App = () =&gt; {
    return (
        &lt;div className=&quot;App&quot;&gt;
            &lt;h1 className=&quot;title&quot;&gt;Hello&lt;/h1&gt;
        &lt;/div&gt;
    );
};</code></pre>
</li>
</ol>
<h4 id="결과-2">결과</h4>
<p>CSS 클래스는 명확한 네이밍 규칙을 따라 다른 컴포넌트와 충돌하지 않습니다:</p>
<pre><code class="language-html">&lt;div class=&quot;App&quot;&gt;
    &lt;h1 class=&quot;title&quot;&gt;Hello&lt;/h1&gt;
&lt;/div&gt;</code></pre>
<hr>
<h2 id="어떤-방법을-선택해야-할까">어떤 방법을 선택해야 할까?</h2>
<h3 id="간단한-프로젝트">간단한 프로젝트</h3>
<ul>
<li><strong>CSS 모듈</strong>: 설정이 간단하며, 컴포넌트 단위로 스타일을 분리할 수 있습니다.</li>
</ul>
<h3 id="복잡한-스타일-관리">복잡한 스타일 관리</h3>
<ul>
<li><strong>Styled-Components</strong>: JavaScript 코드와 스타일을 통합해서 작성할 수 있어 유지보수가 쉽습니다.</li>
<li><strong>SCSS(SASS)</strong>: 변수와 중첩 구조를 통해 복잡한 스타일을 관리하기 좋습니다.</li>
</ul>
<hr>
<h2 id="결론">결론</h2>
<p>React에서는 기본적으로 CSS가 글로벌 범위로 적용됩니다.<br>이 문제를 해결하려면 <strong>CSS 모듈</strong>, <strong>Styled-Components</strong>, 또는 <strong>SCSS</strong>와 같은 도구를 활용해 스타일을 컴포넌트 단위로 관리하는 것이 중요합니다.</p>
<blockquote>
</blockquote>
<h3 id="요약">요약</h3>
<ol>
<li>CSS 모듈로 클래스를 고유하게 만들어 충돌을 방지.</li>
<li>Styled-Components로 JavaScript 내부에서 스타일 작성.</li>
<li>SCSS를 사용해 구조화된 CSS 관리.</li>
</ol>
<p>이제 React에서 CSS를 관리할 때 발생하는 문제를 해결하고, 더 깔끔하고 효율적인 스타일링을 구현해 보세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 컴포넌트를 만드는 세 가지 방법]]></title>
            <link>https://velog.io/@boss_teemo/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%A5%BC-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@boss_teemo/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%A5%BC-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 31 Dec 2024 18:49:43 GMT</pubDate>
            <description><![CDATA[<p>React에서 컴포넌트는 애플리케이션의 기본 구성 요소입니다. 
컴포넌트는 화면에 표시할 UI를 정의하는 단위로, 
이를 사용하면 코드를 재사용하고 UI를 더 효율적으로 관리할 수 있습니다. 
이번 글에서는 React 컴포넌트를 만드는 세 가지 방법에 대해 알아보겠습니다.</p>
<hr>
<h2 id="컴포넌트란">컴포넌트란?</h2>
<p>React 컴포넌트는 <strong>함수</strong> 또는 <strong>클래스</strong>를 통해 정의할 수 있습니다.
하지만 최신 React에서는 <strong>함수형 컴포넌트</strong>를 주로 사용합니다.<br>React 컴포넌트는 반드시 <strong>JSX</strong> 또는 <strong>React.createElement</strong>를 반환해야 합니다. 
반환된 내용은 브라우저 화면에 렌더링됩니다.</p>
<hr>
<h2 id="react-컴포넌트를-만드는-세-가지-방법">React 컴포넌트를 만드는 세 가지 방법</h2>
<p>React에서 함수형 컴포넌트를 정의하는 방법은 크게 세 가지입니다:</p>
<h3 id="1-function-키워드-사용">1. <code>function</code> 키워드 사용</h3>
<p>전통적인 함수 선언 방식을 사용해 컴포넌트를 작성합니다.<br>이 방식은 ES5 이전부터 사용되어 익숙한 형태입니다.</p>
<h4 id="예제">예제:</h4>
<pre><code class="language-jsx">function MyComponent() {
    return &lt;h1&gt;Hello from MyComponent&lt;/h1&gt;;
}</code></pre>
<h4 id="특징">특징:</h4>
<ul>
<li>문법이 간단하고 직관적입니다.</li>
<li>컴포넌트 이름은 대문자로 시작해야 React가 HTML 태그와 구분합니다.</li>
<li>최신 React에서는 <code>function</code> 키워드 대신 다른 방식이 더 많이 사용됩니다.</li>
</ul>
<hr>
<h3 id="2-함수-표현식">2. 함수 표현식</h3>
<p>함수를 변수에 할당하는 방식으로 컴포넌트를 정의할 수 있습니다.<br>이는 함수 선언과 동일하게 동작하지만, 변수 스코프와 관련된 장점이 있습니다.</p>
<h4 id="예제-1">예제:</h4>
<pre><code class="language-jsx">const MyComponent = function() {
    return &lt;h1&gt;Hello from MyComponent&lt;/h1&gt;;
};</code></pre>
<h4 id="특징-1">특징:</h4>
<ul>
<li>컴포넌트를 변수에 할당해 코드 구조를 명확히 관리할 수 있습니다.</li>
<li>최신 React에서는 이 방식보다는 화살표 함수가 더 자주 사용됩니다.</li>
</ul>
<hr>
<h3 id="3-화살표-함수">3. 화살표 함수</h3>
<p>React에서 가장 선호되는 방식은 <strong>화살표 함수</strong>를 사용하는 것입니다.<br>화살표 함수는 ES6(ECMAScript 2015)에서 도입된 간결한 함수 표현법으로, 작성 방식이 짧고 코드 가독성이 높습니다.</p>
<h4 id="예제-2">예제:</h4>
<pre><code class="language-jsx">const MyComponent = () =&gt; {
    return &lt;h1&gt;Hello from MyComponent&lt;/h1&gt;;
};</code></pre>
<p>또는, 한 줄로 작성할 수 있는 경우 중괄호와 <code>return</code>을 생략할 수 있습니다:</p>
<pre><code class="language-jsx">const MyComponent = () =&gt; &lt;h1&gt;Hello from MyComponent&lt;/h1&gt;;</code></pre>
<h4 id="특징-2">특징:</h4>
<ul>
<li>최신 React에서 권장되는 방식입니다.</li>
<li>코드가 간결하고, 특히 <code>this</code> 바인딩 문제를 신경 쓰지 않아도 됩니다.</li>
<li>React Hooks와 함께 사용하기 적합합니다.</li>
</ul>
<hr>
<h2 id="최신-react에서-권장되는-방식">최신 React에서 권장되는 방식</h2>
<p>React는 클래스형 컴포넌트보다 함수형 컴포넌트를 권장합니다.<br>함수형 컴포넌트는 작성하기 더 간단하고 성능도 더 효율적입니다. 
특히, <strong>React Hooks</strong>를 사용하면 클래스형 컴포넌트에서만 가능했던 상태 관리와 라이프사이클 기능을 함수형 컴포넌트에서도 구현할 수 있습니다.</p>
<hr>
<h2 id="요약">요약</h2>
<p>React 컴포넌트를 만드는 세 가지 방법을 정리하면:</p>
<blockquote>
</blockquote>
<ol>
<li><code>function</code> 키워드를 사용하는 전통적인 방식.</li>
<li>함수 표현식을 사용하는 방식.</li>
<li>화살표 함수를 사용하는 최신 방식.</li>
</ol>
<h3 id="권장-화살표-함수를-사용한-함수형-컴포넌트-작성">권장: 화살표 함수를 사용한 함수형 컴포넌트 작성</h3>
<blockquote>
</blockquote>
<ul>
<li>코드가 더 간결하고 최신 React의 기능과 더 잘 맞습니다.</li>
<li>유지보수와 협업이 쉬워집니다.</li>
</ul>
<p>이제 React 컴포넌트를 작성할 때 어떤 방식을 선택할지 고민하지 않아도 되겠죠? 
가장 적합한 방식을 선택해 사용해 보세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[`className` 은 왜 React에서 중요한가?]]></title>
            <link>https://velog.io/@boss_teemo/className-%EC%9D%80-%EC%99%9C-React%EC%97%90%EC%84%9C-%EC%A4%91%EC%9A%94%ED%95%9C%EA%B0%80</link>
            <guid>https://velog.io/@boss_teemo/className-%EC%9D%80-%EC%99%9C-React%EC%97%90%EC%84%9C-%EC%A4%91%EC%9A%94%ED%95%9C%EA%B0%80</guid>
            <pubDate>Tue, 31 Dec 2024 18:26:30 GMT</pubDate>
            <description><![CDATA[<p>React로 개발을 하다 보면 HTML과 비슷해 보이는 코드를 작성하게 됩니다. 
하지만 HTML에서 사용하는 <code>class</code> 속성이 React에서는 <strong><code>className</code></strong>으로 바뀐다는 사실을 알게 됩니다. 
이번 포스팅에서는 왜 React에서 <code>className</code>을 사용하는지와 그 사용 방법을 간단히 정리해 보겠습니다.</p>
<hr>
<h2 id="class-vs-classname"><code>class</code> vs <code>className</code></h2>
<p>HTML에서 요소에 CSS 클래스를 적용할 때는 <code>class</code> 속성을 사용합니다.  </p>
<pre><code class="language-html">&lt;div class=&quot;my-class&quot;&gt;Hello, World!&lt;/div&gt;</code></pre>
<p>하지만, React에서는 <code>class</code> 대신 <code>className</code>을 사용해야 합니다:</p>
<pre><code class="language-jsx">&lt;div className=&quot;my-class&quot;&gt;Hello, World!&lt;/div&gt;</code></pre>
<hr>
<h3 id="이유는-무엇일까">이유는 무엇일까?</h3>
<p>JavaScript에서는 <code>class</code>가 <strong>예약어</strong>로 사용되기 때문에, React는 이를 피하기 위해 <strong><code>className</code></strong>이라는 대체 속성을 사용합니다.<br><code>className</code>을 통해 CSS 스타일링은 그대로 적용되면서도 JavaScript 코드와 충돌을 방지할 수 있습니다.</p>
<hr>
<h2 id="classname-사용-방법"><code>className</code> 사용 방법</h2>
<p>React에서 <code>className</code>을 사용하는 방법은 HTML과 매우 유사합니다.<br>다만, JavaScript 표현식과 결합하거나 동적으로 클래스를 변경할 수 있다는 점이 특징입니다.</p>
<h3 id="예제-1-기본-사용법">예제 1: 기본 사용법</h3>
<pre><code class="language-jsx">const App = () =&gt; {
    return &lt;div className=&quot;container&quot;&gt;Hello, React!&lt;/div&gt;;
};</code></pre>
<h3 id="예제-2-여러-클래스-적용">예제 2: 여러 클래스 적용</h3>
<p>여러 클래스를 적용할 때는 공백으로 구분합니다.</p>
<pre><code class="language-jsx">const App = () =&gt; {
    return &lt;div className=&quot;container primary&quot;&gt;Hello, React!&lt;/div&gt;;
};</code></pre>
<h3 id="예제-3-동적-클래스-적용">예제 3: 동적 클래스 적용</h3>
<p>JavaScript 표현식을 활용해 조건에 따라 클래스를 동적으로 설정할 수 있습니다.</p>
<pre><code class="language-jsx">const App = ({ isActive }) =&gt; {
    return (
        &lt;div className={isActive ? &quot;container active&quot; : &quot;container&quot;}&gt;
            Hello, React!
        &lt;/div&gt;
    );
};</code></pre>
<hr>
<h2 id="classname과-javascript-연동"><code>className</code>과 JavaScript 연동</h2>
<p>React의 <code>className</code> 속성은 JavaScript와 연동해 동적으로 스타일을 제어할 때 유용합니다. 
특히, 여러 클래스를 조합할 때 <strong>템플릿 리터럴</strong>이나 <strong>라이브러리</strong>를 활용할 수 있습니다.</p>
<h3 id="예제-템플릿-리터럴">예제: 템플릿 리터럴</h3>
<pre><code class="language-jsx">const App = ({ theme }) =&gt; {
    return &lt;div className={`container ${theme}`}&gt;Hello, React!&lt;/div&gt;;
};</code></pre>
<h3 id="예제-classnames-라이브러리-사용">예제: <code>classnames</code> 라이브러리 사용</h3>
<p><code>classnames</code> 라이브러리는 조건부 클래스 적용을 더 간단히 도와줍니다.</p>
<pre><code class="language-bash">npm install classnames</code></pre>
<pre><code class="language-jsx">import classNames from &quot;classnames&quot;;

const App = ({ isActive, theme }) =&gt; {
    const containerClass = classNames(&quot;container&quot;, {
        active: isActive,
        [theme]: theme,
    });

    return &lt;div className={containerClass}&gt;Hello, React!&lt;/div&gt;;
};</code></pre>
<hr>
<h2 id="결론">결론</h2>
<p>React에서 <code>className</code>은 HTML의 <code>class</code> 속성을 대체하는 필수적인 개념입니다.<br>다음과 같은 점을 기억하세요:</p>
<ol>
<li>React에서는 <code>class</code> 대신 <code>className</code>을 사용해야 합니다.</li>
<li>JavaScript와 연동하여 동적으로 클래스를 설정할 수 있습니다.</li>
<li><code>classnames</code>와 같은 라이브러리를 활용하면 더 간결하게 조건부 클래스를 관리할 수 있습니다.</li>
</ol>
<p>이제 React에서 <code>className</code>을 활용해 스타일링을 적용해 보세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React 컴포넌트란?]]></title>
            <link>https://velog.io/@boss_teemo/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80</link>
            <guid>https://velog.io/@boss_teemo/React-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80</guid>
            <pubDate>Tue, 31 Dec 2024 17:49:05 GMT</pubDate>
            <description><![CDATA[<p>React 컴포넌트는 <strong>React 애플리케이션의 기본 구성 요소</strong>예요. 
컴포넌트는 화면에 표시할 내용을 정의하는 단위라고 보면 됩니다. 
React 컴포넌트를 만드는 방법에는 두 가지가 있습니다:</p>
<hr>
<h2 id="1-함수형-컴포넌트function-component">1. <strong>함수형 컴포넌트(Function Component)</strong></h2>
<ul>
<li><p>간단한 JavaScript 함수로 작성합니다.  </p>
</li>
<li><p>JSX(HTML처럼 보이는 코드)를 반환합니다.  </p>
</li>
<li><p>최신 React에서는 이 방식을 권장하고 사용합니다.</p>
<p>예제:</p>
<pre><code class="language-jsx">const MyComponent = () =&gt; {
  return &lt;h1&gt;Hello, React!&lt;/h1&gt;;
};</code></pre>
</li>
</ul>
<h2 id="2-클래스형-컴포넌트class-component">2. <strong>클래스형 컴포넌트(Class Component)</strong></h2>
<ul>
<li><p><code>React.Component</code>를 확장한 JavaScript 클래스를 사용합니다.  </p>
</li>
<li><p><code>render()</code>라는 메서드 안에서 JSX를 반환합니다.  </p>
</li>
<li><p>과거에 많이 사용되었지만, 최신 React에서는 거의 사용하지 않습니다.</p>
<p>예제:</p>
<pre><code class="language-jsx">class MyComponent extends React.Component {
  render() {
      return &lt;h1&gt;Hello, React!&lt;/h1&gt;;
  }
}</code></pre>
</li>
</ul>
<hr>
<h2 id="클래스형-컴포넌트-왜-중요한가">클래스형 컴포넌트: 왜 중요한가?</h2>
<p>클래스형 컴포넌트는 React 초창기부터 사용된 방식이에요. 
<code>render()</code> 메서드 안에 JSX를 반환해야 한다는 규칙이 있어요.<br>작성한 코드 예제를 보면 이런 구조입니다:</p>
<pre><code class="language-jsx">class App extends React.Component {
    render() {
        return (
            &lt;h1 title=&quot;This works!&quot;&gt;
                Hi, &lt;span&gt;this&lt;/span&gt; is ReactJS!
            &lt;/h1&gt;
        );
    }
}

export default App;</code></pre>
<p>이 코드를 분석해 보면:</p>
<ul>
<li><strong><code>class App extends React.Component</code></strong>:  
<code>App</code>이라는 클래스는 React 컴포넌트를 확장한 것입니다. 
즉, React에서 제공하는 기능을 사용할 수 있게 됩니다.</li>
<li><strong><code>render()</code> 메서드</strong>:  
이 메서드는 React가 컴포넌트를 화면에 렌더링할 때 호출됩니다. 
여기서 반환하는 내용(JSX)이 실제로 브라우저 화면에 표시됩니다.</li>
<li><strong>JSX 코드</strong>:  
<code>&lt;h1&gt;</code> 태그와 그 안의 내용이 반환됩니다. 
React는 이 JSX를 HTML로 변환해서 DOM에 렌더링합니다.</li>
</ul>
<hr>
<h2 id="최신-react에서는-함수형-컴포넌트를-사용">최신 React에서는 함수형 컴포넌트를 사용</h2>
<p>React는 더 간단하고 성능이 좋은 <strong>함수형 컴포넌트</strong>를 권장합니다. 
이유는 함수형 컴포넌트가:</p>
<ul>
<li>작성하기 쉽고 코드가 더 간결합니다.</li>
<li>React의 최신 기능인 <strong>Hooks</strong>를 지원합니다.</li>
<li>클래스형 컴포넌트보다 성능이 약간 더 좋습니다.</li>
</ul>
<p>위 클래스형 컴포넌트 코드를 함수형 컴포넌트로 바꾼다면 이렇게 됩니다:</p>
<pre><code class="language-jsx">const App = () =&gt; {
    return (
        &lt;h1 title=&quot;This works!&quot;&gt;
            Hi, &lt;span&gt;this&lt;/span&gt; is ReactJS!
        &lt;/h1&gt;
    );
};

export default App;</code></pre>
<hr>
<h2 id="jsx-코드-작성-시-주의할-점">JSX 코드 작성 시 주의할 점</h2>
<p>JSX를 작성할 때는 몇 가지 규칙을 지켜야 React가 제대로 이해할 수 있어요.</p>
<ol>
<li><p><strong>JSX 코드는 반드시 반환(return)해야 한다.</strong></p>
<pre><code class="language-jsx">const MyComponent = () =&gt; {
    return &lt;h1&gt;Hello, React!&lt;/h1&gt;;
};</code></pre>
</li>
<li><p><strong>JSX에 사용되는 컴포넌트 이름은 대문자로 시작해야 한다.</strong><br>React는 대문자로 시작하는 컴포넌트를 사용자 정의 컴포넌트로 인식합니다.<br>소문자로 시작하면 일반 HTML 태그로 간주합니다.</p>
<pre><code class="language-jsx">const MyComponent = () =&gt; {
    return &lt;CustomComponent /&gt;;
};</code></pre>
</li>
<li><p><strong>React 컴포넌트는 JSX 또는 <code>React.createElement</code>를 반환해야 한다.</strong>
React 컴포넌트는 HTML-like 코드를 반환해야 합니다. 단순히 객체를 반환하면 컴포넌트로 동작하지 않습니다.</p>
<pre><code class="language-jsx">const InvalidComponent = () =&gt; {
    return { message: &quot;This is not valid!&quot; }; // 컴포넌트로 동작하지 않음
};</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[React: JSX와 React의 역할 정리]]></title>
            <link>https://velog.io/@boss_teemo/React-JSX%EC%99%80-React%EC%9D%98-%EC%97%AD%ED%95%A0-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@boss_teemo/React-JSX%EC%99%80-React%EC%9D%98-%EC%97%AD%ED%95%A0-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 30 Dec 2024 14:39:24 GMT</pubDate>
            <description><![CDATA[<p>React를 사용할 때 필수로 알아야 할 몇 가지 개념이 있습니다. 
이번 글에서는 JSX 사용 시 React의 역할과 함께 알아야 할 중요한 포인트를 정리해봤습니다.</p>
<hr>
<h2 id="jsx를-사용할-때-react를-import해야-하는-이유">JSX를 사용할 때 React를 import해야 하는 이유</h2>
<p>React를 사용할 때는 JSX를 작성하기 위해 <strong>React를 import</strong>해야 합니다. 
재미있는 점은, 코드에서 React 객체를 직접 사용하지 않더라도 반드시 import를 해야 한다는 것입니다. 
이유는 JSX가 JavaScript의 확장 문법이기 때문인데요, 
결국 이 문법은 <strong><code>React.createElement</code></strong> 를 호출하는 형태로 변환되기 때문에 <code>React</code> 가 필요합니다.</p>
<pre><code class="language-jsx">import React from &#39;react&#39;;

const MyComponent = () =&gt; {
  return &lt;h1&gt;Hello, React!&lt;/h1&gt;;
};</code></pre>
<p>위 코드에서 <code>React</code>를 직접 사용하지 않지만, JSX를 변환하는 과정에서 React가 필요하기 때문에 import가 반드시 포함되어야 합니다.</p>
<hr>
<h2 id="syntactic-sugar란">syntactic sugar란?</h2>
<p>위에서 언급한 JSX는 JavaScript의 <strong>syntactic sugar(문법적 설탕)</strong>입니다. 
쉽게 말하면, 코드를 더 읽기 쉽게 만들어주는 문법적 도구라는 뜻이죠. 
JSX를 사용하면 HTML처럼 직관적으로 UI 구조를 작성할 수 있습니다. 
예를 들어 아래 두 코드는 같은 기능을 하지만, JSX가 훨씬 간단하고 이해하기 쉽습니다.</p>
<h3 id="jsx-사용">JSX 사용</h3>
<pre><code class="language-jsx">const element = &lt;h1&gt;Hello, World!&lt;/h1&gt;;</code></pre>
<h3 id="jsx를-사용하지-않은-경우">JSX를 사용하지 않은 경우</h3>
<pre><code class="language-jsx">const element = React.createElement(&#39;h1&#39;, null, &#39;Hello, World!&#39;);</code></pre>
<hr>
<h2 id="react의-역할">React의 역할</h2>
<p>React는 우리가 작성한 JSX나 <code>React.createElement</code>로 정의한 내용을 브라우저가 이해할 수 있는 DOM 명령어로 변환해줍니다. 
이렇게 React는 <strong>어떤 요소를 렌더링할지</strong> 알려주는 역할을 합니다. 
예를 들어, JSX로 작성한 코드가 실제 브라우저 화면에 표시되기까지의 과정은 다음과 같습니다.</p>
<blockquote>
</blockquote>
<ol>
<li>개발자가 JSX로 작성한 UI 구조를 React가 읽는다.</li>
<li>React는 이를 브라우저가 이해할 수 있는 DOM 요소로 변환한다.</li>
<li>변환된 DOM 요소가 브라우저에 렌더링된다.</li>
</ol>
<hr>
<h2 id="속성-예시-title-속성과-tool-tip">속성 예시: title 속성과 tool tip</h2>
<p>React에서 JSX를 사용할 때, HTML의 속성을 그대로 작성할 수 있습니다. 
예를 들어, <code>title</code> 속성을 추가하면 <strong>tool tip</strong>(툴팁) 효과를 사용할 수 있습니다. 
사용자가 해당 요소 위에 마우스를 올리면 간단한 설명이 표시됩니다.</p>
<h3 id="예제">예제</h3>
<pre><code class="language-jsx">const MyTooltip = () =&gt; {
  return &lt;h1 title=&quot;Hello, this is a tooltip!&quot;&gt;Hover over me&lt;/h1&gt;;
};</code></pre>
<p>위 코드를 실행하면, 화면에 <code>&lt;h1&gt;</code> 태그가 표시되고, 
마우스를 올리면 &quot;Hello, this is a tooltip!&quot;이라는 작은 팝업이 나타납니다.</p>
<hr>
<p>React의 핵심은 우리가 직관적으로 UI를 설계하고, 
나머지 복잡한 작업은 React에 맡길 수 있다는 점입니다. 
JSX와 React의 역할을 명확히 이해하면 더 깔끔하고 효율적인 코드 작성을 할 수 있습니다.</p>
<p>이 글을 통해 JSX와 React의 역할을 좀 더 명확히 이해할 수 있을 거예요. 
추가로 포함하고 싶은 내용이나 수정 사항이 있다면 말씀해주세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React: 선언형 접근과 컴포넌트란?]]></title>
            <link>https://velog.io/@boss_teemo/React-%EC%84%A0%EC%96%B8%ED%98%95-%EC%A0%91%EA%B7%BC%EA%B3%BC-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80</link>
            <guid>https://velog.io/@boss_teemo/React-%EC%84%A0%EC%96%B8%ED%98%95-%EC%A0%91%EA%B7%BC%EA%B3%BC-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%9E%80</guid>
            <pubDate>Mon, 30 Dec 2024 13:57:21 GMT</pubDate>
            <description><![CDATA[<p>React는 서버에서 실행되는 것도 아니고, 데이터베이스와 직접 연결되는 기술도 아니다. 
대신, 최신 웹 애플리케이션에서 동적이고 반응적인 사용자 인터페이스(UI)를 쉽게 만들 수 있게 도와주는 라이브러리다. 
특히 <strong>선언형(declarative)</strong> 방식을 사용해서 개발자가 결과에만 집중할 수 있도록 돕는다.</p>
<hr>
<h2 id="선언형과-명령형-뭐가-다를까">선언형과 명령형, 뭐가 다를까?</h2>
<p>React는 &quot;어떤 상태에서는 어떤 화면이 나와야 하는지&quot;만 정의하면 된다. 
반면, 기존의 <strong>명령형(imperative)</strong> 방식은 화면을 만들기 위해 어떤 과정을 거칠지 하나하나 작성해야 한다.</p>
<h3 id="명령형-방식">명령형 방식</h3>
<ul>
<li>기존 JavaScript를 쓸 때 사용하는 방식이다.</li>
<li>예를 들어 버튼 색깔을 바꾸려면, 버튼을 찾아서, 색깔을 지정하는 과정을 직접 써야 한다.</li>
<li>단계가 많고 복잡해질수록 코드가 지저분해지고, 관리하기도 어려워진다.</li>
</ul>
<h3 id="선언형-방식">선언형 방식</h3>
<ul>
<li>React는 결과만 정의하면 된다. &quot;이 버튼이 클릭되었을 때, 이렇게 보여라&quot; 같은 식으로 작성하면 된다.</li>
<li>어떻게 바꿀지는 React가 알아서 처리한다.</li>
<li>덕분에 코드가 깔끔하고 유지보수가 쉬워진다.</li>
</ul>
<hr>
<h2 id="컴포넌트-react의-기본-단위">컴포넌트: React의 기본 단위</h2>
<p>React에서는 UI를 <strong>컴포넌트(Component)</strong>라는 단위로 나눠서 만든다. 컴포넌트는 독립적으로 동작하는 작은 조각이라고 생각하면 된다. 버튼, 입력 창, 사용자 목록 같은 걸 각각 하나의 컴포넌트로 만들 수 있다.</p>
<h3 id="컴포넌트의-장점">컴포넌트의 장점</h3>
<ul>
<li><strong>독립적</strong>: 각 컴포넌트는 필요한 데이터와 로직을 스스로 처리한다.</li>
<li><strong>재사용 가능</strong>: 한 번 만든 컴포넌트를 다른 곳에서도 반복적으로 사용할 수 있다. 예를 들어, 버튼 컴포넌트를 만들어 두면 다른 화면에서도 그대로 쓸 수 있다.</li>
<li><strong>구조적 설계</strong>: UI를 잘게 나누니까, 애플리케이션이 커져도 관리가 쉬워진다.</li>
</ul>
<hr>
<h2 id="예시">예시</h2>
<p>사용자 목록을 보여주는 UI를 만든다고 해보자.</p>
<ul>
<li>명령형 방식에서는 사용자를 하나하나 화면에 추가하는 과정을 직접 작성해야 한다.</li>
<li>선언형 방식에서는 &quot;이 상태에서는 이 목록을 보여줘&quot;라고 정의만 하면 React가 알아서 그려준다.</li>
</ul>
<p>React는 이런 선언형 접근과 컴포넌트 기반 개발을 결합해서 복잡한 UI도 쉽게 만들 수 있도록 도와준다. 덕분에 개발자는 더 직관적으로 코드를 작성할 수 있고, 사용자 경험도 더 좋아진다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Expo CLI 6.0.0 이후 Dev Tools 웹 UI가 열리지 않는 문제와 해결 방법]]></title>
            <link>https://velog.io/@boss_teemo/Expo-CLI-6.0.0-%EC%9D%B4%ED%9B%84-Dev-Tools-%EC%9B%B9-UI%EA%B0%80-%EC%97%B4%EB%A6%AC%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@boss_teemo/Expo-CLI-6.0.0-%EC%9D%B4%ED%9B%84-Dev-Tools-%EC%9B%B9-UI%EA%B0%80-%EC%97%B4%EB%A6%AC%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%AC%B8%EC%A0%9C%EC%99%80-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Fri, 08 Nov 2024 05:30:55 GMT</pubDate>
            <description><![CDATA[<p>Expo CLI를 최신 버전(6.0.0 이상)으로 업데이트한 후, <code>npx expo start</code> 명령어로 프로젝트를 실행했을 때 기존의 <strong>Dev Tools 웹 UI가 열리지 않는</strong> 문제를 겪었습니다. 이 글에서는 문제의 원인과 해결 방법을 공유합니다.</p>
<hr>
<h2 id="문제-요약">문제 요약</h2>
<p>이전 버전의 Expo CLI에서는 프로젝트 실행 시 브라우저에서 Dev Tools 웹 UI가 자동으로 열리며 QR 코드 스캔, 연결 모드 변경, 시뮬레이터 실행 등을 쉽게 할 수 있었습니다. 
그러나 최신 Expo CLI에서는 Dev Tools 웹 UI가 더 이상 지원되지 않으며, 대신 모든 작업을 <strong>CLI 명령어로 수행해야</strong> 합니다.</p>
<hr>
<h2 id="원인">원인</h2>
<p>Expo 팀은 Expo CLI 6.0.0부터 <strong>Dev Tools 웹 UI를 지원하지 않기로 결정</strong>했습니다. 이를 통해 더 가볍고 빠른 개발 환경을 제공하려는 목적입니다. 이제 CLI에서 필요한 모든 작업을 수행하도록 변경되었습니다.</p>
<hr>
<h2 id="해결-방법">해결 방법</h2>
<h3 id="cli에서-dev-tools-기능-사용하기">CLI에서 Dev Tools 기능 사용하기</h3>
<p>이제는 CLI에서 Dev Tools의 대부분의 기능을 수행할 수 있습니다. 자주 사용하는 명령어는 다음과 같습니다.</p>
<blockquote>
<p><strong>프로젝트 실행 (터널링 모드)</strong>
<code>npx expo start --tunnel</code></p>
</blockquote>
<p>터널 모드는 로컬 네트워크에 구애받지 않고 앱을 실행할 수 있게 해줍니다. CLI가 자동으로 ngrok을 설치해 주며, 모바일 디바이스에서 QR 코드로 연결할 수 있습니다.</p>
<blockquote>
</blockquote>
<p><strong>기타 주요 CLI 명령어</strong></p>
<ul>
<li><code>a</code>: Android 에뮬레이터에서 앱 실행</li>
<li><code>i</code>: iOS 시뮬레이터에서 앱 실행</li>
<li><code>r</code>: 앱 리로드</li>
<li><code>?</code>: 전체 명령어 목록 보기</li>
</ul>
<p>이제 CLI에서 이 명령어들로 Dev Tools 없이도 대부분의 작업을 처리할 수 있습니다.</p>
<hr>
<h3 id="이전-dev-tools-웹-ui가-필요한-경우">이전 Dev Tools 웹 UI가 필요한 경우</h3>
<p>웹 UI가 꼭 필요하다면, Expo CLI 5.x 버전으로 다운그레이드하여 사용할 수 있습니다. 하지만 최신 기능을 사용할 수 없고, 장기적인 해결책은 아니므로 추천하지는 않습니다.</p>
<blockquote>
</blockquote>
<p><code>npm install -g expo-cli@5.0.2</code></p>
<hr>
<h2 id="결론">결론</h2>
<p>Expo CLI의 최신 버전에서는 Dev Tools 웹 UI가 사라졌지만, CLI 명령어만으로도 필요한 작업을 충분히 수행할 수 있습니다. CLI에 익숙해지는 것이 향후 효율적인 개발에 도움이 될 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native 프로젝트 생성하기: Expo CLI vs React Native CLI]]></title>
            <link>https://velog.io/@boss_teemo/React-Native-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0-Expo-CLI-vs-React-Native-CLI</link>
            <guid>https://velog.io/@boss_teemo/React-Native-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0-Expo-CLI-vs-React-Native-CLI</guid>
            <pubDate>Sat, 02 Nov 2024 08:24:03 GMT</pubDate>
            <description><![CDATA[<p>React Native를 사용해 모바일 애플리케이션 개발을 시작할 때, 
개발자는 두 가지 주요 CLI(명령줄 인터페이스) 도구 중 하나를 선택해야 합니다.
Expo CLI와 React Native CLI가 그 주인공입니다. 
두 CLI는 React Native 프로젝트 생성에 필요한 도구와 구성을 제공하지만, 
각 도구가 가진 특징과 사용 방식이 다릅니다. 
이 글에서는 두 CLI의 차이점과 장단점을 알아보고, 상황에 맞는 도구 선택에 대한 가이드를 제시하겠습니다.</p>
<hr>
<h2 id="expo-cli란">Expo CLI란?</h2>
<p>Expo는 React Native 프레임워크 위에서 작동하는 툴킷으로, 
빠르고 쉽게 프로젝트를 생성하고 개발할 수 있게 해주는 툴입니다. 
Expo CLI는 특히 초보자에게 직관적이고 쉬운 환경을 제공하며, 
다양한 기능과 서비스를 내장하고 있습니다.</p>
<h3 id="expo-cli의-장점">Expo CLI의 장점</h3>
<pre><code>1.    빠른 초기 설정: 
    Expo CLI는 기본적인 프로젝트 설정을 자동으로 제공해, 
    빠르게 프로젝트를 시작할 수 있습니다. 
    Node.js와 Expo만 설치하면 별도의 환경 설정 없이 
    바로 앱을 개발할 수 있습니다.

2.    간단한 빌드 및 배포: 
    Expo는 앱을 빌드하고 배포할 수 있는 Expo Go 앱을 제공하여,
    기기에서 즉시 앱을 테스트할 수 있습니다. 
    복잡한 빌드 설정이 필요 없기 때문에, 
    실제 기기에서 코드 수정 사항을 빠르게 확인할 수 있습니다.

3.    Cross-Platform 지원 강화: 
    iOS와 Android 플랫폼 간 코드의 일관성이 높아 
    플랫폼 간 문제를 줄일 수 있습니다.

4.    다양한 라이브러리 및 API 내장: 
    Expo SDK에는 카메라, 위치 서비스, 푸시 알림 등 
    다양한 기능이 내장되어 있어 별도의 설치 없이 사용할 수 있습니다.

5.    OTA 업데이트: 
    Expo는 앱 스토어에 다시 제출할 필요 없이 
    OTA(Over-the-Air) 업데이트를 지원하여 
    코드 수정 시 앱을 바로 업데이트할 수 있습니다.</code></pre><h3 id="expo-cli의-단점">Expo CLI의 단점</h3>
<pre><code>1.    네이티브 모듈 제한: 
    Expo는 자체 환경에서 지원하는 네이티브 모듈에 한해 사용할 수 있습니다. 
    특정 네이티브 기능(예: Bluetooth 또는 배터리 상태 모니터링 등)
    을 필요로 하는 경우, Expo로는 제한이 있을 수 있습니다.

2.    앱 사이즈 증가: 
    Expo SDK가 포함된 상태로 앱이 빌드되므로, 
    앱 크기가 일반 React Native 앱보다 더 커질 수 있습니다.

3.    Expo 관리에서 벗어나면 복잡성 증가: 
    Expo 환경을 벗어나 Ejected Mode로 전환하면, 
    Expo CLI의 단순한 장점이 사라지고 
    React Native CLI와 동일하게 환경 설정을 해야 합니다.</code></pre><hr>
<h2 id="react-native-cli란">React Native CLI란?</h2>
<p>React Native CLI는 Expo 없이 순수한 React Native 프로젝트를 생성할 때 사용하는 기본 CLI입니다. 
개발자가 iOS와 Android의 네이티브 코드를 직접 수정하거나, 특정 네이티브 모듈을 추가할 수 있습니다.</p>
<h3 id="react-native-cli의-장점">React Native CLI의 장점</h3>
<pre><code>1.    네이티브 코드 접근 가능: 
    React Native CLI는 iOS와 Android의 네이티브 코드를 직접 수정할 수 있어, 
    앱을 보다 유연하게 커스터마이징할 수 있습니다. 
    Bluetooth, AR, 배터리 모니터링 등 
    다양한 네이티브 기능을 손쉽게 추가할 수 있습니다.

2.    네이티브 모듈 설치 자유로움: 
    Expo의 제약을 받지 않고 커뮤니티에서 제공하는 
    모든 React Native 패키지를 자유롭게 설치할 수 있습니다.

3.    프로젝트 사이즈 관리 가능: 
    필요하지 않은 패키지나 모듈을 제외하고 필요한 기능만 추가할 수 있어 
    앱의 최종 용량을 효율적으로 관리할 수 있습니다.

4.    개발 환경의 확장성: 
    React Native CLI는 Expo에 비해 복잡한 애플리케이션이나
    고급 네이티브 기능을 필요로 하는 프로젝트에 적합합니다.</code></pre><h3 id="react-native-cli의-단점">React Native CLI의 단점</h3>
<pre><code>1.    복잡한 초기 설정: 
    React Native CLI는 iOS와 Android 네이티브 환경 설정이 필요하여, 
    초보자가 처음 설정할 때 어려움을 겪을 수 있습니다. 
    특히 iOS의 경우 macOS에서만 빌드 가능하여, 
    Mac이 없는 개발자에게는 불편할 수 있습니다.

2.    빌드 및 배포가 번거로움: 
    Expo의 간단한 빌드 기능과 달리, React Native CLI는
    Xcode나 Android Studio를 통해 빌드하고 배포해야 합니다. 
    이러한 과정은 시간이 많이 걸릴 수 있습니다.

3.    OTA 업데이트 미지원: 
    React Native CLI는 OTA 업데이트 기능이 없기 때문에, 
    앱 스토어에 재배포가 필요할 때마다 새 버전을 제출해야 합니다.</code></pre><hr>
<h2 id="expo-cli-vs-react-native-cli-어떤-것을-선택해야-할까">Expo CLI vs React Native CLI: 어떤 것을 선택해야 할까?</h2>
<p>아래는 프로젝트 상황에 따라 어떤 CLI를 선택하면 좋을지에 대한 가이드입니다:</p>
<pre><code>Expo CLI 추천:

•    프로젝트의 빠른 프로토타입이나 MVP를 제작할 때
•    기본적인 기능만으로 충분한 앱을 만들 때
•    다양한 빌드 환경에 익숙하지 않거나, 초기 개발자일 경우
•    OTA 업데이트나 다양한 내장 기능을 간편하게 사용하고 싶을 때
•    React Native CLI 추천:
•    앱에서 특정 네이티브 기능을 필요로 할 때 
    (예: Bluetooth, 네이티브 UI 커스터마이징 등)
•    프로젝트의 확장성이 중요하고, iOS와 Android 코드에 직접 접근하여 제어해야 할 때
•    앱의 최적화가 필요하고, 불필요한 기능을 제외해 앱 용량을 최소화하고자 할 때
•    OTA 업데이트가 필수적이지 않고, 앱 스토어 재배포 과정이 문제되지 않을 때</code></pre><hr>
<h2 id="결론">결론</h2>
<p>Expo CLI와 React Native CLI는 각각의 장단점이 명확합니다. 
Expo CLI는 빠른 설정과 간편한 배포를 지원하지만, 네이티브 모듈 사용에 제약이 있습니다. 
반면, React Native CLI는 복잡한 설정을 요구하지만 네이티브 기능을 자유롭게 사용할 수 있어 고급 기능이 필요한 애플리케이션 개발에 적합합니다. 
개발 목적과 프로젝트의 복잡성을 고려하여 적절한 CLI를 선택하는 것이 중요합니다.</p>
<p>이 글을 통해 Expo CLI와 React Native CLI의 차이점과 장단점을 이해하고, 자신의 프로젝트에 맞는 도구를 선택하는 데 도움이 되었기를 바랍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native의 UI 컴포넌트와 JavaScript 로직의 처리 방식]]></title>
            <link>https://velog.io/@boss_teemo/React-Native%EC%9D%98-UI-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%99%80-JavaScript-%EB%A1%9C%EC%A7%81%EC%9D%98-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@boss_teemo/React-Native%EC%9D%98-UI-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EC%99%80-JavaScript-%EB%A1%9C%EC%A7%81%EC%9D%98-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Wed, 30 Oct 2024 09:42:43 GMT</pubDate>
            <description><![CDATA[<p>React Native는 iOS와 Android의 네이티브 앱을 JavaScript와 React를 기반으로 구축할 수 있는 강력한 프레임워크입니다. 
특히, 웹 개발에서 사용하는 HTML과 유사한 JSX 문법을 활용해 네이티브 UI 컴포넌트를 구성하며, JavaScript 로직은 별도의 스레드에서 처리하여 성능을 높입니다.</p>
<hr>
<h2 id="1-주요-ui-컴포넌트-view-와-text">1. 주요 UI 컴포넌트: <code>&lt;View&gt;</code> 와 <code>&lt;Text&gt;</code></h2>
<p>React Native에서는 HTML 요소인 <code>&lt;div&gt;</code> 나 <code>&lt;span&gt;</code> 대신,
네이티브 플랫폼 전용 컴포넌트인 <code>&lt;View&gt;</code>와 <code>&lt;Text&gt;</code>를 제공합니다. 
이러한 컴포넌트는 React Native가 자동으로 네이티브 코드로 변환하여, iOS와 Android의 UI 요소로 렌더링됩니다.</p>
<pre><code>•    &lt;View&gt;: 레이아웃 및 UI 구조를 구성하는 컴포넌트로, HTML의 &lt;div&gt;와 유사하지만 네이티브 환경에 맞게 최적화되어 렌더링됩니다.

•    &lt;Text&gt;: 텍스트 표시를 위한 컴포넌트로, HTML의 &lt;span&gt;이나 &lt;p&gt;와 유사한 역할을 합니다. 네이티브 플랫폼에서 텍스트 렌더링이 최적화됩니다.</code></pre><blockquote>
<p>이처럼 React Native는 네이티브 환경에 최적화된 UI 컴포넌트를 사용하여 네이티브 수준의 사용자 경험을 제공합니다.</p>
</blockquote>
<hr>
<h2 id="2-javascript-로직의-처리-방식-네이티브와의-상호작용">2. JavaScript 로직의 처리 방식: 네이티브와의 상호작용</h2>
<p>React Native는 UI 렌더링과 JavaScript 로직을 분리하여 성능을 극대화합니다. 
UI 요소는 네이티브 코드로 컴파일되지만, 상태 관리, 조건문 등 JavaScript로 작성된 로직은 네이티브 앱 내에서 JavaScript 스레드에서 실행됩니다. 
이는 React Native가 네이티브 플랫폼과 상호작용하는 효율적인 방식을 제공합니다.</p>
<h3 id="javascript-스레드의-역할">JavaScript 스레드의 역할</h3>
<blockquote>
<p>JavaScript 스레드는 React Native 앱 내에서 상태 관리 및 로직 처리 등을 담당합니다.
이 스레드 덕분에 JavaScript 로직은 네이티브 플랫폼에 직접 접근하지 않더라도, 네이티브 앱의 일부로서 필요한 작업을 수행할 수 있습니다.</p>
</blockquote>
<br>

<h3 id="네이티브-브리지-구조">네이티브 브리지 구조</h3>
<p>React Native는 JavaScript와 네이티브 코드(iOS의 Swift, Android의 Kotlin 등) 사이의 소통을 위해 “브리지” 구조를 사용합니다. 
이 구조는 두 환경 간의 데이터 전송을 가능하게 하여, JavaScript와 네이티브 모듈이 필요한 기능을 서로 호출할 수 있게 합니다.</p>
<blockquote>
</blockquote>
<ol>
<li>JavaScript에서 네이티브 모듈 호출: JavaScript 로직이 네이티브 기능을 요청할 때, 이 브리지를 통해 네이티브 모듈에 호출을 보냅니다.<br></li>
<li>네이티브 모듈에서 JavaScript로 데이터 반환: 네이티브 모듈이 요청에 응답하면, 브리지를 통해 JavaScript 스레드로 데이터를 반환합니다.</li>
</ol>
<p>이 브리지 구조는 React Native가 다양한 네이티브 기능을 활용하면서도, JavaScript로 작성된 코드가 네이티브 기능과 상호작용할 수 있도록 지원하는 핵심입니다.</p>
<hr>
<h2 id="3-react-native의-아키텍처와-성능-최적화">3. React Native의 아키텍처와 성능 최적화</h2>
<p>React Native의 아키텍처는 JavaScript로 개발된 로직과 네이티브 UI의 효율적인 구분에 기반을 두고 있어, 애플리케이션의 성능을 유지하면서도 재사용성과 개발 속도를 높입니다. 
그러나 브리지를 통해 JavaScript와 네이티브 간 통신이 잦아지면 성능 저하가 발생할 수 있어, 성능 최적화를 위해 네이티브 모듈을 적절히 활용하는 것이 중요합니다.</p>
<blockquote>
<p>React Native는 JavaScript의 유연성과 네이티브 성능을 조화롭게 활용하여, 웹 개발자도 네이티브 앱을 효율적으로 개발할 수 있는 강력한 도구입니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native와 React.js의 차이점, 그리고 플랫폼 독립성의 이해]]></title>
            <link>https://velog.io/@boss_teemo/React-Native%EC%99%80-React.js%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%8C%EB%9E%AB%ED%8F%BC-%EB%8F%85%EB%A6%BD%EC%84%B1%EC%9D%98-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@boss_teemo/React-Native%EC%99%80-React.js%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%8C%EB%9E%AB%ED%8F%BC-%EB%8F%85%EB%A6%BD%EC%84%B1%EC%9D%98-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Wed, 30 Oct 2024 09:07:43 GMT</pubDate>
            <description><![CDATA[<h2 id="1-플랫폼-독립성platform-agnostic이란">1. 플랫폼 독립성(platform-agnostic)이란?</h2>
<p>React.js는 웹과 모바일 등 다양한 플랫폼에 적용될 수 있는 “플랫폼 독립성(platform-agnostic)”을 갖춘 프레임워크입니다. 
일반적으로 한 플랫폼에서 개발된 애플리케이션을 다른 플랫폼으로 옮기는 일에는 추가 작업이 필요하지만, React.js는 그 자체로 플랫폼에 구애받지 않고 모든 환경에서 사용될 수 있는 공통의 개발 언어(JavaScript)를 기반으로 합니다.</p>
<p>React.js는 기본적으로 UI 컴포넌트의 작성에 특화되어 있어, 웹 환경과 모바일 환경 모두에서 사용자 인터페이스(UI)를 구축하는 데 적합합니다.</p>
<hr>
<h2 id="2-reactjs와-react-native의-조합-다중-플랫폼-애플리케이션의-개발-방식">2. React.js와 React Native의 조합: 다중 플랫폼 애플리케이션의 개발 방식</h2>
<p>React.js는 웹 애플리케이션뿐만 아니라 모바일 애플리케이션 개발에도 적용할 수 있으며, 여기서 React DOM과 React Native의 조합이 중요한 역할을 합니다. 각 조합은 아래와 같은 목적과 방식으로 사용됩니다:</p>
<pre><code>•    React.js + React DOM = 웹 애플리케이션</code></pre><p>React DOM은 웹 브라우저에서 실행되는 애플리케이션을 위한 JavaScript 렌더링 엔진으로, HTML과 CSS를 통해 UI를 구성합니다. React.js와 React DOM을 결합해 브라우저에서 동작하는 웹 애플리케이션을 개발할 수 있습니다.</p>
<br>

<pre><code>•    React.js + React Native = 네이티브 모바일 애플리케이션</code></pre><p>React Native는 iOS와 Android 환경에서 모두 동작하는 실제 네이티브 모바일 애플리케이션을 개발할 수 있게 합니다. JavaScript와 JSX(React의 확장된 문법)를 사용해 네이티브 컴포넌트를 렌더링함으로써 성능을 높이고, JavaScript 기반 UI 라이브러리의 유연성을 유지합니다.</p>
<blockquote>
<p>React Native의 등장으로 인해, 
웹과 모바일 환경에서 일관된 사용자 경험을 제공하면서 코드 재사용성을 극대화하는 것이 가능해졌습니다.</p>
</blockquote>
<hr>
<h2 id="3-react-native와-네이티브-개발의-차이점">3. React Native와 네이티브 개발의 차이점</h2>
<p>React Native는 JavaScript를 사용하여 네이티브 플랫폼에서 앱을 실행할 수 있게 합니다. 기존의 네이티브 개발(iOS의 Swift, Android의 Kotlin 등)과 달리, React Native는 단일 코드베이스로 iOS와 Android를 모두 지원하여 개발 속도와 유지 보수성을 높일 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[VSCode에서 `styled-components` 자동완성 문제: `import` 대신 `require`가 발생하는 원인과 해결 방법]]></title>
            <link>https://velog.io/@boss_teemo/VSCode%EC%97%90%EC%84%9C-styled-components-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%EB%AC%B8%EC%A0%9C-import-%EB%8C%80%EC%8B%A0-require%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%9B%90%EC%9D%B8%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@boss_teemo/VSCode%EC%97%90%EC%84%9C-styled-components-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%EB%AC%B8%EC%A0%9C-import-%EB%8C%80%EC%8B%A0-require%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%9B%90%EC%9D%B8%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sun, 18 Aug 2024 14:28:06 GMT</pubDate>
            <description><![CDATA[<h3 id="상황"><strong>상황</strong></h3>
<p>프론트엔드 개발 중, <code>styled-components</code>를 사용하여 스타일을 작성하던 중, VSCode에서 <code>styled-components</code>를 자동완성할 때 <code>import</code> 대신 <code>require</code> 문법이 자동으로 입력되는 문제가 발생함. 기존에는 <code>import</code> 구문이 정상적으로 작동했으나, 어느 순간부터 자동완성 기능이 다음과 같이 변경됨:</p>
<pre><code class="language-javascript">const { default: styled } = require(&quot;styled-components&quot;);</code></pre>
<p>이로 인해 코드 일관성이 깨지고, 불편함이 생김.</p>
<hr>
<h3 id="예상되는-원인"><strong>예상되는 원인</strong></h3>
<ol>
<li><p><strong>VSCode 설정 변경</strong></p>
<ul>
<li><code>jsconfig.json</code> 또는 <code>tsconfig.json</code> 파일에서 모듈 시스템이 <code>ES6</code>에서 <code>commonjs</code>로 변경되었을 가능성.</li>
<li>새 파일 생성 시 자동으로 생성된 <code>jsconfig.json</code>에서 <code>module</code> 옵션이 <code>commonjs</code>로 설정되었을 수 있음.</li>
</ul>
</li>
<li><p><strong>확장 프로그램 설치 또는 업데이트</strong></p>
<ul>
<li><code>styled-components</code> 관련 확장 프로그램 또는 ESLint, Prettier와 같은 코드 포매터가 업데이트되면서 설정이 변경되었을 가능성.</li>
<li>특정 확장 프로그램이 <code>require</code> 문법을 기본으로 설정하여 자동완성 기능에 영향을 미쳤을 수 있음.</li>
</ul>
</li>
<li><p><strong>VSCode의 업데이트</strong></p>
<ul>
<li>VSCode 자체가 업데이트되면서 일부 설정이 초기화되거나 변경되었을 가능성.</li>
</ul>
</li>
<li><p><strong>Node.js 또는 패키지 변경</strong></p>
<ul>
<li>Node.js 버전이 변경되면서, 또는 프로젝트 내에서 사용하는 Node.js 버전이 변경되면서 모듈 시스템의 기본 설정이 달라졌을 수 있음.</li>
<li><code>styled-components</code>와 관련된 패키지가 업데이트되면서 설정 파일이 변경되었을 가능성.</li>
</ul>
</li>
</ol>
<hr>
<h3 id="해결-방법"><strong>해결 방법</strong></h3>
<p>문제를 해결하기 위해 다양한 방법을 시도했지만, 최종적으로 1번 방법인 <code>jsconfig.json</code> 파일의 수정으로 해결함.</p>
<ol>
<li><p><strong><code>jsconfig.json</code> 파일 수정</strong> (문제 해결 방법)</p>
<ul>
<li><code>jsconfig.json</code> 파일을 열어 <code>&quot;module&quot;: &quot;commonjs&quot;</code>로 설정된 부분을 <code>&quot;module&quot;: &quot;ES6&quot;</code>로 변경.</li>
<li>이 방법으로 문제를 해결할 수 있었으며, 이후 자동완성에서 <code>import</code> 문법이 다시 정상적으로 작동함.</li>
<li>예시:</li>
</ul>
<pre><code class="language-json">{
  &quot;compilerOptions&quot;: {
    &quot;module&quot;: &quot;ES6&quot;,
    &quot;paths&quot;: {
      &quot;@/*&quot;: [&quot;./*&quot;]
    }
  }
}</code></pre>
</li>
<li><p><strong>(시도했지만 효과가 없었던 방법) 확장 프로그램 비활성화</strong></p>
<ul>
<li><code>styled-components</code> 관련 확장 프로그램을 비활성화하거나 삭제.</li>
<li>특정 확장 프로그램이 문제를 일으킬 수 있으므로, 비활성화 후 다시 자동완성을 확인했지만, 문제는 해결되지 않음.</li>
</ul>
</li>
<li><p><strong>(시도했지만 효과가 없었던 방법) VSCode 설정 초기화</strong></p>
<ul>
<li>VSCode의 설정을 기본값으로 초기화하고, 필요한 경우 <code>settings.json</code> 파일을 수정.</li>
<li>설정 파일에서 잘못된 설정이 없는지 확인하고, <code>import</code>와 <code>require</code> 관련 설정을 리셋했지만, 문제는 지속됨.</li>
</ul>
</li>
<li><p><strong>(시도했지만 효과가 없었던 방법) 캐시 정리 및 VSCode 재설치</strong></p>
<ul>
<li>VSCode의 캐시를 정리하거나, 문제가 지속될 경우 VSCode를 재설치하여 초기 상태로 되돌림.</li>
<li>캐시를 삭제하고 VSCode를 재설치해도 문제는 해결되지 않음.</li>
</ul>
</li>
<li><p><strong>(시도했지만 효과가 없었던 방법) Node.js 버전 및 패키지 관리</strong></p>
<ul>
<li>Node.js와 관련 패키지를 최신 상태로 유지하고, 문제가 발생하기 전에 사용하던 버전으로 되돌려 보는 것도 하나의 방법으로 시도했으나, 문제는 해결되지 않음.</li>
</ul>
</li>
</ol>
<hr>
<h3 id="결론"><strong>결론</strong></h3>
<p>VSCode에서 발생한 <code>styled-components</code> 자동완성 문제는 다양한 원인으로 인해 발생할 수 있으며, 여러 방법을 시도했으나 최종적으로 <code>jsconfig.json</code> 파일에서 모듈 설정을 <code>ES6</code>로 변경하여 문제를 해결할 수 있었다.</p>
<p>이 문제를 겪은 후, 설정 파일을 주기적으로 백업하고, VSCode 업데이트 후에는 설정이 제대로 유지되고 있는지 확인하는 것이 중요하다고 느꼈다. 앞으로도 이런 상황이 발생하지 않도록 프로젝트 환경을 꼼꼼히 관리할 필요가 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1인 개발자로서 백엔드 구현의 복잡성을 극복하기 위한 최적의 기술 스택 선택]]></title>
            <link>https://velog.io/@boss_teemo/1%EC%9D%B8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C%EC%84%9C-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B5%AC%ED%98%84%EC%9D%98-%EB%B3%B5%EC%9E%A1%EC%84%B1%EC%9D%84-%EA%B7%B9%EB%B3%B5%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%EC%B5%9C%EC%A0%81%EC%9D%98-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EC%84%A0%ED%83%9D</link>
            <guid>https://velog.io/@boss_teemo/1%EC%9D%B8-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C%EC%84%9C-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B5%AC%ED%98%84%EC%9D%98-%EB%B3%B5%EC%9E%A1%EC%84%B1%EC%9D%84-%EA%B7%B9%EB%B3%B5%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%EC%B5%9C%EC%A0%81%EC%9D%98-%EA%B8%B0%EC%88%A0-%EC%8A%A4%ED%83%9D-%EC%84%A0%ED%83%9D</guid>
            <pubDate>Sat, 17 Aug 2024 13:17:50 GMT</pubDate>
            <description><![CDATA[<h2 id="백엔드-구현의-현실적인-선택">백엔드 구현의 현실적인 선택</h2>
<p>탈조선 프로젝트를 본격적으로 시작하면서, 프론트엔드에 이어 백엔드 구현의 필요성을 느끼게 됐다. 하지만 1인 개발자로서 모든 것을 직접 구현하는 것은 생각보다 어려웠다. 특히 백엔드의 복잡성을 이해하고 이를 프로젝트에 적용하는 데는 많은 시간과 노력이 필요하다는 것을 깨달았다.</p>
<p>이러한 이유로, 백엔드 구현에서 복잡성을 줄이면서도 안정적이고 확장 가능한 기능을 제공할 수 있는 실용적인 도구들을 선택하기로 결정했다. 다음은 내가 선택한 기술 스택과 그 이유다.</p>
<hr>
<h3 id="1-nextjs와-api-routes">1. Next.js와 API Routes</h3>
<p>프론트엔드에서 이미 사용하고 있는 Next.js는 서버사이드 렌더링과 정적 사이트 생성을 지원하는 강력한 프레임워크다. </p>
<p>또한 Next.js의 API Routes 기능을 사용하면 별도의 백엔드 서버 없이도 간단한 백엔드 로직을 처리할 수 있어, 초기 단계의 프로젝트에 매우 적합하다. </p>
<p>이 덕분에 백엔드 서버를 별도로 구축할 필요 없이, 프론트엔드와 백엔드를 하나의 프로젝트 내에서 통합하여 관리할 수 있다.</p>
<hr>
<h3 id="2-supabase---데이터베이스와-인증의-통합">2. Supabase - 데이터베이스와 인증의 통합</h3>
<p>백엔드에서 중요한 역할을 하는 것이 데이터베이스와 사용자 인증이다. 이를 위해 나는 Supabase를 선택했다. </p>
<p>Supabase는 PostgreSQL 기반의 데이터베이스 서비스로, 실시간 데이터베이스와 사용자 인증, 파일 스토리지를 통합적으로 제공한다. </p>
<p>이를 통해 복잡한 설정 없이도 안정적으로 데이터를 관리하고, 사용자를 인증할 수 있다.</p>
<p>Supabase를 사용하면 사용자 게시판 글, 프로필 정보 등을 안전하게 저장할 수 있고, OAuth2.0을 통한 간편한 로그인 기능도 구현할 수 있다. </p>
<p>Supabase는 Next.js와 잘 통합되어, 앞으로 개발 속도를 크게 향상시킬 수 있을 것으로 기대한다.</p>
<hr>
<h3 id="3-nextauthjs---간편한-사용자-인증">3. NextAuth.js - 간편한 사용자 인증</h3>
<p>프로젝트에서 사용자의 인증은 필수적인 요소다. 이를 위해 나는 NextAuth.js를 선택했다. </p>
<p>NextAuth.js는 다양한 인증 방법(OAuth2.0, 이메일/비밀번호 등)을 간편하게 구현할 수 있는 라이브러리다. </p>
<p>Google, GitHub 등의 소셜 로그인을 빠르게 설정할 수 있어 사용자 경험을 향상시킬 수 있을 것이다. </p>
<p>복잡한 보안 설정 없이도 안전한 사용자 세션 관리를 할 수 있다는 점에서 매우 유용하다.</p>
<hr>
<h3 id="4-stripe---결제-기능">4. Stripe - 결제 기능</h3>
<p>서비스의 수익화를 위해 결제 기능은 필수적이다. Stripe는 다양한 결제 수단을 지원하며, 강력한 API를 통해 결제 기능을 쉽게 구현할 수 있다. </p>
<p>Stripe를 사용하면 직접 결제 시스템을 구축할 필요 없이, 검증된 솔루션을 활용해 빠르고 안전하게 결제를 처리할 수 있다.</p>
<hr>
<h3 id="5-vercel과-cloudflare---배포-및-보안">5. Vercel과 Cloudflare - 배포 및 보안</h3>
<p>Vercel은 Next.js와 완벽하게 통합되어 있어, 코드 푸시만으로도 손쉽게 애플리케이션을 배포할 수 있다. </p>
<p>또한 Cloudflare를 통해 전 세계 사용자에게 빠르게 콘텐츠를 제공하고, DDoS 방어 및 SSL/TLS 암호화를 통해 보안을 강화할 수 있다.</p>
<hr>
<h2 id="결론-실용적인-선택">결론: 실용적인 선택</h2>
<p>1인 개발자로서 모든 것을 직접 구현하는 것은 현실적으로 어렵다는 것을 느꼈고, 그래서 이처럼 안정적이고 검증된 도구들을 선택하게 됐다. </p>
<p>이 기술 스택들은 내가 원하는 기능을 빠르고 안전하게 구현할 수 있도록 도와줄 것이며, 앞으로도 서비스가 성장함에 따라 확장 가능성을 제공할 것이다.</p>
<p>백엔드 구현에 대한 부담을 줄이고, 프론트엔드와의 통합을 쉽게 하며, 동시에 보안과 성능을 최적화할 수 있는 이 방법은 나와 같은 1인 개발자에게 특히 추천할 만한 선택이라고 생각한다.</p>
<p>앞으로도 탈조선 프로젝트를 통해 더 나은 서비스를 제공할 수 있도록, 이 기술 스택들을 잘 활용해 나갈 예정이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[부트캠프 중도하차, 일본 취업, 그리고 개인 프로젝트]]></title>
            <link>https://velog.io/@boss_teemo/%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-%EC%A4%91%EB%8F%84%ED%95%98%EC%B0%A8-%EC%9D%BC%EB%B3%B8-%EC%B7%A8%EC%97%85-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EA%B0%9C%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@boss_teemo/%EB%B6%80%ED%8A%B8%EC%BA%A0%ED%94%84-%EC%A4%91%EB%8F%84%ED%95%98%EC%B0%A8-%EC%9D%BC%EB%B3%B8-%EC%B7%A8%EC%97%85-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EA%B0%9C%EC%9D%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Fri, 16 Aug 2024 18:10:45 GMT</pubDate>
            <description><![CDATA[<h2 id="코드잇-프론트엔드-부트캠프-참여와-중도하차">코드잇 프론트엔드 부트캠프 참여와 중도하차</h2>
<p>나는 2024년 5월 17일, 코드잇 프론트엔드 부트캠프 8기에 참여했다.<br>이 과정은 6개월 동안 진행될 예정이었고, 11월 14일에 종료될 계획이었다.<br>그러나 일본의 한 웹솔루션 업체에 첫 취업이 확정되면서, 부득이하게 8월 1일에 부트캠프를 중도하차하게 되었다.<br>취업 준비와 학기 시작 후 바빠질 일정까지 고려해야 했기 때문이다.</p>
<p>비록 중도하차했지만, 부트캠프를 통해 HTML, CSS, JavaScript, React, Styled-Components, Git, GitHub 등 다양한 기술을 습득할 수 있었다.<br>특히 팀 프로젝트 경험을 통해 웹사이트를 처음부터 끝까지 직접 만들어보는 기회를 가졌고, 이를 통해 큰 자신감을 얻게 되었다.</p>
<hr>
<h2 id="새로운-도전-탈조선-프로젝트">새로운 도전: 탈조선 프로젝트</h2>
<p>부트캠프를 중도하차한 후, 나는 오랫동안 계획해왔던 개인 프로젝트인 ‘탈조선 프로젝트’를 본격적으로 시작했다.<br>이 프로젝트의 목표는 이민을 꿈꾸는 사람들에게 정확한 정보를 제공하고, 이민 과정을 쉽게 이해할 수 있도록 돕는 웹서비스를 개발하는 것이다.</p>
<p>나의 인생 목표 중 하나가 이민이다.<br>오랜 시간 동안 이민을 목표로 자료를 조사하고, 다양한 세미나와 이민 박람회에 참석하면서, 이민이 일반인들에게 얼마나 어려운 일인지 깨닫게 되었다.<br>이러한 경험을 통해 누구나 쉽게 접근할 수 있는 이민 정보 서비스의 필요성을 절감하게 되었고, 이를 실현하기 위해 이 프로젝트를 시작하기로 결심했다.</p>
<p>부트캠프에서 쌓은 기술적 경험과 프로젝트 관리 능력은 이 프로젝트를 실제로 실행에 옮기는 데 큰 도움이 되었다.<br>이러한 기반을 바탕으로 나는 탈조선 프로젝트를 본격적으로 시작할 수 있었다.</p>
<hr>
<h2 id="프로젝트-진행-상황과-향후-계획">프로젝트 진행 상황과 향후 계획</h2>
<p>2024년 8월 4일부터 탈조선 프로젝트의 웹서비스 디자인 작업을 시작했다.<br>3일 만에 랜딩 페이지의 디자인과 제작을 완료했으나, 이후 백엔드 작업이 필요해지면서 프로젝트 진행이 잠시 중단되었다.<br>현재는 백엔드 공부에 집중하고 있으며, 최우선 작업 목표는 게시판 기능 추가와 미완성 페이지들에 표시할 &quot;제작 중&quot; 페이지를 제작하는 것이다.</p>
<p>9월에는 학기가 시작되어 더욱 바빠질 예정이기 때문에, 그 전에 최대한 많은 작업을 마치는 것이 목표이다.<br>현재 작업 중인 내용은 <a href="https://www.taljosun.com/">https://www.taljosun.com/</a> 에서 확인할 수 있다.<br>언제 완성될지는 확실치 않지만, 우선 필수 기능들을 하나씩 추가해나가며 11월 이전에는 기본적인 구성을 완성하는 것을 목표로 하고 있다.</p>
<hr>
<h2 id="일본에서의-첫-취업과-유튜브-계획">일본에서의 첫 취업과 유튜브 계획</h2>
<p>정보처리기사 최종 결과가 발표되면, 이를 바탕으로 비자 수속을 시작하게 된다.<br>비자 발급은 한 달에서 한 달 반 정도 소요될 예정이며, 11월쯤 비자가 나올 것으로 예상된다.<br>비자가 나오면 학교에 취업계를 제출하고, 일본으로 바로 넘어가게 될 것이다.</p>
<p>일본으로 이주하게 되면, 일본에서의 생활과 개발 관련 내용을 유튜브 채널을 통해 공유할 계획이다.<br>유튜브 링크는 다음과 같다: <a href="https://www.youtube.com/@TalJosun">https://www.youtube.com/@TalJosun</a><br>아마 일본 출국 영상을 시작으로 첫 영상을 업로드하게 될 것 같다.</p>
<hr>
<p>마지막으로, 최근 전 세계적으로 지진이 빈번해지면서 일본의 난카이 트로프 대지진에 대한 불안감이 커지고 있다.<br>이런 상황에서 일본으로 가는 것이 과연 괜찮을지에 대한 두려움과 걱정이 있는 것도 사실이다.<br>하지만 일본으로의 취업 과정이 마치 정해진 운명처럼 흘러갔었기에, 나는 이것이 나의 운명이라고 생각하고 일본으로 가기로 결심했다.<br>부디 큰 지진이 일어나지 않기를 바라고, 만약 발생하더라도 큰 피해가 없기를 간절히 기원한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React와 styled-components를 이용한 반응형 이미지 변경 방법]]></title>
            <link>https://velog.io/@boss_teemo/React%EC%99%80-styled-components%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B0%98%EC%9D%91%ED%98%95-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@boss_teemo/React%EC%99%80-styled-components%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B0%98%EC%9D%91%ED%98%95-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 07 Aug 2024 11:22:51 GMT</pubDate>
            <description><![CDATA[<p>React기반으로 next.js와 Styled-compoents를 사용해 
사이드프로젝트를 진행하던 도중
화면사이즈에따라 다른이미지를 보여줘야하는 경우가 생겼다.
이를 구현하기위해 알아보다가 두가지 방법을 알게되었고, 
이에 대해 정리해보고자한다.</p>
<hr>
<h3 id="방법-1-react-상태와-효과를-이용한-방법">방법 1: React 상태와 효과를 이용한 방법</h3>
<p>이 방법은 React의 <code>useState</code>와 <code>useEffect</code> 훅을 사용하여 화면 크기를 감지하고, 상태(state)를 통해 이미지 소스를 변경하는 방법입니다.</p>
<pre><code class="language-javascript">import React, { useState, useEffect } from &#39;react&#39;;
import styled from &#39;styled-components&#39;;
import Image from &#39;next/image&#39;;
import Title from &#39;./Title&#39;;
import SubTitle from &#39;./SubTitle&#39;;

const BannerContainer = styled.div`
  position: relative;
  width: 100vw;
  height: 90vh;
  margin-bottom: 10vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
  background: linear-gradient(
    180deg,
    #4facfe 0%,
    rgba(0, 242, 254, 0.8) 31.5%,
    #ffffff 100%
  );
`;

const BackgroundImage = styled(Image)`
  width: 100%;
  height: auto;
  object-fit: cover;
  @media (max-width: 768px) {
    object-fit: contain;
  }
`;

const TitleContainer = styled.div`
  z-index: 10;
  width: 80%;
  max-width: 1200px;
  height: 85%;
  white-space: nowrap;
`;

const Banner = () =&gt; {
  const [src, setSrc] = useState(&#39;/images/BannerImage.svg&#39;);

  useEffect(() =&gt; {
    const handleResize = () =&gt; {
      if (window.innerWidth &lt; 768) {
        setSrc(&#39;/images/MobileImage.svg&#39;);
      } else {
        setSrc(&#39;/images/BannerImage.svg&#39;);
      }
    };

    window.addEventListener(&#39;resize&#39;, handleResize);

    // 초기 로드 시 실행
    handleResize();

    return () =&gt; {
      window.removeEventListener(&#39;resize&#39;, handleResize);
    };
  }, []);

  return (
    &lt;BannerContainer&gt;
      &lt;BackgroundImage
        fill
        src={src}
        alt=&quot;Banner Image&quot;
        priority
      /&gt;

      &lt;TitleContainer&gt;
        &lt;Title /&gt;
        &lt;SubTitle /&gt;
      &lt;/TitleContainer&gt;
    &lt;/BannerContainer&gt;
  );
};

export default Banner;</code></pre>
<h4 id="장점">장점:</h4>
<ol>
<li><strong>직관성</strong>: 상태 변화를 명확하게 다루며, 코드가 비교적 직관적입니다.</li>
<li><strong>유연성</strong>: 다양한 조건에 따라 이미지를 쉽게 변경할 수 있습니다.</li>
<li><strong>리액트 방식</strong>: React 훅을 사용하여 상태 변화를 관리할 수 있습니다.</li>
</ol>
<h4 id="단점">단점:</h4>
<ol>
<li><strong>추가 렌더링</strong>: 상태 변경으로 인해 불필요한 렌더링이 발생할 수 있습니다.</li>
<li><strong>복잡성 증가</strong>: 단순한 이미지 변경을 위해 추가적인 코드가 필요합니다.</li>
</ol>
<hr>
<h3 id="방법-2-styled-components와-props를-활용한-방법">방법 2: styled-components와 props를 활용한 방법</h3>
<p>이 방법은 styled-components의 <code>attrs</code>를 이용하여 props를 통해 조건부 스타일링을 적용하는 방법입니다.</p>
<pre><code class="language-javascript">import React from &#39;react&#39;;
import styled from &#39;styled-components&#39;;
import Image from &#39;next/image&#39;;
import Title from &#39;./Title&#39;;
import SubTitle from &#39;./SubTitle&#39;;

const BannerContainer = styled.div`
  position: relative;
  width: 100vw;
  height: 90vh;
  margin-bottom: 10vh;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
  background: linear-gradient(
    180deg,
    #4facfe 0%,
    rgba(0, 242, 254, 0.8) 31.5%,
    #ffffff 100%
  );
`;

const BackgroundImage = styled(Image).attrs(props =&gt; ({
  src: props.isMobile ? &#39;/images/MobileImage.svg&#39; : &#39;/images/BannerImage.svg&#39;
}))`
  width: 100%;
  height: auto;
  object-fit: cover;
  @media (max-width: 768px) {
    object-fit: contain;
  }
`;

const TitleContainer = styled.div`
  z-index: 10;
  width: 80%;
  max-width: 1200px;
  height: 85%;
  white-space: nowrap;
`;

const Banner = () =&gt; {
  const [isMobile, setIsMobile] = React.useState(false);

  React.useEffect(() =&gt; {
    const handleResize = () =&gt; {
      setIsMobile(window.innerWidth &lt; 768);
    };

    window.addEventListener(&#39;resize&#39;, handleResize);

    // 초기 로드 시 실행
    handleResize();

    return () =&gt; {
      window.removeEventListener(&#39;resize&#39;, handleResize);
    };
  }, []);

  return (
    &lt;BannerContainer&gt;
      &lt;BackgroundImage
        fill
        isMobile={isMobile}
        alt=&quot;Banner Image&quot;
        priority
      /&gt;

      &lt;TitleContainer&gt;
        &lt;Title /&gt;
        &lt;SubTitle /&gt;
      &lt;/TitleContainer&gt;
    &lt;/BannerContainer&gt;
  );
};

export default Banner;</code></pre>
<h4 id="장점-1">장점:</h4>
<ol>
<li><strong>코드 간결성</strong>: props를 통해 styled-components에서 조건부 스타일링을 바로 적용할 수 있습니다.</li>
<li><strong>렌더링 효율성</strong>: 상태 변경이 최소화되어 불필요한 렌더링이 줄어듭니다.</li>
<li><strong>스타일링 통합</strong>: styled-components 내에서 스타일링과 로직을 모두 처리할 수 있습니다.</li>
</ol>
<h4 id="단점-1">단점:</h4>
<ol>
<li><strong>유연성 부족</strong>: 조건이 더 복잡해지면 코드가 복잡해질 수 있습니다.</li>
<li><strong>디버깅 어려움</strong>: styled-components의 attrs를 통한 동적 props 적용은 디버깅이 어려울 수 있습니다.</li>
</ol>
<hr>
<h2 id="결론">결론</h2>
<ul>
<li><strong>간단한 경우</strong>: 만약 간단한 조건부 이미지 변경이 필요하다면, <code>styled-components</code>와 props를 활용한 방법이 더 적합할 수 있습니다.</li>
<li><strong>복잡한 경우</strong>: 더 복잡한 로직이나 조건이 필요한 경우, React 상태와 효과를 이용한 방법이 더 유연하고 관리하기 쉬울 수 있습니다.</li>
</ul>
<p>이 두 가지 방법을 상황에 맞게 적절히 사용하여 반응형 디자인을 구현해보세요. 필요할 때마다 이 글을 참고하여 구현 방식을 선택하면 좋겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[6주차 기본문제 3] 좌표 정렬하기]]></title>
            <link>https://velog.io/@boss_teemo/6%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-3-%EC%A2%8C%ED%91%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@boss_teemo/6%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-3-%EC%A2%8C%ED%91%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 30 Jul 2024 06:10:08 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>이번에 공부한 문제는 2차원 평면 위의 점 N개가 주어졌을 때, 이를 특정 기준에 따라 정렬하는 프로그램을 작성하는 것입니다. 주어진 점들을 y좌표가 증가하는 순서로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬하는 것입니다.</p>
<h3 id="문제-조건">문제 조건</h3>
<ul>
<li>점의 개수 N은 1 이상 100,000 이하입니다.</li>
<li>각 점의 좌표 ((x_i, y_i))는 -100,000 이상 100,000 이하의 정수입니다.</li>
<li>위치가 같은 두 점은 없습니다.</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>5</td>
<td>1 -1</td>
</tr>
<tr>
<td>0 4</td>
<td>1 2</td>
</tr>
<tr>
<td>1 2</td>
<td>2 2</td>
</tr>
<tr>
<td>1 -1</td>
<td>3 3</td>
</tr>
<tr>
<td>2 2</td>
<td>0 4</td>
</tr>
<tr>
<td>3 3</td>
<td></td>
</tr>
</tbody></table>
<h2 id="문제-해결-방법">문제 해결 방법</h2>
<h3 id="해결-전략">해결 전략</h3>
<p>주어진 점들을 y좌표가 증가하는 순서로 정렬하고, y좌표가 같으면 x좌표가 증가하는 순서로 정렬해야 합니다. 이를 위해 Python의 내장 <code>sorted</code> 함수를 사용했습니다.</p>
<h3 id="시간-복잡도">시간 복잡도</h3>
<p>Python의 <code>sorted</code> 함수는 Timsort 알고리즘을 사용하며, 시간 복잡도는 (O(n \log n))입니다. 따라서, 최대 100,000개의 점을 정렬하는 데 적합합니다.</p>
<h3 id="공간-복잡도">공간 복잡도</h3>
<p>주어진 데이터를 리스트에 저장하고 정렬하므로, 공간 복잡도는 (O(n))입니다.</p>
<h3 id="코드-구현">코드 구현</h3>
<p>다음은 <code>sorted</code> 함수를 사용하여 문제를 해결하는 Python 코드입니다.</p>
<pre><code class="language-python">def sort_points():
    import sys
    input = sys.stdin.read
    data = input().split()

    N = int(data[0])
    points = []

    for i in range(1, len(data), 2):
        x = int(data[i])
        y = int(data[i + 1])
        points.append((x, y))

    # 정렬 기준: y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로
    sorted_points = sorted(points, key=lambda point: (point[1], point[0]))

    for point in sorted_points:
        print(point[0], point[1])

if __name__ == &quot;__main__&quot;:
    sort_points()</code></pre>
<h3 id="코드-설명">코드 설명</h3>
<ol>
<li><code>sys.stdin.read</code>를 사용하여 입력을 한 번에 읽고, <code>split()</code>을 사용하여 각 줄을 분리합니다.</li>
<li>첫 번째 값은 점의 개수인 <code>N</code>이고, 나머지 값들은 점의 좌표입니다.</li>
<li>좌표들을 <code>(x, y)</code> 형태의 튜플로 리스트에 저장합니다.</li>
<li><code>sorted</code> 함수를 사용하여 점들을 정렬합니다. 정렬 기준은 <code>lambda point: (point[1], point[0])</code>로 설정하여, y좌표를 기준으로 오름차순 정렬하고, y좌표가 같으면 x좌표를 기준으로 오름차순 정렬합니다.</li>
<li>정렬된 점들을 차례대로 출력합니다.</li>
</ol>
<h3 id="예시-테스트">예시 테스트</h3>
<ul>
<li>입력:<pre><code>5
0 4
1 2
1 -1
2 2
3 3</code></pre></li>
<li>출력:<pre><code>1 -1
1 2
2 2
3 3
0 4</code></pre></li>
</ul>
<p>이 코드는 주어진 모든 조건을 만족하며, 각 입력에 대해 올바르게 동작합니다. <code>sorted</code> 함수를 사용하여 간단하게 정렬 기준을 설정하고, 원하는 순서대로 점들을 출력할 수 있습니다.</p>
<h2 id="결론">결론</h2>
<p>이번 문제를 통해 Python의 내장 함수인 <code>sorted</code>를 사용하여 2차원 평면 위의 점들을 효율적으로 정렬하는 방법을 배울 수 있었습니다. <code>sorted</code> 함수는 Timsort 알고리즘을 사용하여 시간 복잡도 (O(n \log n))로 매우 효율적입니다. 이 문제를 해결하면서 정렬 기준을 설정하는 방법과 정렬 알고리즘의 효율성을 다시 한 번 확인할 수 있었습니다. 앞으로도 다양한 정렬 알고리즘을 공부하여 알고리즘에 대한 이해를 더욱 깊게 할 예정입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[6주차 기본문제 2] 수 정렬하기 2]]></title>
            <link>https://velog.io/@boss_teemo/6%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-2-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-2</link>
            <guid>https://velog.io/@boss_teemo/6%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-2-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-2</guid>
            <pubDate>Tue, 30 Jul 2024 06:05:38 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>이번에 공부한 문제는 N개의 수를 오름차순으로 정렬하는 프로그램을 작성하는 것입니다. 문제를 해결하기 위해 효율적인 정렬 알고리즘 중 하나인 병합 정렬(Merge Sort)을 사용해보았습니다.</p>
<h3 id="문제-조건">문제 조건</h3>
<ul>
<li>수의 개수 N은 1 이상 1,000,000 이하입니다.</li>
<li>각 수는 절댓값이 1,000,000보다 작거나 같은 정수입니다.</li>
<li>수는 중복되지 않습니다.</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>5</td>
<td>2</td>
</tr>
<tr>
<td>4</td>
<td>3</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td>2</td>
<td>5</td>
</tr>
<tr>
<td>1</td>
<td></td>
</tr>
</tbody></table>
<h2 id="문제-해결-방법">문제 해결 방법</h2>
<h3 id="병합-정렬">병합 정렬</h3>
<p>이번 문제를 해결하기 위해 선택한 알고리즘은 병합 정렬입니다. 병합 정렬은 리스트를 반으로 나누어 각각 정렬한 후, 두 정렬된 리스트를 합치는 방식으로 동작합니다. 이 알고리즘의 시간 복잡도는 (O(n \log n))으로 매우 효율적입니다.</p>
<h3 id="시간-복잡도">시간 복잡도</h3>
<p>병합 정렬의 최악, 최선, 평균 시간 복잡도는 모두 (O(n \log n))입니다. 이는 리스트를 반으로 나누고 다시 합치는 과정이 로그 시간에 이루어지기 때문입니다.</p>
<h3 id="공간-복잡도">공간 복잡도</h3>
<p>병합 정렬은 추가적인 리스트를 사용하여 정렬하기 때문에 공간 복잡도는 (O(n))입니다.</p>
<h3 id="코드-구현">코드 구현</h3>
<p>다음은 병합 정렬을 사용하여 문제를 해결하는 Python 코드입니다.</p>
<pre><code class="language-python">def merge_sort(numbers):
    if len(numbers) &lt;= 1:
        return numbers

    mid = len(numbers) // 2
    left_half = merge_sort(numbers[:mid])
    right_half = merge_sort(numbers[mid:])

    return merge(left_half, right_half)

def merge(left, right):
    sorted_list = []
    i = j = 0

    while i &lt; len(left) and j &lt; len(right):
        if left[i] &lt; right[j]:
            sorted_list.append(left[i])
            i += 1
        else:
            sorted_list.append(right[j])
            j += 1

    # 남은 요소 추가
    sorted_list.extend(left[i:])
    sorted_list.extend(right[j:])

    return sorted_list

def sort_numbers():
    import sys
    input = sys.stdin.read
    data = input().split()

    N = int(data[0])
    numbers = list(map(int, data[1:N+1]))

    # 병합 정렬을 사용하여 정렬
    sorted_numbers = merge_sort(numbers)

    # 결과 출력
    for number in sorted_numbers:
        print(number)

if __name__ == &quot;__main__&quot;:
    sort_numbers()</code></pre>
<h3 id="코드-설명">코드 설명</h3>
<ol>
<li><code>merge_sort</code> 함수는 리스트를 반으로 나누어 각각 재귀적으로 정렬한 후, <code>merge</code> 함수를 사용하여 두 정렬된 리스트를 합칩니다.</li>
<li><code>merge</code> 함수는 두 개의 정렬된 리스트를 받아 하나의 정렬된 리스트로 합칩니다. 두 리스트를 하나씩 비교하며 더 작은 값을 결과 리스트에 추가합니다.</li>
<li><code>sort_numbers</code> 함수는 입력을 받아 숫자들을 리스트로 변환한 후, <code>merge_sort</code> 함수를 호출하여 정렬합니다.</li>
<li>정렬된 숫자들을 차례대로 출력합니다.</li>
</ol>
<h3 id="예시-테스트">예시 테스트</h3>
<ul>
<li>입력:<pre><code>5
5
4
3
2
1</code></pre></li>
<li>출력:<pre><code>1
2
3
4
5</code></pre></li>
</ul>
<p>이 코드는 주어진 모든 조건을 만족하며, 각 입력에 대해 올바르게 동작합니다.</p>
<h2 id="결론">결론</h2>
<p>이번 문제를 통해 병합 정렬 알고리즘을 복습할 수 있었습니다. 병합 정렬은 시간 복잡도가 (O(n \log n))으로 매우 효율적이어서 대량의 데이터를 정렬하는 데 적합합니다. 주어진 문제를 해결하면서 정렬 알고리즘의 기본 개념을 다시 한 번 정리할 수 있었습니다. 앞으로도 다양한 정렬 알고리즘을 공부하여 알고리즘에 대한 이해를 더욱 깊게 할 예정입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[6주차 기본문제 1] 수 정렬하기 1]]></title>
            <link>https://velog.io/@boss_teemo/6%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-1-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-2</link>
            <guid>https://velog.io/@boss_teemo/6%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-1-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-2</guid>
            <pubDate>Tue, 30 Jul 2024 05:57:43 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>이번에 공부한 문제는 N개의 수를 오름차순으로 정렬하는 프로그램을 작성하는 것이었습니다. 문제를 해결하기 위해 기본적인 정렬 알고리즘 중 하나인 버블 정렬을 사용해보았습니다.</p>
<h3 id="문제-조건">문제 조건</h3>
<ul>
<li>수의 개수 N은 1 이상 1,000 이하입니다.</li>
<li>각 수는 절댓값이 1,000보다 작거나 같은 정수입니다.</li>
<li>수는 중복되지 않습니다.</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>5</td>
<td>1</td>
</tr>
<tr>
<td>5</td>
<td>2</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
</tr>
<tr>
<td>1</td>
<td></td>
</tr>
</tbody></table>
<h2 id="문제-해결-방법">문제 해결 방법</h2>
<h3 id="버블-정렬">버블 정렬</h3>
<p>이번 문제를 해결하기 위해 선택한 알고리즘은 버블 정렬입니다. 버블 정렬은 인접한 두 원소를 비교하고, 순서가 잘못된 경우 서로 교환하는 방식으로 동작합니다. 이 과정을 리스트가 정렬될 때까지 반복합니다.</p>
<h3 id="시간-복잡도">시간 복잡도</h3>
<p>버블 정렬의 최악, 최선, 평균 시간 복잡도는 모두 (O(n^2))입니다. 이는 중첩된 두 개의 루프가 리스트의 길이에 비례하여 실행되기 때문입니다.</p>
<h3 id="공간-복잡도">공간 복잡도</h3>
<p>버블 정렬은 주어진 리스트 내부에서 원소를 교환하므로 추가적인 공간이 거의 필요하지 않습니다. 따라서 공간 복잡도는 (O(1))입니다.</p>
<h3 id="코드-구현">코드 구현</h3>
<p>다음은 버블 정렬을 사용하여 문제를 해결하는 Python 코드입니다.</p>
<pre><code class="language-python">def bubble_sort(numbers):
    n = len(numbers)
    for i in range(n):
        for j in range(0, n-i-1):
            if numbers[j] &gt; numbers[j+1]:
                # Swap the elements
                numbers[j], numbers[j+1] = numbers[j+1], numbers[j]

def sort_numbers():
    import sys
    input = sys.stdin.read
    data = input().split()

    N = int(data[0])
    numbers = list(map(int, data[1:N+1]))

    # 버블 정렬을 사용하여 정렬
    bubble_sort(numbers)

    # 결과 출력
    for number in numbers:
        print(number)

if __name__ == &quot;__main__&quot;:
    sort_numbers()</code></pre>
<h3 id="코드-설명">코드 설명</h3>
<ol>
<li><code>bubble_sort</code> 함수는 리스트를 받아 버블 정렬 알고리즘을 사용하여 정렬합니다.<ul>
<li>리스트의 길이를 <code>n</code>으로 설정하고, <code>i</code>를 0부터 <code>n-1</code>까지 반복합니다.</li>
<li>내부 루프에서 <code>j</code>를 0부터 <code>n-i-2</code>까지 반복하면서 인접한 두 원소를 비교하고, 순서가 잘못된 경우 교환합니다.</li>
</ul>
</li>
<li><code>sort_numbers</code> 함수는 입력을 받아 숫자들을 리스트로 변환한 후, <code>bubble_sort</code> 함수를 호출하여 정렬합니다.</li>
<li>정렬된 숫자들을 차례대로 출력합니다.</li>
</ol>
<h3 id="예시-테스트">예시 테스트</h3>
<ul>
<li>입력:<pre><code>5
5
2
3
4
1</code></pre></li>
<li>출력:<pre><code>1
2
3
4
5</code></pre></li>
</ul>
<p>이 코드는 주어진 모든 조건을 만족하며, 각 입력에 대해 올바르게 동작합니다.</p>
<h2 id="결론">결론</h2>
<p>이번 문제를 통해 버블 정렬 알고리즘을 복습할 수 있었습니다. 버블 정렬은 간단한 정렬 알고리즘이지만, 리스트를 직접 정렬하는 과정을 이해하는 데 유용합니다. 버블 정렬의 시간 복잡도는 (O(n^2))로, 데이터가 많을 경우 비효율적일 수 있지만, 알고리즘의 기본 개념을 이해하는 데는 적합합니다. 또한, 공간 복잡도가 (O(1))로 추가적인 메모리 사용이 거의 없다는 점에서 장점이 있습니다. 주어진 문제를 해결하면서 정렬 알고리즘의 기본 개념을 다시 한 번 정리할 수 있었습니다. 앞으로 더 복잡한 정렬 알고리즘도 공부해볼 예정입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[5주차 기본문제 3] 재귀의 귀재]]></title>
            <link>https://velog.io/@boss_teemo/5%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-3-%EC%9E%AC%EA%B7%80%EC%9D%98-%EA%B7%80%EC%9E%AC</link>
            <guid>https://velog.io/@boss_teemo/5%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-3-%EC%9E%AC%EA%B7%80%EC%9D%98-%EA%B7%80%EC%9E%AC</guid>
            <pubDate>Mon, 22 Jul 2024 05:20:28 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>주어진 문제는 문자열이 팰린드롬인지 확인하는 것입니다. 팰린드롬은 앞에서 읽으나 뒤에서 읽으나 동일한 문자열을 말합니다. 이 문제는 재귀적인 방법을 사용하여 해결해야 합니다.</p>
<h3 id="제한-조건">제한 조건</h3>
<ul>
<li>문자열의 길이는 최대 1000입니다.</li>
<li>주어지는 문자열은 알파벳 대문자로만 구성됩니다.</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>ABBA</td>
<td>1 4</td>
</tr>
<tr>
<td>ABC</td>
<td>0 3</td>
</tr>
</tbody></table>
<hr>
<h2 id="문제-해결-방법">문제 해결 방법</h2>
<h3 id="해결-전략">해결 전략</h3>
<ol>
<li>문자열이 팰린드롬인지 확인하는 재귀 함수를 작성합니다.</li>
<li>재귀 함수는 문자열의 시작과 끝 문자가 동일한지 확인합니다.</li>
<li>동일하면 다음 비교를 위해 시작과 끝을 한 칸씩 좁혀가며 재귀 호출합니다.</li>
<li>다르면 팰린드롬이 아님을 반환합니다.</li>
<li>문자열이 팰린드롬인지 여부와 함께 재귀 호출 횟수를 반환합니다.</li>
</ol>
<hr>
<h2 id="코드-구현">코드 구현</h2>
<p>다음은 팰린드롬을 확인하는 Python 코드입니다.</p>
<pre><code class="language-python">def recursion(s, l, r, count):
    count[0] += 1
    if l &gt;= r:
        return 1
    elif s[l] != s[r]:
        return 0
    else:
        return recursion(s, l + 1, r - 1, count)

def isPalindrome(s):
    count = [0]
    result = recursion(s, 0, len(s) - 1, count)
    return result, count[0]

# 입력을 받습니다.
T = int(input())
for _ in range(T):
    s = input().strip()
    result, cnt = isPalindrome(s)
    print(result, cnt)</code></pre>
<h3 id="코드-설명">코드 설명</h3>
<ul>
<li><code>recursion</code> 함수는 문자열 <code>s</code>의 시작 인덱스 <code>l</code>과 끝 인덱스 <code>r</code>을 비교합니다. 또한, 재귀 호출 횟수를 기록하기 위해 <code>count</code> 리스트를 사용합니다.</li>
<li><code>isPalindrome</code> 함수는 <code>recursion</code> 함수를 호출하여 팰린드롬 여부와 재귀 호출 횟수를 계산합니다.</li>
<li>입력 문자열의 개수를 받아 각 문자열에 대해 팰린드롬 여부와 재귀 호출 횟수를 출력합니다.</li>
</ul>
<h3 id="예시-테스트">예시 테스트</h3>
<ul>
<li>입력:<pre><code>2
ABBA
ABC</code></pre></li>
<li>출력:<pre><code>1 4
0 3</code></pre></li>
</ul>
<p>이 코드는 주어진 모든 조건을 만족하며, 각 입력에 대해 올바르게 팰린드롬 여부와 재귀 호출 횟수를 출력합니다.</p>
<hr>
<h2 id="결론">결론</h2>
<p>이 문제는 재귀를 사용하여 문자열이 팰린드롬인지 확인하는 방법을 익히는 좋은 연습입니다. 제한 조건이 비교적 간단하므로 재귀 호출을 통해 문제를 쉽게 해결할 수 있습니다. 주어진 코드와 전략을 활용하여 문제를 해결할 수 있으며, 이를 백준 온라인 저지에 제출하여 올바르게 작동함을 확인할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[5주차 기본문제 2] 피보나치 수열]]></title>
            <link>https://velog.io/@boss_teemo/5%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-2-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EC%88%98%EC%97%B4-ill5g9f1</link>
            <guid>https://velog.io/@boss_teemo/5%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-2-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EC%88%98%EC%97%B4-ill5g9f1</guid>
            <pubDate>Mon, 22 Jul 2024 05:17:00 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>피보나치 수열은 0과 1로 시작하며, 그 다음 수부터는 바로 앞 두 수의 합으로 이루어지는 수열입니다. 피보나치 수열은 다음과 같은 점화식으로 정의됩니다:</p>
<ul>
<li>( F_0 = 0 )</li>
<li>( F_1 = 1 )</li>
<li>( F_n = F_{n-1} + F_{n-2} ) (n ≥ 2)</li>
</ul>
<h3 id="제한-조건">제한 조건</h3>
<ul>
<li>( n )은 45보다 작거나 같은 자연수입니다.</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>10</td>
<td>55</td>
</tr>
</tbody></table>
<hr>
<h2 id="문제-해결-방법">문제 해결 방법</h2>
<h3 id="해결-전략">해결 전략</h3>
<ol>
<li>( n )이 0이면 0을, 1이면 1을 반환합니다.</li>
<li>2 이상일 경우, 리스트를 이용하여 피보나치 수열을 저장하면서 계산합니다.</li>
<li>반복문을 통해 2부터 ( n )까지의 피보나치 수를 차례대로 계산하여 리스트에 저장합니다.</li>
<li>( n )번째 피보나치 수를 반환합니다.</li>
</ol>
<hr>
<h2 id="코드-구현">코드 구현</h2>
<p>다음은 피보나치 수열의 n번째 값을 계산하는 Python 코드입니다.</p>
<pre><code class="language-python">def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1

    fib = [0, 1]
    for i in range(2, n + 1):
        fib.append(fib[i-1] + fib[i-2])

    return fib[n]

# 입력을 받습니다.
n = int(input())

# n번째 피보나치 수를 계산하여 출력합니다.
print(fibonacci(n))</code></pre>
<h3 id="코드-설명">코드 설명:</h3>
<ul>
<li><code>fibonacci</code> 함수는 정수 ( n )을 인수로 받습니다.</li>
<li>( n )이 0일 경우 0을, 1일 경우 1을 반환합니다.</li>
<li>2 이상인 경우, 리스트 <code>fib</code>에 피보나치 수열을 저장합니다.</li>
<li>반복문을 통해 2부터 ( n )까지의 피보나치 수를 차례대로 계산하여 리스트에 추가합니다.</li>
<li>최종적으로 리스트 <code>fib</code>의 ( n )번째 요소를 반환합니다.</li>
<li>사용자로부터 입력을 받아 ( n )에 저장한 후, <code>fibonacci</code> 함수를 호출하여 결과를 출력합니다.</li>
</ul>
<h3 id="예시-테스트">예시 테스트</h3>
<ul>
<li><p>입력: 0</p>
</li>
<li><p>출력: 0</p>
</li>
<li><p>입력: 1</p>
</li>
<li><p>출력: 1</p>
</li>
<li><p>입력: 10</p>
</li>
<li><p>출력: 55</p>
</li>
</ul>
<p>이 코드는 주어진 모든 조건을 만족하며, 각 입력에 대해 올바른 피보나치 수를 출력합니다.</p>
<hr>
<h2 id="결론">결론</h2>
<p>이 문제는 피보나치 수열의 n번째 값을 구하는 알고리즘 문제입니다. 제한 조건이 ( n )이 45 이하로 매우 작기 때문에, 리스트를 사용하여 반복문으로 쉽게 해결할 수 있습니다. 이 문제를 통해 반복문과 리스트를 활용하여 피보나치 수열을 구현하는 방법을 복습할 수 있습니다. 주어진 코드와 전략을 활용하여 문제를 해결할 수 있으며, 이 코드를 백준 온라인 저지에 제출하여 올바르게 작동함을 확인할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[5주차 기본문제 1] 팩토리얼]]></title>
            <link>https://velog.io/@boss_teemo/5%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-1-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC</link>
            <guid>https://velog.io/@boss_teemo/5%EC%A3%BC%EC%B0%A8-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EC%A0%9C-1-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC</guid>
            <pubDate>Mon, 22 Jul 2024 05:12:54 GMT</pubDate>
            <description><![CDATA[<h2 id="문제-설명">문제 설명</h2>
<p>주어진 문제는 정수 ( N )이 주어졌을 때, ( N )의 팩토리얼을 계산하는 프로그램을 작성하는 것입니다. 팩토리얼은 수학적으로 ( N! = N \times (N-1) \times (N-2) \times \cdots \times 1 )로 정의됩니다. 단, 0!는 1로 정의됩니다.</p>
<h3 id="제한-조건">제한 조건</h3>
<ul>
<li>( N )은 0 이상 12 이하의 정수입니다.</li>
<li>입력은 하나의 정수 ( N )입니다.</li>
</ul>
<h3 id="입출력-예">입출력 예</h3>
<table>
<thead>
<tr>
<th>입력</th>
<th>출력</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>5</td>
<td>120</td>
</tr>
<tr>
<td>10</td>
<td>3628800</td>
</tr>
</tbody></table>
<hr>
<h2 id="문제-해결-방법">문제 해결 방법</h2>
<h3 id="해결-전략">해결 전략</h3>
<ol>
<li>팩토리얼을 계산하는 함수 <code>factorial</code>을 정의합니다.</li>
<li>함수는 ( N )이 0일 경우 1을 반환합니다.</li>
<li>( N )이 0이 아닐 경우, 1부터 ( N )까지의 모든 정수를 곱하여 팩토리얼을 계산합니다.</li>
<li>계산된 팩토리얼 값을 반환합니다.</li>
<li>입력 값을 받아 함수에 전달하고 결과를 출력합니다.</li>
</ol>
<hr>
<h2 id="코드-구현">코드 구현</h2>
<p>다음은 팩토리얼을 계산하는 Python 코드입니다.</p>
<pre><code class="language-python">def factorial(n):
    if n == 0:
        return 1
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result

# 입력을 받습니다.
N = int(input())

# 팩토리얼을 계산하여 출력합니다.
print(factorial(N))</code></pre>
<h3 id="코드-설명">코드 설명:</h3>
<ul>
<li><code>factorial</code> 함수는 정수 ( n )을 인수로 받습니다.</li>
<li>( n )이 0인 경우, 1을 반환합니다.</li>
<li>( n )이 0이 아닌 경우, 1부터 ( n )까지의 정수를 차례로 곱하여 결과를 반환합니다.</li>
<li>사용자로부터 입력을 받아 ( N )에 저장한 후, <code>factorial</code> 함수를 호출하여 결과를 출력합니다.</li>
</ul>
<h3 id="예시-테스트">예시 테스트</h3>
<ul>
<li><p>입력: 5</p>
</li>
<li><p>출력: 120</p>
</li>
<li><p>입력: 10</p>
</li>
<li><p>출력: 3628800</p>
</li>
</ul>
<p>이 코드는 주어진 모든 조건을 만족하며, 각 입력에 대해 올바른 팩토리얼 값을 출력합니다.</p>
<hr>
<h2 id="결론">결론</h2>
<p>이 문제는 팩토리얼을 계산하는 간단한 알고리즘 문제입니다. 제한 조건이 ( N )이 12 이하로 매우 작기 때문에, 반복문을 사용하여 쉽게 해결할 수 있습니다. 이 문제를 통해 반복문과 팩토리얼 개념을 복습할 수 있습니다. 주어진 코드와 전략을 활용하여 문제를 해결할 수 있으며, 이 코드를 백준 온라인 저지에 제출하여 올바르게 작동함을 확인할 수 있습니다.</p>
]]></description>
        </item>
    </channel>
</rss>