<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>uomnf97_web.log</title>
        <link>https://velog.io/</link>
        <description>사회적 가치를 실현하는 프로그래머</description>
        <lastBuildDate>Mon, 18 Apr 2022 12:49:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>uomnf97_web.log</title>
            <url>https://images.velog.io/images/uomnf97_web/profile/dac1d1aa-7660-4ca8-a435-d4efcd190201/미모티콘.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. uomnf97_web.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/uomnf97_web" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[TailwindCSS로 Header와 Footer 정복하기]]></title>
            <link>https://velog.io/@uomnf97_web/TailwindCSS%EB%A1%9C-Header%EC%99%80-Footer-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@uomnf97_web/TailwindCSS%EB%A1%9C-Header%EC%99%80-Footer-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 18 Apr 2022 12:49:54 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요! 제이덥입니다~ 오늘은 React.js로 웹페이지 Footer/Header를 만들려고 하는데요! TailwindCSS Config를 다루고 해당되는 부분의 코드를 함께 작성해보려고 합니다! 
<img src="https://velog.velcdn.com/images/uomnf97_web/post/454c2781-233d-4545-ad17-7fb79c4aea56/image.png" alt=""></p>
<h1 id="1-react-app-생성하기">1. React-App 생성하기</h1>
<p><a href="https://somjang.tistory.com/entry/React-%EC%8B%A4%EC%8A%B5%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0-1-yarn-%EC%84%A4%EC%B9%98%EC%99%80-create-react-app-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0">+) yarn이 안깔려 있는 분은 여기로!</a>
<a href="https://codingapple.com/unit/react1-install-create-react-app-npx/">+) react가 안깔려 있는 분은 여기로!</a></p>
<ul>
<li>처음에 해주어야 하는건 우선 React-app을 생성하는 것입니다. 저는 yarn을 이용해서 생성을 해줄 건데요, 만약 npm으로 설치하는 분들은 <code>npm create-react-app &lt;web이름&gt;</code>을 입력해주면 됩니다. <pre><code class="language-bash">yarn create react-app webstructure</code></pre>
</li>
<li>설치가 다 되면 아래 문구가 뜰꺼에요!(저는 이미 webstructure라는 이름으로 디렉토리를 만들어둔 상태라 디렉토리 이름을 다르게 설정하기는 했습니다. 하지만 webstructure로 옮겨서 나머지 작업은 진행할 예정입니다)<img src="https://velog.velcdn.com/images/uomnf97_web/post/d58cc5d6-bfc5-4148-bdbe-7854f7747b55/image.png" alt=""></li>
<li>이후 다음 입력어를 입력하면 react.js가 시작됩니다! 그럼 벌써 1단계가 마무리 되었네요~!<pre><code class="language-bash">yarn start</code></pre>
<img src="https://velog.velcdn.com/images/uomnf97_web/post/7a9b4c2f-3fd3-4811-9f75-4d0e96e7ac78/image.png" alt=""></li>
</ul>
<h1 id="2-tailwindcss-설치하기">2. TailwindCSS 설치하기</h1>
<ul>
<li>TailwindCSS는 CSS 프레임워크입니다. 다른 태그안에 속성을 넣어주는 방식으로 디자인을 진행합니다. 기존 CSS에서는 따로 내용을 커스터마이징을 해주어야하나, Tailwindcss에서는 미리 해당 내용이 정의되어 있어, 개발 시간을 단축해줍니다. 코드가 조금 길어지고, 보기 어렵다는 단점이 있기는 하지만, 간단한 페이지를 구현하고, 빠른 개발을 해야한다면 사용하기 편한 프레임워크입니다. </li>
<li>또한 일반 CSS처럼 커스터마이징도 해줄 수 있기 때문에 확장성도 갖추고 있습니다. </li>
</ul>
<h2 id="21-tailwindcss설치하기">2.1 TailwindCSS설치하기</h2>
<p>그럼 설치해볼까요? 설치는 다음과 같은 입력어를 통해 설치해줄 수 있습니다. 본인이 쓰고 있는 것을 이용해서 설치해주시면 됩니다.</p>
<pre><code class="language-bash">yarn add -D tailwindcss postcss autoprefixer
npm install -D tailwindcss</code></pre>
<blockquote>
<p>아래와 같이 나오면 저희가 활용할 CSS설치까지 마무리 되었네요!<img src="https://velog.velcdn.com/images/uomnf97_web/post/8ca40295-5d6b-4b3b-9d9d-4d3fdeb34925/image.png" alt=""></p>
</blockquote>
<p>이제 tailwind.config.js파일을 추가해줍니다! 아래 명령어를 추가해주시면tailwind.config.js파일이 추가된 것을 보실 수 있습니다!</p>
<pre><code class="language-bash">npx tailwindcss init</code></pre>
<p><img src="https://velog.velcdn.com/images/uomnf97_web/post/2e13641f-013f-4224-81d7-013406c33f9b/image.png" alt="">
이후 tailwindcss파일을 다음과 같이 수정해주세요! 전체 복사하셔서 기존 있던 내용을 모두 지우시고 넣어주시면 됩니다~!</p>
<pre><code class="language-js">module.exports = {
  content: [
    &quot;./src/**/*.{js,jsx,ts,tsx}&quot;,
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}</code></pre>
<p>그리고 추가로 src &gt; index.css파일에 들어가서 해당 내용을 깔끔하게 날리신 뒤에~ 이 내용을 추가해주시면 됩니다 :) </p>
<pre><code class="language-js">// index.css 파일 내부 내용
@tailwind base;
@tailwind components;
@tailwind utilities;</code></pre>
<h1 id="3-craco-설치">3. Craco 설치</h1>
<ul>
<li>create-react-app은 PostCSS를 지원해주지만, 재정의를 할 수 없기에 TailwindCSS를 이용하기에 다양한 제약이 따릅니다. 따라서 CRACO를 설치하고, craco.config.js파일을 추가해서 쉽고 다양하게 커스터마이징을 할 수 있도록 설정해줍니다. 
아래는 다운로드 받을 수 있는 명령어입니다. <pre><code class="language-bash">yarn add @craco/craco
npm install  @craco/craco</code></pre>
<blockquote>
<p>이것 또한 아래와 같이 나오면 설치가 완료가 된거에요~!<img src="https://velog.velcdn.com/images/uomnf97_web/post/58455dc9-6221-4f37-8a99-a28be833a170/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p>그리고 이제 craco를 이용해서 PostCSS를 활용할 수 있도록 <code>craco.config.js</code>파일을 만들어줍니다. 코드는 다음과 같아요~</p>
<pre><code class="language-js">module.exports = {
    style: {
        postcssOptions: {
            plugins: [require(&#39;tailwindcss&#39;), require(&#39;autoprefixer&#39;)],
        },
    },
};</code></pre>
<p><em>주의해야하는 부분은 아래와 같이 가장 상위 디렉토리에 저장을 시켜야한다는 것!</em>
<img src="https://velog.velcdn.com/images/uomnf97_web/post/92a5f046-6987-4fcf-a4c9-5dbbc5071855/image.png" alt=""></p>
<p>마지막으로 <code>package.json</code>에 이부분을 요렇게 수정해줍니다!
<img src="https://velog.velcdn.com/images/uomnf97_web/post/a4b8ca68-afda-450d-8c6b-8e85de1ab347/image.png" alt=""></p>
<pre><code class="language-js">&quot;start&quot;: &quot;craco start&quot;,
&quot;build&quot;: &quot;craco build&quot;,
&quot;test&quot;: &quot;craco test&quot;</code></pre>
<p>위에 코드를 해당하는 부분에 찾아서 붙이시면 됩니다 :)</p>
<p>그럼 모든 세팅은 끝났습니다! Header와 Footer를 만들어볼까요?</p>
<h1 id="4-header-와-footer를-만들기">4. Header 와 Footer를 만들기</h1>
<p>오늘은 Header와 Footer를 만들건데요. 제가 작성한 코드를 임의로 넣어주시면 될 것 같습니다. React-script가 5로 업데이트가 되서 실행이 잘 안되는게 많을 텐데요. craco가 특히 문제가 많다구 하네요;; 빨리 craco가 업데이트 되길바라며.... 아래 따라하시고, 문제 생기시면 연락을 주시기 바랍니다! 시험 화이팅~</p>
<h2 id="41파일-정리">4.1파일 정리</h2>
<p>우리는 이제 App.css파일이 필요없습니다! src에 있는 App.css 파일을 지워주시고, App.js에 있는 아래 문장을 삭제해줍니다!</p>
<pre><code class="language-js">import &#39;./App.css&#39;</code></pre>
<h2 id="42">4.2</h2>
<p>App.js파일을 아래와 같이 수정해줍니다! 전체 내용을 지우시고 복사 붙여넣기 해주시면 됩니다!</p>
<pre><code class="language-js">import logo from &#39;./static/photo/logo.png&#39;;
import &#39;./index.css&#39;;

function App() {
  const currentDay = new Date();
  const currentYear = currentDay.getFullYear();

  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;header className=&quot;fixed inset-x-0 top-0 z-50 left-0 bg-white text-gray-700 body-font border-b border-gray-200&quot;&gt;
        &lt;div className=&quot;container mx-auto flex flex-wrap p-5 flex-col md:flex-row items-center&quot;&gt;
          &lt;div
            className=&quot;flex title-font font-medium items-center text-gray-900 mb-4 md:mb-0&quot;
          &gt;
            &lt;img alt=&quot;logo&quot; src={logo} className=&quot;w-8 h-8 -mr-1&quot; /&gt;
            &lt;span className=&quot;ml-3 text-xl text-indigo-500&quot;&gt;동글동글 코인 지표 인덱스&lt;/span&gt;
          &lt;/div&gt;
          &lt;nav className=&quot;md:ml-auto flex flex-wrap items-center text-base justify-center&quot;&gt;
            &lt;div className=&quot;mr-5 hover:text-gray-900&quot;&gt;
              Speedometer
            &lt;/div&gt;
            &lt;div className=&quot;mr-5 hover:text-gray-900&quot;&gt;
              Graph
            &lt;/div&gt;
            &lt;div className=&quot;mr-5 hover:text-gray-900&quot;&gt;
              Chart
            &lt;/div&gt;
          &lt;/nav&gt;
        &lt;/div&gt;
      &lt;/header&gt;
      &lt;section className=&quot;containe mb-8 mt-24&quot;&gt;
        Speedometer가 들어갈 자리입니다!
      &lt;/section&gt;
      &lt;section className=&quot;containe mb-8 mt-8&quot;&gt;
        Graph가 들어갈 자리입니다!
      &lt;/section&gt;
      &lt;section className=&quot;containe mb-8 mt-8&quot;&gt;
        Chart가 들어갈 자리입니다!
      &lt;/section&gt;
      &lt;footer className=&quot;text-gray-700 body-font&quot;&gt;
        &lt;div className=&quot;bg-gray-200&quot;&gt;
          &lt;div className=&quot;container mx-auto pt-4 px-5 flex flex-wrap flex-col sm:flex-row&quot;&gt;
            &lt;p className=&quot;text-gray-500 text-sm text-center sm:text-left&quot;&gt;
              © {currentYear} 동글동글
            &lt;/p&gt;
            &lt;span className=&quot;sm:ml-auto sm:mt-0 mt-2 sm:w-auto w-full sm:text-left text-center text-gray-500 text-sm&quot;&gt;
              경기도 용인시 처인구 모현읍 외대로 81, 한국외국어대학교
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;div className=&quot;container mx-auto pb-4 px-5 flex flex-wrap flex-col sm:flex-row&quot;&gt;
            &lt;span className=&quot;sm:ml-auto sm:mt-0 mt-2 sm:w-auto w-full sm:text-left text-center text-gray-500 text-sm&quot;&gt;
              Developed by 김도영, 김주원, 김태우, 정서영
            &lt;/span&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/footer&gt;
    &lt;/div&gt;
  );
}

export default App;</code></pre>
<p>이후 <code>yarn start</code> 혹은 <code>npm run start</code>를 눌러주시면 바로 시작하실 수 있습니다! 아래 같은 화면에서 원하는 대로 디자인을 고쳐보세요! <img src="https://velog.velcdn.com/images/uomnf97_web/post/28aafb1e-5315-4ff0-9d41-f3117b542f2a/image.png" alt=""></p>
<p>파일 구조 및 코드는 아래 깃헙주소에서 확인하실 수 있습니다!
<a href="https://github.com/Kim-Ju-won/WebStructure.git">+) 파일 구조 및 코드보러 깃헙에 가기!</a></p>
<p>출처 : 
<a href="https://tailwindcss.com/docs/installation">Tailwindcss Documentation installation</a>
<a href="https://graycha.tistory.com/206">차곡차곡 님의 블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[학회 웹페이지 만들기 :: 버그 고치기]]></title>
            <link>https://velog.io/@uomnf97_web/%ED%95%99%ED%9A%8C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B2%84%EA%B7%B8-%EA%B3%A0%EC%B9%98%EA%B8%B0</link>
            <guid>https://velog.io/@uomnf97_web/%ED%95%99%ED%9A%8C-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EB%B2%84%EA%B7%B8-%EA%B3%A0%EC%B9%98%EA%B8%B0</guid>
            <pubDate>Fri, 18 Feb 2022 12:03:49 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요! 방문객 여러분 오늘은 제가 학회앱페이지를 만들면서 받은 피드백 해결 사항에 대해서 포스팅을 하려고 합니다!</p>
<p>제가 만든 웹은 현재 한국외국어대학교 컴퓨터공학부 학회 PNP의 웹페이지인데 현재 웹페이지 퍼블리싱 이전에 깃헙에 deploy를 해놓은 상태입니다. 궁금하신 분들은 아래 링크를 따라 가셔서 확인하시면 좋을 것 같네요~</p>
<p><a href="https://www.hufspnp.com">+) 학회 홈페이지 살펴보기</a>
<img src="https://images.velog.io/images/uomnf97_web/post/0cd01f40-ad83-46b2-a0dc-71c5e47c1956/Screen%20Shot%202022-02-18%20at%2012.28.48%20AM.png" alt=""></p>
<h1 id="맡은-역할">맡은 역할</h1>
<p>학회페이지는 전반적으로 각 페이지를 각 사람에 할당해서 만드는 방식으로 진행했습니다. 깃허브에서 학회깃헙에 프로젝트를 생성하고 각자 fork한 다음 각자 할당받은 페이지를 개발을 했구요! 이후에 프로젝트 페이지에 병합을 하는 방식으로 진행했습니다.</p>
<ul>
<li>저는 기본적으로 &#39;학회소개&#39;페이지와 &#39;FAQ&#39;페이지를 만들었습니다. 전체 학회 기본 소개 페이지부터 활동 및 연혁 등을 소개하는 페이지를 만들었네요! ㅎㅎ</li>
<li>추가로 저는 학회페이지에서 라우터를 관리하고, 전체 페이지 병합의 초기작업을 진행했습니다! 덕분에 라우터라는 개념에 대해서 경험지를 많이 획득할 수 있어서 좋은 경험이었던 것 같네요!</li>
</ul>
<h1 id="feedback">FeedBack</h1>
<p>피드백으로 받은 사항은 다음과 같습니다!</p>
<pre><code class="language-bash">- About
1. &#39;학회소개 페이지&#39;에서 따라 글자 중앙정렬이 안되는 해상도 존재
    - 세부 사항 : FHD(1920 X 1080) 해상도 모니터에서는 문제점이 생김
