<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sanghyeon.log</title>
        <link>https://velog.io/</link>
        <description>프론트-둥</description>
        <lastBuildDate>Tue, 31 Oct 2023 06:27:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sanghyeon.log</title>
            <url>https://velog.velcdn.com/images/sanghyeon-coding/profile/6f5f7a72-2c50-46ac-bc0a-b7191aa3a84b/image.JPG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sanghyeon.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sanghyeon-coding" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[에어브릿지 딥링크 테스트]]></title>
            <link>https://velog.io/@sanghyeon-coding/%EC%97%90%EC%96%B4%EB%B8%8C%EB%A6%BF%EC%A7%80-%EB%94%A5%EB%A7%81%ED%81%AC-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@sanghyeon-coding/%EC%97%90%EC%96%B4%EB%B8%8C%EB%A6%BF%EC%A7%80-%EB%94%A5%EB%A7%81%ED%81%AC-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Tue, 31 Oct 2023 06:27:51 GMT</pubDate>
            <description><![CDATA[<p><a href="https://abr.ge/dwghrl">https://abr.ge/dwghrl</a></p>
<p>승원님 테스트
✔️ com.lugstay.app.dev://app.lugstay.com/spaces/13762
<a href="https://abr.ge/jxnxfi">https://abr.ge/jxnxfi</a></p>
<p>✔️ com.lugstay.app.dev://staging.app.lugstay.com/spaces/13762
<a href="https://abr.ge/fmcbpt">https://abr.ge/fmcbpt</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vue2 프로젝트 초기 세팅]]></title>
            <link>https://velog.io/@sanghyeon-coding/Vue2-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B4%88%EA%B8%B0-%EC%84%B8%ED%8C%85</link>
            <guid>https://velog.io/@sanghyeon-coding/Vue2-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B4%88%EA%B8%B0-%EC%84%B8%ED%8C%85</guid>
            <pubDate>Thu, 23 Mar 2023 16:25:38 GMT</pubDate>
            <description><![CDATA[<p>신나게 프로젝트 돌고나서 새로운 프로젝트 세팅하려면 갑자기 프레임워크랑 낯가리는 사람? 저요!
초기 세팅하는 법 메모장 어딘가 열심히 끄적여놓고 못 찾는 사람? 저요!
미래의 나 보라고 소상히 적어둔 vue2 프로젝트 초기 세팅 가보자구🤟</p>
<h3 id="✔️-vue-cli-프로젝트-생성">✔️ Vue CLI 프로젝트 생성</h3>
<pre><code>vue create ‘프로젝트 명’
Please pick a preset : Default ([Vue 2] babel, eslint)
cd ‘프로젝트 명’
npm run serve</code></pre><p>🔗 <a href="https://cli.vuejs.org/">https://cli.vuejs.org/</a></p>
<h3 id="✔️-라우터-설치">✔️ 라우터 설치</h3>
<pre><code>npm i vue-router@3.5.3</code></pre><p>+) 2022년 2월 7일부터 뷰 라우터를 npm으로 설치시 버전(@3.5.3)을 명시해줘야 Vue2와 호환됨
+) 최신 버전은 아래 깃헙에서 참고
🔗 <a href="https://github.com/vuejs/vue-router">https://github.com/vuejs/vue-router</a></p>
<p>📁src/routes/index.js </p>
<pre><code>import Vue from &#39;vue&#39;;
import VueRouter from &#39;vue-router&#39;;

Vue.use(VueRouter);

export default new VueRouter({
    routes: [],
});</code></pre><p>📁main.js</p>
<pre><code>import Vue from &#39;vue&#39;;
import App from &#39;./App.vue&#39;;
import router from &#39;./routes/index&#39;; // 추가

Vue.config.productionTip = false;

new Vue({
  render: h =&gt; h(App),
  router, // 추가
}).$mount(&#39;#app&#39;);</code></pre><p>📁src/routes/index.js
: 코드 스플리팅, redirect, fallback, history mode 추가</p>
<pre><code>import Vue from &#39;vue&#39;;
import VueRouter from &#39;vue-router&#39;;

Vue.use(VueRouter);

export default new VueRouter({
  mode: &#39;history&#39;, // history mode
  routes: [
    {
      path: &#39;/&#39;,
      redirect: &#39;/login&#39;, // redirect
    },
    {
      path: &#39;/login&#39;,
      component: () =&gt; import(&#39;@/views/LoginPage&#39;),
    },
    {
      path: &#39;*&#39;,
      component: () =&gt; import(&#39;@/views/NotFoundPage&#39;), // fallback
    },
  ],
});</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[JSX, 조건부 내용 출력 3가지 방법]]></title>
            <link>https://velog.io/@sanghyeon-coding/JSX-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%82%B4%EC%9A%A9-%EC%B6%9C%EB%A0%A5-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@sanghyeon-coding/JSX-%EC%A1%B0%EA%B1%B4%EB%B6%80-%EB%82%B4%EC%9A%A9-%EC%B6%9C%EB%A0%A5-3%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 26 Dec 2022 01:58:22 GMT</pubDate>
            <description><![CDATA[<p>평소 조건부 내용 출력에 3항 연산자를 메인으로 사용했는데 새로운 방법 두 가지를 더 알게 되었다.
(주석 Here 부분)</p>
<h4 id="🔥-3항-연산자">🔥 3항 연산자</h4>
<pre><code>function Expenses(props){
    const [filteredYear, setFilteredYear] = useState(&#39;2020&#39;);
    const filterChangeHandler = selectedYear =&gt; {
        setFilteredYear(selectedYear);
    };
    const filteredExpenses = props.items.filter(expense =&gt; {
        return expense.date.getFullYear().toString() === filteredYear;
    });

    return(
        &lt;div&gt;
            &lt;Card className=&quot;expenses&quot;&gt;
                &lt;ExpenseFilter
                    selected={filteredYear}
                    onChangeFilter={filterChangeHandler}
                /&gt;
                {/* Here */}
                {filteredExpenses.length === 0 ? (
                    &lt;p&gt;No expenses found.&lt;/p&gt;
                ) : (
                    filteredExpenses.map( (expense) =&gt; (
                        &lt;ExpenseItem
                            key={expense.id}
                            title={expense.title}
                            amount={expense.amount}
                            date={expense.date}
                        /&gt;
                    ))
                )}
            &lt;/Card&gt;
        &lt;/div&gt;
    );
}</code></pre><h4 id="🔥--연산자">🔥 &amp;&amp; 연산자</h4>
<pre><code>function Expenses(props){
    const [filteredYear, setFilteredYear] = useState(&#39;2020&#39;);
    const filterChangeHandler = selectedYear =&gt; {
        setFilteredYear(selectedYear);
    };
    const filteredExpenses = props.items.filter(expense =&gt; {
        return expense.date.getFullYear().toString() === filteredYear;
    });

    return(
        &lt;div&gt;
            &lt;Card className=&quot;expenses&quot;&gt;
                &lt;ExpenseFilter
                    selected={filteredYear}
                    onChangeFilter={filterChangeHandler}
                /&gt;
                {/* Here */}
                {filteredExpenses.length === 0 &amp;&amp; &lt;p&gt;No expenses found.&lt;/p&gt;}
                {filteredExpenses.length &gt; 0 &amp;&amp;
                    filteredExpenses.map( (expense) =&gt; (
                        &lt;ExpenseItem
                            key={expense.id}
                            title={expense.title}
                            amount={expense.amount}
                            date={expense.date}
                        /&gt;
                    ))
                }
            &lt;/Card&gt;
        &lt;/div&gt;
    );
}</code></pre><h4 id="🔥-새로운-변수-생성">🔥 새로운 변수 생성</h4>
<pre><code>function Expenses(props){
    const [filteredYear, setFilteredYear] = useState(&#39;2020&#39;);
    const filterChangeHandler = selectedYear =&gt; {
        setFilteredYear(selectedYear);
    };
    const filteredExpenses = props.items.filter(expense =&gt; {
        return expense.date.getFullYear().toString() === filteredYear;
    });

    // Here
    let expensesContent = &lt;p&gt;No expenses found.&lt;/p&gt;;
    if (filteredExpenses.length &gt; 0){
        expensesContent = filteredExpenses.map( (expense) =&gt; (
            &lt;ExpenseItem
                key={expense.id}
                title={expense.title}
                amount={expense.amount}
                date={expense.date}
            /&gt;
        ))
    }

    return(
        &lt;div&gt;
            &lt;Card className=&quot;expenses&quot;&gt;
                &lt;ExpenseFilter
                    selected={filteredYear}
                    onChangeFilter={filterChangeHandler}
                /&gt;
                {/* Here */}
                {expensesContent}
            &lt;/Card&gt;
        &lt;/div&gt;
    );
}</code></pre><p>출처: Udemy Maximilian Schwarzmüller &lt;React 완벽 가이드 with Redux, Next.js, TypeScript&gt; 74강</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git] git 명령어 정리]]></title>
            <link>https://velog.io/@sanghyeon-coding/git-git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@sanghyeon-coding/git-git-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Wed, 21 Sep 2022 12:50:13 GMT</pubDate>
            <description><![CDATA[<p><em>(이 포스트는 코딩애플님의 &quot;매우쉽게 알려주는 git&amp;github&quot; 강의내용을 제가 보려고 정리해둔 글입니다.)</em></p>
<blockquote>
<p><del>1. git add, commit으로 파일 기록하기
2. git add, commit, diff 쉽게 하는 법
3. branch
4. merge (3-way, fast-forward, squash, rebase)</del>
5. reset (git revert, reset, restore)
6. push</p>
</blockquote>
<h3 id="5-reset-git-revert-reset-restore">5. reset (git revert, reset, restore)</h3>
<p>파일 복구</p>
<pre><code>git restore 파일명</code></pre><p>특정 commit 시점으로 파일 복구</p>
<pre><code>git restore --source 커밋아이디 파일명</code></pre><p>staging 취소</p>
<pre><code>git restore --staged 파일명</code></pre><p>commit 취소 (여러개 가능)</p>
<pre><code>git revert 커밋아이디1 커밋아이디2</code></pre><p>최근 commit 취소</p>
<pre><code>git revert HEAD</code></pre><p>reset (모든 작업물 과거로 돌리기)</p>
<pre><code>git reset --hard 커밋아이디</code></pre><p>reset (변동사항 staging한 상태로 과거로 돌리기)</p>
<pre><code>git reset --soft 커밋아이디</code></pre><p>reset (변동사항 지우지말고 unstage)</p>
<pre><code>git reset --mixed 커밋아이디</code></pre><h3 id="6-push">6. push</h3>
<p>기본 명령어</p>
<pre><code>git push -u 원격저장소주소 올릴로컬브랜치명</code></pre><p>(기본 명령어가 길어서 변수문법 사용)
원격저장소주소를 origin이라는 변수에 담음</p>
<pre><code>git remote add origin 원격저장소주소</code></pre><p>짧아진 명령어</p>
<pre><code>git push -u origin master</code></pre><p>(-u : 주소를 기억해라)
더 짧아진 명령어</p>
<pre><code>git push</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[mac m2] git 설치]]></title>
            <link>https://velog.io/@sanghyeon-coding/mac-m2-git-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@sanghyeon-coding/mac-m2-git-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Sun, 18 Sep 2022 04:10:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ul>
<li>homebrew 설치하기</li>
</ul>
</blockquote>
<ul>
<li>git 설치하기</li>
<li>zsh: command not found : brew 해결하기</li>
<li>git 설치 전후 버전이 동일할 때 해결하기</li>
</ul>
<p><em>(이 글은 mac 환경을 처음 접하는 맥린이 개발자가 개발환경을 세팅하면서 정리한 글입니다.)</em></p>
<p>mac에는 기본적으로 git이 깔려있습니다.
제 맥북의 경우 2.37.0이었고, 현재 git 홈페이지 최신 버전은 2.37.3이라 git 버전 업데이트를 해봅시다!</p>
<h3 id="1-homebrew-설치하기"><strong>1. homebrew 설치하기</strong></h3>
<p><a href="https://brew.sh/index_ko">https://brew.sh/index_ko</a></p>
<p>링크를 타고 들어가면 정면에 보이는 코드를 새 터미널에 복붙해줍니다.
(은근 시간이 걸리더라구요? 5분은 기다린 것 같아욥)</p>
<h3 id="2-git-설치하기"><strong>2. git 설치하기</strong></h3>
<pre><code>brew install git</code></pre><p>✋ zsh: command not found: brew 에러난 사람 손? 댓츠 미
(Homebrew가 /usr/local/... 이 아니라 /opt/homebrew/ 에 설정되어 있어서 그런거라 금방 해결할 수 있어용)</p>
<p>해결방법)</p>
<pre><code>vi ~/.zshrc</code></pre><pre><code>export PATH=/opt/homebrew/bin:$PATH</code></pre><p>ESC 클릭, :wq 입력하고 엔터
(홈 디렉토리의 .zshrc로 설정해 zsh shell이 brew command를 찾아 실행할 수 있습니당)</p>
<p>그리고 다시 brew install git!</p>
<h3 id="3-git-설치-전후-버전이-동일한-경우"><strong>3. git 설치 전후 버전이 동일한 경우</strong></h3>
<pre><code>brew info git</code></pre><ul>
<li>git version 2.37.3<pre><code>git --version</code></pre></li>
<li>git version 2.37.0</li>
</ul>
<p>이건 brew가 새로운 버전을 덮어씌우지 못해서 버전이 다르게 나오는 것입니다.</p>
<pre><code>echo &quot;export PATH=/usr/local/bin:\$PATH&quot; &gt;&gt; ~/.bash_profile</code></pre><p>터미널 재실행해서 버전 확인하면 2.37.3이 잘 나옵니다!👍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[css] table태그 colgroup으로 너비 맞추기]]></title>
            <link>https://velog.io/@sanghyeon-coding/table-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@sanghyeon-coding/table-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Fri, 16 Sep 2022 01:53:29 GMT</pubDate>
            <description><![CDATA[<pre><code>&lt;template&gt;
  &lt;div class=&quot;tab-wrap&quot;&gt;
    &lt;table&gt;
      &lt;colgroup&gt;
        &lt;col width=&quot;20%&quot; /&gt;
        &lt;col width=&quot;40%&quot; /&gt;
        &lt;col width=&quot;40%&quot; /&gt;
      &lt;/colgroup&gt;
      &lt;thead&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;col&quot;&gt;구분&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;태블릿&lt;/th&gt;
          &lt;th scope=&quot;col&quot;&gt;스마트폰&lt;/th&gt;
        &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;상반기 판매수&lt;/th&gt;
          &lt;td&gt;20,000&lt;/td&gt;
          &lt;td&gt;50,000&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
          &lt;th scope=&quot;row&quot;&gt;하반기 판매수&lt;/th&gt;
          &lt;td&gt;30,000&lt;/td&gt;
          &lt;td&gt;110,000&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
      &lt;tfoot&gt;
        &lt;th scope=&quot;row&quot;&gt;total&lt;/th&gt;
        &lt;td&gt;50,000&lt;/td&gt;
        &lt;td&gt;160,000&lt;/td&gt;
      &lt;/tfoot&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/template&gt;

&lt;script&gt;
export default {};
&lt;/script&gt;

&lt;style scoped&gt;
table {
  width: 100%;
}
tfoot td {
  text-align: center;
}
tbody tr td {
  text-align: center;
}
&lt;/style&gt;</code></pre><p><img src="https://velog.velcdn.com/images/sanghyeon-coding/post/bf300a4c-6c88-443c-9fbb-e726fa74a9c1/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>