2. &#39;학회 활동&#39;, &#39;연혁 페이지&#39;에서 특정해상도에서 Footer가 하단에 고정되어 있지 않고 여백이 존재
    - 세부 사항 : FHD(1920 X 1080) 해상도에서 모니터에서 문제점이 생김
3. &#39;연혁 페이지&#39;에서 선이랑 원의 중심이 만나지 않고 원이 타원이다
    - 세부 사항 : FHD 해상도 상태 혹은 모바일에서 문제점 발생
4. &#39;학회장 페이지, 교수 페이지&#39;부분이 모바일에서 보면 겹쳐져 나타난다.
    - 세부 사항 : 모바일, 패드 크기에서 문제 발생
5. 모든 페이지에 있는 페이지 제목이 모바일 상황에서 header에 가려진다. 
6.  버튼이 모바일 상황에서 깨짐 문제 발생
- FAQ
1. 오타
    - 세부사항 : 좌측에 플러스 “친구”로 바꾸기  
2. 모바일 상황에서 컨테이너가 겹치는 문제 발생</code></pre>
<ul>
<li>정리 : 대부분의 문제점이 Responsive화면에 의한 문제점이었습니다. 개인 개발을 할 때 쓰는 맥 14인치 컴퓨터가 1280 X 720 사이즈라 이보다 큰 Full HD사이즈 혹은 패드, 핸드폰 사이즈일 때 문제가 발생하는 경우가 많았습니다. 따라서 이 점을 유념해 해당 페이지들의 수정을 진행하였습니다! 따라서 Responsive화면을 만들어주기 위해서 학습을 진행했습니다.</li>
</ul>
<h1 id="tailwindcss">TailwindCSS</h1>
<h2 id="tailwind-css란">Tailwind CSS란?</h2>
<blockquote>
<p>Tailwind CSS is the only framework that I&#39;ve seen scale on large teams. It&#39;s easy to customize, adapts to any design, and build size is tiny</p>
</blockquote>
<p>Tailwindcss란 CSS 프레임워크로 인라인 스타일을 가능하게 해주는 쉽고 빠르게 스타일링을 하게 해주며, 일관된 디자인을 가능하게 해줍니다. 스타일 변경을 위해 따로 클래스를 제작해줄 필요가 없으며 선언된 태그 안에 속성을 부여하는 방식으로 디자인을 적용해주는 방식으로 CSS적용을 진행합니다. </p>
<ul>
<li>장점 : <pre><code>  - 빠른 개발 시간
  - 일관된 디자인 
  - 쉽고 자유로운 커스텀
  - 로우레벨의 스타일 제공 
  - 미리보기, 자동완성 등 디자인 개발에 편한 환경</code></pre></li>
<li>단점<pre><code>  - 길고 난잡한 코드
  - 클래스명 선언할 필요가 없는 대신 익숙해질 수 있도록 일부를 학습해야함.</code></pre></li>
</ul>
<p>추가로 관심이 있는 분들은 Tailwindcss공식 사이트를 통해서 확인하실 수 있습니다!
<a href="https://tailwindcss.com/">-&gt; TailwindCSS 살펴보기</a></p>
<h2 id="tailwindcss에서-responsive-화면-만들기">TailwindCSS에서 Responsive 화면 만들기</h2>
<p>우선 아래 페이지에서 공식 문서에서 권장하는 내용을 확인하실 수 있습니다. <img src="https://images.velog.io/images/uomnf97_web/post/570bc9d6-f2c8-4565-8bfc-ad3e9a86eeb1/Screen%20Shot%202022-02-18%20at%204.01.54%20PM.png" alt=""><a href="https://tailwindcss.com/docs/responsive-design">+) Responsive Design 공식 documentation확인</a></p>
<p>관련 내용을 살펴 보면 <strong>특정 픽셀에서 적용될 수 있도록 아래 나와있는 Breakpoing prefix를 입력 한뒤 정렬을 하도록 하여 관련 부분에서 정렬이나 내용이 어떠한 방식으로 정리 될 수 있는지 정의합니다.</strong> </p>
<table>
<thead>
<tr>
<th>Breakingpoint prefix</th>
<th>Minimum width</th>
<th>CSS</th>
</tr>
</thead>
<tbody><tr>
<td>&#39;sm&#39;</td>
<td>640px</td>
<td>@media (min-width: 640px) { ... }</td>
</tr>
<tr>
<td>&#39;md&#39;</td>
<td>760 px</td>
<td>@media (min-width: 760px) { ... }</td>
</tr>
<tr>
<td>&#39;lg&#39;</td>
<td>1024 px</td>
<td>@media (min-width: 1024px) { ... }</td>
</tr>
<tr>
<td>&#39;xl&#39;</td>
<td>1280 px</td>
<td>@media (min-width: 1280px) { ... }</td>
</tr>
<tr>
<td>&#39;2xl&#39;</td>
<td>1536 px</td>
<td>@media (min-width: 1536px) { ... }</td>
</tr>
<tr>
<td>사용 방법은 해당 <code>prefix : config내용</code> 순으로 이루어 져있는데요. 예를 들어 내가 1024 px상황에서 중앙 정렬을 하고 싶다면 <code>lg: text-center</code>와 같이 정의하면 되는 것입니다! 쉽게 적용 할 수 있네요!</td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>또한 Tailwindcss는 default값으로 모바일에 적용되기 최적화되는 방식으로 디자인을 먼저 한다는 것을 알고 있어야합니다. 따라서 이보다 큰 상황에서 적용되는 breakpoint들은 현재 설정된 breakpoint 그리고 그 이상만 적용되는 걸 유의 해주세요! </p>
<p><strong>Targeting Mobile Screens</strong>:
앞서 말씀드렸던 건 모바일 상황이 default임으로 굳이 모바일에 적용하시려면 <code>sm:</code>속성을 이용안하셔도 됩니다! 만들어 주실 때는 아무런 breakpoint없이 추가해주면 됩니다!</p>
<p><strong>Targeting a single Break Points</strong>:
여기서 나오는 breakpoint prefix는 모두 min-width가정입니다. min-width보다 큰 상황에서는 모두 적용이 되는 것이죠. 따라서 이보다 <strong><del>이상</del>이하</strong>를 표현해주고 싶으실 때에는 더 큰 Breakingpoint prefix를 이용해주시면 됩니다.</p>
<pre><code class="language-js">&lt;div class=&quot;bg-green-500 md:bg-red-500 lg:bg-green-500&quot;&gt;
  &lt;!-- ... --&gt;
&lt;/div&gt;</code></pre>
<p>이렇게 되면 md(760px)~lg(1024)에서는 red-500 배경 색상으로 적용되고 lg(1024px)이상에서는 green-500이 배경색상으로 정해집니다.</p>
<ul>
<li>Customizing breakpoints
아래와 같이 tailwind.config.js 파일을 이용해서 관련 내용을 정의할 수 있습니다. </li>
</ul>
<pre><code class="language-js">module.exports = {
  theme: {
    screens: {
      &#39;tablet&#39;: &#39;640px&#39;,
      // =&gt; @media (min-width: 640px) { ... }

      &#39;laptop&#39;: &#39;1024px&#39;,
      // =&gt; @media (min-width: 1024px) { ... }

      &#39;desktop&#39;: &#39;1280px&#39;,
      // =&gt; @media (min-width: 1280px) { ... }
    },
  }
}</code></pre>
<p>관련 내용을 공부하였으니,,, 학회페이지를 수정하러 가볼까요?!</p>
<h1 id="피드백-반영하기">피드백 반영하기</h1>
<h2 id="1-about-page-중앙-정렬문제">1. About Page 중앙 정렬문제</h2>
<pre><code>1. &#39;학회소개 페이지&#39;에서 따라 글자 중앙정렬이 안되는 해상도 존재
    - 세부 사항 : FHD(1920 X 1080) 해상도 모니터에서는 문제점이 생김</code></pre><p>문제 화면:<img src="https://images.velog.io/images/uomnf97_web/post/ab443ced-a32b-496c-97ee-d76365aacccf/Screen%20Shot%202022-02-18%20at%204.39.16%20PM.png" width="600"/>
수정 화면: 
<img src="https://images.velog.io/images/uomnf97_web/post/15c0209f-87e6-4f5e-a6f2-97a7b8aa6f30/Screen%20Shot%202022-02-18%20at%207.30.43%20PM.png" alt="">
수정 사항 : 해상도 별로 왼쪽 마진을 responsive하게 설정하여 해당 문제점을 해결해주었습니다.</p>
<pre><code class="language-js">&lt;div class=&quot;p-8&quot;&gt;
    &lt;h2 className=&quot;text-indigo-500 tracking-widest font-medium title-font xl:ml-16 2xl:ml-72 mb-1&quot;&gt;Our Goal&lt;/h2&gt;
    &lt;h1 className=&quot;font-medium title-font mb-4 text-gray-900 xl:ml-16 2xl:ml-72 text-center&quot;&gt;학회 목적&lt;/h1&gt;
    &lt;div class = &quot;space-y-2&quot;&gt;
        &lt;p className =&quot;lg:w-4/5 xl:ml-16 2xl:ml-72 text-lg mt-3 text-left &quot;&gt;
        1. 자신이 되고자 하는 목표를 찾기                       
        &lt;/p&gt;
        &lt;p className=&quot;lg:w-4/5 xl:ml-16 2xl:ml-72 lg:whitespace-nowrap text-lg mt-3 text-left &quot;&gt;
        2. 컴퓨터 기술 및 이론에 관한 학습을 통해 자신의 소프트웨어 분야 전문성 증진
        &lt;/p&gt;
        &lt;p className=&quot;lg:w-4/5 xl:ml-16 2xl:ml-72 text-lg mt-3 text-left&quot;&gt;
        3. 학회원들과 함께 협력하며 자신의 프로젝트를 완성
        &lt;/p&gt;
        &lt;p className=&quot;lg:w-4/5 xl:ml-16 2xl:ml-72 text-lg mt-3 text-left&quot;&gt;
        4. 실무 경험과 현업에서 필요한 각종 정보를 공유
        &lt;/p&gt;
        &lt;p className=&quot;lg:w-4/5 xl:ml-16 2xl:ml-72 text-lg mt-3 text-left&quot;&gt;
        5. 선후배 간의 친목을 증진
        &lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;</code></pre>
<h2 id="2-footer-하단-고정하기">2. Footer 하단 고정하기</h2>
<pre><code class="language-bash">2. &#39;학회 활동&#39;, &#39;연혁 페이지&#39;에서 특정해상도에서 Footer가 하단에 고정되어 있지 않고 여백이 존재
    - 세부 사항 : FHD(1920 X 1080) 해상도에서 모니터에서 문제점이 생김</code></pre>
<p>문제 화면:<img src="https://images.velog.io/images/uomnf97_web/post/d4585556-ebf2-424e-b1d8-b06468e5a261/Screen%20Shot%202022-02-18%20at%205.16.18%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/badce06e-f5da-4ec0-a0b3-89461b2f6788/Screen%20Shot%202022-02-18%20at%205.16.28%20PM.png" alt=""></p>
<p>수정 화면: 
<img src="https://images.velog.io/images/uomnf97_web/post/6bce33f7-2ec7-493c-bc84-86fe6b10e6b8/Screen%20Shot%202022-02-18%20at%206.31.36%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/715159fc-12b5-4389-ace9-c1caab4eb121/Screen%20Shot%202022-02-18%20at%206.31.40%20PM.png" alt="">
수정 사항 : 문제가 있는 두개의 페이지에서 1280px이상이 되는 경우 상단의 아이템과의 마진을 조정함으로서 문제를 해결하였습니다!</p>
<pre><code class="language-js">// Activity Page
&lt;div className=&quot;flex flex-wrap mt-8 mb-48 xl:mb-96&quot;&gt;</code></pre>
<pre><code class="language-js">//Professor Page
&lt;section className = &quot;text-gray-700 body-font border-t border-gray-200 lg:mb-32 xl:mb-60&quot;&gt;</code></pre>
<h2 id="3-history-page-원이-만나지-않는-문제">3. History Page 원이 만나지 않는 문제</h2>
<pre><code class="language-bash">3. &#39;연혁 페이지&#39;에서 선이랑 원의 중심이 만나지 않고 원이 타원이다
    - 세부 사항 : FHD 해상도 상태 혹은 모바일에서 문제점 발생</code></pre>
<p>문제 화면:
<img src="https://images.velog.io/images/uomnf97_web/post/ed6f7045-36eb-42da-b736-66e0ee4082c3/Screen%20Shot%202022-02-18%20at%205.10.02%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/0ddb29c3-3c2b-496e-8163-46a8535b7a02/Screen%20Shot%202022-02-18%20at%205.10.35%20PM.png" width=600/></p>
<p>수정 화면: 
<img src="https://images.velog.io/images/uomnf97_web/post/f897f4f2-fb77-4f08-93a8-17602a11fd0f/Screen%20Shot%202022-02-20%20at%204.37.04%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/138eb15a-fde6-4df0-87e2-fcefd52ca2eb/Screen%20Shot%202022-02-20%20at%204.37.29%20PM.png" width=400/></p>
<p>수정 사항 : 불필요한 코드들을 삭제하고 중앙 정렬로 바꾼다음 해당 border을 글씨가 들어있는 컨테이너 뒤로 가는 &quot;z값&quot;을 조정함으로서 문제점을 해결하였습니다.</p>
<h2 id="4-leaderprofessor-page-겹침문제">4. Leader/Professor Page 겹침문제</h2>
<pre><code class="language-bash">4. &#39;학회장 페이지, 교수 페이지&#39;부분이 모바일에서 보면 겹쳐져 나타난다.
    - 세부 사항 : 모바일, 패드 크기에서 문제 발생</code></pre>
<p>문제 화면:
<img src="https://images.velog.io/images/uomnf97_web/post/2bca48e3-192a-4d58-b00b-3a1e94e3bfb1/Screen%20Shot%202022-02-18%20at%205.05.13%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/d1565d43-f1ee-4914-b2d5-c61a3c4bd108/Screen%20Shot%202022-02-18%20at%205.04.48%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/9cd2a151-b9ba-4950-9bec-f1bf4552af5f/Screen%20Shot%202022-02-18%20at%205.07.33%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/4f570423-b089-491f-ad27-b1e4a6cdf147/Screen%20Shot%202022-02-18%20at%205.07.49%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/25fa2e46-907b-4701-a615-d66bc5edc9d6/Screen%20Shot%202022-02-18%20at%205.08.09%20PM.png" width=300/></p>
<p>수정 화면: <img src="https://images.velog.io/images/uomnf97_web/post/bbc49eb4-6546-4765-85b6-886ca8b82897/Screen%20Shot%202022-02-18%20at%207.56.00%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/0e84b075-ddf8-45b7-af14-c70b5ed6cb22/Screen%20Shot%202022-02-18%20at%207.55.24%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/8fc66e98-5432-48ed-943f-8abfdec55dd2/Screen%20Shot%202022-02-18%20at%207.55.41%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/8c658418-dcf4-4fc7-bc3d-0a61ce11de95/Screen%20Shot%202022-02-18%20at%208.14.41%20PM.png" width=300/><img src="https://images.velog.io/images/uomnf97_web/post/9deecd98-d229-4096-8304-fc455435f400/Screen%20Shot%202022-02-18%20at%208.16.23%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/568e0ad0-3007-48da-b7db-a699133eb2fe/Screen%20Shot%202022-02-18%20at%208.15.34%20PM.png" alt="">
수정 사항 : 이 상황역시 md, lg, xl 등을 적극적으로 활용하여 해당 상황일때 각 컨테이너의 크기를 조정해줌으로서 문제를 해결하였습니다.</p>
<pre><code class="language-js">//leader page
&lt;div className=&quot;flex flex-col text-center md:w-1/3 lg:w-1/4  mb-8 mt-12&quot;&gt;</code></pre>
<pre><code class="language-js">&lt;div class=&quot;mx-auto bg-white rounded-xl shadow-md overflow-hidden&quot;&gt;
                    &lt;div class=&quot;xl:flex&quot;&gt;
                    &lt;div class=&quot;xl:flex&quot;&gt;
                    &lt;img
                        class=&quot;object-covel&quot;
                        src={professor}
                    /&gt;
                    &lt;/div&gt;
                    &lt;div class=&quot;p-8 text-justy-center&quot;&gt;
                        &lt;h2 class=&quot; text-indigo-500 tracking-widest font-medium title-font mb-1&quot;&gt;2000~&lt;/h2&gt;
                        &lt;h1 class=&quot;font-medium title-font mb-4 text-gray-900&quot;&gt;경력&lt;/h1&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        서울공대 제어계측공학과 학사(1986) &lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        한국과학기술원 전기 및 전자공학과 석사(1988)&lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        한국과학기술원 전기 및 전자공학과 박사(1994)&lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        한국과학기술원 전기 및 전자공학과 Post-Doc(1994-1995)&lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        한국외대 디지털정보공학과 교수(1995-현재)&lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        대한전자공학회 정회원 &lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        IEEE member&lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        한국외대 과학기술학회 PNP 지도교수(2000-현재)&lt;/p&gt;
                        &lt;p className=&quot;lg:text-lg mx-auto leading-relaxed text-base mt-3 text-justify-center lg:whitespace-nowrap&quot;&gt;
                        한국외대 컴퓨터공학부 학부장(2021)&lt;/p&gt;
                    &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;</code></pre>
<h2 id="5-header가-페이지-제목을-가리는-문제">5. Header가 페이지 제목을 가리는 문제</h2>
<pre><code class="language-bash">5.  모든 페이지에 있는 페이지 제목이 모바일 상황에서 header에 가려진다. </code></pre>
<p>문제 화면:<img src="https://images.velog.io/images/uomnf97_web/post/3b63c6ec-c798-4f8c-9ad8-d859e71babdb/Screen%20Shot%202022-02-18%20at%204.42.35%20PM.png" width="300"/></p>
<p>수정 화면: <img src="https://images.velog.io/images/uomnf97_web/post/d096d694-b71a-4495-b258-9eef8811bcd4/Screen%20Shot%202022-02-18%20at%204.53.40%20PM.png" width="300"/>
수정 사항 :</p>
<ul>
<li>문제점이 발생하는 상황은 모바일 크기 상황이었음으로 일반적인 상황에 대한 top 마진을 40으로 조절하고, 이후에 <code>lg: mt-24</code>로 일관된 상단 여백을 가질 수 있도록 조절해주었습니다. <pre><code class="language-js">&lt;div class=&quot;mt-40 lg:mt-24&quot;&gt;</code></pre>
</li>
</ul>
<h2 id="6-상단-버튼-크기-문제">6. 상단 버튼 크기 문제</h2>
<pre><code class="language-bash">6.  버튼이 모바일 상황에서 버튼의 크기가 달라짐
</code></pre>
<p>문제 화면:<img src="https://images.velog.io/images/uomnf97_web/post/c3878a0f-2bc3-4394-9b2d-305fe7e282ed/Screen%20Shot%202022-02-18%20at%205.19.38%20PM.png" width="300"/>
수정 화면: <img src="https://images.velog.io/images/uomnf97_web/post/31d1e76b-8c0f-414e-a5c3-70031c3267d7/Screen%20Shot%202022-02-18%20at%205.36.01%20PM.png" width="300"/>
수정 사항 :
기존의 코드는 <code>flex-row</code>로 한행으로 묶어주었는데 해당을 1024px 이상인 경우에서만 해당코드를 활용할 수 있도록 하고 모바일 사이즈에서는 <code>flex flex-wrap</code>으로 상황에따라 flex하게 반응 할 수 있도록 해주었다. </p>
<pre><code class="language-js">&lt;div className=&quot;flex flex-wrap lg:flex lg:flex-row place-content-center mt-8&quot;&gt;</code></pre>
<h2 id="7-faq-page-문제">7. FAQ Page 문제</h2>
<pre><code class="language-bash">- FAQ
1. 오타
    - 세부사항 : 좌측에 플러스 “친구”로 바꾸기  
2. 모바일 상황에서 컨테이너가 겹치는 문제 발생</code></pre>
<p>문제 화면:
<img src="https://images.velog.io/images/uomnf97_web/post/cee6794d-be6b-4c81-97a0-7e7f76f73bd0/Screen%20Shot%202022-02-18%20at%205.13.04%20PM.png" width="300"/></p>
<p>수정 화면: <img src="https://images.velog.io/images/uomnf97_web/post/15766683-f10d-4a65-8576-5c7cbeca7e3b/Screen%20Shot%202022-02-18%20at%2011.47.05%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/d646a807-9b41-4f3a-847f-b8be7a5882e7/Screen%20Shot%202022-02-20%20at%204.41.05%20PM.png" width="300"/><img src="https://images.velog.io/images/uomnf97_web/post/eeec0ea1-2b92-47c4-b322-66e70aec729d/Screen%20Shot%202022-02-20%20at%204.40.40%20PM.png" width="300"/></p>
<p>수정 사항 : hidden 기능을 사용해서 특정해상도에서 숨기고 text관련 속성을 이용해서 글씨 크기를 조정함으로서 버튼이 깨지는 문제점을 해결했습니다! </p>
<p>참고 : <a href="https://wonny.space/writing/dev/hello-tailwind-css">블로그</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Gh-Pages 배포의 모든것!]]></title>
            <link>https://velog.io/@uomnf97_web/Gh-Pages-%EB%B0%B0%ED%8F%AC%EC%9D%98-%EB%AA%A8%EB%93%A0%EA%B2%83</link>
            <guid>https://velog.io/@uomnf97_web/Gh-Pages-%EB%B0%B0%ED%8F%AC%EC%9D%98-%EB%AA%A8%EB%93%A0%EA%B2%83</guid>
            <pubDate>Fri, 04 Feb 2022 13:29:04 GMT</pubDate>
            <description><![CDATA[<p>안녕하세요! 
좋은 하루 보내셨나요?! 제이덥입니다!</p>
<p>오늘은 Github에서 web을 Publishing 하는 방법에 대해서 정리해볼까 합니다! 어떻게 Publishing하는지 기본적인 부분에 대해서 다루고 추가적으로 제가 발생했던 오류에 대해서 설명해보고 마치려고 합니다!</p>
<h2 id="1-github-repository만들기">1. Github Repository만들기</h2>
<ul>
<li>당연히 첫번째로 해줘야할 것은 repository를 만들어야 합니다! 우선 github에 들어가셔서 본인이 만들고 싶은 _주소이름_으로 repository를 만들어줍시다!
<img src="https://images.velog.io/images/uomnf97_web/post/70f74c5e-ac98-4c1a-a4a3-748dedbba417/Screen%20Shot%202022-02-04%20at%208.32.36%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/6001d9fc-8814-414b-8fca-e94215e711c6/Screen%20Shot%202022-02-04%20at%208.33.29%20PM.png" alt=""></li>
</ul>
<h2 id="2-react-app-만들어주기">2. React-App 만들어주기!</h2>
<ul>
<li>물론 여기서 react App.js말고 다른 웹사이트를 만들어주셔도 됩니다! 하지만 저는 react로 웹을 배포해보았기에 react에 대해서 설명할께요! 아래 명령어를 입력해주시는데 #repository-name#으로 표시된 부분을 본인이 추가하신 repository이름과 똑같이 해주세요!</li>
</ul>
<pre><code class="language-bash">yarn create react-app #repository-name#</code></pre>
<p>이후 원격 저장소를 연결해주어야 겠죠?! 관련된 내용을 연결해주기 위해서는 아까 여러분의 Git-hub에 만들어주신 repository에 들어가셔서 git clone을 위한 주소를 아래와 같이 복사하신 다음에!
<img src="https://images.velog.io/images/uomnf97_web/post/07d5afa5-b87f-4e73-85f5-15f8df48fb45/Screen%20Shot%202022-02-04%20at%208.43.12%20PM.png" alt="">
여러분의 Visual Studio Code에 혹은 터미널에 아래와 같이 추가해주세요~!</p>
<pre><code>git remote add origin #repository 주소#</code></pre><p>그럼 이제 React-app과 호스팅 준비가 거의 다 완료된 상태입니다!</p>
<h2 id="3-gh-pages">3. Gh-pages</h2>
<h3 id="1-gh-pages-관련-패키지를-다운로드-받기">1. gh-pages 관련 패키지를 다운로드 받기!</h3>
<p>아래 명령어를 터미널 혹은 Visual Studio Code에 아래 명령어를 입력하여 다운로드 받습니다!</p>
<pre><code class="language-bash">yarn add gh-pages --save-dev ##또는 npm install gh-pages --save-dev</code></pre>
<h3 id="2-packagejson에-코드-추가">2. package.json에 코드 추가!</h3>
<p>아래와 같이 name, version, private 다음에 혹은, 맨 아래에 코드를 추가합니다! 여기서 username을 여러분의 github username 그리고 repository name은 여러분의 repository name으로 추가하면 됩니다~</p>
<pre><code class="language-bash">&quot;https://username.github.io/repository/</code></pre>
<pre><code class="language-js">//pakage.json
{
  &quot;name&quot;: &quot;pnp&quot;,
  &quot;version&quot;: &quot;0.1.0&quot;,
  &quot;private&quot;: true,
  &quot;homepage&quot;: &quot;https://username.github.io/repository/&quot;,
  &quot;dependencies&quot;: {
   //...
}</code></pre>
<p>추가로 script로 묶여 있는 부분안에 predeploy와 deploy를 추가합니다. </p>
<pre><code class="language-js">//pakage.json
{
  &quot;scripts&quot;: {
  //...
  &quot;predeploy&quot;: &quot;npm run build&quot; //혹은 yarn start,
  &quot;deploy&quot;: &quot;gh-pages -d build&quot;}
}</code></pre>
<h3 id="원리">원리</h3>
<p>gh-pages라는 디렉토리를 형성시키고 <code>yarn run deploy</code>와 같은 명령어를 입력하면 npm run build를 통해 전체 내용을 build합니다. 그리고 deploy과정이 진행되면 gh-pages라는 폴더가 생성되고 관련 폴더에 build한 내용이 옮겨지게 됩니다. 이후 gh-pages라는 브랜치를 깃헙에서 생성시켜 관련된 부분에 포스팅이 되는 것입니다!</p>
<h2 id="posting하다가-생긴-문제점">Posting하다가 생긴 문제점!</h2>
<p>nwitter clone coding그리고 학회페이지를 포스팅을 하다보니 문제점이 생겼었는데요, 바로 빈화면이 나타나는 것이었는데 주로 react-dom-router를 사용할 때, browser라우터를 이용할 때 발생한다고 합니다!</p>
<p>특히 아래와 같이 js파일에 home을 &#39;/&#39;로 설정해줄 경우 repository주소로 이동하지 않고 /로 이동하려고 하기때문에 올바르게 설정이 되지 않는다고 하네요!</p>
<pre><code class="language-js">import React from &#39;react&#39;;
import { Route } from &#39;react-router-dom&#39;;

import Index from &#39;./pages/Index&#39;;
import About from &#39;./pages/About/About&#39;;
import About_history from &#39;./pages/About/About_history&#39;;
import About_leader from &#39;./pages/About/About_leader&#39;;
import About_activity from &#39;./pages/About/About_activity&#39;;
import About_professor from &#39;./pages/About/About_professor&#39;;
import Achievements from &#39;./pages/Achievement/Achievements&#39;;
import Members from &#39;./pages/Members/Members&#39;;
import Recruit from &#39;./pages/Recruit&#39;;
import FAQ from &#39;./pages/FAQ&#39;;
import Blog from &#39;./pages/Blog/Blog&#39;;
import Graduates from &#39;./pages/Members/Graduate/Graduates&#39;

const App = () =&gt; {
  return (
    &lt;div&gt;
      &lt;Route path=&quot;/&quot; component={Index} exact /&gt;
      &lt;Route path=&quot;/about&quot; component={About} /&gt;
      &lt;Route path=&quot;/about_history&quot; component={About_history} /&gt;
      &lt;Route path=&quot;/about_leader&quot; component={About_leader} /&gt;
      &lt;Route path=&quot;/about_activity&quot; component={About_activity} /&gt;
      &lt;Route path=&quot;/about_professor&quot; component={About_professor} /&gt;
      &lt;Route path=&quot;/achievements&quot; component={Achievements} /&gt;
      &lt;Route path=&quot;/members&quot; component={Members} /&gt;
      &lt;Route path=&quot;/graduates&quot; component={Graduates} /&gt;
      &lt;Route path=&quot;/recruit&quot; component={Recruit} /&gt;
      &lt;Route path=&quot;/FAQ&quot; component={FAQ} /&gt;
      &lt;Route path=&quot;/Blog&quot; component={Blog} /&gt;
    &lt;/div&gt;
  );
};

export default App;</code></pre>
<p>따라서 그럴경우 <code>&lt;BrowserRouter&gt;</code>를 <code>basename={process.env.PUBLIC_URL}</code>로 묶어주면 해결이 됩니다! 우리가 설정한 루트와 repository를 일치시켜주는 거라고 이해하시면 됩니다!</p>
<pre><code class="language-js">import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom&#39;;
import { BrowserRouter } from &#39;react-router-dom&#39;;
import &#39;./index.css&#39;;
import App from &#39;./App&#39;;

ReactDOM.render(
  &lt;React.StrictMode&gt;
    &lt;BrowserRouter basename={process.env.PUBLIC_URL}&gt;
      &lt;App /&gt;
    &lt;/BrowserRouter&gt;
  &lt;/React.StrictMode&gt;,
  document.getElementById(&#39;root&#39;)
);

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[트위터 클론 코딩 :: #2 Authentification]]></title>
            <link>https://velog.io/@uomnf97_web/%ED%8A%B8%EC%9C%84%ED%84%B0-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-2-Authentification</link>
            <guid>https://velog.io/@uomnf97_web/%ED%8A%B8%EC%9C%84%ED%84%B0-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-2-Authentification</guid>
            <pubDate>Fri, 28 Jan 2022 14:26:42 GMT</pubDate>
            <description><![CDATA[<h1 id="20-using-firebase-auth">#2.0 Using Firebase Auth</h1>
<ul>
<li>router.js를 따로 선언하여 활용하는 이유 : 모듈화 시켜 router로서만 활용할 수 있도록 하고, 추가로 App.js에는 footer, header등 다양한 것들을 추가시킬 수 있도록 하였다. </li>
</ul>
<h2 id="사용방법">사용방법</h2>
<ul>
<li>먼저 import를 해줘야한다<pre><code class="language-js">//firebase.js =&gt; fbase.js로 바꿔주었다. 
import &quot;firebase/compat/auth&quot;; </code></pre>
</li>
<li><code>authService.currentUser</code>를 호출한다. 이는 user가 있을 경우 없으면 null을 반환하는 원리를 이용해 코드를 작성한다.<h3 id="잡기술">잡기술</h3>
</li>
</ul>
<ol>
<li>절대 경로로 만들어주기 : 아래코드를 가진 파일을 jsconfig를 추가해주면 <code>../../firebase/compat/auth</code>와 같은 상대경로가 아닌 위와 같은 절대 경로로 표현해줄 수 있게 된다. </li>
</ol>
<p>jsconfig.json </p>
<pre><code class="language-json">{
    &quot;compilerOptions&quot;:{
        &quot;baseUrl&quot;: &quot;src&quot;
    },
    &quot;include&quot;:[&quot;src&quot;]
} </code></pre>
<ol start="2">
<li>firebase에서 특정함수를 불러주고 싶을때 아래와 같이 추가해주면 import할 때 활용할 수 있다. 
<code>export const authService = firebase.auth();</code></li>
</ol>
<p>코드 수정 사항 최종 : </p>
<pre><code class="language-js">//Router.js
import React from &quot;react&quot;;
import { HashRouter as Router , Route, Switch} from &quot;react-router-dom&quot;;
import Auth from &quot;../routes/Auth&quot;;
import Home from &quot;../routes/Home&quot;;

const AppRouter = ({ isLoggedIn }) =&gt; {
    return(
        &lt;Router&gt;
            &lt;Switch&gt;
                {isLoggedIn ?
                &lt;&gt;
                    &lt;Route exact path=&quot;/&quot;&gt;
                        &lt;Home/&gt;
                    &lt;/Route&gt;
                &lt;/&gt;:
                &lt;Route exact path=&quot;/&quot;&gt;  
                    &lt;Auth/&gt; 
                &lt;/Route&gt;
                }
            &lt;/Switch&gt;
        &lt;/Router&gt;
    )
};

export default AppRouter;</code></pre>
<pre><code class="language-js">//App.js
import React, { useState}  from &quot;react&quot;
import { authService } from &quot;fbase&quot;;
import AppRouter from &quot;components/Router&quot;;

function App() {

  const [ isLoggedIn, setIsLoggedin ] = useState(authService.currentUser);
  return (
    &lt;&gt;
      &lt;AppRouter isLoggedIn={isLoggedIn}/&gt;
      &lt;footer&gt;&amp;copy; {new Date().getFullYear} Nwitter &lt;/footer&gt;
    &lt;/&gt;
  );
}

export default App;</code></pre>
<h1 id="21-login-form-part1">#2.1 Login Form Part1</h1>
<ol>
<li>미리 가입했던 firebase홈페이지에서 생성된 nwitter 프로젝트에서 authentication을 통해서 이메일 인증, 깃헙인증 등을 추가해줄 수 있다. </li>
</ol>
<ul>
<li>authentification &gt; enable 을 통해 원하는 계정 설정<ul>
<li>github으로 하고 싶을 때에는 app에서 생성해줘야함 </li>
</ul>
<ol>
<li>github계정 &gt; setting &gt; developer setting &gt; OAuth App 
발급된 Client ID와 Clients Secret을 붙여넣기 
<img src="https://images.velog.io/images/uomnf97_web/post/30f81be8-c253-4203-b215-898c9d348700/Screen%20Shot%202022-01-28%20at%205.20.29%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/cdf76500-03ae-4eba-8661-66ba293a007e/Screen%20Shot%202022-01-28%20at%205.27.01%20PM.png" alt=""></li>
</ol>
</li>
<li>코드 수정<pre><code class="language-js">//Auth.js 수정사항
import React, { useState } from &quot;react&quot;;
</code></pre>
</li>
</ul>
<p>const Auth = () =&gt; {
    const [email, setEmail] = useState(&quot;&quot;);
    const [password, setPassword] = useState(&quot;&quot;);
    const onChange = (event) =&gt;{
        const {
            target : { name, value}
        } = event;
        if(name ===&quot;email&quot;){
            setEmail(value)
        } else if (name===&quot;password&quot;){
            setPassword(value)
        }</p>
<pre><code>};
const onSubmit = (event)=&gt;{
    event.preventDefault();
}
return(
    &lt;div&gt;
        &lt;form onSubmit={onSubmit}&gt;
            &lt;input
                name = &quot;email&quot;
                type=&quot;text&quot;
                placeholder=&quot;Email&quot; 
                required
                value = {email}
                onChange={onChange}
            /&gt;
            &lt;input 
                name = &quot;password&quot;
                type=&quot;password&quot; 
                placeholder=&quot;Password&quot; 
                required
                value = {password}
                onChange={onChange}
            /&gt;
            &lt;input type=&quot;submit&quot; value = &quot;Log In&quot; /&gt;
        &lt;/form&gt;
        &lt;div&gt;
            &lt;button&gt;Continue with Google&lt;/button&gt;
            &lt;button&gt;Continue with Github&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;</code></pre><p>)};
export default Auth</p>
<pre><code>- 결과창![](https://images.velog.io/images/uomnf97_web/post/066b0600-42e4-4e10-96a6-90d9ef9d331e/Screen%20Shot%202022-01-28%20at%205.45.27%20PM.png)

# #2.2 Recap
__코드 설명__ : 
1. const를 통해서 email, password 변수를 추가하여 사용자가 입력하는 값을 전달하도록 함. 
2. onChange 함수는 Hook으로 만든 함수인데 내부에서 입력되는 변수의 모형을 {name:value}에 해당하는 모형으로 바꿔주고 value에 값을 키보드가 입력될 때마다 저장하도록 함. 
3. `event.preventDefault()` : 사용하고 있는 사용자가 아닌 개발자가 관련된걸 컨트롤 할 수 있도록 보호하도록 하는 코드 

# #2.3 Creating Account 

- documentation의 email provider를 활용할 계획임 
- promise와 같이 나와있는 것은 await를 사용해야 함. 
- `authService.createUserWithEmailAndPassword`를 활용하여 email과 password로 된 계정을 생성할 수 있다. 
- `authService.signInWithEmailAndPassword`를 활용하여 로그인을 할 수 있다. 
- 또한 persistance를 설정해주어야 하는데, 이를 통해서 local로 설정하면 계속 로그인되어있고, session으로 설정하면 탭이나 브라우저가 열려있는동안 로그인되어 기억되고, none으로 설정하면 로그인 되어있지않는다. 


- 코드 :
```js
//auth.js
import React, { useState } from &quot;react&quot;;
import { authService } from &quot;../fbase&quot;;

const Auth = () =&gt; {
    const [email, setEmail] = useState(&quot;&quot;);
    const [password, setPassword] = useState(&quot;&quot;);
    const [newAccount, setNewAccount] = useState(true);
    const onChange = (event) =&gt;{
        const {
            target : { name, value}
        } = event;
        if(name ===&quot;email&quot;){
            setEmail(value)
        } else if (name===&quot;password&quot;){
            setPassword(value)
        }

    };
    const onSubmit = async(event)=&gt;{
        event.preventDefault();
        if (newAccount) {
            // create account
            await authService.createUserWithEmailAndPassword(email, password);
        } else {
            // log in 
            await authService.signInWithEmailAndPassword(email, password);
        }
    }
    return(
        &lt;div&gt;
            &lt;form onSubmit={onSubmit}&gt;
                &lt;input
                    name = &quot;email&quot;
                    type=&quot;text&quot;
                    placeholder=&quot;Email&quot; 
                    required
                    value = {email}
                    onChange={onChange}
                /&gt;
                &lt;input 
                    name = &quot;password&quot;
                    type=&quot;password&quot; 
                    placeholder=&quot;Password&quot; 
                    required
                    value = {password}
                    onChange={onChange}
                /&gt;
                &lt;input type=&quot;submit&quot; value = { newAccount ? &quot;Create Account&quot; : &quot;Log In&quot;} /&gt;
            &lt;/form&gt;
            &lt;div&gt;
                &lt;button&gt;Continue with Google&lt;/button&gt;
                &lt;button&gt;Continue with Github&lt;/button&gt;
            &lt;/div&gt;
        &lt;/div&gt;
)};
export default Auth</code></pre><ul>
<li>결과 :
<img src="https://images.velog.io/images/uomnf97_web/post/06a1f25c-3acc-4fa6-9a5b-012e6caa15a5/Screen%20Shot%202022-01-28%20at%206.32.10%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/69f09963-f0b2-4e61-a736-7a72410a56be/Screen%20Shot%202022-01-28%20at%206.32.31%20PM.png" alt=""></li>
</ul>
<h1 id="24-log-in">#2.4 Log In</h1>
<pre><code class="language-js"></code></pre>
<p><em>*모르는 내용에 대한 documentation을 검색하고 싶으면 <a href="https://firebase.google.com/docs/">https://firebase.google.com/docs/</a> 를 통해서 확인할 수 있다</em></p>
<p>출처: <a href="https://nomadcoders.co/nwitter">노마드코더: 트위터 클론 코딩</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[트위터 클론 코딩 :: #1 Setup]]></title>
            <link>https://velog.io/@uomnf97_web/%ED%8A%B8%EC%9C%84%ED%84%B0-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-1-Setup</link>
            <guid>https://velog.io/@uomnf97_web/%ED%8A%B8%EC%9C%84%ED%84%B0-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-1-Setup</guid>
            <pubDate>Fri, 14 Jan 2022 13:33:40 GMT</pubDate>
            <description><![CDATA[<h1 id="10-react--firebase-setup">#1.0 React + Firebase Setup</h1>
<h2 id="환경설정-하기">환경설정 하기</h2>
<ol>
<li><strong>Github에 &quot;nwitter&quot; 저장소 생성하</strong>
: Readme, .gitignore 추가하지 말기 </li>
<li><strong>create-react-app을 이용해서 추가하기</strong> </li>
</ol>
<pre><code class="language-bash">yarn create react-app nwitter </code></pre>
<ol start="3">
<li><strong>index.js</strong></li>
</ol>
<ul>
<li>지워야 할 코드<pre><code class="language-js">import &#39;./index.css&#39;;</code></pre>
<pre><code class="language-js">import reportWebVitals from &#39;./reportWebVitals&#39;;</code></pre>
<pre><code class="language-js">// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();</code></pre>
</li>
<li>최종 코드 <pre><code class="language-js">import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom&#39;;
import App from &#39;./App&#39;;
</code></pre>
</li>
</ul>
<p>ReactDOM.render(
  &lt;React.StrictMode&gt;
    <App />
  &lt;/React.StrictMode&gt;,
  document.getElementById(&#39;root&#39;)
);</p>
<pre><code>
4. __App.js__
- 아래 코드만 남기고 나머지 제거
```js
import React from &quot;react&quot;

function App() {
  return (
    &lt;div&gt;&lt;/div&gt;
  );
}

export default App;</code></pre><ol start="5">
<li><p>아래와 같이 다섯개의 파일을 제거 
: App.css, App.test.js, index.css, logo.svg
<img src="https://images.velog.io/images/uomnf97_web/post/3a4f84fe-ee92-440b-b8f8-2bd547eb5995/Screen%20Shot%202022-01-14%20at%207.28.36%20PM.png" alt=""></p>
</li>
<li><p>__package.json 부분에서 test부분 삭제 __</p>
</li>
<li><p><strong>변경 사항을 git에 commit</strong></p>
<pre><code class="language-bash">git add . </code></pre>
</li>
</ol>
<pre><code class="language-bash">git commit -m &quot;1.0 introduction update&quot; </code></pre>
<pre><code class="language-bash">git push origin main</code></pre>
<p>8.__ Firebase 프로젝트 생성 __
: Firebase 아이디를 생성한뒤 &gt; 새 프로젝트 클릭 &gt; nwitter라고 만들어주기
<img src="https://images.velog.io/images/uomnf97_web/post/8add224b-14f4-4794-a90a-d0a39d8d91bf/Screen%20Shot%202022-01-14%20at%207.34.40%20PM.png" alt="">: 아래와 같은 순서로 진행<img src="https://images.velog.io/images/uomnf97_web/post/7440a5df-b252-4718-b38f-9a4f77e55a64/Screen%20Shot%202022-01-14%20at%207.39.23%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/5366e455-0934-4671-9cae-6d2d7fd95e97/Screen%20Shot%202022-01-14%20at%207.36.11%20PM.png" alt=""><img src="https://images.velog.io/images/uomnf97_web/post/750ae192-20b5-47a1-bacb-741f36c1e682/Screen%20Shot%202022-01-14%20at%207.37.37%20PM.png" alt=""></p>
<ul>
<li>마지막 단계에서 유의해야 할 점. 
: 이곳에서는 npm 설치를 이용해서 firebase 설치를 진행하고, 아래 코드는 복사 붙여넣기 하여 firebase configuration에 추가해야함<pre><code class="language-js">//firebase.js추가 내용
import firebase from &quot;firebase/compat/app&quot;;
import &quot;firebase/compat/auth&quot;;
import &quot;firebase/compat/firestore&quot;;
import &quot;firebase/compat/storage&quot;;
</code></pre>
</li>
</ul>
<p>const firebaseConfig = {
    apiKey: &quot;<strong><strong><strong><strong><strong>**</strong></strong></strong></strong></strong>&quot;,
    authDomain: &quot;<strong><strong><strong><strong><strong>**</strong></strong></strong></strong></strong>&quot;,
    projectId: &quot;<strong><strong><strong><strong><strong>**</strong></strong></strong></strong></strong>&quot;,
    storageBucket: &quot;<strong><strong><strong><strong><strong>**</strong></strong></strong></strong></strong>&quot;,
    messagingSenderId: &quot;<strong><strong><strong><strong><strong>**</strong></strong></strong></strong></strong>&quot;,
    appId: &quot;<strong><strong><strong><strong><strong>**</strong></strong></strong></strong></strong>&quot;
  };</p>
<p>export default firebase.initializeApp(firebaseConfig);</p>
<pre><code>추가로 버전이 바뀌었기 때문에 현재 트위터 클론을 따라 하고 싶으면 아래와 같은 방식으로 따라해야함.

```bash 
Firebase V9 업데이트 되면서. 이슈가 생겼습니다. 이에 코드의 큰 변경 없이 버전 9.0 을 사용하기 위해서. Firebase 의 &#39;compat&#39; 호환 버전 사용을 권장합니다.

또한 React Router Dom 이 버전 6 으로 업데이트 되었습니다. 따라서 수강하시는 동안 버전 6으로 업그레이드 하지 말고. 버전 5 유지를 권장합니다.

Firebase 설치시 npm i firebase 을 하지마시고.

npm i firebase@9.6.1 혹은 
yarn add firebase@9.6.1이와 같이 입력하세요.

React Router Dom 설치시 npm i react-router-dom 을 하지마시고.

npm i react-router-dom@5.3.0 이와 같이 입력하세요.

Firebase 을 import 할 때. 아래와 같이 입력하세요.

import firebase from &quot;firebase/compat/app&quot;;
import &quot;firebase/compat/auth&quot;;
import &quot;firebase/compat/firestore&quot;;
import &quot;firebase/compat/storage&quot;;</code></pre><ol start="9">
<li><strong>yarn start를 통해 올바르게 서버가 활동하는지 확인</strong>
: App.js를 아래와 같이 바꾸어 돌어가는지 확인<pre><code class="language-js">import React from &quot;react&quot;
import firebase from &quot;firebase/compat/app&quot;;
import &quot;firebase/compat/auth&quot;;
import &quot;firebase/compat/firestore&quot;;
import &quot;firebase/compat/storage&quot;;
console.log(firebase);
</code></pre>
</li>
</ol>
<p>function App() {
  return (
    <div></div>
  );
}</p>
<p>export default App;</p>
<pre><code>아래와 같이 오류가 없으면 올바르게 설정 완료!![](https://images.velog.io/images/uomnf97_web/post/607d57b9-a18a-437b-b2c1-a41af9fa06d6/Screen%20Shot%202022-01-14%20at%207.54.18%20PM.png)

# #1.1 Securing the Keys

- .env 에 `REACT_APP_`라는 변수를 이용해서 암호화 할 수 있음, 하지만 명시해두어야 하는 것이 __build를 할 때 복호화가 이루어지기 때문에 사용자로부터 완전히 막을 수 있는 기능이 아님__ 즉 .gitignore에 등록함으로서 github에 본인 암호를 보일 수 없게 하는기능이지 완벽한 Key 보안은 아님. __github에 본인 firebase key를 보이지 않게 하기 위하여 사용__


- root 에 .env생성 뒤, 반드시 `REACT_APP_변수이름`과 같은 형식으로 등록해야함


- github에 올라갈 js 코드
```js
import firebase from &quot;firebase/compat/app&quot;;
import &quot;firebase/compat/auth&quot;;
import &quot;firebase/compat/firestore&quot;;
import &quot;firebase/compat/storage&quot;;

const firebaseConfig = {
    apiKey: process.env.REACT_APP_API_KEY,
    authDomain: process.env.REACT_APP_API_AUTH_DOMAIN,
    projectId: process.env.REACT_APP_PROJECTID,
    storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
    messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
    appId: process.env.REACT_APP_APP_ID
  };

export default firebase.initializeApp(firebaseConfig);</code></pre><h1 id="12-router-setup">#1.2 Router Setup</h1>
<ul>
<li>components와 routes 두개의 파일을 src파일 안에 추가 해주고 다음과 같이 파일 구성
: Auth.js - Authentification을 위한 페이지
: Home.js- Home page로 트윗을 하거나 볼수 있음
: Profile.js- 본인 계정을 확인하는 profile 페이지 
: EditProfile.js- 본인 계정 정보를 수정하는 페이지
아래과 같은 모습으로 파일 구조를 정리해야함
<img src="https://images.velog.io/images/uomnf97_web/post/497534d0-9967-4822-9cfd-9b3490de97f7/Screen%20Shot%202022-01-14%20at%208.31.04%20PM.png" alt=""></li>
<li>코드 추가사항<pre><code class="language-js">//index.js
import React from &#39;react&#39;;
import ReactDOM from &#39;react-dom&#39;;
import App from &#39;./components/App&#39;;
</code></pre>
</li>
</ul>
<p>ReactDOM.render(
  &lt;React.StrictMode&gt;
    <App />
  &lt;/React.StrictMode&gt;,
  document.getElementById(&#39;root&#39;)
);</p>
<pre><code>
```js
//Auth.js
import React from &quot;react&quot;;

const Auth = () =&gt; &lt;span&gt;Auth&lt;/span&gt;;
export default Auth</code></pre><pre><code class="language-js">//Home.js
import React from &quot;react&quot;;

const Home = () =&gt; &lt;span&gt;Home&lt;/span&gt;;
export default Home</code></pre>
<pre><code class="language-js">//Profile.js
import React from &quot;react&quot;;

const Profie = () =&gt; &lt;span&gt;Profie&lt;/span&gt;;
export default Profile</code></pre>
<pre><code class="language-js">//EditProfile.js
import React from &quot;react&quot;;

const EditProfile = () =&gt; &lt;span&gt;Edit Profile&lt;/span&gt;;
export default EditProfile</code></pre>
<ul>
<li><p>아래와 같은 코드 방식으로 쓰면 자동으로 import 됨</p>
<pre><code class="language-bash">const Auth = () =&gt; &lt;span&gt;Auth&lt;/span&gt;;
export default Auth</code></pre>
</li>
<li><p>react-router-dom 설치</p>
<pre><code class="language-bash">yarn add react-router-dom@5.3.0</code></pre>
<p><img src="https://images.velog.io/images/uomnf97_web/post/586528b2-e520-4f7b-90b5-cba929e33ba1/Screen%20Shot%202022-01-14%20at%208.58.41%20PM.png" alt=""></p>
</li>
<li><p>components에 Router.js 추가 </p>
<pre><code class="language-js">//App.js
import React from &quot;react&quot;
import firebase from &quot;firebase/compat/app&quot;;
import &quot;firebase/compat/auth&quot;;
import &quot;firebase/compat/firestore&quot;;
import &quot;firebase/compat/storage&quot;;
import AppRouter from &quot;./Router&quot;;
</code></pre>
</li>
</ul>
<p>function App() {
  return (
    <AppRouter />
  );
}</p>
<p>export default App;</p>
<pre><code>
```js
//Router.js
import React, { useState} from &quot;react&quot;;
import { HashRouter as Router , Route, Switch} from &quot;react-router-dom&quot;;
import Auth from &quot;../routes/Auth&quot;;
import Home from &quot;../routes/Home&quot;;

const AppRouter = () =&gt; {
    const [ isLoggedIn, setIsLoggedin ] = useState(false);
    return(
        &lt;Router&gt;
            &lt;Switch&gt;
                {isLoggedIn ?
                &lt;&gt;
                    &lt;Route exact path=&quot;/&quot;&gt;
                        &lt;Home/&gt;
                    &lt;/Route&gt;
                &lt;/&gt;:
                &lt;Route exact path=&quot;/&quot;&gt;  
                    &lt;Auth/&gt; 
                &lt;/Route&gt;
                }
            &lt;/Switch&gt;
        &lt;/Router&gt;

    )
};

export default AppRouter;</code></pre><p>*결과창
<img src="https://images.velog.io/images/uomnf97_web/post/024e8984-eef9-4bd5-b5b1-fc7ff0bd4a78/Screen%20Shot%202022-01-14%20at%2010.32.21%20PM.png" alt=""></p>
<ul>
<li>Fragment : <code>&lt;&gt;,&lt;/&gt;</code>로 부모 태크 없이 한번에 묶어야 할 때 사용.
출처: <a href="https://nomadcoders.co/nwitter/lobby">노마드코더 : 트위터 클론 코딩</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[트위터 클론 코딩 :: Introduction]]></title>
            <link>https://velog.io/@uomnf97_web/%ED%8A%B8%EC%9C%84%ED%84%B0-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-Introduction</link>
            <guid>https://velog.io/@uomnf97_web/%ED%8A%B8%EC%9C%84%ED%84%B0-%ED%81%B4%EB%A1%A0-%EC%BD%94%EB%94%A9-Introduction</guid>
            <pubDate>Thu, 13 Jan 2022 13:23:05 GMT</pubDate>
            <description><![CDATA[<h1 id="00-welcome-">#0.0 Welcome !</h1>
<h2 id="강의-소개">강의 소개</h2>
<ul>
<li>Firebase를 이용해서 Twitter를 클론하는 Nwitter을 만들어 볼 것임</li>
<li>Firebase를 통해 아래와 같은 매우 다양한 기능을 구현할 것임<ul>
<li>이메일, 깃헙 등과 같은 Authentification을 통한 회원 가입</li>
<li>Password를 통한 회원 가입</li>
<li>Twitter 업로드, 파일 업로드 </li>
<li>계정 수정, 게시글 수정</li>
<li>실시간 연동 시스템 등</li>
</ul>
</li>
<li>모든 내용은 백엔드 처리 과정 없이 진행 될 예정이며, CSS로 디자인을 하는게 가장 오래 걸릴 정도로 쉽고 빠르게 코딩을 할 수 있도록 수업을 기획하였음</li>
</ul>
<h1 id="01-requirements">#0.1 Requirements</h1>
<ul>
<li>코코아톡 클론 코딩(CSS, HTML, Github), React Fundamental course, React for Beginners Course, 실전형 React Hooks를 듣고 오는 것이 좋음</li>
</ul>
<ul>
<li>필요한 기술 : HTML, CSS, React JS, Github 을 활용할 줄 알아야 함.</li>
</ul>
<p><em>React Hooks를 이용한 다양한 Component building 방법과 함께 State를 업데이트 하는 방법을 배우게 될 예정</em></p>
<h1 id="02-what-is-firebase">#0.2 What is Firebase?</h1>
<h2 id="firebase란">Firebase란?</h2>
<ul>
<li>Firebase는 데이터 베이스에서 시작되었으며, 구글에 속해있지 않았으 인수되어 현재의 모습으로 발전되었음</li>
</ul>
<h2 id="firebase의-기능">Firebase의 기능</h2>
<ul>
<li>백엔드 기능을 포함하여 제공되는 서비스</li>
<li>앱을 만들 수 있는 다양한 기능들을 제공함. </li>
<li>Cloud Firestore는 백엔드 코드 없이 백엔드기능을 사용할 수 있는 기능임</li>
<li>Firebase ML은 머신러닝이 가능하도록 한 백엔드임</li>
<li>Cloud Function은 serverless function 제공, AWS Lambda와 같은 기능</li>
<li>Cloud Storage는 AWS의 S3와 같은 기능으로 사진과 같은 것들을 업로드 할 때 활용</li>
<li>Hosting은 우리가 만든 Asset을 배포하거나 React Application을 배포하고 싶을 때 활용 가능</li>
<li>Authentifcation은 이미 구현된 기능으로 10분안에 관련된 Authentification을 할 수 있도록 도와준다. </li>
<li>Realtime database는 Realtime Firebase database로 Realtime기능이 구현되어있으나 요즘 자주 쓰지는 않음</li>
<li>다양한 Analytics 기능을 제공함 </li>
<li>Crashlytics: 앱의 충돌에 관련된 정보를 제공함</li>
<li>Performance monitoring: app의 보여주는 기능을 제공함</li>
<li>Test Lab: 웹사이트를 다양한 기기별로 테스트 할 수 있는 기능을 제공함</li>
<li>App distribution : 너의 ios나 android의 버전 배포를 도와줌</li>
<li>Grow business에서는 In-App Messaging, Google Analytics등 훨씬 더 다양한 기능을 배포함</li>
<li>각각 호환되는 OS가 다르므로 주의할 것</li>
<li><strong>이번 강의에서는 Cloud Firestore, Hosting, Authentification, Cloud Storage을 사용할 것임</strong></li>
</ul>
<p>경쟁사 : AWS amplify - GraphQL, REST API 등 다양한 내용을 지원. 다양한 기능을 제공해주는 반에 새롭게 나온내용이라 많은 자료가 있지 않다는 단점이 있음. </p>
<h1 id="03-when-to-use-firebase">#0.3 When To Use Firebase</h1>
<ul>
<li>Firebase나 Amplify를 써서 특정한 프로젝트를 진행한다는 것은 모든 내용을 AWS혹은 Google 과 공유한다는 것을 의미한다. 따라서 사업적으로 진지한 서비스나 프로젝트를 해야할 때 권장하지는 않는다. 모든 시스템의 데이터베이스나 정보들은 구글 혹은 AWS서비스 것이 되기 때문이다. </li>
</ul>
<ul>
<li>하지만, 서비스의 테스팅이나 간단한 프로토타입 버전을 세상에 먼저 공개하려고 한다면, 사용가능하다. 서버를 만들거나 시스템을 만들지 않고도 간단하게 이미 구현된 기능을 이용할 수 있기 때문에 빠른 개발이 가능하다. 따라서 이런 경우 Firebase나 Amplify를 사용해야 할 시기이다. </li>
</ul>
<h1 id="04-pricing-in-firebase">#0.4 Pricing in Firebase</h1>
<ul>
<li>Firebase는 무료 한도가 정해져있다. 5기가 클라우딩 업로드 제한이라든지, 하루에 20000번 업로드 가능한다든지, 이러한 방식으로 무료로 사용할 수 있는 범위가 정해져있기 때문에 반드시 확인하고 진행하기를 권장한다. 
<img src="https://images.velog.io/images/uomnf97_web/post/53b81c09-4f8b-4713-800f-49f104dc5c1d/Screen%20Shot%202022-01-13%20at%2010.22.44%20PM.png" alt="">
출처: <a href="https://nomadcoders.co/nwitter/lobby">노마드코더</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[실전형 리액트 Hooks : #0 Introduction]]></title>
            <link>https://velog.io/@uomnf97_web/%EC%8B%A4%EC%A0%84%ED%98%95-%EB%A6%AC%EC%95%A1%ED%8A%B8-Hooks-0-Introduction</link>
            <guid>https://velog.io/@uomnf97_web/%EC%8B%A4%EC%A0%84%ED%98%95-%EB%A6%AC%EC%95%A1%ED%8A%B8-Hooks-0-Introduction</guid>
            <pubDate>Fri, 07 Jan 2022 10:52:13 GMT</pubDate>
            <description><![CDATA[<h1 id="02-introduction">#0.2 introduction</h1>
<h2 id="강의-소개">강의 소개</h2>
<ul>
<li>내용 : use state, use effect에 관해 배우고, hooks library build를 할 것. 이론, 예제, 실전 실습으로 이루어진 강의</li>
</ul>
<ul>
<li>npm : 여러가지 npm package를 등록해두는 곳으로 use-input, use-interval등 여러 패키지를 등록하고 사용할 수 있는 곳.</li>
</ul>
<ul>
<li>To do list: npm package를 생성하여 npm사이트에 등록할 예정.</li>
</ul>
<pre><code class="language-bash">목록 list
1. useTitle : react document의 Title을 바꾸는 것
2. useInput : input 역할
3. usePageLeave : page를 벗어나는 시점을 발견하고 함수 실행
4. useClick : element가 클릭되는 시점을 발견
5. useFadeIn : 어떤 Element든 안으로 서서히 사라지게 만듦. 
6. useFullscreen : 어떤 Element든 풀스크린으로 만들거나 원래화면으로 돌아가게 됨
7. useHover : 마우스가 올라갔을 때 어떤 것인지 감지함 
8. useNetwork : useNetwork는 Online 또는 Offline인지 감지함
9. useNotification : notification API를 사용할 때 알림을 보내줌
10. useScroll : 스크롤을 사용할 때를 감지해 알려줌
11. useTabs : 웹사이트에 메뉴 또는 무엇이든지 간에 tab을 사용하기 매우 쉽게 만들어주는 hook
12. usePreventLeave : 유저가 변경사항이 있을 때 저장하지 않고 떠나는 것을 방지해주는 hook
13. useConfirm : 어떤 것을 확인하고 싶을 때 쓰는 hook
14. useAxios : HTTP requests client axios를 위한 wrapper</code></pre>
<h1 id="03-requirements">#0.3 Requirements</h1>
<blockquote>
<p>강의 전 알고 있어야 하는 것들 : 노마드 코더의 Movieapp이나 다른 리액트 강의를 들어봤어야함. set state와 props등을 알고 있어야 hooks가 훌륭한 이유를 이해할 수 있을 것임. Only react, node js가 다운로드 되어 있어야함 </p>
</blockquote>
<h1 id="04-workflow">0.4 Workflow</h1>
<ul>
<li><p>작업 환경 : Codesandbox</p>
<ul>
<li>웹으로 하는 작업 환경이며, react, visual studio, node js등 다양한 개발환경을 설정해서 사용할 수 있음. </li>
<li>코드 작성 후 결과를 바로바로 확인할 수 있는 장점이 있고, 완성되는 동시에 VS code의 NPM package direcotry에 저장하고 올릴 예정임
<img src="https://images.velog.io/images/uomnf97_web/post/8ebd4149-fb83-441f-bc55-8209e2523502/Screen%20Shot%202022-01-07%20at%207.51.56%20PM.png" alt=""></li>
</ul>
</li>
<li><p>To do list : </p>
<ul>
<li>codesandbox 가입 </li>
<li>create sandbox &gt; react 클릭</li>
<li>codesandbox.io/s/new인 상태에서 저장 단축기 클릭(맥 command + s , 윈도우 : ctrl + s ) -&gt; 화면의 주소 new부분이 변환된것을 체크 했을 때 바뀌어 있으면 올바르게 저장되어 있는 것임을 알 수 있음. </li>
<li>기본적인 css, html 코드 등이 제공되고 홈페이지가 어떻게 바뀌고 있는지 확인가능함. </li>
</ul>
</li>
</ul>
<p>출처: <a href="https://nomadcoders.co/react-hooks-introduction/lobby">노마드코더 - React Hooks</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native 날씨앱 만들기 - 3]]></title>
            <link>https://velog.io/@uomnf97_web/React-Native-%EB%82%A0%EC%94%A8%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-3</link>
            <guid>https://velog.io/@uomnf97_web/React-Native-%EB%82%A0%EC%94%A8%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-3</guid>
            <pubDate>Mon, 23 Aug 2021 16:01:42 GMT</pubDate>
            <description><![CDATA[<h1 id="how-does-react-native-work">How does React Native Work</h1>
<h2 id="3-ways-to-develop-application">3 Ways To Develop Application</h2>
<h3 id="fully-native">Fully Native</h3>
<blockquote>
<p><strong>Fully Native란</strong>?  Swift or object C로 IOS앱을 만듦, 혹은 Java나 코틀린을 사용해서 개발함</p>
</blockquote>
<h3 id="web-view-based-app">Web View Based App</h3>
<blockquote>
<p><strong>Web View Based App</strong>?  simple 앱을 만들고, Cordova 나 Phone Gap을 통해 HTML, CSS를 넣는 것</p>
</blockquote>
<h3 id=""></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native 날씨앱 만들기 - 2]]></title>
            <link>https://velog.io/@uomnf97_web/React-Native-%EB%82%A0%EC%94%A8%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-2</link>
            <guid>https://velog.io/@uomnf97_web/React-Native-%EB%82%A0%EC%94%A8%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-2</guid>
            <pubDate>Mon, 23 Aug 2021 16:01:31 GMT</pubDate>
            <description><![CDATA[<h1 id="getting-to-know-expo">Getting to know Expo</h1>
<ul>
<li><strong>Run as iOS Simulator</strong>:
__simulator 특징 __: assets &gt; splash.png 파일로 변경가능
<img src="https://images.velog.io/images/uomnf97_web/post/e9eb0d04-c8ce-4feb-99f3-ec75c45b175b/Screen%20Shot%202021-08-13%20at%206.36.42%20PM.png" alt=""></li>
</ul>
<ul>
<li><strong>Expo Dev tools</strong> 
Issues : project issues &gt; expo optimize 명령어로 이미지를 압축시켜줌</li>
</ul>
<ul>
<li><strong>Metro Bundler</strong>: React Native 제어장치</li>
</ul>
<ul>
<li><strong>I phone X</strong> : 디바이스 로그</li>
</ul>
<h3 id="장점">장점</h3>
<ul>
<li><strong>live reloading</strong>, <strong>hot reloading</strong> : app.js 의 <code>&lt;text&gt;</code> 부분을 바꾸고 저장하면 바로 reloading 되어 simulator에 나타남( 혹은 시뮬레이터에서 ㅊcommand + r 을 누르면됨 / 핸드폰: shaking) 
<strong>simulator에서 command + d __: 다양한 옵션을 실행가능![]
__debug remote js</strong> : 크롬을 통해서 디버깅 가능, 다만 조금 느려짐, 네트워크 리퀘스트, 콘솔을 확인 가능</li>
</ul>
<ul>
<li>expo 실행 명령어 
<strong>1)Expo simulator</strong> : Run on android device emulator or Run on iOS simulator
<strong>2)Visual Studio Code</strong> : 
start : <code>expo star</code>
android : <code>expo start --androi</code>
ios : <code>expo start -- ios</code>
web : <code>expo start --web</code>
eject : <code>expo eject</code>
<em>*expo eject는 a모든 파일을 종료시키기 때문에 다시 사용할 수 없게 하는 명령어이다. 제대로 활용하고 싶으면 다른 것을 이용하기를 바란다.</em></li>
</ul>
<p><img src="https://images.velog.io/images/uomnf97_web/post/b942f3c6-e05a-439b-b28e-3975ba34034b/Screen%20Shot%202021-08-13%20at%206.54.17%20PM.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Native 날씨앱 만들기 - 1]]></title>
            <link>https://velog.io/@uomnf97_web/React-Native-%EB%82%A0%EC%94%A8%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</link>
            <guid>https://velog.io/@uomnf97_web/React-Native-%EB%82%A0%EC%94%A8%EC%95%B1-%EB%A7%8C%EB%93%A4%EA%B8%B0-1</guid>
            <pubDate>Mon, 23 Aug 2021 16:01:17 GMT</pubDate>
            <description><![CDATA[<h1 id="introduction">Introduction</h1>
<ul>
<li>알고있어야하는 내용 : React, javascript, expo</li>
<li>활용할 내용 : icon , layout 시스템 공부해보기</li>
</ul>
<h1 id="requirements">Requirements</h1>
<ul>
<li><code>node</code> : version 10 이상 </li>
<li><code>npm</code> : version 6 이상</li>
<li><strong>Simulator 다운로드</strong>
1) Mac OS : Xcode 
developer.apple.com &gt; expo 검색 &gt; 다운로드
<img src="https://images.velog.io/images/uomnf97_web/post/ec4cf40c-52ad-4b26-a193-0cb382a6bcc2/Screen%20Shot%202021-08-06%20at%205.20.53%20PM.png" alt="">
2) 핸드폰: expo 다운로드 </li>
<li><code>npm install -g expo-cli</code> : 명령어에 입력해서 expo 다운로드
( 동작이 안될 경우 yarn global add expo-cli를 이용해서 다운로드 ) 
<img src="https://images.velog.io/images/uomnf97_web/post/4b26efd3-8999-4ecf-9911-4fee8faccf64/Screen%20Shot%202021-08-06%20at%208.16.50%20PM.png" alt=""></li>
</ul>
<h1 id="expo">Expo</h1>
<blockquote>
<p><strong>Expo란 ?</strong> Create-react-app을 말함. 리엑트 네이티브를 위한 설정 파일같은 것들이 없는 방식으로 모든 것이 셋업 되어 있음. React Native CLI 를 이용해서 command line 명령을 이용해서 셋업해줄 수 있음</p>
</blockquote>
<ul>
<li>React Native CLI : 많은 설정을 직접 해줘야할 때 사용하는 방법</li>
<li>Expo의 장점 : 
1) 빠르게 시뮬레이션을 돌릴 수 있다. 
2) Native files를 자동으로 관리해주고 심겨줌 
3) Expo가 훨씬 더 많은 내용을 다룰 수 있게 해줌 ( Expo &gt; Native ) 
4) Expo가 Building Problem을 해결해줌</li>
</ul>
<h1 id="creating-project">Creating Project</h1>
<ol>
<li><code>expo init fokin-weather</code></li>
<li><code>blank</code>모드 : 가장 기본적인 옵션( 이외 : Typesciprt, tab( 템블릿있을 때  등 있음)
<img src="https://images.velog.io/images/uomnf97_web/post/f8c1e621-cea9-4ca7-ac7b-7e9e099f4d7b/Screen%20Shot%202021-08-06%20at%208.18.58%20PM.png" alt=""></li>
<li>Project 이름 설정, Yes 를 입력해서 npm으로 다운로드 ( yarn 사용가능)</li>
<li>Github에 Repository 생성
<img src="https://images.velog.io/images/uomnf97_web/post/2feb213b-a376-4a44-a9eb-21cf3dd766c5/Screen%20Shot%202021-08-06%20at%205.44.48%20PM.png" alt=""></li>
<li>Visual Studio Code 실행</li>
<li>terminal 실행</li>
</ol>
<p>-git remote add origin [repos]
-git pull origin main --allow-unrelated-histories
7. terminal : yarn start로 시작
8. <strong>핸드폰 종류별 expo 실행법</strong></p>
<ul>
<li>Android : QR Code 실행</li>
<li>I Phone : Expo 로그인 -&gt; expo login 입력 </li>
<li>컴퓨터 실행방법 :
__ Run on Andoroid device/emulator__ or <strong>Run on iOS simulator</strong> click!
<img src="https://images.velog.io/images/uomnf97_web/post/155cbea2-47d3-4fd9-9775-d7ed3bc46794/Screen%20Shot%202021-08-13%20at%206.34.03%20PM.png" alt=""></li>
</ul>
<h3 id="파일-구성">파일 구성</h3>
<ul>
<li>Read Me : Learning React Native by Building foking weather app 파일 생성<img src="https://images.velog.io/images/uomnf97_web/post/be10ee6b-da6a-4450-be18-42d6e3b85eb5/Screen%20Shot%202021-08-13%20at%206.27.13%20PM.png" alt=""></li>
<li>app.json : expo가 읽을 파일 </li>
<li>app.js : 기본적인 react 파일</li>
</ul>
<p>출처 : <a href="https://nomadcoders.co/react-native-fundamentals/lectures/1572">노마트 코더</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NomadCoder :: React JS 로 영화 만들기 (2) Setting -1]]></title>
            <link>https://velog.io/@uomnf97_web/NomadCoder-React-JS-%EB%A1%9C-%EC%98%81%ED%99%94-%EB%A7%8C%EB%93%A4%EA%B8%B0-2-Setting-1</link>
            <guid>https://velog.io/@uomnf97_web/NomadCoder-React-JS-%EB%A1%9C-%EC%98%81%ED%99%94-%EB%A7%8C%EB%93%A4%EA%B8%B0-2-Setting-1</guid>
            <pubDate>Thu, 13 May 2021 12:43:27 GMT</pubDate>
            <description><![CDATA[<p>출처: <a href="https://nomadcoders.co/react-fundamentals/lectures/1544">NomadCoder</a></p>
<h1 id="creating-your-first-react-app">Creating your first React App</h1>
<h2 id="리액트를-구현하는-방법">리액트를 구현하는 방법:</h2>
<ul>
<li>원래 리액트 JS를 구현하기 위해서는 WebPack, Babel download , compile 등을 해야되나 Facebook에서 제공하는 간단한 명령어를 통해 구현해줄 수 있음. </li>
</ul>
<ol>
<li><code>npx create-react-app [file-name]</code> : 이 명령어를 통해, Node react JS에 필요한 것들을 한번에 구현해 줄 수 있다. 
<img src="https://images.velog.io/images/uomnf97_web/post/917e04e7-9e30-43da-b71f-565980da75ef/image.png" alt="">
<img src="https://images.velog.io/images/uomnf97_web/post/d448af2c-9a0a-4640-a144-d79a27eee934/image.png" alt=""></li>
</ol>
<ol start="2">
<li>Visual Studio로 파일 열기 </li>
</ol>
<p>명령어 창에 <code>code [file-name]/</code>이라고 적어줘도 되고, Visual Studio 앱을 직접열어, 파일 안으로 들어갈 수도 있다. </p>
<ol start="3">
<li>Delete Readme content -&gt; write # Movie App 2019
React JS fundamental Course (2019 update!)</li>
</ol>
<ol start="4">
<li><p>package.json 에서 script 섹션에 </p>
<pre><code> &quot;test&quot;: &quot;react-scripts test&quot;,
     &quot;eject&quot;: &quot;react-scripts eject&quot;</code></pre><p>부분을 삭제해준다.( 실습에 필요 하지 않음 )
<img src="https://images.velog.io/images/uomnf97_web/post/82e9131e-1137-4e63-ada6-2ed402f0f358/image.png" alt=""></p>
</li>
<li><p>yarn = npm 이 같으므로 삭제해줘도 됨.</p>
</li>
</ol>
<ol start="6">
<li>__ ctrl + <code>__ 로 VS Code terminal을 열어줄 수 있다. 해당 파일 명에 접근한뒤,</code>npm start`를 입력하면 react가 생성된다.</li>
</ol>
<p><img src="https://images.velog.io/images/uomnf97_web/post/bee585b8-0883-4c0b-8e4f-113c73786226/image.png" alt=""></p>
<ul>
<li>첫 번째 주소는 개인이 접근할 수 있는 주소, </li>
<li>두 번째 주소는 와이파이로 접근할 수 있는 주소</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[NomadCoder :: React JS로 영화 웹서비스 만들기- 개발환경 설정]]></title>
            <link>https://velog.io/@uomnf97_web/NomadCoder-React-JS%EB%A1%9C-%EC%98%81%ED%99%94-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@uomnf97_web/NomadCoder-React-JS%EB%A1%9C-%EC%98%81%ED%99%94-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 13 May 2021 10:11:55 GMT</pubDate>
            <description><![CDATA[<h1 id="requirements">Requirements</h1>
<h2 id="installation">Installation</h2>
<p>__ 1. Node JS Download __</p>
<ul>
<li><p>구글에 Node Js 검색후 다운로드
Node 10 -&gt; 구 버전이나, 안정성이 높음 ( 2021년 기준 14)
Node 12 -&gt; 최신 버전으로 불안전함 (2021년 기준 16 )
<img src="https://images.velog.io/images/uomnf97_web/post/c904343c-6216-49a7-99f4-d258409f89cb/image.png" alt=""></p>
</li>
<li><p><code>node -v</code> : check version(설치한 Node Js 버전 확인)</p>
</li>
<li><p><code>npm -v</code>: Node Js 와 함께설치 되는 파일, 설치 됬는지 확인.
<img src="https://images.velog.io/images/uomnf97_web/post/2a7ccd2a-92fa-4eca-b9d8-e197e7c89455/image.png" alt=""></p>
</li>
<li><p><code>npm install npx -g</code> : 설치</p>
</li>
</ul>
<blockquote>
<p><img src="https://images.velog.io/images/uomnf97_web/post/f273037b-043e-4c6b-a7be-cbeac6bccbaf/image.png" alt="">
<img src="https://images.velog.io/images/uomnf97_web/post/0a6b34f0-6d25-4977-bb08-0969dc702112/image.png" alt=""></p>
</blockquote>
<p>__ 2. Visual Studio code __</p>
<ul>
<li>atom, vim등을 사용할 수 있지만, api와 확장 프로그램이 잘되어있으므로 설치를 권장함 . Google에 검색해서 바로 다운로드 받을 수 있음. 
<img src="https://images.velog.io/images/uomnf97_web/post/6dfe5c06-e2c3-426f-b8b3-1ac0bc6a6ec3/image.png" alt=""></li>
</ul>
<p>__ 3. Git __</p>
<ul>
<li>git-scm.com 에서 다운로드를 받음
MAC은 Homebrew를 통해서 terminal에 입력어를 통해 다운로드를 받을 수 있음 : <code>brew install git</code>
<img src="https://images.velog.io/images/uomnf97_web/post/f3c50b1d-cfa9-47c5-a9db-65baa3e38845/image.png" alt=""></li>
</ul>
<blockquote>
<p>m1 에서 brew 설치하기
<img src="https://images.velog.io/images/uomnf97_web/post/293f8c8b-3904-4ad6-bd25-f761389eead8/image.png" alt="">
vi 편집기에 추가할 path 
<code>export PATH=&quot;/opt/homebrew/bin:$PATH&quot;</code></p>
</blockquote>
<ul>
<li>Git 설치 
<img src="https://images.velog.io/images/uomnf97_web/post/abd52ab8-22b5-4498-8297-3197a3d9e124/image.png" alt=""></li>
</ul>
<ul>
<li>Git Gui 설치
<img src="https://images.velog.io/images/uomnf97_web/post/c3b6e2ba-2a13-4a05-8366-469462e28319/image.png" alt=""></li>
</ul>
<ul>
<li><code>git -v</code>,<code>git —version</code> : 설치 후 버전 확인(터미널에서) </li>
</ul>
<p>Mac에서 설치를 할경우 <code>EACCES: permission denied</code> 와 같은 권한 에러가 나타날 수 있음. 이 때 sudo를 사용해도, 설치가 안될 가능성이 큼 아래와 같은 명령어를 이용해서 권한 설정을 해주면 무사히 설치할 수 있음. </p>
<hr>
<h1 id="theory-requirements">Theory Requirements</h1>
<p>  __ 1. HTML __ : div , span</p>
<p>  __ 2. CSS __ : flexible</p>
<p>  __ 3. Vanilla JS( Javascript ) __ : function, return, arguments const, let, array</p>
<p>  __ Need to Know __ : variables, function, class, package.json</p>
<h1 id="why-react">Why React</h1>
<ul>
<li>에어비엔비, 페이스북, npm , spotify 등 많은 회사들이 React를 이용해서 웹 사이트를 만들고 있음. 주당 400만 다운로드 횟수를 기록하고 있을 정도로 수요가 높으며, 페이스북에서 많은 지원을 받아 지속적으로 업데이트 되고 있음. 또한, 64퍼센트 사람의 사람들이 사용하고, 또 사용할 예정이라고 답을 했고, 다른 프론트 엔드 기술에 비해 많이 알려져있음. 마지막으로 자바스크립트를 기반으로 하는데, 이를 통해서 자바스크립트의 역량을 함께 향상 시킬 수 있으므로 좋은 기술임.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML Image/Audio/Video]]></title>
            <link>https://velog.io/@uomnf97_web/HTML-ImageAudioVideo</link>
            <guid>https://velog.io/@uomnf97_web/HTML-ImageAudioVideo</guid>
            <pubDate>Thu, 08 Apr 2021 12:52:08 GMT</pubDate>
            <description><![CDATA[<h1 id="1-이미지">1. 이미지</h1>
<ul>
<li><strong><code>&lt;imag&gt;</code></strong> : 이미지 태그와 다음에 있는 어트리뷰트를 이용하여 정의한다. </li>
</ul>
<ul>
<li><strong><code>src</code></strong>    : 이미지 파일 경로</li>
<li><strong><code>alt</code></strong> :    이미지 파일이 없을 경우 표시되는 문장</li>
<li><strong><code>width</code></strong>:    이미지의 너비 (CSS에서 지정하는 것이 일반적)</li>
<li><strong><code>height</code></strong>:    이미지의 높이 (CSS에서 지정하는 것이 일반적)</li>
</ul>
<h1 id="2-오디오">2. 오디오</h1>
<ul>
<li><strong><code>&lt;오디오&gt;</code></strong> : 오디오 태그와 다음에 있는 어트리뷰트를 이용하여 정의한다. HTML 5이하에서는 사용할 수 없다. Internet Explorer 8에서는 활용 불가능하다.</li>
</ul>
<ul>
<li><strong><code>src</code></strong>:    음악 파일 경로</li>
<li><strong><code>preload</code></strong>:    재생 전에 음악 파일을 모두 불러올 것인지 지정</li>
<li><strong><code>autoplay</code></strong>:    음악 파일을 자동의 재생 개시할 것인지 지정</li>
<li><strong><code>loop</code></strong>:    음악을 반복할 것인지 지정</li>
<li><strong><code>controls</code></strong>:    음악 재생 도구를 표시할 것인지 지정. 재생 도구의 외관은 브라우저마다 차이가 있다.</li>
</ul>
<h1 id="3-비디오">3. 비디오</h1>
<ul>
<li><strong><code>&lt;비디오&gt;</code></strong> : 비디오 태그와 다음에 있는 어트리뷰트를 이용하여 정의한다. HTML 5이하에서는 사용할 수 없다. Internet Explorer 8에서는 활용 불가능하다.또한 브라우저 별로 차이를 보이는 것도 특징이다.</li>
</ul>
<ul>
<li><strong><code>src</code></strong>:    동영상 파일 경로</li>
<li><strong><code>poster</code></strong>:    동영상 준비 중에 표시될 이미지 파일 경로</li>
<li><strong><code>preload</code></strong>:    재생 전에 동영상 파일을 모두 불러올 것인지 지정</li>
<li><strong><code>autoplay</code></strong>:    동영상 파일을 자동의 재생 개시할 것인지 지정</li>
<li><strong><code>loop</code></strong>:    동영상을 반복할 것인지 지정</li>
<li><strong><code>controls</code></strong>:    동영상 재생 도구를 표시할 것인지 지정. 재생 도구의 외관은 브라우저마다 차이가 있다.</li>
<li><strong><code>width</code></strong>:    동영상의 너비를 지정</li>
<li><strong><code>height</code></strong>:    동영상의 높이를 지정</li>
</ul>
<p>참고: <a href="https://poiemaweb.com/html5-tag-image-multimedia">PoiemaWeb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML Form Practice]]></title>
            <link>https://velog.io/@uomnf97_web/HTML-Form-Practice</link>
            <guid>https://velog.io/@uomnf97_web/HTML-Form-Practice</guid>
            <pubDate>Thu, 08 Apr 2021 12:50:36 GMT</pubDate>
            <description><![CDATA[<h1 id="form">Form</h1>
<blockquote>
<p>form 태그는 사용자가 입력한 데이터를 수집하기 위해 사용되며   input,  textarea, button, select, checkbox, radio button, submit button 등의 입력 양식 태그를 포함할 수 있다.</p>
</blockquote>
  <body>
    <h3>button</h3>
    <input type="button" value="Click me" onclick="alert('Hello world!')">
    <hr>

<pre><code>&lt;h3&gt;checkbox&lt;/h3&gt;
&lt;input type=&quot;checkbox&quot; name=&quot;fruit1&quot; value=&quot;apple&quot; checked&gt; 사과&lt;br&gt;
&lt;input type=&quot;checkbox&quot; name=&quot;fruit2&quot; value=&quot;grape&quot;&gt; 포도&lt;br&gt;
&lt;input type=&quot;checkbox&quot; name=&quot;fruit3&quot; value=&quot;peach&quot;&gt; 복숭아&lt;br&gt;
&lt;hr&gt;

&lt;h3&gt;color&lt;/h3&gt;
&lt;input type=&quot;color&quot; name=&quot;mycolor&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;date&lt;/h3&gt;
&lt;input type=&quot;date&quot; name=&quot;birthday&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;datetime&lt;/h3&gt;
&lt;input type=&quot;datetime&quot; name=&quot;birthdaytime&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;datetime-local&lt;/h3&gt;
&lt;input type=&quot;datetime-local&quot; name=&quot;birthdaytime&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;email&lt;/h3&gt;
&lt;input type=&quot;email&quot; name=&quot;useremail&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;file&lt;/h3&gt;
&lt;input type=&quot;file&quot; name=&quot;myfile&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;hidden&lt;/h3&gt;
&lt;input type=&quot;hidden&quot; name=&quot;country&quot; value=&quot;Norway&quot;&gt;
hidden filed는 사용자에 표시되지 않는다.
&lt;hr&gt;

&lt;h3&gt;image&lt;/h3&gt;
&lt;input type=&quot;image&quot; src=&quot;img/img_submit.gif&quot; alt=&quot;Submit&quot; width=&quot;48&quot; height=&quot;48&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;month&lt;/h3&gt;
&lt;input type=&quot;month&quot; name=&quot;birthdaymonth&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;number&lt;/h3&gt;
&lt;input type=&quot;number&quot; name=&quot;quantity&quot; min=&quot;2&quot; max=&quot;10&quot; step=&quot;2&quot; value=&quot;2&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;password&lt;/h3&gt;
&lt;input type=&quot;password&quot; name=&quot;pwd&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;radio&lt;/h3&gt;
&lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;male&quot; checked&gt; 남자&lt;br&gt;
&lt;input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;female&quot;&gt; 여자&lt;br&gt;
&lt;hr&gt;

&lt;h3&gt;range&lt;/h3&gt;
&lt;input type=&quot;range&quot; name=&quot;points&quot; min=&quot;0&quot; max=&quot;10&quot; step=&quot;1&quot; value=&quot;5&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;reset&lt;/h3&gt;
&lt;input type=&quot;reset&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;search&lt;/h3&gt;
&lt;input type=&quot;search&quot; name=&quot;googlesearch&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;submit&lt;/h3&gt;
&lt;input type=&quot;submit&quot; value=&quot;Submit&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;tel&lt;/h3&gt;
&lt;input type=&quot;tel&quot; name=&quot;mytel&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;text&lt;/h3&gt;
&lt;input type=&quot;text&quot; name=&quot;myname&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;time&lt;/h3&gt;
&lt;input type=&quot;time&quot; name=&quot;mytime&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;url&lt;/h3&gt;
&lt;input type=&quot;url&quot; name=&quot;myurl&quot;&gt;
&lt;hr&gt;

&lt;h3&gt;week&lt;/h3&gt;
&lt;input type=&quot;week&quot; name=&quot;week_year&quot;&gt;</code></pre><p>참고 : <a href="https://poiemaweb.com/html5-tag-forms">PoiemaWeb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML List & Table]]></title>
            <link>https://velog.io/@uomnf97_web/HTML-List-Table</link>
            <guid>https://velog.io/@uomnf97_web/HTML-List-Table</guid>
            <pubDate>Thu, 08 Apr 2021 12:48:08 GMT</pubDate>
            <description><![CDATA[<h1 id="list">List</h1>
<h3 id="순서없는-리스트">순서없는 리스트</h3>
<ul>
<li><strong><code>&lt;ul&gt;</code></strong> : 순서없는 목록을 만들어주며, <code>&lt;li&gt;</code>태그를 이용하여 목록을 만들어 준다.</li>
</ul>
<h3 id="순서있는-리스트">순서있는 리스트</h3>
<ul>
<li><strong><code>&lt;ol&gt;</code></strong> : 순서있는 목록을 만들어주며 <code>&lt;li&gt;</code>태그를 이용하여 목록을 만들어 준다.</li>
<li><em>type 어트리뷰트*</em> : 순서를 소문자 알파벳, 로마숫자 등 지정해 줄 수 있다. </li>
<li><em>start 어트리뷰트*</em>: 시작 숫자를 지정해준다.</li>
<li><em>reversed 어트리뷰트*</em>:리스트의 숫자를 거꾸로 만들어 줄 수 있다. </li>
</ul>
<h3 id="중첩된-리스트">중첩된 리스트</h3>
<ul>
<li>여러 리스트 태그를 중첩하여 구조화하면, 리스트를 중첩하여 표현 해 줄 수 있다. <pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
  &lt;h2&gt;Teams&lt;/h2&gt;
  &lt;ul&gt;
    &lt;li&gt;Hufs&lt;/li&gt;
    &lt;li&gt;Web
      &lt;ol&gt;
        &lt;li&gt;HTML&lt;/li&gt;
        &lt;li&gt;CSS&lt;/li&gt;
      &lt;/ol&gt;
    &lt;/li&gt;
    &lt;li&gt;AI&lt;/li&gt;
  &lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><img src="https://images.velog.io/images/uomnf97_web/post/83509716-cdcf-4bc3-adbb-8db82ebe3c2f/image.png" alt=""></li>
</ul>
<hr>
<h1 id="테이블">테이블</h1>
<ul>
<li>과거에는 이 태그를 이용해서 레이아웃을 만들었으나 요즘은 div 를 대신하여 쓰고 이 태그는 레이 아웃을 만드는데 쓰이지 않는다. </li>
</ul>
<ul>
<li><strong><code>&lt;table&gt;</code></strong>:    표를 감싸는 태그</li>
<li><strong><code>&lt;tr&gt;</code></strong>:    표 내부의 행 (table row)</li>
<li><strong><code>&lt;th&gt;</code></strong>:    행 내부의 제목 셀 (table heading)</li>
<li><strong><code>&lt;td&gt;</code></strong>:    행 내부의 일반 셀 (table data)</li>
</ul>
<ul>
<li><p><strong><code>border</code></strong>:    표 테두리 두께 지정. (CSS border property를 사용하는 것이 더 나은 방법이다.)</p>
</li>
<li><p><strong><code>rowspan</code></strong>:    해당 셀이 점유하는 행의 수 지정</p>
</li>
<li><p><strong><code>colspan</code></strong>:    해당 셀이 점유하는 열의 수 지정</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;style&gt;
    table, th, td {
      border: 1px solid blue;
      border-collapse: collapse;
    }
    th, td {
      padding: 15px;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h2&gt;2개의 culumn을 span&lt;/h2&gt;
  &lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th colspan=&quot;2&quot;&gt;Telephone&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Uomnf97&lt;/td&gt;
      &lt;td&gt;010 123 1234&lt;/td&gt;
      &lt;td&gt;02 2182 1234&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><head>
  <style>
    table, th, td {
      border: 1px solid blue;
      border-collapse: collapse;
    }
    th, td {
      padding: 15px;
    }
  </style>
</head>
<body>
  <h2>2개의 column을 span으로 표현하기</h2>
  <table>
    <tr>
      <th>Name</th>
      <th colspan="2">Cellphone</th>
      <th colspan="3">Telephone</th>
    </tr>
    <tr>
      <td>Uomnf97</td>
      <td>010 123 1234</td>
      <td>02 2182 1234</td>
    </tr>
  </table>
</body>

</li>
</ul>
<p>참고: <a href="https://poiemaweb.com/html5-tag-list-table">PoiemaWeb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML Body Tags Practice]]></title>
            <link>https://velog.io/@uomnf97_web/HTML-Body-Tags-Practice</link>
            <guid>https://velog.io/@uomnf97_web/HTML-Body-Tags-Practice</guid>
            <pubDate>Thu, 08 Apr 2021 12:23:07 GMT</pubDate>
            <description><![CDATA[<h1 id="html-body-tags">HTML Body Tags</h1>
<blockquote>
<p><strong>Trend</strong>: 최근의 웹트렌드는 텍스트를 줄이고 이미지나 동영상으로 콘텐츠를 구성하는 것이다. </p>
</blockquote>
<hr>
<h3 id="제목-태그">제목 태그</h3>
<ul>
<li><strong><code>&lt;h1&gt;,&lt;h2&gt; ... &lt;h6&gt;</code></strong> : heading태그라고 부르며 h1 부터 h6까지 다른 크기를 가진 글자로 써줄 수 있다. 시멘틱 정보가 있으니 중요한 정보만 h1태그로 처리 할것</li>
</ul>
<hr>
<h3 id="글자-태그--text-formatting-">글자 태그 ( Text Formatting )</h3>
<ul>
<li><strong><code>&lt;b&gt;</code></strong>: bold체를 만들어주는 태그, semantic 의미는 없다. </li>
<li><strong><code>&lt;stong&gt;</code></strong>: bold체를 만들어주는 태그, semantic의미를 갖는다.</li>
<li><strong><code>&lt;i&gt;</code></strong>: Italic체를 지정한다. Semantic의미는 존재하지 않는다. </li>
<li><strong><code>&lt;em&gt;</code></strong> : emphasize text를 지정한다. Italic체로 표현되며, semantic적 중요성을 갖는다.</li>
<li><strong><code>small</code></strong>: small text 를 지정한다. </li>
<li><strong><code>&lt;mark&gt;</code></strong>: highlighted text 를 지정한다. </li>
<li><strong><code>&lt;deleted&gt;</code></strong>: 특정한 단어에 가운데 줄을 그린다.. </li>
<li><strong><code>&lt;ins&gt;</code></strong>: 특정한 단어에 밑줄을 그린다. </li>
<li><strong><code>&lt;sub&gt;/&lt;sup&gt;</code></strong>: sub는 밑첨자 텍스트를, sup는 윗첨자 텍스트를 작성해준다.</li>
</ul>
<hr>
<h3 id="본문-태그">본문 태그</h3>
<ul>
<li><strong><code>&lt;p&gt;</code></strong>: 단락을 만들어주는 태그</li>
<li><strong><code>&lt;br&gt;</code></strong>:줄바꿈 태그, 종료 태그가 존재하지 않는다. </li>
<li><strong><code>&amp;nbsp;</code></strong> : 연속된 공백을 넣어줄때 필요한 문자기호</li>
<li><strong><code>&lt;pre&gt;</code></strong> : performatted text를 지정한다. 작성된 그대로를 출력해주는 태그</li>
<li><strong><code>&lt;hr&gt;</code></strong> : 수평 줄을 삽입한다. </li>
<li><strong><code>&lt;q&gt;</code></strong> : 짧은 인용문 태그 인용부호는 큰따옴표로 감싼다. </li>
<li><strong><code>&lt;bloackquote&gt;</code></strong> : 긴 인용문 블록을 지정한다. block quote 요소를 들여쓰기를 하며, css 를 이용하여 다양한 style을 적용할 수 있다. </li>
</ul>
<hr>
<p>참고: <a href="https://poiemaweb.com/html5-tag-text">Poiemaweb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML Tag Practice]]></title>
            <link>https://velog.io/@uomnf97_web/HTML-Tag-%EC%8B%A4%EC%8A%B5-1</link>
            <guid>https://velog.io/@uomnf97_web/HTML-Tag-%EC%8B%A4%EC%8A%B5-1</guid>
            <pubDate>Thu, 08 Apr 2021 12:22:35 GMT</pubDate>
            <description><![CDATA[<h1 id="1-문서-정의-태그">1. 문서 정의 태그</h1>
<p>앞서 언급했듯 모든 html앞에 오는 태그로 문서별로 단 하나만 존재한다. XHTML인지, HTML 5인지 그 문서의 형식을 알려준다. </p>
<ul>
<li><strong>HTML 5</strong> :<pre><code>&lt;!DOCTYPE html&gt;</code></pre></li>
<li><strong>HTML 4.01</strong>:<pre><code>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;</code></pre></li>
<li><strong>XTML 1.0</strong>:<pre><code>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</code></pre></li>
</ul>
<hr>
<h1 id="2-html-tag">2. html tag</h1>
<ul>
<li><p><strong>html</strong> : 문서 형식을 지정하는 <code>&lt;DOCTYPE html&gt;</code>을 제외하고 모든 HTML요소의 부모 요소 이다. 따라서 html의 열림 태그와, 닫힘 태그 안에 모든 html요소가 구서되어있어야한다. </p>
</li>
<li><p><strong>Lang Attribute</strong> : 보통 Lang 어트리뷰트와 함께 쓰이는데, 언어에따라 ko, es, en등의 축약형으로 언어를 지정한다. 위키백과같은 코드를 복사해서 실습을 해본다면, 해당언어로 되어있는 부분만 출력하는 것을 알 수 있다. 즉, 그 HTML content를 제한해준다고 볼 수 있다. </p>
</li>
</ul>
<hr>
<h1 id="3-head-tag">3. head tag</h1>
<ul>
<li><strong>head</strong>: 헤드 태그는 그 문서의 메타 데이터를 담고 있는 요소이며 문서에 단 하나만 존재해야 한다. 메타데이터의 종류로는 title, style, link, script에 대한 데이터이다. 이때 head태그로 감싼 코드는 문서내에서 표시 되지 않는다. </li>
</ul>
<h3 id="--메타데이터-태그-종류">- 메타데이터 태그 종류</h3>
<p><strong>1. title tag</strong> : title 요소는 문서의 제목을 의미하고, 브라우저 탭부분에 표기 된다. 
<strong>2. style tag: *<em>style요소는 문서의 style 정보를 제공한다. 글자 색상, 폰트, 배경 색 등이 정의되어있다. 
*</em> 3. link tag</strong> : link 요소는 외부 리소스와 연계 정보를 저장한다. 주로 HTML과 외부 CSS파일을 연계해서 사용한다. 이때 링크의 href에서는 링크할 파일을 설정해준다. 
** 4. script tag** : script요소를 통해 client-side java 를 정의한다. src어트리뷰트를 사용하여 자바스크립트 파일을 로드할 수 있다. 
** 5. meta tag** : meta 요소는 description, keywords, author, 기타 메타데이터 정의에 사용된다. 메타데이터는 브라우저, 검색엔진(Keywords)등에 사용된다.</p>
<ul>
<li><strong>charset</strong> : 문서가 사용할 문자셋을 의미한다.<br>ex) utf-8, ascii etc</li>
<li><strong>name=&quot;keywords&quot;</strong> : SEO(검색엔진 최적화)를 위해 검색엔진이 사용할 Keywords을 정의한다. </li>
<li><strong>name=&quot;descriptions&quot;</strong> : 웹페이지의 설명을 정의한다.</li>
<li><strong>name=&quot;author&quot;</strong> : 웹페이지의 저자를 명시한다.</li>
<li><strong>http_equiv=&quot;refresh&quot;</strong> : 웹페이지를 일정 시간마다 Refresh 한다.</li>
</ul>
<hr>
<h1 id="4-body-tag">4. body tag</h1>
<ul>
<li><strong>body tag</strong>: HTML문서의 내용을 나타내며, 웹페이지에 표현되는 모든 요소든의 부모 요소이다. 메타데이터를 제외한 대부분의 요소가 기술되어있으며, 문서상 <strong>하나</strong>만 존재한다.</li>
</ul>
<hr>
<p>1~4번의 내용을 가지고 가상 html문서를 만들어보았다. </p>
<pre><code>&lt;!doctype html&gt;
&lt;html lang =&quot;ko&quot;&gt; 
    &lt;head&gt;
        &lt;meta charset=&quot;utf-8&quot;&gt;
        &lt;meta name=&quot;Keyword&quot; content =&quot;실습, HTML, 태그&quot;&gt;
        &lt;meta name=&quot;description&quot; content=&quot;HTML Practice&quot;&gt;
        &lt;meta name=&quot;author&quot; content=&quot;김주원&quot;&gt;
        &lt;meta http-equiv=&quot;refresh&quot; content=&quot;10&quot;&gt;
        &lt;script&gt;
            document.addEventListener(&#39;click&#39;, function () {
              alert(&#39;안녕!&#39;);
            });
          &lt;/script&gt;
        &lt;title&gt;HTML실습!!&lt;/title&gt;
        &lt;style&gt;
            body {
                background-color: rgb(207, 207, 161);
                color: rgb(67, 90, 196);
            }
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;배웠던 태그 실습&lt;/h1&gt;
        &lt;p&gt;Welcome to my Velog&lt;/p&gt;
        &lt;p&gt;안녕하세요&lt;/p&gt;
        &lt;p&gt;Hello&lt;/p&gt;
        &lt;p&gt;こんにちは&lt;/p&gt;
        &lt;p&gt;你好&lt;/p&gt;
        &lt;p&gt;שלום&lt;/p&gt;
        &lt;p&gt;สวัสดี&lt;/p&gt;
    &lt;/body&gt;
&lt;/html&gt;</code></pre><hr>
<p>결과: 
<img src="https://images.velog.io/images/uomnf97_web/post/5e4694f6-eda6-464c-bc67-77b03ebceb8f/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/uomnf97_web/post/146525ce-63dc-4b41-b71f-8cb34f8b89c0/image.png" alt=""></p>
<ul>
<li>이외의 태그 reference 정리 : <a href="http://www.tcpschool.com/html-tags/link">http://www.tcpschool.com/html-tags/link</a></li>
</ul>
<p>참고: <a href="https://poiemaweb.com/html5-tag-basic">PoiemaWeb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML (4) :: Hyper Link]]></title>
            <link>https://velog.io/@uomnf97_web/HTML-4-Hyper-Link</link>
            <guid>https://velog.io/@uomnf97_web/HTML-4-Hyper-Link</guid>
            <pubDate>Thu, 08 Apr 2021 12:21:09 GMT</pubDate>
            <description><![CDATA[<h1 id="hyper-link">Hyper Link</h1>
<blockquote>
<p><em>HyperLink란 한텍스트에서 다른 텍스트로 텍스트의 일반적인 순서가 아닌 사용자가 원하는 순서대로 이동할 수 있는 링크를 말한다 HTML 은 HyperText언어로 하이퍼링크를 지원한다.</em></p>
</blockquote>
<ul>
<li><p><strong><code>&lt;a&gt;</code></strong>: a 태그를 통해 서로 다른 웹페이지로 이동을 가능하게 한다. </p>
</li>
<li><p><strong><code>href 어트리뷰트</code></strong> : href는 이동하고자 하는 파일의 위치(경로)를  값으로 받는다. 본인을 기반으로 한 상대경로를 받을 수도 있고, url을 통한 절대 경로를 받을 수도 있다. 또한 앞선 포스팅에 설명했듯이 script, style기능에 활용되며 ,페이지 상단으로 이동하거나 하단으로 이동할 때 활용가능하다.</p>
</li>
<li><p><strong><code>target 어트리뷰트</code></strong> : 링크를 어떠한 방식으로 오픈할 지 정한다. _self는 현재 윈도우에서 오픈을 시키며, _blank는 새로운 윈도우나 탭에서 오픈한다.</p>
</li>
</ul>
<p>참고: <a href="https://poiemaweb.com/html5-tag-link">PoiemaWeb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML (3) :: LayOut]]></title>
            <link>https://velog.io/@uomnf97_web/HTML-3-LayOut</link>
            <guid>https://velog.io/@uomnf97_web/HTML-3-LayOut</guid>
            <pubDate>Thu, 08 Apr 2021 12:19:19 GMT</pubDate>
            <description><![CDATA[<h1 id="html-layout-만들기">HTML Layout 만들기</h1>
<ul>
<li>HTML의 문서공간을 다음 사진과 같이 효과적으로 활용해주기 위해 태그를 활용하여 문서의 공간을 나눠준다.</li>
</ul>
<hr>
<p><img src="https://images.velog.io/images/uomnf97_web/post/6a030a07-75df-4fd5-9f5c-60acf55616de/image.png" alt="">
사진 출처: <a href="https://poiemaweb.com/html5-tag-structure">PoiemaWeb</a></p>
<hr>
<ul>
<li><strong>트렌드</strong> : <code>span</code> <code>div</code> <code>table</code> 등을 사용하였고, 과거에는 table 태그를 이용하여 레이아웃을 구성했으나, 모던웹에서는 주로 <code>div</code>태그를 이용하여 레이아웃을 구성하고있다.
<code>span</code> : inline 단위 구역을 지정한다.
<code>div</code>: block 단위의 구역을 지정한다</li>
</ul>
<ul>
<li><p><strong>HTML 5</strong> : html에서는 새롭게 추가된 태그들 중 구역을 나누는, 레이아웃을 구현해주는 시멘틱 태그가 있으므로 이런 태그들을 사용하는게 좋을 것이다. Internet Explorer에서 제공되지 않기에 유의해 서 작성한다.</p>
<p><strong>header</strong>: 헤더를 의미한다.
<strong>nav</strong>: 내비게이션을 의미한다.
<strong>aside</strong>: 사이드에 위치하는 공간을 의미한다.
<strong>section</strong>: 본문의 여러 내용(article)을 포함하는 공간을 의미한다.
<strong>article</strong>: 본문의 주내용이 들어가는 공간을 의미한다. 
<strong>footer</strong>: 푸터를 의미한다. </p>
<hr>
<p><img src="https://images.velog.io/images/uomnf97_web/post/2fecc686-5928-49a4-86b0-3327b1bd6e21/image.png" alt="">
사진 출처: <a href="https://poiemaweb.com/html5-tag-structure">PoiemaWeb</a></p>
</li>
</ul>
<hr>
<p>참고: <a href="https://poiemaweb.com/html5-tag-structure">PoiemaWeb</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML(2) :: Semantic Web]]></title>
            <link>https://velog.io/@uomnf97_web/HTML2-Semantic-Web</link>
            <guid>https://velog.io/@uomnf97_web/HTML2-Semantic-Web</guid>
            <pubDate>Thu, 08 Apr 2021 12:18:30 GMT</pubDate>
            <description><![CDATA[<h1 id="semantic-web">Semantic Web</h1>
<blockquote>
<p><strong>Semantic web</strong> 이란 웹에 존재하는 수많은 웹페이지들에 메타데이터(Metadata)를 부여하여, 기존의 잡다한 데이터 집합이었던 웹페이지를 ‘의미’와 관련성을 가지는 거대한 데이터 베이스로 구축하고자 하는 발상을 가지고 만들어진 웹시 스템을의미한다.</p>
</blockquote>
<ul>
<li><p><strong>Semantic 요쇼(Semantic Element)</strong> : 브라우저, 검색엔진, 개발자 모두에게 콘덴츠의 의미를 명확히 설명하는 역할을 한하며, 시맨틱 태그(Semantic Tag)로 구현된다.이때 시멘틱 요소는 img, header, aside 등이 있으며 각각 이미지, 헤더, 사이드에 위치하는 공간 등 content의미를 전달해주는 역할을 한다. </p>
</li>
<li><p><strong>Non-Semantic 요소</strong>: div, span 등이 있으며, content에 대한 어떤 내용도 전달하지 않는다.</p>
</li>
<li><p><strong>시맨틱 웹의 장점</strong>: 개발자가 의도한 요소의 의미가 명확히 드러내어, 코드의 가독성을 높이고, 유지보수를 쉽게 만든다. 
<em>예)브라우저가 검색엔진에서 웹사이트정보를 크롤링하여 검색 사이트 이용자가 검색할 만한 키워드를 미리 예상하여 검색 키워드에 대응 하는 인덱스를 만들어주는데, 이때 시맨틱 요소를 해석하여 대응하는 텍스트를 만들어준다. 따라서 만약 웹에 본인 웹사이트가 검색이 잘 안될경우시맨틱 요소를 수정하는 방법을 통해 쉽게 해결할 수 있다!</em></p>
</li>
</ul>
<hr>
<p><img src="https://images.velog.io/images/uomnf97_web/post/c459117c-b694-467a-b1a0-1e3c109edad5/8CF8FAD2-7C05-454B-8F61-13439132565C.png" alt="">
시멘틱 요소의 의미 전달 예시 자료
<a href="https://poiemaweb.com/html5-semantic-web">사진출처</a></p>
<hr>
<pre><code>#코드 예시
</code></pre><hr>
<p>참고:<a href="https://poiemaweb.com/html5-semantic-web">PoiemaWeb</a></p>
]]></description>
        </item>
    </channel>
</rss>