<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dung-dung.log</title>
        <link>https://velog.io/</link>
        <description>아둥바둥</description>
        <lastBuildDate>Thu, 18 Jan 2024 20:41:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dung-dung.log</title>
            <url>https://velog.velcdn.com/images/dung-dung/profile/eb2e1dc3-15e3-4a84-a9c1-b93346209873/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dung-dung.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dung-dung" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[git 설치 안내 사항 알아보기]]></title>
            <link>https://velog.io/@dung-dung/git-%EC%84%A4%EC%B9%98-%EC%95%88%EB%82%B4-%EC%82%AC%ED%95%AD-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@dung-dung/git-%EC%84%A4%EC%B9%98-%EC%95%88%EB%82%B4-%EC%82%AC%ED%95%AD-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Thu, 18 Jan 2024 20:41:31 GMT</pubDate>
            <description><![CDATA[<p>git을 처음 컴퓨터에 설치하고자 할 때, 다양한 경로 중 <a href="https://git-scm.com/download/win">아래의 사이트</a>를 통해서 설치를 진행하는 경우가 많을 것이다. 
<img src="https://velog.velcdn.com/images/dung-dung/post/cf0b4145-a3d6-4d9d-abae-b795b166f8d9/image.png" alt=""></p>
<p>그렇다면 셋업 파일을 다운로드 하고, 런치 하기 까지의 과정 중에 만나는 다양한 옵션과 항목의 내용이 무엇인지 가장 최신 git 기준으로 (24년 1월) 자세히 알아보고자 한다.</p>
<p><br> <br></p>
<hr>
<br><br>
23년1월 기준, _**32-bit git for windows setup**_을 눌러 파일을 다운받으면,
_32비트 보다 64 비트의 설치를 추천_하는 안내 문구가 뜬다.

<p>그래서 아래와 같은 <strong>64 비트 윈도우 파일을 설치</strong>의 과정에 대해서 알아보자.
<img src="https://velog.velcdn.com/images/dung-dung/post/bc3bc15b-2ed1-4d55-87d1-a5ae0a98e2c4/image.png" alt=""></p>
<p>이를 <strong>클릭</strong>하면 다운로드가 진행되고, 아래와 같은 <strong>64 bit 의 git 파일</strong>이 다운된 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/dung-dung/post/1be708fd-bd52-4509-b6f1-ea1b6f026194/image.png" alt=""></p>
<p>이를 더블클릭 해 실행하면, 본격적인 *<em>git setup *</em>안내가 진행된다.</p>
<h2 id="information--copyright">information &amp; copyright</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/c9026c08-8726-4e2d-afe5-5d5865663610/image.png" alt=""></p>
<p>이는 우리가 설치하려는 GNU의 저작권에 대한 라이선스의 내용과 복사, 배포, 수정권한에 대한 내용이다. </p>
<p>이에 대해서 동의하고 설치를 진행하고자 한다면 하단의 <strong>Next 버튼</strong>을 누르면 된다.</p>
<p>GNU General Public License(이하 GPL)은 1991년 6월에 제정된 버전 2로,  소프트웨어 특허 문제를 방지하기 위해 모든 특허가 모든 사용자에게 무료로 사용되거나 아예 라이선스가 없는 상태로 허가되어야 한다고 명시하고 있다. 이 외에도 프로그램의 배포에 관한 자세한 조건과 라이선스의 유지, 라이선스 위반에 대한 조항 등이 명시되어 있다.</p>
<h2 id="select-destination-location">select destination location</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/55fb685e-d5e1-4393-8c63-b91d3b0018c9/image.png" alt=""></p>
<p>다음은 깃을 설치할 폴더 위치를 결정하는 곳이다. 
만약 다른 곳에 설치를 원한다면 <strong>Browse...</strong> 버튼을 눌러 다른 곳을 탐색할 수 있다.
최소 320.9MB의 여유 용량이 있는 디스크가 필요하다.</p>
<h2 id="select-components">select components</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/ba1d5107-6f74-4bf3-afc1-0f3ee7f6f221/image.png" alt=""></p>
<p>여러가지 다양한 컴포넌트 중에 어떤 컴포넌트를 설치하고 싶은지 묻고 있다. 체크 표시 항목은 기본 설정된 항목이다.
<br>
📌 첫 번째 <strong>Additional icons &gt; On the Desktop</strong>은 데스크탑에 추가 git아이콘을 만들것인지를 묻는다.
<br>
📌 두 번째 <strong>windows explorer integration</strong>은 운영 체제의 파일 탐색기(Explorer)와 다른 프로그램 또는 기능을 통합하는 것을 의미한다. 폴더 선택 후 마우스 오른쪽 버튼 클릭 시 Git에 연결 시킬 수 있는 기능 제공한다.</p>
<p>그 하위의 <strong>open Git Bash here</strong> 옵션은 현재 탐색기 창의 경로에 해당하는 위치에서 Git Bash 셸을 열 수 있는 기능을 제공한다. </p>
<p>다른 하위의 옵션인 <strong>open Git GUI here</strong>은 현재 탐색기 창의 경로에 해당하는 위치에서 Git GUI(그래픽 사용자 인터페이스) 도구를 열 수 있는 기능을 제공한다. </p>
<p>Git GUI는 Git을 시각적으로 다룰 수 있게 해주는 그래픽 사용자 인터페이스 도구로, 코드의 변경 내용을 추적하고 변경 사항을 커밋하는 등의 Git 작업을 수행할 수 있도록 도와준다.
<br>
📌 세 번째 <strong>git LFS (large file support)</strong>는 말 그대로 대용량 파일의 지원을 의미한다. </p>
<p>git은 본래 작은 용량의 이진 파일 지원 중심으로 구성되어있다. 그런데 LFS 기능을 이용하면 영상파일 등 보다 대용량 파일을 업로드 할 수 있다. 
<a href="https://git-lfs.com/">공식 홈페이지</a>에 따르면, LFS(Git Large File Storage)는 오디오 샘플, 비디오, 데이터 세트 및 그래픽과 같은 대용량 파일을 Git 내부의 텍스트 포인터로 대체하는 한편 파일 내용을 GitHub.com 또는 GitHub Enterprise와 같은 원격 서버에 저장한다. 상세 기능은 아래와 같다.</p>
<p><strong>대용량 파일 관리</strong>: Git LFS는 대용량 파일을 따로 관리하고, 이 파일들에 대한 참조만을 Git 저장소에 저장합니다. 이를 통해 저장소 크기를 줄이고 Git의 성능을 향상시킬 수 있습니다.</p>
<p><strong>속도 향상</strong>: Git LFS는 대용량 파일에 대한 변경 내용을 다룰 때 효율적으로 동작하므로, 큰 파일이 포함된 프로젝트의 작업 속도를 향상시킬 수 있습니다.</p>
<p><strong>백업 용이성</strong>: Git LFS를 사용하면 대용량 파일이나 이진 파일을 따로 저장하고, 필요한 경우 이 파일들을 복원할 수 있습니다. 이는 파일 손상, 삭제 또는 재구성 시 백업과 복구에 도움을 줍니다.</p>
<p><strong>확장성</strong>: Git LFS는 Git과 호환성이 있어 기존 Git 작업 흐름과 통합하기 용이합니다. Git 명령어와 함께 사용할 수 있어 사용자들이 기존의 Git 명령어를 그대로 사용하면서도 대용량 파일을 효과적으로 관리할 수 있습니다.</p>
<p>자세한 내용은 공식 홈페이지를 참고하길 바란다.
<br>
📌 네 번째 <strong>associate .git* configuration files with the default text editor</strong>은 Git 저장소의 설정 파일인 .gitconfig, .gitignore, .gitattributes 등과 같은 파일을 기본 텍스트 편집기와 연결하거나 연관시키는 작업을 맡는다.
<br>
📌 다섯 번째** associate .sh files to be run with bash** 는 리눅스나 유닉스 계열의 운영 체제에서 쉘 스크립트 파일인 .sh 확장자를 Bash 쉘에서 실행하도록 설정함을 의미한다.
<br>
📌 여섯 번째 <strong>check daily for git for windows updates</strong> 는  Git for Windows의 업데이트를 매일 확인하도록 만드는 것이다. 
Git for Windows는 주기적으로 업데이트가 되며, 새로운 버전에서는 보안 업데이트, 새로운 기능 추가, 버그 수정 등이 제공된다. 업데이트를 수동으로 확인하고 적용하는 대신, 매일 자동으로 확인하도록 설정할 수 있다.</p>
<p>하지만 개인적인 생각으로, 다른 프로젝트들을 진행함에 있어서 깃이 계속 업데이트 되는 것은 이에 맞추어 계속 다른 프로그램의 버전 또한 맞춰야 하기에 번거롭다고 생각된다.
때문에 기본 설정 항목에 이 항목이 체크되어있지 않은 것을 그대로 이어 설치하지 않는 것을 추천한다. 
<br>
📌 일곱 번째 <strong>add a git bash profile to windows terminal</strong> 은 Windows Terminal에서 Git Bash 프로파일을 추가하는 것을 의미한다.
터미널 환경을 향상시켜 Git Bash를 더 쉽게 사용할 수 있게 한다. 
<br>
📌 여덟 번재 <strong>scalar (git add-on to manage large-scale repositories)</strong> 은 Git의 대규모 저장소 관리를 개선하기 위한 확장 기능 중 하나로 대규모 저장소에서의 성능 및 작업 효율을 향상시키는 데 중점을 두었다. 상세 정보는 아래와 같다.</p>
<p><strong>파일 시스템 메타데이터 캐시</strong>: Scalar는 대규모 저장소에서의 성능 향상을 위해 파일 시스템 메타데이터에 대한 캐싱을 수행합니다. 이를 통해 파일 및 디렉토리를 효과적으로 관리하고 Git 명령을 빠르게 수행할 수 있습니다.</p>
<p><strong>병렬성 증가</strong>: Scalar는 병렬 처리를 통해 Git 명령의 처리 속도를 향상시킵니다. 특히 대규모 저장소에서 작업을 병렬로 처리함으로써 전반적인 성능을 향상시킬 수 있습니다.</p>
<p><strong>가상 파일 시스템</strong>(Virtual File System): Scalar는 Git 저장소의 파일을 필요에 따라 가상으로 가져오고, 실제로 필요한 파일만 로컬에 복사하여 저장소의 크기를 줄이는 가상 파일 시스템을 제공합니다.</p>
<p><strong>자동 업데이트</strong>: Scalar는 자동 업데이트 기능을 포함하여 새로운 기능이나 성능 향상을 포함하는 새로운 버전이 나올 때 손쉽게 업데이트할 수 있도록 지원합니다.</p>
<h2 id="select-start-menu-folder">select start menu folder</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/3d02bf4d-bbba-49d4-933d-28d18ed34efd/image.png" alt="">
프로그램의 단축경로 위치를 어디에 둘지 결정하는 단계이다. 
기본 폴더는 Git이고, 원한다면 다른 경로를 찾을 수 있다.</p>
<h2 id="choosing-the-default-editor-used-by-git">choosing the default editor used by git</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/5b090c68-db1a-42dc-9afd-9d4fb89d575c/image.png" alt="">
기본 편집기에 대해 설정하는 단계이다. </p>
<p>편집기의 종류는 아래의 이미지에 보이는 것을 비롯해 다양한데, 하나하나 그 특징에 대해서 간략히 알아보자면 아래와 같다.
<img src="https://velog.velcdn.com/images/dung-dung/post/79ae34c3-c72f-4bd4-aa57-f74cd2efb405/image.png" alt=""></p>
<p><br><br>
📌 <strong><a href="https://www.nano-editor.org/dist/v2.8/nano.html">GNU Nano</a></strong></p>
<p>기본적인 텍스트 편집 외에도, nano는 대화형 검색 및 바꾸기, 실행 취소/레도, 구문 색칠, 부드러운 스크롤, 자동 입력, 줄 바꿈 및 열 번호 이동, 기능 토글, 파일 잠금, 백업 파일 및 국제화 지원과 같은 많은 추가 기능을 지원한다.
유닉스 계열의 편집기로 편집기 화면은 아래와 같은 모습이다.</p>
<p><a href="https://chat.openai.com/c/fd271179-9e9a-47a8-b77a-d052dbfbb4a6">나노 이미지 출처</a></p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/1da65a75-ce05-4b30-82e7-31dda7a6a001/image.png" alt=""></p>
<p><br><br>
📌 <strong><a href="https://www.vim.org/">Vim</a></strong></p>
<p>어떤 종류의 텍스트라도 매우 효율적으로 만들고 변경할 수 있도록 만들어진 고도로 구성 가능한 텍스트 편집기이다. Vim은 대부분의 유닉스 시스템과 애플 OS X에 &quot;vi&quot;로 포함되어 있다. 다시말해, MacOs 같은 유닉스 계열 운영체제의 기본 텍스트 에디터이다.
하지만 git에서는 vim보다 가능한 최신 GUI로 바꾸어 설치할 것을 권장한다.</p>
<p><br><br>
📌 <strong><a href="https://notepad-plus-plus.org/">Notepad++</a></strong></p>
<p>여러 언어를 지원하는 무료 소스 코드 편집기 및 메모장이다. MS 윈도우 환경에서 실행되는 그 사용은 GNU General Public License에 의해 관리된다.
<img src="https://velog.velcdn.com/images/dung-dung/post/0bcff011-36d2-4a3f-9cc2-06b8f50f64da/image.png" alt=""></p>
<p><br><br>
📌 <strong><a href="https://code.visualstudio.com/">Visual Studio Code</a></strong></p>
<p>마이크로소프트가 마이크로소프트 윈도우, macOS, 리눅스용으로 개발한 소스 코드 편집기이다. 다양한 설치 파일을 통해서 확장시킬 수 있다. 
필자가 가장 추천하는 편집기 이다.</p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/9bfd7d35-564d-4086-b882-d79f47a550de/image.png" alt=""></p>
<p><br><br>
📌 <strong><a href="https://www.sublimetext.com/">Sublime Text</a></strong></p>
<p> 파이썬 API용으로 작성된 사유 크로스 플랫폼 소스 코드 편집기이다. 수많은 프로그래밍 언어와 마크업 언어를 네이티브로 지원하며 플러그인을 사용하여 사용자에 의해 기능을 확장할 수 있다.
 <img src="https://velog.velcdn.com/images/dung-dung/post/97fdd28b-a762-4a21-a941-ababfa8f6d10/image.png" alt=""></p>
<p><br><br>
📌 <strong><a href="https://github.blog/2022-06-08-sunsetting-atom/">Atom</a></strong></p>
<p>GitHub에서 만든 텍스트 에디터로, 다양한 프로그래밍 언어의 편집기로 사용할 수 있도록 고안된 도구이다. Sublime Text와 Textmate를 본땄다.
하지만 22년 12월 부로 Atom이라는 소프트웨어 및 Atom 프로젝트가 소속된 조직을 공식적으로 종료했으므로 새로운 프로젝트를 시작하는 단계라면 선택을 지양하기를 추천한다.</p>
<p><br><br>
📌 <strong><a href="https://vscodium.com/">VSCodium</a></strong></p>
<p>VS Code의 무료이고 오픈 소스인 소프트웨어 바이너리이다. 
기반이 VSCode이다.
<img src="https://velog.velcdn.com/images/dung-dung/post/4716f817-982b-4f54-ab3f-0b32a3f49780/image.png" alt=""></p>
<p><br><br>
📌 <strong>Notepad</strong>
윈도우 내장 문서 편집기 메모장을 의미한다.</p>
<h2 id="adjusting-the-name-of-the-initial-branch-in-new-repositories">Adjusting the name of the initial branch in new repositories</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/3b8b15cd-9c38-4f13-98e0-8cec0592530c/image.png" alt="">
새 저장소의 첫 번째 브랜치 네임을 설정한다.
기본 설정 값은 첫 번째 라디오버튼인데 master로 진행함을 의미한다.
하지만 깃의 브랜치가 master의 오래된 이름에서 main으로 바꿀 것을 추진한지 몇년 째이며, 필자의 경우 master이름을 이용하다가 다른 최신 프로그램과 충돌을 겪은 적이 있으므로 두 번째 라디오버튼을 클릭할 것을 추천한다.
더 많은 이야기는 <a href="https://chaewonkong.github.io/posts/set-default-branch-to-main.html">여기</a>를 추천한다.</p>
<h2 id="adjusting-your-path-environment">Adjusting your path environment</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/86783d2d-024f-4737-ab02-b2e243b61dc3/image.png" alt=""></p>
<p>명령 프롬프트나 다른 커맨드 라인 도구에서 git 명령을 사용할 수 있도록 환경변수를 설정하는 부분이다.</p>
<h2 id="choosing-the-ssh-executable">Choosing the SSH executable</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/81015845-1e5e-4b50-be91-019720106470/image.png" alt="">
git에서 ssh를 사용해 작업할 때 git이 가지고 있는 openSSH를 사용할 것인지, 외부의 openSSH를 사용할 것인지를 결정한다.</p>
<p>SSH는 원격 서버와의 안전한 통신을 위해 사용되는 프로토콜로, 다양한 SSH 클라이언트가 있다.</p>
<h2 id="choosing-https-transport-backend">choosing HTTPS transport backend</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/520d96e7-b71c-409d-985c-0b96617efebf/image.png" alt="">
git에서 HTTPS로 작업할 때 OpenSSL리 가지고 있는 루트 인증서를 사용할 것인지, 아니면 window의 secure channel의 루트 인증서를 사용할 것인지 결정한다.
다만, 기업 등에서 git 레포 서버를 운영하고 있는 경우 두 번째를 선택해야 한다.</p>
<h2 id="comfiguring-the-line-ending-conversions">comfiguring the line ending conversions</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/993151e3-5c44-4cee-8843-29454628d8e4/image.png" alt=""></p>
<p>레포지토리에서 체크아웃, 커밋 시 줄바꿈에 대한 옵션이다.</p>
<p><strong>CRLF (Carriage Return Line Feed)</strong>:
CRLF는 줄바꿈을 표현하기 위해 Carriage Return (CR)와 Line Feed (LF) 두 문자를 사용하는 방식이다.
CR은 현재 커서를 현재 라인의 처음으로 이동시키는 제어 문자이고, LF는 다음 라인으로 이동시키는 제어 문자이다.</p>
<p><strong>LF (Line Feed)</strong>:
LF는 줄바꿈을 표현하기 위해 Line Feed (LF) 문자 하나만 사용하는 방식이다.
주로 Unix 및 Linux 운영 체제에서 텍스트 파일의 줄바꿈에 사용된다.
Git 등의 버전 관리 시스템에서는 리눅스 계열의 스타일을 따르는 것이 일반적이다.</p>
<p>CRLF는 주로 Windows에서 사용되고, LF는 주로 Unix/Linux에서 사용된다.</p>
<h2 id="configuring-the-terminal-emulator-to-use-with-git-bash">configuring the terminal emulator to use with Git Bash</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/3a0ec5a4-6822-4e54-a219-037f4fe56ec4/image.png" alt=""></p>
<p>깃에서 사용할 콘솔을 선택하는데, minTTY을 사용할 것인지, 아니면 window의 표준 콘솔을 사용할 것인지 선택하는 과정이다.</p>
<p>MinTTY는 Windows 운영 체제에서 사용되는 터미널 에뮬레이터이다. MinTTY는 주로 Git Bash 및 Cygwin과 함께 사용되며, 터미널 환경을 제공하여 Unix/Linux 스타일의 명령어와 유틸리티를 Windows에서 사용할 수 있게 해준다.</p>
<h2 id="choose-the-default-behavior-of-git-pull">choose the default behavior of &#39;git pull&#39;</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/2cf03627-6a06-4fac-8544-9e2771083787/image.png" alt=""></p>
<p>git pull 명령어는 원격 저장소에서 최신 변경 사항을 가져오고, 로컬 브랜치에 병합하는 데 사용된다.</p>
<p><strong>Fast-forward</strong>:
가장 간단하면서 기본적인 방법이다.
로컬 브랜치가 원격 브랜치를 추월하게 되어 단순히 앞으로 이동하는 것을 의미한다.
이 경우에는 새로운 커밋이 생성되지 않고, 기존 커밋들이 그대로 유지된다.</p>
<p><strong>Merge</strong>:
변경 사항을 가져온 후에 로컬 브랜치에 새로운 병합 커밋이 생성된다.
이 방법은 변경 이력을 그대로 보존하면서 병합을 수행한다.</p>
<p><strong>Rebase</strong>:
변경 사항을 가져온 후에 로컬 브랜치의 커밋들을 변경하여, 원격 브랜치의 변경 사항이 로컬 브랜치의 최상단에 쌓이도록 만든다.
이 방법은 커밋 이력을 깔끔하게 유지할 수 있지만, 팀 내에서 공유되는 브랜치에 사용할 때 주의가 필요하다.</p>
<p><strong>Only Ever Fast-Forward</strong>:
이 옵션은 원격 브랜치를 로컬 브랜치에 항상 fast-forward 방식으로만 병합하도록 설정하는 것이다.
이 경우 다른 방식의 병합은 허용되지 않는다.</p>
<h2 id="choose-a-credential-helper">choose a credential helper</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/18d749c4-cf5b-42dc-80ce-4bc62cf684c8/image.png" alt=""></p>
<p>git에 접속할 때 인증 보조 기능의 사용 여부를 선택하는 내용이다. 
이를 설정해두면 2단계 인증의 번거로움을 덜어준다.</p>
<h2 id="configuring-extra-options">configuring extra options</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/2c138d1c-3bb7-4076-ac3c-bd5f3925471d/image.png" alt=""></p>
<p>추가 옵션에 대한 내용이다.</p>
<p><strong>Enable file system caching</strong>:
이 옵션을 활성화하면 파일 시스템 캐싱이 가능해진다. 즉, 특정 작업에 필요한 파일 시스템 데이터가 대량으로 읽혀져서 메모리에 캐시된다. 
특히 대규모 저장소에서 작업할 때 적절하다.</p>
<p><strong>Enable symbolic links</strong>:
이 옵션을 활성화하면 심볼릭 링크 사용이 허용된다. 다만, 이 옵션을 활성화하려면 시스템에서 &quot;SeCreateSymbolicLink&quot; 권한이 필요하다. 이미 존재하는 저장소에는 영향을 주지 않는다. 심볼릭 링크를 사용할 수 있다.</p>
<h2 id="configuring-experimental-options">configuring experimental options</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/58c073a1-fdf6-4a3b-ad1d-4ef41de1cf9d/image.png" alt=""></p>
<p>git bash창에서 node, python 등의 네이티브 콘솔 프로그램 실행에 대한 옵션과
git 명령어에서 built-in file system watcher를 사용할지 여부를 선택한다.</p>
<h2 id="installing">installing</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/bc4d8ca3-4e24-4002-a798-d2574feb2741/image.png" alt=""></p>
<h2 id="마침내-완료">마침내, 완료</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/72361100-10ba-4490-a514-c3fccf0f01e9/image.png" alt=""></p>
<p>그리고 마침내 설치 완료이다.</p>
<p><br><br><br><br><br><br></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Facade 패턴]]></title>
            <link>https://velog.io/@dung-dung/Facade-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@dung-dung/Facade-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Wed, 07 Jun 2023 16:08:34 GMT</pubDate>
            <description><![CDATA[<p><a href="http://www.yes24.com/Product/Goods/115576266">JAVA 언어로 배우는 디자인패턴 입문 책</a>의 교재 및 예제 풀이를 정리해보려 한다. </p>
<h2 id="facade-패턴은-단순한-창구를-만든다"><strong>Facade</strong> 패턴은 단순한 창구를 만든다.</h2>
<p>Facade는 건물의 정면, 즉 현관을 의미한다.</p>
<p>큰 프로그램의 많은 클래스를 적절히 제어해 창구에 요청하는 방식으로 만든다.
복잡히 얽혀서 너저분한 세부 내용을 정리해서 높은 수준의 인터페이스(API)를 제공한다.</p>
<p>인터페이스 수를 줄여 외부와의 결합을 느슨하게 만든다. 
이 때문에 패키지(클래스 집합)를 부품으로 가져와 사용할 수 있다. </p>
<p>이 패턴의 역할은 크게 세 개로 나뉘는데 Facade, Client, 그 외 시스템을 구성하는 여러 역 이다.</p>
<p>예제로는 임의 txt파일로 이루어진 데이터베이스 정보를 가져와 HTML 파일을 작성해주는 프로그램이다. </p>
<p>사용하는 클래스는 4가지인데, Database, HtmlWriter, PageMaker, Main 이렇게 구성되어있다. </p>
<p>자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
<a href="https://www.youngin.com/reader/pds/pds.asp">https://www.youngin.com/reader/pds/pds.asp</a></p>
<hr>
<h3 id="문제-1--pagemaker-클래스만-pagemaker-패키지-밖에서-이용할-수-있게-하고-싶다-database-와-htmlwriter-클래스를-pagemaker-패키지-밖에서-이용할-수-없게-하려-한다">문제 1 : PageMaker 클래스만 pagemaker 패키지 밖에서 이용할 수 있게 하고 싶다. Database 와 HtmlWriter 클래스를 pagemaker 패키지 밖에서 이용할 수 없게 하려 한다.</h3>
<p>가존에 public class Database, public class HtmlWriter 두 개로 이루어진 클래스의 내용을 
class Database, class HtmlWriter 으로 수정한다. </p>
<p>디폴트 값은 같은 패키지에서만 이용할 수 있음을 의미하고 public은 모든 클래스에서 이용할 수 있음을 의미하기 때문이다. </p>
<h3 id="문제-2--데이터-파일-maildatatxt-에-포함된-사용자의-이메일-주소-링크-페이지를-만드는-makelinkpage-메소드를-pagemaker-클래스에-추가한다">문제 2 : 데이터 파일 maildata.txt 에 포함된 사용자의 이메일 주소 링크 페이지를 만드는 makeLinkPage 메소드를 PageMaker 클래스에 추가한다.</h3>
<p>Main 클래스의 수정은 아래와 같다. </p>
<pre><code>
import pagemaker.PageMaker;

public class Main {
    public static void main(String[] args) {
        PageMaker.makeLinkPage(&quot;linkpage.html&quot;);
    }
}
</code></pre><p>그리고 makeLinkPage 메소드는 try-catch문으로 구성할 수 있는데, txt 파일의 데이터를 value와 key 값으로 받아들여서 mailto 라는 메소드의 인수로 각각 넣는다. </p>
<pre><code>
    public static void makeLinkPage(String filename) {
        try {
            HtmlWriter writer = new HtmlWriter(new FileWriter(filename));
            writer.title(&quot;Link page&quot;);
            Properties mailprop = Database.getProperties(&quot;maildata&quot;);
            for (String mailaddr: mailprop.stringPropertyNames()) {
                String username = mailprop.getProperty(mailaddr, &quot;(unknown)&quot;);
                writer.mailto(mailaddr, username);
            }
            writer.close();
            System.out.println(filename + &quot; is created.&quot;);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }</code></pre><p>덧붙이자면, 기존의 makeWelcomPage의 메소드는 아래와 같다. </p>
<pre><code>    public static void makeWelcomePage(String mailaddr, String filename) {
        try {
            Properties mailprop = Database.getProperties(&quot;maildata&quot;);
            String username = mailprop.getProperty(mailaddr);
            HtmlWriter writer = new HtmlWriter(new FileWriter(filename));
            writer.title(username + &quot;&#39;s web page&quot;);
            writer.paragraph(&quot;Welcome to &quot; + username + &quot;&#39;s web page!&quot;);
            writer.paragraph(&quot;Nice to meet you!&quot;);
            writer.mailto(mailaddr, username);
            writer.close();
            System.out.println(filename + &quot; is created for &quot; + mailaddr + &quot; (&quot; + username + &quot;)&quot;);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }</code></pre><p>mailto 메소드는 HtmlWriter 내부에 있는 내용으로서 아래와 같다. 수정된 건 없다.</p>
<pre><code>public void mailto(String mailaddr, String username) throws IOException {
    link(&quot;mailto: &quot; + mailaddr, usernamr);
}</code></pre><h3 id="문제-3--예제-프로그램의-htmlwriter-클래스에서는-많은-문자열이-있다-여러줄의-문자열-리터럴을-읽기-쉽게-하는-텍스트-블록이-있다---사이에-내용을-작성하면-달라질까">문제 3 : 예제 프로그램의 HtmlWriter 클래스에서는 많은 문자열이 있다. 여러줄의 문자열 리터럴을 읽기 쉽게 하는 텍스트 블록이 있다. &quot;&quot;&quot; &quot;&quot;&quot; 사이에 내용을 작성하면 달라질까?</h3>
<p>기존의 내용은 아래와 같다. </p>
<pre><code>        writer.write(&quot;&lt;!DOCTYPE html&gt;&quot;);
        writer.write(&quot;&lt;html&gt;&quot;);
        writer.write(&quot;&lt;head&gt;&quot;);
        writer.write(&quot;&lt;title&gt;&quot; + title + &quot;&lt;/title&gt;&quot;);
        writer.write(&quot;&lt;/head&gt;&quot;);
        writer.write(&quot;&lt;body&gt;&quot;);
        writer.write(&quot;\n&quot;);
        writer.write(&quot;&lt;h1&gt;&quot; + title + &quot;&lt;/h1&gt;&quot;);
        writer.write(&quot;\n&quot;);</code></pre><p>수정하고자 하는 내용은 아래와 같다. </p>
<pre><code> String title = &quot;Welcome!&quot;;
        String message = &quot;Hello, world!&quot;;
        String html = &quot;&quot;&quot;
        &lt;!DOCTYPE html&gt;
        &lt;html&gt;
            &lt;head&gt;
                &lt;title&gt;%s&lt;/title&gt;
            &lt;/head&gt;
            &lt;body&gt;
                &lt;h1 style=&quot;text-align: center&quot;&gt;%s&lt;/h1&gt;
            &lt;/body&gt;
        &lt;/html&gt;
        &quot;&quot;&quot;.formatted(title, message);
        System.out.print(html);
    }</code></pre><p>결과는 달라지지 않는다. </p>
<p>%s 등과 같은 제어문자열을 사용하면 title, message 내용을 포함할 수 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Chain of Responsibility 패턴]]></title>
            <link>https://velog.io/@dung-dung/Chain-of-Responsibility-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@dung-dung/Chain-of-Responsibility-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Wed, 07 Jun 2023 11:31:58 GMT</pubDate>
            <description><![CDATA[<p><a href="http://www.yes24.com/Product/Goods/115576266">JAVA 언어로 배우는 디자인패턴 입문 책</a>의 교재 및 예제 풀이를 정리해보려 한다. </p>
<p>--</p>
<h2 id="chain-of-responsibility-패턴은-여러-객체를-사슬처럼-연쇄적으로-묶고-객체-사슬을-차례대로-돌면서-원하는-객체를-결정하는-패턴이다"><strong>Chain of Responsibility</strong> 패턴은 여러 객체를 사슬처럼 연쇄적으로 묶고, 객체 사슬을 차례대로 돌면서 원하는 객체를 결정하는 패턴이다.</h2>
<p>책임을 떠넘기는 구조이다. 
요청을 해당 사람이 해결할 수 있으면 하고, 못하면 다음 사람으로 넘기는 구조이다. </p>
<p>이 패턴의 구조는 크게 3개로 나뉜다. 
Hander - 처리자 : 요구를 처리하는 인터페이스를 정의
ConcreteHandler - 구체적 처리자 : 요구를 구체적으로 처리한다. 
Client - 요구자 : 첫 번째 구체적 처리자에게 요구를 한다. </p>
<p>교재의 예제는 난수를 발행시키고, 지정 번호 미만의 문제를 해결하거나 홀수 번호 문제만 해결하는 등 특정 조건일 경우만 해결하는 클래스를 생성해 여러 클래스로 넘기는 구조로 이루어진다. </p>
<p>교재는 Main을 포함해서 7개의 클래스로 이루어져 있다. 그런데 4개의 클래스는 비슷한 맥락이다. </p>
<p>Trouble, Support, NoSupport, LimitSupport, OddSupport, SpecialSupport, Main 이렇게 구성된다. </p>
<p>그중 NoSupport, LimitSupport, OddSupport, SpecialSupport 이 4가지는 모두 Support로부터 상속받는다. </p>
<p>자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
<a href="https://www.youngin.com/reader/pds/pds.asp">https://www.youngin.com/reader/pds/pds.asp</a></p>
<hr>
<h3 id="문제-1--gui-앱-상에는-버튼-텍스트-상자-체크방스-등-컴포넌트가-있다-이-컴포넌트를-클릭했을-때-발생하는-이벤트를-어떻게-떠넘기나-next는-어디에-등장하나">문제 1 : GUI 앱 상에는 버튼, 텍스트 상자, 체크방스 등 컴포넌트가 있다. 이 컴포넌트를 클릭했을 때 발생하는 이벤트를 어떻게 떠넘기나. next는 어디에 등장하나.</h3>
<p>부모 컴포넌트가 next가 되는 경우가 많다. 
next는 그 다음 대상자를 의미한다. 
컴포넌트로 전달된 이벤트는 해당 컴포넌트가 처리하지 않을 때 순차적으로 부모 컴포넌트로 전달된다. </p>
<h3 id="문제-2--예제-프로그램의-support에서-support-메소드는-public-이지만-resolve-메소드는-protected-이다-클래스-설계자가-이와-같이-구분한-의도는-무엇인가">문제 2 : 예제 프로그램의 support에서 support 메소드는 public 이지만, resolve 메소드는 protected 이다. 클래스 설계자가 이와 같이 구분한 의도는 무엇인가.</h3>
<p>public은 여러 클래스에서 이용 가능 한 것을 의미한다. 
protected는 해당 패키지 및 하위 클래스에서 접근 가능한 것을 의미한다. </p>
<p>resolve 메소드는 support 클래스 내부에 생성된 메소드인데, 
다른 클래스가 트러블 해결을 의뢰할 때는 resolve가 아닌 support 메소드를 사용하길 바란다는 의도다. </p>
<p>support 클래스와 관계 없는 클래스에서 resolve를 호출해 사용하지 못하게 막기 위함이다. </p>
<p>또한 resolve 메소드의 이름 등을 변환할 때 수정할 대상이 많이져 번거로워지기 때문이다. </p>
<h3 id="문제-3--예제-프로그램의-support-메소드를-재귀적으로-호출하는-대신-루프로-전개-해라">문제 3 : 예제 프로그램의 support 메소드를 재귀적으로 호출하는 대신 루프로 전개 해라.</h3>
<p>기존의 support 메소드는 아래와 같다. </p>
<pre><code>public void support (Trouble trouble) {
    if ( resolve(trouble)) {
        done(trouble);
    } else if ( next != null) {
        next.support(trouble);
    } else {
        fail(trouble);
    }
}</code></pre><p>for 문의 반복 조건을 true로 둠으로서 - 루프를 통해서 이를 전개할 수 있다. </p>
<pre><code>pubilc void Support(Trouble troublee){
  for (Support obj = this; true; obj = obj.next) {
      if (obj.resolve(trouble)) {        // 만약 문제를 해결할 수 있다면
          obj.done(troble);            // 해당 Solve클래스로 해결했음을 출력하는 done 메소드를 부르고
          break;                        // 빠져나온다.
      } else if (obj.next == null) {    // 만약 다음 Solve 메소드가 없다면.
          obj.fail(trouble);            // 해결되지 않다는 문구를 출력한다.
          break;                        // 그리고 빠져나온다. 
      }
  }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Decorator 패턴]]></title>
            <link>https://velog.io/@dung-dung/Decorator-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@dung-dung/Decorator-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Wed, 07 Jun 2023 10:50:27 GMT</pubDate>
            <description><![CDATA[<p><a href="http://www.yes24.com/Product/Goods/115576266">JAVA 언어로 배우는 디자인패턴 입문 책</a>의 교재 및 예제 풀이를 정리해보려 한다. </p>
<hr>
<h2 id="decorator--패턴은-중심이-되는-객체에-점점-장식을-더해가는-패턴이다">*<em>Decorator *</em> 패턴은 중심이 되는 객체에 점점 장식을 더해가는 패턴이다.</h2>
<p>교재는 예제로 특정 문자열의 길이만큼 장식문자 (+, -)를 붙여 출력하는 프로그램을 만든다. </p>
<p>총 사용하는 클래스는 6개로, <strong>Display, StringDisplay, Border, SideBorder, FullBorder, Main</strong>이다.</p>
<p>동작을 실행시키는 Main 클래스를 제외하고, 추상클래스인 <strong>Display</strong> 클래스를 부모로 두고, 이를 <strong>StringDisplay</strong>와 <strong>Border</strong>가 상속받는 구조이다. </p>
<p><strong>SideBorder</strong> 와 <strong>FullBorder</strong> 는 <strong>Border</strong> 클래스를 상속받는 자식클래스이다. </p>
<p><strong>Display</strong> 클래스에서는 세 개의 추상메소드를 선언하고 show() 메소드를 선언해 모든 행을 표시하도록 한다. 
선언하는 추상메소드 세 개는 getColumns, getRows, getRowText 이다. </p>
<p>자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
<a href="https://www.youngin.com/reader/pds/pds.asp">https://www.youngin.com/reader/pds/pds.asp</a></p>
<hr>
<h3 id="문제-1--예제-프로그램에-추가하는-형태로-위아래-장식-문자가-붙는-updownborder-클래스를-만들어-보라">문제 1 : 예제 프로그램에 추가하는 형태로 위아래 장식 문자가 붙는 UpDownBorder 클래스를 만들어 보라</h3>
<p>만들어야 하는 결과는 아래와 같다. </p>
<pre><code>Hello, world.
-------------
Hello, world.
-------------
*-------------*
*Hello, world.*
*-------------*
+-----------------+
|/////////////////|
||===============||
||*Hello, world.*||
||===============||
|/////////////////|
+-----------------+</code></pre><p>이를 위해서 수정할 점은 문저 Main 클래스이다. 새로 생성할 클래스의 이름이 UpDownBorder이고, - 기호가 추가된 모양이므로, FullBorder를 제외한다.
사용하고 싶은 StringDisplay, UpDownDisplay, SidrBorder, FullBorder 에 따라서 아래와 같이 수정한다. </p>
<pre><code>
public class Main {
    public static void main(String[] args) {
        Display b1 = new StringDisplay(&quot;Hello, world.&quot;);
        Display b2 = new UpDownBorder(b1, &#39;-&#39;);
        Display b3 = new SideBorder(b2, &#39;*&#39;);
        b1.show();
        b2.show();
        b3.show();
        Display b4 =
                    new FullBorder(
                        new UpDownBorder(
                            new SideBorder(
                                new UpDownBorder(
                                    new SideBorder(
                                        new StringDisplay(&quot;Hello, world.&quot;),
                                        &#39;*&#39;
                                    ),
                                    &#39;=&#39;
                                ),
                                &#39;|&#39;
                            ),
                            &#39;/&#39;
                        )
                    );
        b4.show();
    }
}
</code></pre><p>그리고 새로 만든 UpDownDisplay는 FullBorder와 유사한 모양이되, 장식문자를 지칭하는 것을 생성한다. </p>
<pre><code>    private char borderChar;  // 장식 문자 

    // 내용물이 될 Display와 장식 문자를 지정
    public UpDownBorder(Display display, char ch) {
        super(display);
        this.borderChar = ch;
    }

    ...

</code></pre><p>또한 getRowText부분을 수정해 row가 0일때 또는 row가 getRows() -1 일 때에 해당할 경우의 리턴값과  그렇지 않을 때의 리턴값을 수정해 준다.</p>
<pre><code>...

@Override
    public String getRowText(int row) {
        if (row == 0 || row == getRows() -1) {                                                 // 상단 테두리
            return makeLine(borderChar, getColumns());
        } else {                                                    
            return display.getRowText(row - 1) ;
        }
    }

    ...</code></pre><h3 id="문제-2--concretecomponent-역으로-여러-문자열을-표시하는-multistringdisplay-클래스를-만들어보라">문제 2 : ConcreteComponent 역으로 여러 문자열을 표시하는 MultiStringDisplay 클래스를 만들어보라</h3>
<p>완성해야하는 결과는 아래와 같다. </p>
<pre><code>Hi!
Good morning.
Good night!
#Hi!          #
#Good morning.#
#Good night!  #
+-------------+
|Hi!          |
|Good morning.|
|Good night!  |
+-------------+</code></pre><p>기존의 클래스에 새로은 클래스를 추가해주는데, 이름은 MultiStringDisplay이다. 
출력결과를 보면 space와 데코레이견 기호를 같이 추가해주었다는 것을 알 수 있다. </p>
<p>이를 위해서 기존의 Main 클래스를 수정한다. </p>
<pre><code>
public class Main {
    public static void main(String[] args) {
        MultiStringDisplay md = new MultiStringDisplay();

        md.add(&quot;Hi!&quot;);
        md.add(&quot;Good mording.&quot;);
        md.add(&quot;Good night!&quot;);
        md.show();

        Display d1 = new SideBorder(md, &#39;#&#39;);
        d1.show();

        Display d2 = new FullBorder(md);
        d2.show();
    }
}
</code></pre><p>그리고 MultiStringDisplay 클래스를 수정해주는데, 문자열을 저장하기 위해 리스트와 최대 문자 수를 저장할 변수를 새로 생성한다. </p>
<pre><code>    private List&lt;String&gt; body = new ArrayList&lt;&gt;();

    private int columns = 0;</code></pre><p>각 문자열을 추가받아 최대 문자 수를 갱신하는 add 메소드를 생성하며, 기존의 FullBorder 클래스 처럼 getColumns, getRows, getRowText 를 추가해준다. </p>
<pre><code>

    @Override
    public int getColumns() {
        // 문자 수는 내용물 양쪽에 좌우 장식 문자만큼 더한 것
        return columns;
    }

    @Override
    public int getRows() {
        // 행수는 내용물의 행수에 상하 장식 문자만큼 더한 것
        return body.size();
    }

    @Override
    public String getRowText(int row) {
        return body.get(row);
    }</code></pre><p>또한 표시 문자열 오른쪽 끝에 채울 공백을 필요에 따라서 늘려야 하므로 메소드 하나를 추가해준다. 이름은 updatePadding() 이다. </p>
<pre><code> public void updatePadding() {
        for (int row = 0; row &lt; body.size(); row++) {
            String line = body.get(row);
            int padding = columns - line.length();
            if (padding &gt; 0) {
                body.set(row, line + spaces(padding));
            }
        }
    }</code></pre><p>그리고 공백을 만드는 함수를 space라고 하며 count를 인수로 가진다. </p>
<pre><code>
    private String spaces(int count) {
        StringBuilder spaces = new StringBuilder();
        for (int i = 0; i &lt; count; i++) {
            spaces.append(&quot; &quot;);
        }
        return spaces.toString();
    }
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Builder 패턴]]></title>
            <link>https://velog.io/@dung-dung/Builder-%ED%8C%A8%ED%84%B4</link>
            <guid>https://velog.io/@dung-dung/Builder-%ED%8C%A8%ED%84%B4</guid>
            <pubDate>Wed, 07 Jun 2023 08:33:26 GMT</pubDate>
            <description><![CDATA[<p><br/><br/><br/><br/><br/></p>
<h3 id="java-언어로-배우는-디자인패턴-입문-책의-교재-및-예제-풀이를-정리해보려-한다"><a href="http://www.yes24.com/Product/Goods/115576266">JAVA 언어로 배우는 디자인패턴 입문 책</a>의 교재 및 예제 풀이를 정리해보려 한다.</h3>
<hr>
<p><br/><br/><br/><br/><br/><br/><br/></p>
<h2 id="builder-패턴이란"><strong>Builder</strong> 패턴이란?</h2>
<br/>
Builder 패턴은 복잡한 인스턴스를 조립한다.

<p>그 이름에서 알 수 있듯 구조를 가진 인스턴스를 구축해나가는 패턴이다.  </p>
<p>교재의 예제는 이 패턴을 이용해서 문서(html)파일을 작성하는 프로그램을 보여준다. </p>
<p>문서 파일의 구조는 타이틀, 문자열, 항목을 포함하는 구조로 이루어져 있다. </p>
<p>클래스는 총 5개로, Builder, Director, TextBuilder, HTMLBuilder, Main으로 구성되어있다. </p>
<p>자세한 내용은 아래의 교재에서 제공하는 사이트를 참고해 예제를 확인하기 바란다.
<a href="https://www.youngin.com/reader/pds/pds.asp">https://www.youngin.com/reader/pds/pds.asp</a></p>
<hr>
<p><br/><br/><br/></p>
<h3 id="문제-1--예제-프로그램의-builder-클래스를-인터페이스로-변경하고-그에-맞춰-다른-클래스를-수정하라">문제 1 : 예제 프로그램의 Builder 클래스를 인터페이스로 변경하고 그에 맞춰 다른 클래스를 수정하라</h3>
<p><br/><br/>
먼저 클래스로 선언한 부분을 인터페이스로 바꿔준다.</p>
<pre><code>//Builder.java

//public abstract class Builder { 
public interface Builder{

</code></pre><p><br/><br/>
다음으로 builder 클래스를 기존에 상속(<strong>extends</strong>)받았던  TextBuilder, HTMLBuilder 두 가지를 <strong>implements로</strong> 수정해준다. </p>
<pre><code>HTMLBuilder.java

//public  class HTMLBuilder extends Builder
public class HTMLBuilder implements Builder
</code></pre><p><br/><br/>
그리고</p>
<pre><code>TextBuilder.java

//public  class TextBuilder extends Builder
public class TextBuilder implements Builder</code></pre><p><br/><br/><br/><br/><br/></p>
<h3 id="문제-2--예제-프로그램의-director-클래스이-construct-메소드를-수정해-다른-문서를-만들어보자-이-때-textbuilder-클래스나-htmlbuilder-클래스를-수정할-필요가-전혀-없다">문제 2 : 예제 프로그램의 Director 클래스이 construct 메소드를 수정해 다른 문서를 만들어보자. 이 때 TextBuilder 클래스나 HTMLBuilder 클래스를 수정할 필요가 전혀 없다.</h3>
<p>Director.java 파일 내부에 makeTitle, makeString, makeItems 의 각 &quot; &quot; 안의 내용을 내 임의로 수정해주면 된다. 
<br/><br/><br/><br/><br/></p>
<h3 id="문제-3--예제-프로그램의-builder-클래스의-하위-클래스로서-concretebuilderd-역할을-할-수-있는-클래스를-작성하세요-텍스트-html-파일-이외에-소재는-자유">문제 3 : 예제 프로그램의 Builder 클래스의 하위 클래스로서 ConcreteBuilderd 역할을 할 수 있는 클래스를 작성하세요. 텍스트, HTML 파일 이외에 소재는 자유</h3>
<p><br/><br/>
해설에서는 기존의 HTMLBuilder.java, TextBuilder.java 파일을 삭제하고 다른 GUI를 생성해 ConcreteBuildered 역할을 수행하게 하고자 한다. </p>
<p>해당 클래스의 이름은 FrameBuilder 이라고 하자. 
또한 Builder를 상속받기 때문에 makeTitle, makeString, makeItems 메서드를 이용한다. </p>
<p>추가된 점은 GUI를 구성할 것이기 때문에, 아래의 코드처럼 JFrame과 해당 프레임 안에 들어갈 박스버튼을 선언해주어야 한다. </p>
<pre><code>private JFrame frame = new JFrame(); 
private Box box = new Box(BoxLayout.Y_AXIS);</code></pre><p>그리고 각각의 makeTitle, makeString, makeItems 내부에는 프레임 혹은 라벨을 붙여준다. 
<br/>
거기에 더하여 windowListenter에 대한 설정이 필요하므로 close 메소드에 이를 추가한다. </p>
<pre><code>    @Override
    public void close() {
        frame.getContentPane().add(box);
        frame.pack();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }</code></pre><br/>
이에 따라서 Main.java 파일도 수정이 필요한데, 기존에 html과 text 파일을 생성 하는 등의 동작을 빼고 JFrame을 import해 이를 생성하는 코드를 작성해준다. 

<pre><code>
import javax.swing.JFrame;

public class Main {
    public static void main(String[] args) {
        FrameBuilder framebuilder = new FrameBuilder();
        Director director = new Director(framebuilder);
        director.construct();
        JFrame frame = framebuilder.getFrameResult();
        frame.setVisible(true);
    }
}</code></pre><p><br/><br/><br/><br/><br/><br/></p>
<h3 id="문제-4--textbuilder-클래스에서-문서를-구축해-가는-필드-sb가-string-클래스가-아니라-stringbuilder-클래스로-되어있는-이유는-무엇인가-string을-사용하면-무슨-문제가-일어나나">문제 4 : TextBuilder 클래스에서 문서를 구축해 가는 필드 sb가 String 클래스가 아니라 StringBuilder 클래스로 되어있는 이유는 무엇인가. String을 사용하면 무슨 문제가 일어나나</h3>
<p>TextBuilder에서 사용된 StringBuilder()는 어떤 것이냐면, 아래와 같다.</p>
<blockquote>
</blockquote>
<p>public StringBuilder()
Constructs a string builder with no characters in it and an initial capacity of 16 characters.</p>
<p>이어서 String()은 어떤 것이냐면, 아래와 같다. </p>
<blockquote>
<p>java.lang.String
The String class represents character strings. All string literals in Java programs, such as &quot;abc&quot;, are implemented as instances of this class.</p>
</blockquote>
<p>그래서 String으로 사용하되 조금의 수정을 가미하면 아무 문제가 없다. </p>
<p>기존의 아래와 같은 코드를 </p>
<pre><code>
public class TextBuilder extends Builder {
    private StringBuilder sb = new StringBuilder();

    @Override
    public void makeTitle(String title) {
        sb.append(&quot;==============================\n&quot;);
        sb.append(&quot;[&quot;);
        sb.append(title);
        sb.append(&quot;]\n\n&quot;);
    }
    ...</code></pre><p>아래와 같이 수정해준다. </p>
<pre><code>
public class TextBuilder extends Builder {
    private String text = &quot;&quot;;

    @Override
    public void makeTitle(String title) {
        text += &quot;==============================\n&quot;;
        text += &quot;[&quot; + title + &quot;]\n&quot;;
        text += &quot;\n&quot;;
    }
</code></pre><p>변수를 sb에서 text로 바꿨다는 점과 .append()를 +=으로 바꿨다는 점에서 차이를 가진다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 파이썬 Django 실습 강의리뷰 : 챕터 5]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Django-%EC%8B%A4%EC%8A%B5-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-5</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Django-%EC%8B%A4%EC%8A%B5-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-5</guid>
            <pubDate>Mon, 22 May 2023 16:05:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/824d9aa9-3c50-45d1-9d51-18a6997c73c3/image.png" alt=""></p>
<p>테킷스쿨에는 멋쟁이사자처럼 [대학11기] 파이썬 Django 실습 강의가 있습니다.
멋쟁이사자처럼 대학 동아리에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.
이번에 리뷰하려는 것은 ✨챕터 5 : 백엔드의 필수: CRUD 개발하기 ✨ 입니다.</p>
<hr>
<h1 id="①-웹-개발의-필수-crud란">① 웹 개발의 필수: CRUD란?</h1>
<p>create, read, update, delete의 약자로, 소프트웨어가 가지는 기본적인 데이터 처리 기능이다. 
웹 서비스의 기반이 되는 개념이다. </p>
<p>추가, 조회, 수정, 삭제로 한글로 부른다. 상황에 따라 고려해야 할 점들이 각각 다르다</p>
<p>삭제는 soft/hard 두 가지가 있다. 삭제했다고 정리하고 실제 완전히 삭제하지 않는 것을 soft delete이라고 한다.</p>
<p>클라이언트는 입력을 주로 하며, 서버에게 요청한다.
서버는 검증 및 연상을 주로 하며, 데이터베이스에게 요청한다.
데이터베이스는 처리(crud)를 하고, 다시 서버에게 이를 전송한다.</p>
<p>서버가 없어도 클라이언트와 데이터베이스 만 있어도 작동은 되지만, 서버가 있어야 보안을 강화하는 효과 등이 있다. </p>
<p>데이터베이스로의 데이터 요청과 응답이 기본적인 crud의 흐름이다.</p>
<h1 id="②-create로-데이터-생성하기-1">② Create로 데이터 생성하기 (1)</h1>
<p>데이터의 특정 테이블의 생성을 create이라고 한다.</p>
<blockquote>
<p>create의 흐름 : 
폼 요청 -&gt; 폼 응답 -&gt; 데이터 생성 요청 -&gt; 데이터베이스의 데이터 응답</p>
</blockquote>
<p>*사용자에게 입력받는 데이터
*시스템에서 생성하는 데이터
두 가지로 구성되어있다. </p>
<p>인증권한; 로그인이 필요하거나 관리지만 생성할 수 있게 한다
데이터 유효성; 클라이언트가 입력한 데이터가 유효한지 검증한다. (나이, 전화번호, 숫자만 들어오도록 만든다 등)</p>
<h1 id="③-create로-데이터-생성하기-2">③ Create로 데이터 생성하기 (2)</h1>
<p>이전까지 작업하던 파일에 들어가서 
<img src="https://velog.velcdn.com/images/dung-dung/post/52dd2db5-8f86-466e-8058-5e5399233ba3/image.png" alt=""></p>
<p>페이지 소스를 확인하면, 새로고침을 했을 때 네트워크에 다양한 경로로 내용을 가져온다는 것을 확인할 수 있다. </p>
<p>여기에서 {% ~~ %} 내용을 입력하면, 하드코딩 없이도 변경된 url 주소를 불러올 수 있다. 
예를 들어서, </p>
<pre><code>{% url &#39;posts:post-create&#39; %} </code></pre><p>을 입력하면, 설령 경로가 create가 아니더라도 이름이 post-create에 해당하는 내용으로 url이 연결된다. </p>
<p>만약 기존 파일에서, 내가 파일을 브라우져로 가져오면 이를 받아들이는 프로그램을 만들과자 한다면, views.py와 post_form.html 파일을 수정하면 된다.</p>
<pre><code>// posts &gt; views.py
def post_create_view(request):
    if request.method == &quot;GET&quot;:
        return render(request, &#39;posts/post_form.html/&#39;)
    else:
        image = request.FILES.get(&#39;image&#39;)
        content = request.POST.get(&#39;content&#39;)
        print(image)
        print(content)
        Post.objects.create(
            image=image,
            content=content,
        )
        return redirect(&#39;index&#39;)</code></pre><p>post_create_view 는 내가 앞에서 view로 선언을 해두었기 때문에 꼭 return 값이 있어야 한다.</p>
<p>만약 post_form.html 을 수정하고자 한다면,</p>
<pre><code>// post_form.html

{% extends &#39;base.html&#39; %}
    {% block title %} POST 입력 {% endblock %}
{% block content %}

    &lt;h1&gt;POST 입력 화면&lt;/h1&gt;
    &lt;form action=&quot;{% url &#39;posts:post-create&#39; %}&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&gt; {% csrf_token %}
        &lt;div&gt;
            &lt;label for=&quot;id_image&quot;&gt;이미지&lt;/label&gt;
            &lt;input type=&quot;file&quot; name=&quot;image&quot; accept=&quot;image/*&quot; id=&quot;id_image&quot;&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;label for=&quot;id_content&quot;&gt;내용&lt;/label&gt;
            &lt;textarea name=&quot;content&quot; id=&quot;id_content&quot; cols=&quot;30&quot; rows=&quot;10&quot;&gt;&lt;/textarea&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;input type=&quot;submit&quot;&gt;

        &lt;/div&gt;
    &lt;/form&gt;


{% endblock %}
</code></pre><p>사진을 넣으면, admin에서 해당 변경 내용을 확인할 수 있다. </p>
<p>settings 에 아래 코드를  추가하고</p>
<pre><code>// config &gt; settings.py


MEDIA_URL = &#39;media/&#39;
MEDIA_ROOT = BASE_DIR / &#39;media&#39;
</code></pre><p>config 와 동등한 위치에서 media 폴더를 생성한다.
이제 이미지를 업로드하면 여기에 저장될 것이다..</p>
<h1 id="④-read로-데이터-조회하기-1">④ Read로 데이터 조회하기 (1)</h1>
<p>장고 디버그 툴바를 여기에서 다운받아 사용할 수 있다.</p>
<p><a href="https://django-debug-toolbar.readthedocs.io/en/latest/installation.html">https://django-debug-toolbar.readthedocs.io/en/latest/installation.html</a></p>
<p>화면 우측에 생긴 바를 통해서 sql 등을 확인할 수 있다.</p>
<p>조금 디테일을 살려서 문서를 수정해보자.</p>
<p>여러 포스트를 모아서 리스트 모양으로 보고 싶다면 post_list_view 함수를 수정해주어야 한다.</p>
<pre><code>def index(request):
    post_list = Post.objects.all().order_by(&#39;-created_at&#39;)</code></pre><p>만약 여러 포스트를 최신순으로 정렬하고 싶다면, </p>
<pre><code>def index(request):
    post_list = Post.objects.all().order_by(&#39;-created_at&#39;)</code></pre><p>뒤에 order_by를 추가해준다. </p>
<p>그리고 리스트를 조회할 때 댓글에 대해서 알고싶다면post_card.html 파일에서 수정하면 되는데, </p>
<p>이미지가 있을 때, 이를 보이게 하고싶다면 card__body 부분에 아래의 코드를 추가해주면 된다. </p>
<pre><code>        &lt;div&gt;
            {% if post.image  %}
                &lt;img class=&quot;card__image&quot; src=&quot;{{ post.image.url }}&quot; alt=&quot;&quot;/&gt;
            {% else %}
                &lt;img class=&quot;card__image&quot; src=&quot;http://via.placeholder.com/600x600&quot; alt=&quot;&quot;/&gt;
            {% endif %}

        &lt;/div&gt;</code></pre><p>댓글에 대한 내용은 아래의 코드를 추가해주면 된다. </p>
<pre><code> &lt;div&gt;
                &lt;p class=&quot;&quot;&gt;댓글 {{ post.comment_set.all.count }}개 {% if not detail %}모두 보기{% endif %}&lt;/p&gt;
                &lt;ul class=&quot;card__comment-group&quot;&gt;
                    {% if not detail %}
                        {% for comment in post.comment_set.all %}
                            &lt;li&gt;&lt;p&gt;&lt;span class=&quot;card__user-name&quot;&gt;{{ comment.writer }}&lt;/span&gt;{{ comment.content }}&lt;/p&gt;
                            &lt;/li&gt;
                        {% empty %}
                            &lt;li&gt;&lt;p&gt;댓글 없음&lt;/p&gt;&lt;/li&gt;
                        {% endfor %}
                    {% else %}
                        {% for comment in post.comment_set.all|slice:&quot;:2&quot; %}
                            &lt;li&gt;&lt;p&gt;&lt;span class=&quot;card__user-name&quot;&gt;{{ comment.writer }}&lt;/span&gt;{{ comment.content }}&lt;/p&gt;
                            &lt;/li&gt;
                        {% empty %}
                            &lt;li&gt;&lt;p&gt;댓글 없음&lt;/p&gt;&lt;/li&gt;
                        {% endfor %}
                    {% endif %}
                &lt;/ul&gt;
            &lt;/div&gt;
            &lt;span class=&quot;card__created-at&quot;&gt;{{ post.created_at|date:&quot;Y년 m월 d일&quot; }}&lt;/span&gt;</code></pre><p>작성자를 나타내는지의 유무와, 댓글이 없을 경우에는 &#39;댓글 없음&#39;을 출력하고 있다면 그 내용을 불러와 출력한다. 또한 시간을 제외한 날짜만 출력하기 위해서 맨 마지막 <span> 태그를 추가했다!</p>
<h1 id="⑤-read로-데이터-조회하기-2">⑤ Read로 데이터 조회하기 (2)</h1>
<p>포스트에서 게시물 글의 &#39;더보기&#39;를 누르면 상세내용이 나오게 만들고 싶다면, 기존의 post_card.html 파일에서 아래 코드를 추가해준다.</p>
<pre><code>  &lt;a href=&quot;/posts/{{post.id}}&quot;&gt;더보기&lt;/a&gt;</code></pre><p>저 코드에 있는 post.id는 index.html 파일에서 for 문을 돌리면서 그 내부에 post_card.html 파일을 불러왔기 때문에 가능하다. </p>
<p>만약 더 편하게 url을 불러오고 싶다면 urls.py 에 가서, post_detail_view에 이름을 추가해주면 된다.</p>
<pre><code>      path(&#39;&lt;int:id&gt;&#39;, post_detail_view, name=&#39;post-detail&#39;),
</code></pre><p>그리고 post_card도 수정하면 된다.</p>
<pre><code>  {% if not detail %}
                    &lt;a href=&quot;{%  url &#39;posts:post-detail&#39; post.id %}&quot;&gt;더보기&lt;/a&gt;
                {% endif %}</code></pre><h1 id="⑥-update로-데이터-수정하기-1">⑥ Update로 데이터 수정하기 (1)</h1>
<p>기존에 작성한 게시물의 글 혹은 사진을 수정하고 싶다면, view.py 파일과 post_form.html 파일을 수정하면 된다. </p>
<pre><code>// views.py


def post_update_view(request, id):
    post = Post.objects.get(id=id)
    if request.method == &#39;GET&#39;:
        context = { &#39;post&#39;:post }
        return render(request, &#39;posts/post_form.html/&#39;, context)
    elif request.method == &#39;POST&#39;:
        pass
</code></pre><p>if 문을 통해서 더 구체적인 코드를 작성할 수 있다.</p>
<pre><code>// post_form.html


      &lt;div&gt;
            &lt;label for=&quot;id_image&quot;&gt;이미지&lt;/label&gt;
            {% if post.image %}
                &lt;p&gt;현재 : &lt;a href=&quot;{{post.image.url }}&quot;&gt;{{ post.image.name }}&lt;/a&gt;&lt;/p&gt;
                &lt;p&gt;변경 : &lt;/p&gt;
            {% else %}
            {% endif %}
            &lt;input type=&quot;file&quot; name=&quot;image&quot; accept=&quot;image/*&quot; id=&quot;id_image&quot;&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;label for=&quot;id_content&quot;&gt;내용&lt;/label&gt;
            &lt;textarea name=&quot;content&quot; id=&quot;id_content&quot; cols=&quot;30&quot; rows=&quot;10&quot;&gt;{% if post %} {{ post.content }} {% endif %}
            &lt;/textarea&gt;
        &lt;/div&gt;
</code></pre><h1 id="⑦-update로-데이터-수정하기-2">⑦ Update로 데이터 수정하기 (2)</h1>
<p>  기존에 파일을 수정하면서 이미지를 바꿀 수 있는데, 이 과정에서 기존 파일은 삭제되고 새 파일이 저장되어야 한다. 
  이를 위해서 views.py 파일을 수정한다.</p>
<pre><code>  // posts &gt;  views.py

def post_update_view(request, id):

    # post = Post.objects.get(id=id)
    post = get_object_or_404(Post, id=id)


    if request.method == &#39;GET&#39;:
        context = { &#39;post&#39;:post }
        return render(request, &#39;posts/post_form.html/&#39;, context)
    elif request.method == &#39;POST&#39;:
        new_image = request.FILES.get(&#39;image&#39;)
        content = request.POST.get(&#39;content&#39;)
        print(new_image)
        print(content)

        if new_image:
            post.image.delete()
            post.image = new_image

        post.content = content
        post.save()
        return redirect(&#39;posts:post-detail&#39;, post.id )</code></pre><p>  더 안전한 코드 유지를 위해서 </p>
<pre><code>  post = Post.objects.get(id=id)</code></pre><p>  대신에</p>
<pre><code>    post = get_object_or_404(Post, id=id)</code></pre><p>  이를 이용할 수 있다. </p>
<h1 id="⑧-delete로-데이터-삭제하기-1">⑧ Delete로 데이터 삭제하기 (1)</h1>
<p>  delete에 두 가지 종류의 삭제가 있는데, 소프트가 아닌 하드 딜리트, 즉 완전 삭제로 파일을 삭제하기 위한 코드를 이번 8과 9에서 살펴보자.</p>
<p>  먼저 쉬운 url 연결을 위해서 urls.py에서 post_delete_view에 이름을 붙여주자</p>
<pre><code>    path(&#39;&lt;int:id&gt;/delete/&#39;, post_delete_view, name=&#39;post-delete&#39;),     </code></pre><p>  그리고 views.py 에서도 수정을 더해주는데, 만약 포스트를 찾지 못하면 404 에러 화면을 띄우도록 하며, 포스트가 있다면 해당 html파일로 연결하는 if 문과 return 문을 작성한다.</p>
<pre><code>
def post_delete_view(request, id):
    post = get_object_or_404(Post, id=id)

    if request.method == &#39;GET&#39;:
        context = { &#39;post&#39;: post }
        return render(request, &#39;posts/post_confirm_delete.html&#39;, context)  

    return render(request, &#39;posts/post_confirm_delete.html/&#39;)

</code></pre><p>  삭제하기 버튼은 일단 임의로 수정하기 버튼 옆에 만들어 준다.</p>
<pre><code>// templates &gt; post_card.html

    &lt;!-- 수정하기 버튼  --&gt;
        {% if request.user == post.writer  %}
        &lt;a href=&quot;{% url &#39;posts:post-update&#39; post.id %}&quot;&gt; 수정하기 &lt;/a&gt;
        &lt;a href=&quot;{% url &#39;posts:post-delete&#39; post.id %}&quot;&gt; 삭제하기 &lt;/a&gt;
        {% endif %}
</code></pre><p>  가장 중요한 post_confirm_delete.html 파일은 아래와 같다. </p>
<pre><code>// templates &gt; posts &gt; post_confirm_delete.html

  {% extends &#39;base.html&#39; %}
    {% block title %} POST 삭제 {% endblock %}
{% block content %}

    &lt;h1&gt;POST 삭제 화면&lt;/h1&gt;

    &lt;form action=&quot;&quot; method=&quot;POST&quot;&gt;
        {% csrf_token %}
        &lt;p&gt;한 번 삭제된 데이터는 복구가 불가능 합니다. &lt;/p&gt;
        &lt;p&gt;그래도 삭제 하시겠습니까? ID : {{ post.id }} &lt;/p&gt; &lt;br/&gt; &lt;br/&gt;

        &lt;a href=&quot;{% url &#39;index&#39; %}&quot;&gt;돌아가기&lt;/a&gt;
        &lt;input type=&quot;submit&quot; value=&quot;삭제하기&quot;&gt;

    &lt;/form&gt;
    &lt;br/&gt;
    {% include &#39;mixin/posts/post_card.html&#39; with detail=True %}

{% endblock %}

</code></pre><pre><code>실행하면 화면은 아래와 같이 나온다.</code></pre><p>  <img src="blob:https://velog.io/0efe5abc-6a30-41f4-ac29-546fcf2002f2" alt="업로드중.."></p>
<h1 id="⑨--delete로-데이터-삭제하기-2">⑨  Delete로 데이터 삭제하기 (2)</h1>
<p>  위의 코드에 이어서, 정말로 삭제를 하도록 만들기 위해서는 views.py에 post.delete()코드를 작성하는 것이 핵심이다.</p>
<pre><code>// posts &gt; views.py

  def post_delete_view(request, id):
    post = get_object_or_404(Post, id=id)

    if request.method == &#39;GET&#39;:
        context = { &#39;post&#39;: post }
        return render(request, &#39;posts/post_confirm_delete.html&#39;, context)  
    else:
        post.delete()
        return redirect(&#39;index&#39;)


</code></pre><hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 파이썬 Django 실습 강의리뷰 : 챕터 4 ]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Django-%EC%8B%A4%EC%8A%B5-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-4</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Django-%EC%8B%A4%EC%8A%B5-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-4</guid>
            <pubDate>Sat, 20 May 2023 22:50:19 GMT</pubDate>
            <description><![CDATA[<p>테킷스쿨에는 멋쟁이사자처럼 [대학11기] 파이썬 Django 실습 강의가 있습니다.
멋쟁이사자처럼 대학 동아리에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.
이번에 리뷰하려는 것은 ✨챕터 4 : Template과 View 정복하기 ✨ 입니다.</p>
<hr>
<h1 id="①views를-만드는-2가지-방법">①Views를 만드는 2가지 방법</h1>
<p>MTV 디자인 패턴
Model : 데이터 관리, 데이터베이스와 연결 및 실행
Template : 데이터 출력, 사용자에게 표현 방식 정의
View : 컨트롤러, 비즈니스 로직을 처리 </p>
<p>장고 실행 흐름은 아래와 같다. </p>
<blockquote>
<p>웹 브라우저 -&gt; url.py -&gt; view -&gt; Model -&gt; View -&gt; Template -&gt; View -&gt; 웹 브라우저</p>
</blockquote>
<p>Views 만드는 두 가지 방법으로 FBV, CBV가 있다. 
전자는 함수형이고 후자는 클래스형으로 불린다.
전자인 FBV는 구현이 간단하고, 읽기 쉬우며 직관적인 코드로 구성되어있다는 점에서 장점이 있다.
반면 코드의 확장과 재사용이 어렵고, 조건부 분기를 통한 HTTP 메서드 처리가 어렵다. </p>
<p>후자인 CBV는 코드의 확장과 재사용이 용이하며, 다중상속과 Mixin이 가능하다. 내장 class based view 사용 가능하다. 단점은 읽기 어렵고, 복잡하다. 또한 데코레이션 사용 시 함수를 재정의해야 한다는 점에서 FBV와 다르다. </p>
<p>두 가지 방법 중 상황에 따라서 더 적합한 방식을 사용해 개발을 진행하면 된다. </p>
<h1 id="②-function-based-view-알아보고-작성하기-1">② Function Based View 알아보고 작성하기 (1)</h1>
<p>기존의 config &gt; urls.py 파일에서 하나의 url 을 추가하고자 한다.
이를 위해서 posts&gt; views.py 파일 또한 수정을 해주어야 한다. </p>
<pre><code>// config &gt; urls.pu

urlpatterns = [
 path(&#39;url/&#39;, url_view)
]
</code></pre><pre><code>// posts &gt; views.py
from django.http import HttpResponse

def url_view(request):
    return HttpResponse(&#39;&lt;h1&gt;장고 실습 중&lt;/h1&gt;&#39;)
</code></pre><p>그런데 위의 경우에서 HttpResponse 대신에 JsonResponse를 이용할 수 있다. 
코드를 수정하면 다음과 같다. </p>
<pre><code>// posts &gt; views.py
from django.http import HttpResponse, JsonResponse

def url_view(request):
    data = {&#39;code&#39; : &#39;001&#39;, &#39;msg&#39; : &#39;OK&#39;}
    return JsonResponse(data)
</code></pre><p>전자의 경우의 경우, 페이지 소스코드를 보면 h1이 그대로 보이는 반면, 후자의 경우에는 그대로 {&#39;code&#39; : &#39;001&#39;, &#39;msg&#39; : &#39;OK&#39;} 가 출력되는 걸 볼 수 있다.</p>
<p>작성한 url을 받는 방법은 아래와 같다. </p>
<pre><code>// posts &gt; views.py

def url_parameter_view(request):
    return HttpResponse()</code></pre><p>또한 url도 추가해 준다.</p>
<pre><code>// config &gt; urls.py

urlpatterns = [
    path(&#39;admin/&#39;, &#39;admin.site.urls),
     path(&#39;url/&#39;, url_view)
    path(&#39;url/&lt;str:username&gt;/&#39;, url_parameter_view),

]
</code></pre><p>이렇게 설정하면, 브라우저 실제 창에서 
&#39;기본 포트 넘버&#39;/url/ 
위의 상황에서 아무 문자열을 입력하면, 해당 내용의 텍스트가 적힌 페이지가 창에서 보인다. 
또한 아래의 코드를 views파일에 추가하면 콘솔 창에서 key와 value로 입력한 내용이 보인다. </p>
<pre><code>// posts &gt; views.py

def url_parameter_view(request, username):
    print(&#39;url_parameter_view()&#39;)
    print(username)
    print(request.GET)
    return HttpResponse(username)
</code></pre><h1 id="③-function-based-view-알아보고-작성하기-2">③ Function Based View 알아보고 작성하기 (2)</h1>
<p>지금 상황에서 views코드와 url코드는 아래와 같다.  import문은 생략한다.</p>
<pre><code>// posts &gt; views.py


def url_view(request):
    print(&#39;url_view()&#39;)
    data = {&#39;code&#39;: &#39;001&#39;, &#39;msg&#39;: &#39;OK&#39;}
    return HttpResponse(&#39;&lt;h1&gt;url_view&lt;/h1&gt;&#39;)
    # return JsonResponse(data)

def url_parameter_view(request, username):
    print(&#39;url_parameter_view()&#39;)
    print(username)
    print(request.GET)
    return HttpResponse(username)
</code></pre><pre><code>// config &gt; urls.py

urlpatterns = [
    path(&#39;admin/&#39;, &#39;admin.site.urls),
     path(&#39;url/&#39;, url_view)
    path(&#39;url/&lt;str:username&gt;/&#39;, url_parameter_view),

]
</code></pre><p>더 직관적으로 콘솔창에서  key와 value를 보기 위해서는 views코드를 아래와 같이 수정하면 된다. </p>
<pre><code>// posts &gt; views.py

def url_parameter_view(request, username):
    print(&#39;url_parameter_view()&#39;)
    print(f&#39;username: {username}&#39;)
    print(f&#39;request.GET: {request.GET}&#39;)
    return HttpResponse(username)

</code></pre><p>만약 문자열이 아닌 숫자를 입력하고 싶다면, url파일을 아래와 같이 수정한다.</p>
<pre><code>// config &gt; urls.py

urlpatterns = [
    path(&#39;admin/&#39;, &#39;admin.site.urls),
     path(&#39;url/&#39;, url_view)
    path(&#39;url/&lt;int:username&gt;/&#39;, url_parameter_view),

]
</code></pre><p>str을 int로 수정한 것이다. </p>
<p>또다른 함수를 만들어 기존 파일에 추가해 보자먄</p>
<pre><code>// posts &gt; views.py


def url_view(request):
    print(&#39;url_view()&#39;)
    data = {&#39;code&#39;: &#39;001&#39;, &#39;msg&#39;: &#39;OK&#39;}
    return HttpResponse(&#39;&lt;h1&gt;url_view&lt;/h1&gt;&#39;)
    # return JsonResponse(data)


def url_parameter_view(request, username):
    print(&#39;url_parameter_view()&#39;)
    print(f&#39;username: {username}&#39;)
    print(f&#39;request.GET: {request.GET}&#39;)
    return HttpResponse(username)


def function_view(request):
    print(f&#39;request.method: {request.method}&#39;)
    print(f&#39;request.GET: {request.GET}&#39;)
    print(f&#39;request.POST: {request.POST}&#39;)
    return render(request, &#39;view.html&#39;</code></pre><p>그리고 posts 폴더 내부에 templates 폴더를 새로 생성해 view.html 파일을 임의로 만들어준다. (반드시 templates 으로 폴더 이름이 동일해야 한다. </p>
<pre><code>//posts &gt; templates &gt; view.html

&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;a href=&quot;/fbv/&quot;&gt;새로고침&lt;/a&gt;&lt;br&gt;

    &lt;form action=&quot;&quot; method=&quot;GET&quot;&gt;
        &lt;input type=&quot;text&quot; name=&quot;var&quot;&gt;
        &lt;input type=&quot;submit&quot; value=&quot;GET 제출&quot;&gt;
    &lt;/form&gt;

    &lt;form action=&quot;&quot; method=&quot;POST&quot;&gt; {% csrf_token %}
        &lt;input type=&quot;text&quot; name=&quot;var&quot;&gt;
        &lt;input type=&quot;submit&quot; value=&quot;POST 제출&quot;&gt;
    &lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>또한 urls 에도 추가한다.</p>
<pre><code>// config &gt; urls.py

urlpatterns = [
    path(&#39;admin/&#39;, &#39;admin.site.urls),
     path(&#39;url/&#39;, url_view)
    path(&#39;url/&lt;int:username&gt;/&#39;, url_parameter_view),
    path(&#39;fbv/&#39;, funtion_view)
]
</code></pre><p>실행시키면 아래와 같은 결과가 나온다. 
<img src="https://velog.velcdn.com/images/dung-dung/post/7767a56b-b57f-4b97-b780-9568a5a325b8/image.png" alt=""></p>
<p>(해당 강의 내용 참고) </p>
<p>데이터를 입력받는 세 가지 방법을 지금 배워본 것이다. 
다시 정리하면, 
첫 번째는 urls.py에서 views에 적힌 함수를 받아오는 것 (url_view ) 
두 번째는 브라우져 창에서 key=value형태로 데이터를 전달 받는 것 ( url_parameter_view )
세 번재는 폼을 만드는 것이다. (funstion_view)</p>
<p>세개 모두 함수형으로 구성했다. </p>
<p>if로 function_view를 분기처리 하면 아래와 같다. </p>
<pre><code>// posts &gt; views.py


def url_view(request):
    print(&#39;url_view()&#39;)
    data = {&#39;code&#39;: &#39;001&#39;, &#39;msg&#39;: &#39;OK&#39;}
    return HttpResponse(&#39;&lt;h1&gt;url_view&lt;/h1&gt;&#39;)
    # return JsonResponse(data)


def url_parameter_view(request, username):
    print(&#39;url_parameter_view()&#39;)
    print(f&#39;username: {username}&#39;)
    print(f&#39;request.GET: {request.GET}&#39;)
    return HttpResponse(username)


def function_view(request):
    print(f&#39;request.method: {request.method}&#39;)
    if request.method == &#39;GET&#39;:
        print(f&#39;request.GET: {request.GET}&#39;)
    elif request.method == &#39;POST&#39;:
        print(f&#39;request.POST: {request.POST}&#39;)
    return render(request, &#39;view.html&#39;)
</code></pre><h1 id="④-class-based-view-알아보고-작성하기">④ Class Based View 알아보고 작성하기</h1>
<p>먼저 views 파일 안에서 class 뷰 를 설정하면 아래와 같다. </p>
<pre><code>// posts &gt; views.py


def url_view(request):
    print(&#39;url_view()&#39;)
    data = {&#39;code&#39;: &#39;001&#39;, &#39;msg&#39;: &#39;OK&#39;}
    return HttpResponse(&#39;&lt;h1&gt;url_view&lt;/h1&gt;&#39;)
    # return JsonResponse(data)


def url_parameter_view(request, username):
    print(&#39;url_parameter_view()&#39;)
    print(f&#39;username: {username}&#39;)
    print(f&#39;request.GET: {request.GET}&#39;)
    return HttpResponse(username)


def function_view(request):
    print(f&#39;request.method: {request.method}&#39;)
    if request.method == &#39;GET&#39;:
        print(f&#39;request.GET: {request.GET}&#39;)
    elif request.method == &#39;POST&#39;:
        print(f&#39;request.POST: {request.POST}&#39;)
    return render(request, &#39;view.html&#39;)

class class_view(ListView):
    model = Post
    template_name = &#39;cbv_view.html&#39;
</code></pre><p>그리고 templates 폴더 내부에 cvb_view.html 파일 하나를 만들어준다. </p>
<pre><code>// posts &gt;templates &gt; cbb_view.html


&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    {% for object in object_list %}
        {{ object }}
    {% endfor %}
&lt;/body&gt;
&lt;/html&gt;

</code></pre><p>또한 url도 추가해준다. </p>
<pre><code>// config &gt; urls.py

urlpatterns = [
    path(&#39;admin/&#39;, &#39;admin.site.urls),
     path(&#39;url/&#39;, url_view)
    path(&#39;url/&lt;int:username&gt;/&#39;, url_parameter_view),
    path(&#39;fbv/&#39;, funtion_view),

    path(&#39;cbv/&#39;, c;ass_view.as_view()),
]
</code></pre><p>만약, 방금 만든 클래스 기반 뷰를 함수형으로 만들면 아래와 같다. </p>
<pre><code>def funtion_list_view(request):
    object_list = Post.objects.all().order_by(&#39;-id&#39;)
    return render(request, &#39;cbv_view.html&#39;, {&#39;object_list&#39;: object_list})</code></pre><p>url도 아래와 같이 추가한다.</p>
<pre><code>    path(&#39;fbv/list/&#39;, funtion_list_view),
</code></pre><p>그리고 templates 내부에 posts 폴더를 만들어서 post_list.html 을 만들어 활동 할 수 있다. </p>
<h1 id="⑤--django-templates-engine-알아보기-1">⑤  Django Templates Engine 알아보기 (1)</h1>
<p>클라이언(브라우저)가 서버의 view에서 요청을 보내고, 서버의 template을 실행시키고 view는 template를 http언어로 번역해서 브라우로 보낸다. </p>
<p>중요한 점은 template은 서버에서 실행한다는 점이다. </p>
<p>template 태그로 여러가지가 있는데 그 예시로 
block(자식 템플릿으로 재정의), extends, include(템플릿을 로드), for, if, url 등이 있다. </p>
<p>템플렛 상속은 pyton 상속과 같은 의미인데, 자식에서 작성한 html이 부모의 html 내용으로 들어간다. 
header, footer 등의 중복 요소를 줄여 반복성을 줄인다. </p>
<p>template 필터로는 date, default, center, truncatechars, intcomma 등이 있다. 
{{ value|필터명:&quot;형식&quot; }} 으로 구성되어있다. </p>
<h1 id="⑥-django-templates-engine-알아보기-2">⑥ Django Templates Engine 알아보기 (2)</h1>
<p>기존에 posts 즉 앱 단위에서 templates 폴더를 만들어서 작성했다면, 이제는 config 즉 더 큰 프로젝트 단위체서 템플렛을 설정해 보고자 한다. </p>
<p>이를 위해서는 settings 파일을 수정해주어야 한다. </p>
<pre><code>//config &gt; settings.py

...
TEMPLATES = [
&#39;DIRS&#39;: [BASE_DIR / &#39;templates&#39;],
]
...
</code></pre><p>그리고 config와 동등한 위치에 templates 폴더를 만들고, 그 내부에 posts 폴더를 또 만든다. </p>
<p>그 내부에 4개의 html 파일을 만들어주는데 그 코드는 전부 동일해도 괜찮다. 
post_list, post_detail, post_form, post_confirm_delete 이 네 가지 이다. </p>
<p>이어서 views 파일에도 아래의 코드를 추가해준다. </p>
<p>그리고 posts 파일 내에 urls.py 파일을 만드는데 아래와 같은 코드를 작성한다. </p>
<p>이렇게 만든 걸 config 내의 urls.py 파일에 가져와야 한다.</p>
<p>혹시 헷갈릴까봐, 수정한 코드 전문을 첨부한다. </p>
<pre><code>// posts &gt; views.py

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.generic.list import ListView
from .models import Post



# 6강 내용
def index(request):
    return render(request, &#39;index.html&#39;)

def post_list_view(request):
    return render(request, &#39;posts/post_list.html/&#39;)

def post_create_view(request):
    return render(request, &#39;posts/post_form.html/&#39;)

def post_detail_view(request, id):
    return render(request, &#39;posts/post_detail.html/&#39;)

def post_update_view(request, id):
    return render(request, &#39;posts/post_form.html/&#39;)

def post_delete_view(request, id):
    return render(request, &#39;posts/post_confirm_delete.html/&#39;)




# 함수를 실행하는  방법
def url_view(request):
    print(&#39;url_view()&#39;)
    data = {&#39;code&#39;: &#39;001&#39;, &#39;msg&#39;: &#39;OK&#39;}
    return HttpResponse(&#39;&lt;h1&gt;url_view&lt;/h1&gt;&#39;)
    # return JsonResponse(data)


# 받는 방법
def url_parameter_view(request, username):
    print(&#39;url_parameter_view()&#39;)
    print(f&#39;username: {username}&#39;)
    print(f&#39;request.GET: {request.GET}&#39;)
    return HttpResponse(username)

def function_view(request):
    print(f&#39;request.method: {request.method}&#39;)
    if request.method == &#39;GET&#39;:
        print(f&#39;request.GET: {request.GET}&#39;)
    elif request.method == &#39;POST&#39;:
        print(f&#39;request.POST: {request.POST}&#39;)
    return render(request, &#39;view.html&#39;)


#  클래스 기반 뷰 
class class_view(ListView):
    model = Post
    ordering = [&#39;-id&#39;]
    # template_name = &#39;cbv_view.html&#39;


def funtion_list_view(request):
    object_list = Post.objects.all().order_by(&#39;-id&#39;)
    return render(request, &#39;cbv_view.html&#39;, {&#39;object_list&#39;: object_list})</code></pre><pre><code>// config &gt; urls.py

from django.contrib import admin
from django.urls import include, path
from posts.views import index, url_view, url_parameter_view, function_view, class_view, funtion_list_view

urlpatterns = [
    path(&#39;admin/&#39;, admin.site.urls),
    path(&#39;url/&#39;, url_view),
    path(&#39;url/&lt;str:username&gt;/&#39;, url_parameter_view),
    path(&#39;fbv/&#39;, function_view),

    path(&#39;fbv/list/&#39;, funtion_list_view),
    path(&#39;cbv/&#39;, class_view.as_view(), name=&#39;cbv&#39;),

    path(&#39;&#39;, index, name=&#39;index&#39;),
    path(&#39;posts/&#39;, include(&#39;posts.urls&#39;, namespace=&#39;posts&#39;)),
]

</code></pre><pre><code>// posts &gt; urls,.py

from django.urls import path
from .views import post_list_view, post_create_view,post_detail_view, post_update_view, post_delete_view

app_name = &#39;posts&#39;

urlpatterns = [
    path(&#39;&#39;, post_list_view, name=&#39;post-list&#39;),
    path(&#39;new/&#39;, post_create_view),
    path(&#39;&lt;int:id&gt;&#39;, post_detail_view),
    path(&#39;&lt;int:id&gt;/edit/&#39;, post_update_view),
    path(&#39;&lt;int:id&gt;/delete/&#39;, post_delete_view),
]
</code></pre><h1 id="⑦-django-templates-engine-알아보기-3">⑦ Django Templates Engine 알아보기 (3)</h1>
<p>템플렛의 상속에 대해서 알아본다. </p>
<p>html 코드를 작성할 때, 다 똑같이 작성하는 중복되는 부분을 삭제하고자 한다. </p>
<p>config와 동등한 위치에 생성한 templates에 새로운 파일 base.html 파일을 만든다. </p>
<p>block은 상속받은 내용을 어디에 적을지 정의한다.</p>
<pre><code>// templates &gt; base.html


&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;{% block title %} {% endblock %} | 라이언그램 &lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div&gt;
        {% block content %}
        {% endblock %} 
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>그리고 index.html 파일은 아래와 같이 작성된다. </p>
<pre><code>// templates &gt; index.html

{% extends &#39;base.html&#39; %}
    {% block title %} 인덱스  {% endblock %}
{% block content %}

    &lt;h1&gt;인덱스 화면&lt;/h1&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;{% url &#39;posts:post-list&#39; %}&quot;&gt;게시글 목록&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;

{% endblock %}</code></pre><p>다른 나머지 post_list, post_detail, post_form, post_confirm_delete 도 수정해준다. </p>
<h1 id="⑧--django-templates를-작성하며-인스타그램-꾸미기-1">⑧  Django Templates를 작성하며 인스타그램 꾸미기 (1)</h1>
<p>각 화면의 구조화와 이루어져야 하고, 각각에 들어가는 내용이 구조화 되어야 한다. </p>
<p>인스타그램 화면을 보면, 크개 상단의 카드뉴스 형태화 하단의 나브바로 구성됨을 확인할 수 있다.</p>
<p>이를 본따 index.html 을 아래와 같이 수정할 수 있다. </p>
<pre><code>// templates &gt; index.html

{% extends &#39;base.html&#39; %}
    {% block title %} 인덱스  {% endblock %}
{% block content %}

&lt;main&gt;
    &lt;div class=&quot;card-list&quot;&gt;
        &lt;p&gt;추후 수정 &lt;/p&gt;
    &lt;/div&gt;
    &lt;div&gt;
        &lt;nav class=&quot;bottom-menu-group&quot;&gt;
            &lt;ul&gt;
                &lt;li&gt;홈&lt;/li&gt;
                &lt;li&gt;검색&lt;/li&gt;
                &lt;li&gt;글쓰기&lt;/li&gt;
                &lt;li&gt;좋아요&lt;/li&gt;
                &lt;li&gt;프로필&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/nav&gt;
    &lt;/div&gt;
&lt;/main&gt;

{% endblock %}</code></pre><p>그리고 settings.py 를 수정해준다. </p>
<pre><code>// settings.py

STATIC_URL = &#39;static/&#39;
STATICFILES_DIRS = [
    BASE_DIR / &#39;static&#39;
]
</code></pre><p>이어서 config와 동등한 위치에 static 이란 이름의 폴더를 생성한다.</p>
<p>그리고 base.html을 비롯한 모든 파일에 아래의 코드를 입력한다.</p>
<pre><code>{% load static %}</code></pre><p>더불어 넣고 싶은 이미지가 있다면, 이는 static 폴더 안에 icons 폴더를 만들어서 여기에 넣으면 된다.</p>
<p>이 부분은 기존에 작성된 여러 파일과 조각을 합치는 것에 가깝다.
각각에 작성된 css 파일을 가져와 적용하는 방법 등에 집중해서 보면 좋겠다. </p>
<p>내가 원하는 css 파일을 작성하며 실습하는 것도 좋은 방법이라 생각된다. 
<img src="https://velog.velcdn.com/images/dung-dung/post/761a0d92-6687-425d-8bf5-4d4760df4c89/image.png" alt=""></p>
<p>지금까지의 실습은 위와 같다.</p>
<h1 id="⑨-django-templates를-작성하며-인스타그램-꾸미기-2">⑨ Django Templates를 작성하며 인스타그램 꾸미기 (2)</h1>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/90f3bcef-cfed-4ef0-9341-17aa2f9b7617/image.png" alt=""></p>
<p>완성한 실습은 위와 같다.</p>
<hr>
<p>더 많은 강의 후기 및 요약 정보는  : <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 7]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-7</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-7</guid>
            <pubDate>Sat, 29 Apr 2023 15:09:45 GMT</pubDate>
            <description><![CDATA[<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-7--python-beginner---자료구조-✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 7 : Python Beginner - 자료구조 *</em>✨ 입니다.</h4>
<hr>
<h1 id="①-리스트---리스트의-정의-및-선언">① 리스트 - 리스트의 정의 및 선언</h1>
<p>리스트란 [] 대괄호를 통해 그 값을 넣을 수 있고, 0부터 시작한다는 특징을 가진다. </p>
<p>코드를 통해서 이에 대한 예시를 알아보고자 한다.</p>
<pre><code>

mbti = [&#39;INFP&#39;, &#39;ENFP&#39;, &#39;ESTJ&#39;, &#39;INTP&#39;]

print(mbti)    
print(mbti[0])




&gt;&gt;&gt; [&#39;INFP&#39;, &#39;ENFP&#39;, &#39;ESTJ&#39;, &#39;INTP&#39;]
&gt;&gt;&gt; INFP

</code></pre><p>[0]은 0번을 의미하고, 이를 출력하면 0 번째 측, 첫 번째 자리에 있는 데이터가 출력된다.</p>
<p>그 외에도 새로운 값을 특정 위치에 넣어 추가할 수 있다.</p>
<pre><code>mbti = [&#39;INFP&#39;, &#39;ENFP&#39;, &#39;ESTJ&#39;, &#39;INTP&#39;]


mbti[0] = &#39;infj&#39;        # 새로운 값을 넣어서 만들기 

print(mbti)
print(mbti[0])




&gt;&gt;&gt; [&#39;infj&#39;, &#39;ENFP&#39;, &#39;ESTJ&#39;, &#39;INTP&#39;]
&gt;&gt;&gt; infj
</code></pre><p>리스트에는 숫자가 올 수도, 문자열이 올 수도, 둘 다 올 수도 있다. </p>
<pre><code>
my_list = [123, &#39;apple&#39;]

print(my_list)



&gt;&gt;&gt; [123, &#39;apple&#39;]
</code></pre><h1 id="②-리스트---리스트-데이터-접근-및-조작">② 리스트 - 리스트 데이터 접근 및 조작</h1>
<pre><code>colors = [&#39;red&#39;, &#39;blue&#39;, &#39;green&#39;]</code></pre><p>대표 배열 한 개를 위와 같이 설정할 때, 이에 대해서 수정, 추가, 제거 등을 할 수 있다.</p>
<p>먼저 특정 위치에 수정한 사례는 아래와 같다.</p>
<pre><code>colors[2] = &#39;black&#39;
print(colors)



&gt;&gt;&gt;  [&#39;red&#39;, &#39;blue&#39;, &#39;black&#39;]
</code></pre><p>다음으로 마지막 순서에 추가한 사례를 살펴보면, </p>
<pre><code>colors.append(&#39;purple&#39;)
print(colors)



&gt;&gt;&gt; [&#39;red&#39;, &#39;blue&#39;, &#39;black&#39;, &#39;purple&#39;]
</code></pre><p>그 외에도 원하는 위치에 추가할 수도 있다.</p>
<pre><code>colors.insert(1, &#39;yellow&#39;)
print(colors)



&gt;&gt;&gt; [&#39;red&#39;, &#39;yellow&#39;, &#39;blue&#39;, &#39;black&#39;, &#39;purple&#39;]
</code></pre><p>제거하는 방법으로는 두 가지가 있는데, 먼저 지워도 다시 사용할 수 없는 경우다.</p>
<pre><code>del colors[0]
print(colors)


&gt;&gt;&gt; [&#39;yellow&#39;, &#39;blue&#39;, &#39;black&#39;, &#39;purple&#39;]
</code></pre><p>또다른 제거 방법으로 다시 반환하는 경우다. </p>
<pre><code>colors.pop(0)
print(colors)



&gt;&gt;&gt; [&#39;blue&#39;, &#39;black&#39;, &#39;purple&#39;]
</code></pre><p>이것의 특징은 바로 삭제하는 것이 아니라, 반환이 가능하다는 점으로, 아래를 통해서 자세히 살펴볼 수 있다.</p>
<pre><code>color = colors.pop(0)
print(colors)
print(color)



&gt;&gt;&gt; [&#39;black&#39;, &#39;purple&#39;]
&gt;&gt;&gt; &#39;blue&#39;
</code></pre><p>그 외에 제거할 때, 특정 데이터 자체를 입력해  제거하는 방법이 있다.</p>
<pre><code>colors.remove(&#39;black&#39;)
print(colors)


&gt;&gt;&gt; [&#39;purple&#39;]
</code></pre><h1 id="③-리스트---리스트-정렬">③ 리스트 - 리스트 정렬</h1>
<pre><code>
colors = [&#39;blue&#39;, &#39;red&#39;, &#39;gray&#39;, &#39;black&#39;, &#39;yellow&#39;, &#39;orange&#39;]</code></pre><p>colors 리스트가 위와 같을 때, 다양한 방법으로 정렬하고, 길이-갯수를 측정할 수 있다. </p>
<p>정렬하는 방법으로 여러가지가 있다.</p>
<pre><code># 정렬 - 원본데이터 변경
colors.sort()
print(colors) 



&gt;&gt;&gt; [&#39;black&#39;, &#39;blue&#39;, &#39;gray&#39;, &#39;orange&#39;, &#39;red&#39;, &#39;yellow&#39;]
</code></pre><p>sort를 이용하되, 역순으로 정렬할 수 있다. </p>
<pre><code>
# 역순정렬
colors.sort(reverse=True)
print(colors) 



&gt;&gt;&gt; [&#39;yellow&#39;, &#39;red&#39;, &#39;orange&#39;, &#39;gray&#39;, &#39;blue&#39;, &#39;black&#39;]</code></pre><p>전열 결과를 다음과 같이 표현해 출려할 수 있다.</p>
<pre><code>
# 정렬 2
sorted(colors) # 최초의 초기화 데이터 를 변형시키지 않음. 
print(colors)

print(sorted(colors))



&gt;&gt;&gt; [&#39;yellow&#39;, &#39;red&#39;, &#39;orange&#39;, &#39;gray&#39;, &#39;blue&#39;, &#39;black&#39;]
&gt;&gt;&gt; [&#39;black&#39;, &#39;blue&#39;, &#39;gray&#39;, &#39;orange&#39;, &#39;red&#39;, &#39;yellow&#39;]
</code></pre><p>요소의 갯수 또한 출력할 수 있다.</p>
<pre><code>
# 길이 - 요소의 갯수
print(len(colors))

print(colors[7])
print(colors[-1]) # 마지막 원소를 출력하고 싶다면



&gt;&gt;&gt; 6
&gt;&gt;&gt; black
&gt;&gt;&gt; black
</code></pre><h1 id="④-리스트---리스트-슬라이싱-및-복사">④ 리스트 - 리스트 슬라이싱 및 복사</h1>
<pre><code>
colors = [&#39;blue&#39;, &#39;red&#39;, &#39;gray&#39;, &#39;black&#39;, &#39;yellow&#39;, &#39;orange&#39;]</code></pre><p>colors 리스트가 위와 같을 때, 원하는 부분만 출력할 수 있다.</p>
<pre><code>print(colors[1:5])
print(colors[:5])
print(colors[0:])
print(colors[:]) # 전체를 의미한다. 
print(colors[-1:])  



&gt;&gt;&gt; [&#39;red&#39;, &#39;orange&#39;, &#39;gray&#39;, &#39;blue&#39;]
&gt;&gt;&gt; [&#39;yellow&#39;, &#39;red&#39;, &#39;orange&#39;, &#39;gray&#39;, &#39;blue&#39;]
&gt;&gt;&gt; [&#39;yellow&#39;, &#39;red&#39;, &#39;orange&#39;, &#39;gray&#39;, &#39;blue&#39;, &#39;black&#39;]
&gt;&gt;&gt; [&#39;yellow&#39;, &#39;red&#39;, &#39;orange&#39;, &#39;gray&#39;, &#39;blue&#39;, &#39;black&#39;]
&gt;&gt;&gt; [&#39;black&#39;]</code></pre><p>또한 리스트 전체를 새로운 변수에 넣어 표현할 수 있다.</p>
<pre><code>colors_2 = colors[:] 


print(colors_2)



&gt;&gt;&gt; [&#39;yellow&#39;, &#39;red&#39;, &#39;orange&#39;, &#39;gray&#39;, &#39;blue&#39;, &#39;black&#39;]
</code></pre><p>이러한 구조가  colors_2 = color 와 다른 것은, 최초의 할당 메모리가 동일하다는 것이다. 
후자는 최초와 분리되어서 출력되지 않는다. 
때문에 colors_2를 변형하면, color 또한 변형된다.</p>
<h1 id="⑤-리스트---리스트와-흐름-제어">⑤ 리스트 - 리스트와 흐름 제어</h1>
<pre><code>scores = [88, 100, 96, 43, 65, 78]</code></pre><p>scores를 위와 같은 리스트라 가정하자.
이를 for 문을 통해서 리스트 내 랜덤 데이터를 뽑아 원하는 조건만족 여부에 따른 출력값도 아래와 같이 확인할 수 있다.
아래의 경우 조건은 리스트 내 임의의 값이 80 이상인지의 여부이다.</p>
<pre><code>
 scores.sort(reverse=True)
 print(scores)

 for score in scores:
     if score &gt;= 80:
         print(scores)
     else:
         print(&quot;fail&quot;)



&gt;&gt;&gt; [100, 96, 88, 78, 65, 43]
&gt;&gt;&gt; [100, 96, 88, 78, 65, 43]
&gt;&gt;&gt; [100, 96, 88, 78, 65, 43]
&gt;&gt;&gt; [100, 96, 88, 78, 65, 43]
&gt;&gt;&gt; fail
&gt;&gt;&gt; fail
&gt;&gt;&gt; fail
</code></pre><h1 id="⑥-리스트---리스트-최댓값최솟값총합">⑥ 리스트 - 리스트 최댓값/최솟값/총합</h1>
<pre><code>scores = [88, 100, 96, 43, 65, 78]</code></pre><p>scores를 위와 같은 리스트라 가정하자.</p>
<p>이 때 최댓값은 아래와 같은 코드로 알 수 있다.</p>
<pre><code>max_val = max(scores)</code></pre><p>최솟값은 아래와 같다.</p>
<pre><code>min_val = min(scores)</code></pre><p>리스트 내 총 합을 구하는 코드는 아래와 같다. </p>
<pre><code>sum_val = sum(scores)

sum_values = 0

for score in scores:
    sum_values = 0
    for score in scores:
        sum_values = sum_values + score
print(sum_values)       # 합을 구하기 



&gt;&gt;&gt; 470</code></pre><p>평균 또한 구할 수 있는데, 위의 코드에서 구한 합을 갯수로 나누면 된다.</p>
<pre><code>avg_val = sum(scores) / len(scores)
print(avg_val)


&gt;&gt;&gt; 78.333333333</code></pre><h1 id="⑦-튜플">⑦ 튜플</h1>
<p>튜플과 리스트는 유사해 보이지만, 튜플은 각각의 요소를 변경할 수 없다는 리스트와의 차이점을 가진다. </p>
<pre><code>tup = (1, 20, 40)</code></pre><p>임의의 튜플을 위와 같이 설정할때, 출력하면 다음과 같다.</p>
<pre><code>print(tup)



&gt;&gt;&gt; (100, 20, 200)</code></pre><p>특정한 값을 재할당하면 오류가 발생한다.</p>
<pre><code>tup[0] =100             # 오류
</code></pre><p>위의 코드가 그 예시이다. </p>
<p>하지만 전체를 새로 정의해 바꾸면 괜찮다.</p>
<pre><code>tup = (100, 20, 200)        
print(tup)


&gt;&gt;&gt; (100, 20, 200)  </code></pre><h1 id="⑧-튜플---튜플리스트-변환">⑧ 튜플 - 튜플/리스트 변환</h1>
<pre><code>tup = (1, 20, 40)</code></pre><p>tup을 위와 같이 선언할 때, 
for문을 통해서 이를 출력할 수 있다. </p>
<pre><code>for x in tup:
    print(x)        # 순서대로 출려된다. 

&gt;&gt;&gt; 1
    20
    40</code></pre><p>튜플을 리스트로 변환할 수 있다.</p>
<pre><code>list_1 = list(tup)
print(list_1)

#리스트로 변환 2
list_2 = [x for x in tup]
print(list_2)

#리스트 변환 3
list_3=[]

for x in tup:
    list_3.append(x)

print(list_3)




&gt;&gt;&gt; [1, 20, 40]
&gt;&gt;&gt; [1, 20, 40]
&gt;&gt;&gt; [1, 20, 40]</code></pre><h1 id="⑨-딕셔너리---딕셔너리-정의-및-선언">⑨ 딕셔너리 - 딕셔너리 정의 및 선언</h1>
<p>아래와 같이 딕셔너리를 선언할 수 있다. 이는 key값과 value값으로 구분되어있다.</p>
<pre><code>
student = {
    &quot;student_no&quot;: &quot;20230401&quot;, 
    &quot;major&quot;: &quot;English&quot;,
    &quot;grade&quot;: 1
}

print(student[&quot;student_no&quot;])



&gt;&gt;&gt; 20230401
</code></pre><p>딕셔너리 내 데이터 수정은 다음과 같다.</p>
<pre><code>student[&quot;student_no&quot;] = &quot;20230101&quot;

print(student)
print(student[&quot;student_no&quot;])



&gt;&gt;&gt; {&#39;student_no&#39;: &#39;20230101&#39;, &#39;major&#39;: &#39;English&#39;, &#39;grade&#39;: 1}
&gt;&gt;&gt; 20230101
</code></pre><h1 id="⑩-딕셔너리---딕셔너리-데이터-조작">⑩ 딕셔너리 - 딕셔너리 데이터 조작</h1>
<pre><code>student = {
    &quot;student_no&quot;: &quot;20230401&quot;, 
    &quot;major&quot;: &quot;English&quot;,
    &quot;grade&quot;: 1
}</code></pre><p>위와 같이 딕셔너리를 선언할 때,
추가는 다음과 같다.</p>
<pre><code>student[&quot;gpa&quot;] = 4.5
print(student)



&gt;&gt;&gt; {&#39;student_no&#39;: &#39;20230101&#39;, &#39;major&#39;: &#39;English&#39;, &#39;grade&#39;: 1, &#39;gpa&#39;: 4.5}</code></pre><p>수정은 다음과 같다.</p>
<pre><code>student[&quot;gpa&quot;] = 4.3
print(student)



&gt;&gt;&gt; {&#39;student_no&#39;: &#39;20230101&#39;, &#39;major&#39;: &#39;English&#39;, &#39;grade&#39;: 1, &#39;gpa&#39;: 4.3}</code></pre><p>삭제는 다음과 같다.</p>
<pre><code>del student[&quot;gpa&quot;]
print(student)



&gt;&gt;&gt; {&#39;student_no&#39;: &#39;20230101&#39;, &#39;major&#39;: &#39;English&#39;, &#39;grade&#39;: 1}</code></pre><h1 id="⑪-딕셔너리---딕셔너리-함수">⑪ 딕셔너리 - 딕셔너리 함수</h1>
<pre><code>student = {
    &quot;student_no&quot;: &quot;20230401&quot;, 
    &quot;major&quot;: &quot;English&quot;,
    &quot;grade&quot;: 1
}</code></pre><p>위와 같이 딕셔너리를 선언할 때,</p>
<p>데이터에 접근하는 방법은 아래와 같다.</p>
<pre><code>print(student.get(&quot;grade&quot;))



&gt;&gt;&gt; 1</code></pre><p>만약 없는 데이터에 접근한다면 이와 같은 결과가 나온다. </p>
<pre><code>print(student.get(&quot;gpa&quot;))      



&gt;&gt;&gt; None</code></pre><p>만약 데이터가 없을 경우 출력할 문구가 있다면, 이와 같이 입력한다.</p>
<pre><code>print(student.get(&quot;gpa&quot;, &quot;해당 키-값이 없습니다~&quot;))    



&gt;&gt;&gt; 해당 키-값이 없습니다~</code></pre><p>딕셔너리의 키를 반환하고 싶다면, </p>
<pre><code>print(student.keys()) 



&gt;&gt;&gt;dict_keys([&#39;student_no&#39;, &#39;major&#39;, &#39;grade&#39;])</code></pre><p>딕셔너리의 키를 리스트로 반환한다면,</p>
<pre><code>print(list(student.keys()))



&gt;&gt;&gt; [&#39;student_no&#39;, &#39;major&#39;, &#39;grade&#39;]
</code></pre><p>딕서녀리의 값을 반환한다면,</p>
<pre><code>print(student.values()) 



&gt;&gt;&gt; dict_values([&#39;20230101&#39;, &#39;English&#39;, 1])</code></pre><h1 id="⑫-딕셔너리---딕셔너리와-반복문">⑫ 딕셔너리 - 딕셔너리와 반복문</h1>
<pre><code>tech = {
    &quot;HTML&quot; : &quot;Advanced&quot;,
    &quot;JavaScript&quot;: &quot;Intermediate&quot;,
    &quot;Python&quot;: &quot;Expert&quot;,
    &quot;Go&quot;: &quot;Novice&quot;
}</code></pre><p>임의의 딕셔너리 tech를 위와 같이 선언할 때,
key와 value 를 함께 짝지어 출력하면 다음과 같다.</p>
<pre><code>for key, value in tech.items():
    print(f&#39;{key} - {value}&#39;)




&gt;&gt;&gt; HTML - Advanced
    JavaScript - Intermediate
    Python - Expert
    Go - Novice</code></pre><p>key값만 출력하고 싶다면,</p>
<pre><code>for i in tech:
    print(i)

&gt;&gt;&gt; HTML
JavaScript
Python
Go</code></pre><p>value만 출력하고 싶다면,</p>
<pre><code>
for value in tech.values():
    print(value)



&gt;&gt;&gt; Advanced
    Intermediate
    Expert
    Novice
</code></pre><h1 id="⑬-딕셔너리---중첩">⑬ 딕셔너리 - 중첩</h1>
<p>딕셔너리 두 개를 다음과 같이 선언한다.</p>
<pre><code>student_1 ={
    &quot;student_no&quot;: &quot;1&quot;,
    &quot;gpa&quot;: &quot;4.3&quot;
}

student_2 ={
    &quot;student_no&quot;: &quot;2&quot;,
    &quot;gpa&quot;: &quot;3.8&quot;
}</code></pre><p>그리고 하나의 변수에 두개의 딕셔너리를 리스트로 담는다.</p>
<pre><code>students = [student_1, student_2]</code></pre><p>반복문을 통해서 두 개의 리스트에 해당하는 특정 정보를 가져오면 다음과 같다.</p>
<pre><code>for student_ in students:
    print(student_[&#39;student_no&#39;])



&gt;&gt;&gt; 1
    2</code></pre><pre><code>for student_ in students:
    student[&#39;graduated&#39;] = False
    print(student_)




&gt;&gt;&gt; {&#39;student_no&#39;: &#39;1&#39;, &#39;gpa&#39;: &#39;4.3&#39;}
    {&#39;student_no&#39;: &#39;2&#39;, &#39;gpa&#39;: &#39;3.8&#39;}</code></pre><p>또다른 딕셔너리 student_a를 아래와 같이 정의한다</p>
<pre><code>student_a = {
    &quot;subjects&quot;: [&quot;회계원리&quot;, &quot;중국어회화&quot;]
}</code></pre><p>프린트를 통해서 만든 딕셔너리를 불러오면 아래와 같이 출력된다.</p>
<pre><code>print(student_a[&quot;subjects&quot;]) 


&gt;&gt;&gt; [&#39;회계원리&#39;, &#39;중국어회화&#39;]</code></pre><p>이를 불러와 특정 정보를 출력하면 아래와 같다. </p>
<pre><code>subjects_list = student_a[&quot;subjects&quot;]

for subject in subjects_list:
    print(subject)



&gt;&gt;&gt; 회계원리
    중국어회화</code></pre><p>다른 딕셔너리 student_b를 아래와 같이 정의한다.</p>
<pre><code>studnet_b = {
    &quot;scholarship&quot;: {
        &quot;name&quot;: &quot;국가장학금&quot;,
        &quot;amount&quot;: &quot;1000000&quot;
    }
}</code></pre><p>그 정보를 출력하면 아래와 같다.</p>
<pre><code>print(studnet_b)


&gt;&gt;&gt;{&#39;scholarship&#39;: {&#39;name&#39;: &#39;국가장학금&#39;, &#39;amount&#39;: &#39;1000000&#39;}}</code></pre><p>이에 대해서 키 값만 출력하거나, value만 출력하거나. value를 출력하면 아래와 같다.</p>
<pre><code>for key in studnet_b.keys():
    print(key)

for value in studnet_b.values():
    for value_2 in value.values():
        print(value_2)


&gt;&gt;&gt; scholarship
&gt;&gt;&gt; 국가장학금
&gt;&gt;&gt; 1000000
</code></pre><hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 9]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-9</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-9</guid>
            <pubDate>Sat, 29 Apr 2023 03:11:53 GMT</pubDate>
            <description><![CDATA[<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-9--실습---콘솔-회원가입-프로그램-만들기--✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 9 : 실습 - 콘솔 회원가입 프로그램 만들기  *</em>✨ 입니다.</h4>
<hr>
<h1 id="①-실습1-회원가입프로그램1">① 실습1 회원가입프로그램(1)</h1>
<p>지금까지 배운 내용을 토대로, 간단한 회원가입 프로그램을 만들어봅니다.
if, while 등이 함께 섞인 복잡한 구조입니다. </p>
<pre><code>
print(&#39;===============================&#39;)
print(&#39;회원가입&#39;)
print(&#39;===============================&#39;)

register = False

while not register:
    print(&#39;회원가입을 진행하시겠습니까? \n Y:진행       N:취소&#39;)
    register_input = input(&#39;&gt;&gt;      &#39;) 
    register_input = register_input.lower()

    if register_input == &#39;y&#39;:
        register = True
        print(&#39;===============================&#39;)
        print(&#39;회원가입이 진행됩니다.&#39;)
        print(&#39;===============================&#39;)

    elif register_input == &#39;n&#39;:
        print(&#39;===============================&#39;)
        print(&#39;회원가입이 취소됩니다.&#39;)
        print(&#39;===============================&#39;)

    else:
        print(&#39;입력값을 재고해주세요&#39;)


</code></pre><p>사용자의 입력에 따라서 3개의 응답 중 하나가 나옵니다. 
지금 상황으로는 break가 없기 때문에, while문을 빠져나오지 않고 계속 반복합니다. </p>
<h1 id="②-회원가입프로그램-2">② 회원가입프로그램 (2)</h1>
<p>위의 내용에 계속 이어서 작성을 진행하는데, 이번에는 배열을 이용합니다. </p>
<pre><code>
users = []

while True:

    user = {}
    username = input(&#39;ID: &#39;)

    while True:
        password = input(&quot;PW: &quot;)
        password_confirm = input(&#39;PW 확인: &#39;)
        if password == password_confirm:
            break # if 문 탈출
        else:
            print(&#39;패스워드가 일치하지 않습니다. &#39;)

    name = input(&#39;이름: &#39;)

    while True: 
        birth_date = input(&#39;생년월일(6자리): &#39;)
        if len(birth_date) == 6:
            break
        else:
            print(&#39;생년월일 입력값이 올바르지 않습니다.&#39;)

    email = input(&#39;이메일: &#39;)




</code></pre><p>특이점은 사용자의 생년월일이 만약 6자리가 아니라면 생년월일 입력문을 반복해 출력한다는 점 입니다. </p>
<h1 id="③-실습-2-회원가입프로그램3">③ 실습 2 회원가입프로그램(3)</h1>
<p>이를 통해 완성할 수 있습니다. 
입력한 정보를 모아서 회원가입에 성공했다는 문구를 출력합니다. </p>
<pre><code>

    user[&#39;username&#39;] = username
    user[&#39;password&#39;] = password
    user[&#39;name&#39;] = name
    user[&#39;birth_date&#39;] = birth_date
    user[&#39;email&#39;] = email


    users.append(user)
    print(users)

    print(&quot;----------------------------&quot;)
    print(f&quot; {user[&#39;name&#39;]}   님, 가입을 환영합니다!&quot;)
    print(&quot;----------------------------&quot;)

    print(&#39;회원가입을 추가로 진행하시겠습니까? \n y:진행    n:취소&#39;)
    register_another_input = input(&#39;&gt;&gt;&gt; &#39;)
    register_another_input = register_another_input.lower()

    if register_another_input == &#39;y&#39;:
        pass
    elif register_another_input == &#39;n&#39;:
        exit()







</code></pre><p> 이상으로 회원가입에 대한 간단한 프로그램입니다.!</p>
<hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 8]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-8</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-8</guid>
            <pubDate>Sat, 29 Apr 2023 02:34:22 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/9988ed54-a9e5-41c1-bf4b-5ebe20a7f2aa/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-8--python-next-level---함수-모듈-✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 8 : Python Next Level - 함수, 모듈 *</em>✨ 입니다.</h4>
<hr>
<h1 id="①-함수-1">① 함수 (1)</h1>
<p>function 함수는 매개변수와 인자로 이루어진 것으로, 여러 프로그램에 걸쳐서 사용할 수 있어 효율적이다. </p>
<p>혼동하기 쉬운 매개변수와 인자의 구분은 아래와 같은데, 예시를 통해서 자세히 살펴보자 </p>
<blockquote>
<p> 매개변수(파라미터) ; 함수 정의에 쓰인 것
 인자 (인수) ; 함수 실행시 들어간 값</p>
</blockquote>
<p>먼저 파라미터의 예시는 다음과 같다</p>
<pre><code>
def print_name(name):      #함수 선언, name은 파라미터
    print(f&#39;이름은 {name}입니다&#39;)     


# &quot;김**&quot;, &quot;김멋사&quot; 는 인자(인수)이다.
print_name(&quot;김**&quot;) 
print_name(&quot;김멋사&quot;) 



&gt;&gt;&gt; 이름은 김**입니다
&gt;&gt;&gt; 이름은 김멋사입니다</code></pre><p>다음으로 인자의 예시는 다음과 같다</p>
<pre><code>
def print_ex_string():
    print(&#39;예시 문자열 입니다. &#39;)

print_ex_string()       # 만든 함수 콜   




&gt;&gt;&gt; 예시 문자열입니다. 

</code></pre><p>그 외에도 여러개의 인자를 넣을 수 있는데, 예시는 아래와 같다. </p>
<pre><code>

def print_name_age(name, age):      #함수 선언, name은 파라미터
    print(f&#39;이름은 {name}이고, 나이는 {age}살 입니다&#39;)


print_name_age(&quot;김멋사&quot;, &quot;33&quot;)
# print_name_age() # 인자가 없으면 오류난다. 





&gt;&gt;&gt; 이름은 김지민이고, 나이는 33살입니다. 




</code></pre><h1 id="②-함수-2">② 함수 (2)</h1>
<p>함수를 응용한 또다른 예시를 살펴보자.
 기본값을 함수에 내장시켜두면, 출력시 인자가 없을 때 이를 불러온다. 
 인자가 있다면, 작성된 인자를 우선한다.</p>
<p> 만약 인자의 변수명에 대입을 한다면, 인자의 구성 순서가 바뀌어도 괜찮다. </p>
<pre><code>


def order_coffee(qty, option=&#39;hot&#39;):
    print(f&#39;{qty}잔 / {option}&#39;)

order_coffee(3, &#39;iced&#39;)     # 다른 겂
order_coffee(3)             # 기본 값 출력
order_coffee(option=&#39;iced&#39;, qty=5)      # 각각 선언을 한다면 순서 바꿔도 괜찮다.




&gt;&gt;&gt; 3잔 / iced
&gt;&gt;&gt; 3잔 / hot
&gt;&gt;&gt; 5잔 / iced



</code></pre><h1 id="③-함수-3">③ 함수 (3)</h1>
<p>함수 안에 if 문을 넣어 구성할 수 있다. </p>
<p>그리고 return 문을 주어 선언하고자 하는 데이터를 정해주어야 한다. </p>
<pre><code>def get_id(email):

    if email.endswith(&#39;@test.com&#39;):
        email_id = email.removesuffix(&#39;@test.com&#39;)
        print(email_id)
        return email_id         # 반한하고자 하는 데이터를 정해주어야 함
    else:
        print(&#39;처리할 수 없는 이메일 주소입니다.&#39;)

user_id = get_id(&#39;user@duksung.com&#39;)
print(user_id)
user_id = get_id(&#39;user@test.com&#39;)
print(user_id)




&gt;&gt;&gt; 처리할 수 없는 이메일 주소입니다.    
&gt;&gt;&gt; None
&gt;&gt;&gt; user
&gt;&gt;&gt; user


</code></pre><h1 id="④-함수---모듈">④ 함수 - 모듈</h1>
<p>만든 함수를 다른 파일에 작성해도, 여러 파일에서 해당 함수를 불러와 사용할 수 있다. </p>
<p>파일 두 개가 있다 가정해보자.
첫 번째 파일은 id_getter.py이며, 여기에서 사용할 함수를 정의한다.
두 번째 파일은 ex01.py이며, 여기에서 함수를 불러와 사용한다. </p>
<pre><code>

# id_getter.py

def get_id(email):

    if email.endswith(&#39;@test.com&#39;):
        email_id = email.removesuffix(&#39;@test.com&#39;)
        print(email_id)
        return email_id         # 반한하고자 하는 데이터를 정해주어야 함
    else:
        print(&#39;처리할 수 없는 이메일 주소입니다.&#39;)



</code></pre><p>만든 함수를 사용할 ex01.py 파일은 아래와 같으며, 실행하면 다음과 같은 결과가 나온다.</p>
<pre><code>


# ex01.py

from id_getter import get_id
user_id = get_id(&#39;user@test.com&#39;)
print(user_id)



&gt;&gt;&gt; user
&gt;&gt;&gt; user






</code></pre><hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 6]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-6</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-6</guid>
            <pubDate>Fri, 28 Apr 2023 20:01:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/9988ed54-a9e5-41c1-bf4b-5ebe20a7f2aa/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-6---python-beginner---조건문과-반복문-✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 6 :  Python Beginner - 조건문과 반복문 *</em>✨ 입니다.</h4>
<hr>
<h1 id="①-조건문-1">① 조건문 (1)</h1>
<p>if 문은 대표적인 조건문이다. 
if 다음에 오는 것이 true이면 그 아랫줄을 실행한다.</p>
<p>else는 if 의 조건에 해당하는 것을 제외하는 경우에 대해서 실행할 명령어를 알려준다. </p>
<pre><code>
if True:        # 콜론이 기준이 된다.
    print(&quot;True&quot;)       # 들여쓰기를 해야한다
else:
    print(&quot;False&quot;)


if 4&gt;3:
    print(&quot;a&quot;)
else:
    print(&quot;b&quot;)



&gt;&gt;&gt; True
&gt;&gt;&gt; a</code></pre><p>변수를 포함해 사용자의 입력에 따라 결과가 달라지는 if 문은 아래와 같다.</p>
<pre><code>#입력값을 int로 처리 
value = input(&quot;값을 입력해주세요: &quot;)

 if int(value) &gt; 10:      # 문자열로 출력되기에 숫자로 변환해야함
     print(&quot;a&quot;)
 else:
     print(&quot;b&quot;)



&gt;&gt;&gt; 값을 입력해주세요:  11
&gt;&gt;&gt; a 
</code></pre><p>다른 사례로, 숫자가 아닌 문자열로 이를 작성할 수 있다. </p>
<pre><code>value = input(&quot;값을 입력해주세요: &quot;)

value = value.upper()

if value == &quot;INFP&quot;:
    print(&quot;INFP&quot;)    
else:
    print(&quot;nothing&quot;)


&gt;&gt;&gt; 값을 입력해주세요: infp
&gt;&gt;&gt; INFP
</code></pre><h1 id="②-조건문2">② 조건문(2)</h1>
<p>elif 를 통해서 조금 변형된 조건문을 만들 수 있다. </p>
<pre><code>day = input(&quot;요일을 입력해주세요(0~6): &quot;)
if day == &quot;0&quot;:
    print(&quot;휴무&quot;)
elif day == &quot;6&quot;:
    print(&quot;단축영업&quot;)
elif day == &quot;1&quot;:
    print(&quot;연장영업&quot;)
elif day == &quot;3&quot;:
    print(&quot;암튼 휴일로 해&quot;)
else:
    print(&quot;정상영업&quot;)



&gt;&gt;&gt; 요일을 입력해주세요(0~6): 1
&gt;&gt;&gt; 연장영업</code></pre><h1 id="③-반복문1-loops">③ 반복문(1) loops</h1>
<p>for 문을 통해서 반복문을 작성할 수 있다. </p>
<p>변수 두 개를 설정해 특정 범위를 조건으로 가질 때 반복하는 if 문을 살펴보자.</p>
<pre><code>
i = 0

for i in range(1, 101):   #1   부터 100 번까지 반복
    print(i)


&gt;&gt;&gt; 1
&gt;&gt;&gt; 2
...
&gt;&gt;&gt; 99
&gt;&gt;&gt; 100
</code></pre><p>변수 두 개를 통해서 1 씩 추가된 값을 출력하는 결과를 살펴보자 </p>
<pre><code>
i = 0
sum = 0

for i in  range(1, 101):
    sum = sum + i

print(sum)  # 1 부터 100 까지 더한 값



&gt;&gt;&gt; 5050</code></pre><h1 id="④-반복문2-while">④ 반복문(2) while</h1>
<p>while 문 또한 반복문이다. 
이를 통해 무한반복과, 조건을 만족할 경우만 반복하는 경우 두 가지를 표현할 수 있다.</p>
<p>먼저 무한반복은 아래와 같다. &#39;while&#39; 이후 값이 true 라면 다음 줄에 오는 명령을 반복하는 것이다. </p>
<pre><code>
 while True:
     print(&quot;while loop&quot;)

&gt;&gt;&gt; True
&gt;&gt;&gt; True
&gt;&gt;&gt; True
&gt;&gt;&gt; True
&gt;&gt;&gt; True
&gt;&gt;&gt; True
...</code></pre><p>다음으로 조건에 의한 반복문이다. 
변수를 초깃값과 함께 선언해주고, 이 변수에 1 씩 더하되, 100보다 작을 때 까지만 반복해 print선언과 덧셈을 반복한다.</p>
<pre><code>
progress = 0

while progress &lt; 100:
    progress = progress + 1
    print(f&quot;{progress}% completed&quot;)



&gt;&gt;&gt; 1% completed
&gt;&gt;&gt; 2% completed
...
&gt;&gt;&gt; 99% completed
&gt;&gt;&gt; 100% completed
</code></pre><hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 5]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-5</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-5</guid>
            <pubDate>Fri, 28 Apr 2023 09:25:32 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/9988ed54-a9e5-41c1-bf4b-5ebe20a7f2aa/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-5--python-beginner---변수와-자료형-✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 5 : Python Beginner - 변수와 자료형 *</em>✨ 입니다.</h4>
<hr>
<h1 id="①-변수와-자료형---변수-선언">① 변수와 자료형 - 변수 선언</h1>
<p>VSCODE를 편집기로 이용해서, 실습을 진행한다. </p>
<p>.py 확장자로 작성한 파일을 실행하면, 터미널에서 해당 결과가 출력된 것을 확인할 수 있다.</p>
<blockquote>
<p>변수 : 데이터가 담기는 공간</p>
</blockquote>
<p>코드를 통해 실습을 진행할 수 있다. </p>
<pre><code>print(&quot;안녕하세요 :)&quot;)



출력결과&gt;&gt;&gt; _안녕하세요 :)_
</code></pre><blockquote>
<p>만약 터미널에서 한글이 깨진다면! 
&#39;code runner&#39; 이라는 확장 프로그램 설치 후, 해당 프로그램의 설정에 들어가 &#39;run in terminer&#39; 에 체크표시를 해주면 된다!</p>
</blockquote>
<p>변수를 이용해보자.</p>
<blockquote>
<p><strong>변수</strong>는 데이터를 변경해서 할당 할 수 있는 공간</p>
</blockquote>
<pre><code>
print(&quot;안녕하세요 :)&quot;)
#  greeting 이라는 변수 선언
#  이 변수에 문자열 값을 할당
greeting = &quot;안녕하세요 :)&quot;

print(greeting)

&gt;&gt;&gt; _안녕하세요 :)_</code></pre><p>그렇다면, 만약 중간에 변수 값이 바뀐다면 어떨까?</p>
<pre><code>
greeting = &quot;반갑습니다 :)&quot;
print(greeting)

&gt;&gt;&gt; 반갑습니다 :)</code></pre><blockquote>
<p><strong>변수</strong>는, 데이터가 변할 수 있는, 데이터를 언제든 담고 꺼낼 수 있는 공간이다. </p>
</blockquote>
<h1 id="②-변수와-자료형---변수-선언-시-주의-사항">② 변수와 자료형 - 변수 선언 시 주의 사항</h1>
<p>함수 혹은 변수를 선언하는데 각각의 언어는 규칙이 있다.
관습적인 것과 프로그램 상 정해진 규칙이 있다.
이를 <strong>명명규칙</strong>이라 부른다.
여기에 여섯 개의 주의사항이 있다.</p>
<p>*<em>첫 번째 *</em>: 변수 사이 공백 허용 X</p>
<pre><code>gree ting = &quot;안녕하세요&quot;

&gt;&gt;&gt; error!</code></pre><p><strong>두 번째</strong> : 변수 사이는 _(언더스코어) 이용</p>
<pre><code>my_greeting = &quot;안녕하세요&quot;
</code></pre><p><strong>세 번째</strong> : 변수를 선언하기 위한 문자열은 숫자/특수문자로 시작 불가</p>
<pre><code>greeting_1 = &quot;안녕&quot;
1_greeting = &quot;hihi&quot;      &gt;&gt;&gt; error
!_greeting = &quot;hello&quot;     &gt;&gt;&gt; error</code></pre><p>*<em>네 번째 *</em>: 예약어 (프로그램에 이미 내부적으로 저장된 함수.)는 변수로 선언 불가</p>
<pre><code>print = &quot;안녕하시오&quot;

print(print)        &gt;&gt;&gt; error</code></pre><p><strong>다섯 번째</strong> : 가급적 소문자 사용</p>
<p><strong>여섯 번째</strong> : 오타 주의 </p>
<h1 id="③-변수와-자료형---문자열-1">③ 변수와 자료형 - 문자열 (1)</h1>
<h1 id="문자열-string--문자의-나열">문자열 string = 문자의 나열</h1>
<pre><code>city = &quot;seoul&quot;      # Seoul, SEOUL, SEouL 
print(city)



&gt;&gt;&gt; seoul</code></pre><p>대문자로 출력하고 싶다면 upper() 이용한다</p>
<pre><code>city.upper()
print(city.upper())

city = city.upper()
print(city)         # 대문자로 변형된 데이터가 대입되어 출력



&gt;&gt;&gt; SEOUL
&gt;&gt;&gt; SEOUL</code></pre><p>소문자로 출력하고 싶다면 lower() 이용한다</p>
<pre><code>city.lower()
print(city.lower())

city = city.lower()
print(city)         # 소문자로 변경된 데이터가 데입되어 출력


&gt;&gt;&gt; seoul
&gt;&gt;&gt; seoul</code></pre><p>공백을 제거하고 싶다면 rstrip(), lstrip() 을 통해서 우측과 좌측 공백을 제거한다.</p>
<pre><code>occupation = &quot;      developer       &quot; # 공백 하나하나 문자다
print(occupation)

occupation.rstrip()
print(occupation.rstrip()) # 우측 공백 제거

occupation.lstrip()
print(occupation.lstrip()) # 좌측 공백 제거 



&gt;&gt;&gt;      developer       
&gt;&gt;&gt;      developer
&gt;&gt;&gt;developer      
</code></pre><p>문자열의 개행과 탭의 구분은 각각 \n, \t 이다. 그냥 엔터 친다고 해결 안된다. </p>
<pre><code>print(&quot;INFP ENFP INTP ESTJ&quot;)
 print(&quot;INFP    
       ENFP 
       INTP 
       ESTJ&quot;)
print(&quot;INFP\nENFP\nINTP\nESTJ&quot;)  #개행
print(&quot;INFP\tENFP\tINTP\tESTJ&quot;)  # tab



&gt;&gt;&gt; NFP ENFP INTP ESTJ
&gt;&gt;&gt; error
&gt;&gt;&gt; INFP
    ENFP
    INTP
    ESTJ
&gt;&gt;&gt; INFP    ENFP    INTP    ESTJ

</code></pre><h1 id="④-변수와-자료형---문자열-2">④ 변수와 자료형 - 문자열 (2)</h1>
<p>removeprefix() 를 통해서 기존 변수에 할당된 데이터 값의 일부를 삭제할 수 있다. </p>
<pre><code>
score = &quot;점수:90&quot;
print(score.removeprefix(&quot;점수:&quot;))


score_2 = &quot;75점&quot;
print(score_2.removesuffix(&quot;점&quot;)) 



&gt;&gt;&gt; 90
&gt;&gt;&gt; 75</code></pre><p>replace() 를 이용해서 기존 변수에 할당된 데이터 값의 일부를 다른 값으로 교체할 수 있다. </p>
<pre><code>city =&quot;서울 중구&quot;
print(city)
print(city.replace(&quot;서울&quot;, &quot;서울시&quot;))



&gt;&gt;&gt; 서울 중구 
&gt;&gt;&gt; 서울시 중구 
</code></pre><h1 id="⑤-변수와-자료형---문자열-3">⑤ 변수와 자료형 - 문자열 (3)</h1>
<p>데이터가 여러개이고, 그 중 일부만 골라서 출력해야하는 상황에서는 모든 데이터를 print값 안에 적은 것 - 하드코딩 - 이 힘든 경우가 있다.</p>
<p>이러한 상황에서 쓸 수 있는 것은 바로 print() 문 안에 f 를 넣어, 변수도 변수의 데이터값으로 출력할 수 있는 구조이다. 
아래 예시를 통해 살펴보자. </p>
<pre><code>si_1 = &quot;용인&quot;
gu_1 = &quot;기흥&quot;
address_1 = f&quot;{si_1}시  {gu_1}구&quot;

si_2 = &quot;서울&quot;
gu_2 = &quot;종로&quot;


print(address_1)
print(f&quot;{si_1}시  {gu_1}구&quot;)  #(시의이름)시 (구의이름)구
print(&quot;용인시  기흥구&quot;)
print(f&quot;{si_2}시  {gu_2}구&quot;)  #(시의이름)시 (구의이름)구



&gt;&gt;&gt; 용인시  기흥구
&gt;&gt;&gt; 용인시  기흥구
&gt;&gt;&gt; 용인시  기흥구
&gt;&gt;&gt; 서울시  종로구</code></pre><h1 id="⑥-변수와-자료형---숫자-1">⑥ 변수와 자료형 - 숫자 (1)</h1>
<p>숫자의 사칙연산은 파이썬에서 +, -, *, / 으로 표현할 수 있다. 
그 밖에 제곱승이나 괄호로 연산 순서를 결정할 수 있으며, //, % 등의 기호도 있다. </p>
<pre><code>
a = 2
b = 3

print(a + b)
print(a - b)
print(a * b)
print(a / b)        # 몫 아님

print(a ** b)       # 제곱승

print((a+b) * b)

print(a // b)       # 몫
print(a % b)        # 나머지



&gt;&gt;&gt; 5
&gt;&gt;&gt; -1
&gt;&gt;&gt; 6
&gt;&gt;&gt; 0.6666666666666666

&gt;&gt;&gt; 8
&gt;&gt;&gt; 15

&gt;&gt;&gt; 0
&gt;&gt;&gt; 2
</code></pre><p>실수(float)와 실수 간의 연산과 정수와 실수 간의 연산에 대해서 알아보자 </p>
<pre><code>
x = 0.6
y = 0.3
z = 1

print(&quot;실수와 실수의 연산 -&gt; 실수로 나타난다&quot;)
print(x + y)
print(x - y)
print(x * y)
print(x / y)

print(&quot;실수와 정수의 연산 -&gt; 실수로 나타난다&quot;)
print(x + z)
print(x - z)
print(x * z)
print(x / z)



&gt;&gt;&gt; 실수와 실수의 연산 -&gt; 실수로 나타난다
&gt;&gt;&gt; 0.8999999999999999
&gt;&gt;&gt; 0.3
&gt;&gt;&gt; 0.18
&gt;&gt;&gt; 2.0

&gt;&gt;&gt; 실수와 정수의 연산 -&gt; 실수로 나타난다
&gt;&gt;&gt; 1.6
&gt;&gt;&gt; -0.4
&gt;&gt;&gt; 0.6
&gt;&gt;&gt; 0.6
</code></pre><blockquote>
<p>실수와 연산하는 수는 그 결과가 모두 실수이다. </p>
</blockquote>
<h1 id="⑦-변수와-자료형---숫자-2">⑦ 변수와 자료형 - 숫자 (2)</h1>
<p>숫자의 세 번째 자리마다 언더스코어를 넣어 표기할 수 있다. 
출력값에서 _ 는 생략된다.</p>
<pre><code>price = 123_900_000_000  
print(price)            


&gt;&gt;&gt; 123900000000</code></pre><p>상수 contants는 다른 데이터가 덮어쓰기를 하면 마지막 대입값이 출력되므로 주의해야 한다. </p>
<pre><code>
PI = 3.141592       # 다른 데이터 덮어쓰기 하면 X

PI = 1.23           # 이런식으로 작성 X

print(PI) 



&gt;&gt;&gt; 1.23</code></pre><h1 id="⑧-변수와-자료형---숫자-3">⑧ 변수와 자료형 - 숫자 (3)</h1>
<p>문자열-숫자간 변환에 대해서 알아보자면, 문자열과 숫자를 컴퓨터는 동일한 값으로 생각하지 않는다. </p>
<pre><code>a = 100
b = &quot;100&quot;
# 위의 두 값을 컴퓨터는 동일한 100으로 인식하지 않는다. 
c = &quot;0.456&quot;

a = str(a)  # 숫자를 문자열로
b = int(b)  # 문자열을 숫자로 
c = float(c) # 숫자로 . 데이터가 동일한지 비교할 때 유용하다.



&gt;&gt;&gt; 100
&gt;&gt;&gt; 100
&gt;&gt;&gt; 0.456
</code></pre><h1 id="⑨-변수와-자료형---논리형부울">⑨ 변수와 자료형 - 논리형(부울)</h1>
<p>논리형 데이터 bool, boolean에 대해서 알아보자. 
그 결과는 두 가지로, True, False인데 꼭 대문자로 시작한다.</p>
<pre><code>print(3&gt;2)
print(3==3)
print(3==3.0)
print(3 is 3.0)    # 데이터형 구분. 정수와 실수라서 False 결과 나옴


&gt;&gt;&gt; True
&gt;&gt;&gt; True
&gt;&gt;&gt; True
&gt;&gt;&gt; False</code></pre><h1 id="⑩-변수와-자료형---명령-프롬프트">⑩ 변수와 자료형 - 명령 프롬프트</h1>
<p>명령프롬포트 prompt를 만들어 콘솔창에서 간단히 사용자의 데이터를 수집할 수 있다. </p>
<pre><code>input(&quot;설치를 계속 진행하시겠습니까? (y/n):     &quot;) 


&gt;&gt;&gt; 설치를 계속 진행하시겠습니까? (y/n): </code></pre><p>사용자의 데이터 받기, 할당하기, 출력하기 3단계를 아래의 예시를 통해 확인할 수 있다.</p>
<pre><code>text = input(&quot;출력할 텍스트를 입력해보세요:     &quot;)
print(text)



&gt;&gt;&gt; 출력할 텍스트를 입력해보세요:    **집가고싶어요**
&gt;&gt;&gt; **집가고싶어요**
</code></pre><h1 id="⑪-변수와-자료형---주석">⑪ 변수와 자료형 - 주석</h1>
<p>주석 comments의 종류는 두 가지가 있다.
첫 번째로 한 줄 주석인데, 이는 # 기호를 문장 맨 앞에 붙여 사용한다.</p>
<pre><code>#주석입니다</code></pre><p>두 번째는 여러줄 주석인데, &quot;&quot;&quot; 와 &quot;&quot;&quot; 사이에 내용을 적어 주석을 표현한다.</p>
<pre><code>
&quot;&quot;&quot;
여러줄 주석입니다. 
여러줄 주석입니다. 
여러줄 주석입니다. 
print(&quot;test&quot;)

&quot;&quot;&quot;



&gt;&gt;&gt;
</code></pre><hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 3]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-3</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-3</guid>
            <pubDate>Thu, 27 Apr 2023 01:04:13 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/1f7c2823-b69b-4ab7-a6fa-e01ab80f0244/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-3--python-개발-환경-세팅-✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 3 : Python 개발 환경 세팅 *</em>✨ 입니다.</h4>
<hr>
<h1 id="①-python-버전">① python 버전</h1>
<p>파이썬은 <a href="https://www.python.org/">https://www.python.org/</a> 에서 다운받을 수 있다. </p>
<p>최신 버전을 다운받는 것이 좋은데, 너무 최신은 최적화 등에 버그가 있을 수 있으므로 이전 버전 등의 다운을 추천한다고 한다.</p>
<h1 id="②-python-가상-환경-및-pipenv-활용">② python 가상 환경 및 pipenv 활용</h1>
<p>cmd, cmder, powershell 등의 터미널에서 가상환경을 설정할 수 있다. </p>
<p>pip는 공구상자같은 느낌이고, pipenv는 그 속에 들어있는 드라이버이다. 
pip의 설치가 선행되어야 한다. </p>
<p>pip를 설치하고, 최신버전으로 업그레이드 등을 하기 위해 아래의 코드를 작성한다.</p>
<blockquote>
<p>pip install --upgrade pip</p>
</blockquote>
<p>혹시 pip가 이미 설치되어있다면, pipenv가 있는지 확인하기 위해서</p>
<blockquote>
<p>pip list</p>
</blockquote>
<p>이를 입력한다.</p>
<p>만약 없다면, pipenv를 설치해준다.</p>
<blockquote>
<p>pip install pipenv</p>
</blockquote>
<p>이후, 프로젝트 실습을 진행할 디렉토리의 위치에서 가상환경을 실행할텐데, 이를 위해서 python 버전을 알고있어야 한다. </p>
<blockquote>
<p>python--version  </p>
</blockquote>
<p>해당 디렉토리 위치로 이동한 후, pyhton이 실행되지 않은 상태에서 </p>
<blockquote>
<p>pipenv --python 3.x</p>
</blockquote>
<p>마지막에 자신의 파이썬 버전을 넣어서 실행한다.</p>
<p>혹은 </p>
<blockquote>
<p>pipenv install python-dotenv </p>
</blockquote>
<p>이를 통해 실행한다. </p>
<hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 2]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-2</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-2</guid>
            <pubDate>Thu, 27 Apr 2023 00:47:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/2ebe4715-1678-4bc3-a02b-f80358367344/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-2--python의-등장과-발전-✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 2 : python의 등장과 발전 *</em>✨ 입니다.</h4>
<hr>
<h1 id="①-python의-등장">① python의 등장</h1>
<p>2000년대로 오며, 3.x 버전으로 바뀐다.</p>
<p>완전 다른 언어처럼 작용될 정도로 이전 버전과 호환에 충돌이 잦았고, 3.x버전이 최근 많이 사용된다. (일부 api 제외 - 맥 등)</p>
<p>flack, 등 다양한 api 공개</p>
<p>python, sdkitlearn, keras 등 통계나 데이터분석, 인공지능 등에서 필수적인 분야로 환영받고 있다.</p>
<h1 id="②-python-언어의-특징">② python 언어의 특징</h1>
<p>인터프리터 언어이다. </p>
<p>java의 경우, 소스코드를 컴파일러가 바이트코드로 변환 후, jvm 에서 실행 - 빌드/컴파일 과정이 필수로 필요하다.</p>
<p>python의 경우 별도의 이진수 등으로 변환하는 과정이 필요하지 않다. 파이썬 인터프리터만 있으면 실행결과를 볼 수 있다. </p>
<hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 백엔드 파이썬 온보딩 트랙 강의리뷰 : 챕터 1]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-1</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%EB%B0%B1%EC%97%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-1</guid>
            <pubDate>Wed, 26 Apr 2023 10:59:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/9988ed54-a9e5-41c1-bf4b-5ebe20a7f2aa/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기백엔드-파이썬-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/"><strong>[대학11기]백엔드 파이썬 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-1--intro-python-시작하기-✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨*<em>챕터 1 : Intro Python 시작하기 *</em>✨ 입니다.</h4>
<hr>
<p>앞으로 진행될 내용에 대해 간단히 설명했는데요, 이는 아래와 같습니다.</p>
<blockquote>
<p> python </p>
</blockquote>
<blockquote>
<p> python 을 토대로 django rest framework를 통한 api만들기 </p>
</blockquote>
<p>만약 해당 강의내용에 대한 이해가 부족하다면 따로 또 시간을 들여서라도 복습을 하고 넘어가길 추천한다고 합니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 프론트엔드 온보딩 트랙 강의리뷰 : 챕터 11]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-11</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-11</guid>
            <pubDate>Wed, 29 Mar 2023 19:54:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/c3ea16bd-b226-4efe-ac84-d1f2415cf096/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기프론트엔드-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/my/courses"><strong>[대학11기]프론트엔드 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-11--웹페이지-구성하기✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨<strong>챕터 11 : 웹페이지 구성하기</strong>✨ 입니다.</h4>
<hr>
<h1 id="①-레이아웃-개요">① 레이아웃 개요</h1>
<ul>
<li><p>nav</p>
</li>
<li><p>header</p>
</li>
<li><p>section</p>
<ul>
<li>article</li>
</ul>
</li>
<li><p>footer </p>
</li>
</ul>
<hr>
<h1 id="②-header-작성">② header 작성</h1>
<p>vscode를 편집기로 작성을 시작한다. 
!느낌표 + enter을 통해 자동으로 html파일 기본 구성 작성을 마칠 수 있다.
그밖에 googlefont, fontawsome을 사용하기 위한 추가 코드들 header부분에 작성해 준비를 마쳐 준다. </p>
<p>필자의 경우 선택한 폰트 등이 강의와 조금 달라 아래와 같은 코드로 작성했다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;레이아웃&lt;/title&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./stylesheet.css&quot;&gt;

    &lt;!-- google fonts --&gt;
    &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot;&gt;
    &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin&gt;
    &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Sunflower:wght@500&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;!-- fontawesome --&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://use.fontawesome.com/releases/v5.15.4/css/all.css&quot; integrity=&quot;sha384-DyZ88mC6Up2uqS4h/KRgHuoeGwBcD4Ng9SiP4dIRy0EXTlnuz47vAwmeGwVChigm&quot; crossorigin=&quot;anonymous&quot;/&gt;
&lt;/head&gt;
</code></pre>
<hr>
<h1 id="③-body---nav-작성">③ body - nav 작성</h1>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/3900ba0e-f1d2-459c-b602-5f38575177a4/image.png" alt=""></p>
<p>이와 같은 이미지를 만들기 위해서 html파일의 네비게이션 영역과 css 파일의 코드를 수정했다.</p>
<p>먼저 html 파일의 코드는 아래와 같다.</p>
<pre><code class="language-html">
&lt;body&gt;
    &lt;nav&gt;
        &lt;div class=&quot;container&quot;&gt;
            &lt;h1 class=&quot;nav-logo&quot;&gt;&lt;a href=&quot;./index.html&quot;&gt;&lt;i class=&quot;fas fa-star&quot;&gt;Layout&lt;/i&gt;&lt;/a&gt;&lt;/h1&gt;
            &lt;div class=&quot;nav-menu&quot;&gt;
                &lt;ul class=&quot;nav-btn&quot;&gt;
                    &lt;li&gt;&lt;a href=&quot;./index.html&quot;&gt;홈&lt;/a&gt;&lt;/li&gt;
                    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;소개&lt;/a&gt;&lt;/li&gt;
                    &lt;li&gt;&lt;a href=&quot;https://techit.education/&quot;&gt;Techit&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/nav&gt;
&lt;/body&gt;</code></pre>
<p>그리고 css 코드는 아래와 같다.</p>
<pre><code class="language-html">* {
    box-sizing: border-box;
}

body {
    margin: 0;
    padding: 0;
    font-family: &#39;Sunflower&#39;, sans-serif;
}

a:link, a:visited {
    text-decoration: none;
    color: black;
}

.container {
    width: 960px;
    margin: 0 auto;
}

nav {
    height: 80px;
    background-color: rosybrown;
    line-height: 80px;
}

nav::after {        //layout과 &#39;홈&#39; 내용 그 사이에 공간을 만들어 고정시키기
    content: &quot;&quot;;
    display: block;
    clear: both;
}

.nav-logo {
    font-size: 50px;
    float: left;
    margin: 0;
}

.nav-menu {
    float: right;
}

.nav-btn {
    list-style-type: none;
    margin: 0;
}

ul.nav-btn &gt; li {
    float: left;
    margin-left: 20px;
    font-size: 25px;
    margin-top: 10px;
}</code></pre>
<hr>
<h1 id="④-body---header-작성">④ body - header 작성</h1>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/8fb0ba46-c45d-4ac7-b43e-cac284250a41/image.png" alt=""></p>
<p>위와 같은 결과를 만들기 위해서 네비게이션바에 이어서 헤더 부분을 수정했다. 
아래는 수정한 html 코드이다. </p>
<pre><code class="language-html">  &lt;header class=&quot;hd&quot;&gt;
        &lt;div class=&quot;container&quot;&gt;
            &lt;h2 class=&quot;hd-title&quot;&gt;POSSIVILITY TO REALITY!&lt;/h2&gt;
            &lt;p class=&quot;hd-content&quot;&gt;여러분을 응원합니다!&lt;/p&gt;
        &lt;/div&gt;
  &lt;/header&gt;</code></pre>
<p>아래는 수정한 css 파일이다.</p>
<pre><code class="language-html">/* 헤더 */
.hd {
    position: relative;
    height: 600px;
    text-align: center;
}

.hd-title {
    font-size: 80px;
    margin-top: 0;
    margin-bottom: 30px;
    padding-top: 200px;
}

.hd-content {
    font-size: 25px;
}

.hd::before {
    content: &quot;&quot;;
    display: block;
    position: absolute;
    left: 0;
    right: 0;
    width: 100%;
    height: 100%;
    opacity: 0.8; /* 불투명도 */      
    background-image: url(./test5.jpg);
    background-size: cover;
    background-position: center center;
    background-repeat: no-repeat;
}

.hd .container {
    position: relative;
}</code></pre>
<blockquote>
<p>opacity 값을 수정해 배경에 불투명도를 덧씌운다는 점이 특징이다.</p>
</blockquote>
<hr>
<h1 id="⑤-body---section-작성">⑤ body - section 작성</h1>
<p>세 개로 구분된 섹션 부분을 작성하기 위해 수정한 코드이다. 아래는 완성하고자 하는 이미지이다.
<img src="https://velog.velcdn.com/images/dung-dung/post/830c005f-9b7a-491a-83bb-3a951d6931db/image.png" alt=""></p>
<p>이는 수정한 html 코드이다. </p>
<pre><code class="language-html">    &lt;section class=&quot;sec&quot;&gt;
        &lt;div class=&quot;container&quot;&gt;
            &lt;article class=&quot;artc&quot;&gt;
                &lt;div class=&quot;card-img&quot;&gt;
                    &lt;img src=&quot;./test1.jpg&quot; alt=&quot;이미지1&quot;&gt;
                &lt;/div&gt;
                &lt;p&gt;이미지1&lt;/p&gt;
            &lt;/article&gt;

            &lt;article class=&quot;artc&quot;&gt;
                &lt;div class=&quot;card-img&quot;&gt;
                    &lt;img src=&quot;./test2.jpg&quot; alt=&quot;이미지2&quot;&gt;
                &lt;/div&gt;
                &lt;p&gt;이미지2&lt;/p&gt;
            &lt;/article&gt;

            &lt;article class=&quot;artc&quot;&gt;
                &lt;div class=&quot;card-img&quot;&gt;
                    &lt;img src=&quot;./test3.jpg&quot; alt=&quot;이미지3&quot;&gt;
                &lt;/div&gt;
                &lt;p&gt;이미지3&lt;/p&gt;
            &lt;/article&gt;
        &lt;/div&gt;
    &lt;/section&gt;</code></pre>
<p>아래는 수정한 css 코드이다.</p>
<pre><code class="language-html">/* section */

.sec {
    text-align: center;
    padding: 100px 0;
    background-color: peachpuff;
}

.sec article {
    float: left;
    width: 300px;
    margin-right: 30px;
}

.sec article:last-child {
    margin-right: 0;
}

.sec article img {
    width: 100%;
    height: auto;
}

.card-img {
    overflow: hidden;
    height: 300px;
    width: 300px;
}

.sec::after {
    content: &quot;&quot;;
    display: block;
    clear: both;
}</code></pre>
<blockquote>
<p>위의 이미지는 가로 세로를 300px로 만들어 자른 것이다. 그런데 원본 이미지의 크기가 300px이 안될 경우, 첨부한 사진과 같이 비어있는 부분이 생기기도 한다.</p>
</blockquote>
<hr>
<h1 id="⑥-body---footer-작성">⑥ body - footer 작성</h1>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/2d365b65-fde0-4017-9372-35a9f543218e/image.png" alt=""></p>
<p>특히 마지막 부분에 주목해서 본다면, footer 부분을 수정해 작성했다.</p>
<p>html 부분에 추가한 코드는 아래와 같다.</p>
<pre><code class="language-html">
    &lt;footer class=&quot;ft&quot;&gt;
        &lt;div class=&quot;container&quot;&gt;
            &lt;p&gt;&amp;copy; 2023 JIMIN. ALL RIGHT RESERVED. &lt;/p&gt;
        &lt;/div&gt;
    &lt;/footer&gt;</code></pre>
<p>css 부분에 추가한 코드는 아래와 같다.</p>
<pre><code class="language-html"> /* footer */
.ft {
    padding: 15px;
    text-align: center;
    background-color: palevioletred;
}</code></pre>
<blockquote>
<p>하나하나 내가 작성한 코드가 바로바로 반영되어 시각적으로 보이는 것이 재미있고, 흥미롭다. </p>
</blockquote>
<hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 프론트엔드 온보딩 트랙 강의리뷰 : 챕터 10]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-10</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-10</guid>
            <pubDate>Wed, 29 Mar 2023 18:22:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/c3ea16bd-b226-4efe-ac84-d1f2415cf096/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기프론트엔드-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/my/courses"><strong>[대학11기]프론트엔드 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-10--css-외부-리소스-적용해보기✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨<strong>챕터 10 : CSS 외부 리소스 적용해보기</strong>✨ 입니다.</h4>
<hr>
<h1 id="①-google-fonts">① Google Fonts</h1>
<p>html과 css 파일을 통해서 폰트 및 스타일을 설정할 수 있다. 
아래와 같은 코드로 기본 예시 사례를 설정할 수 있다.</p>
<p><a href="https://fonts.google.com/">구글폰트</a>에서는 다양한 폰트를 제공한다. </p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/201c6259-bb27-4206-8379-1ec67bbc4554/image.png" alt=""></p>
<p>이와 같이 원하는 폰트를 찾아서, 
To embed a font, copy the code into the <head> of your html
하위의 내용을 복사해 각각 html파일과 css 파일에 넣어 원하는 폰트를 사용할 수 있다. 
아래는 사용 사례이다. </p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/bf09fe41-2d75-4266-bbcd-25d1735ab317/image.png" alt=""></p>
<hr>
<h1 id="②-fonts-awsome">② Fonts Awsome</h1>
<p><a href="https://fontawesome.com/">폰트어썸</a>에서 여러 아이콘을 가져와 이용할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/213bbe25-5af2-4942-bafa-2d316e7c07ef/image.png" alt=""></p>
<p>위의 그림은 애플과 링크드인 아이콘을 가져온 예시이다. 
색상도 변경할 수 있다.</p>
<hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 프론트엔드 온보딩 트랙 강의리뷰 : 챕터 9]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-9</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-9</guid>
            <pubDate>Wed, 29 Mar 2023 18:22:28 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/c3ea16bd-b226-4efe-ac84-d1f2415cf096/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기프론트엔드-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/my/courses"><strong>[대학11기]프론트엔드 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-9--css-next-level✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨<strong>챕터 9 : CSS Next Level</strong>✨ 입니다.</h4>
<hr>
<h1 id="①-float">① Float</h1>
<h3 id="float-">Float :</h3>
<p>자식요소가 부모요소로부터 떠오르다. margin을 없애버리다. </p>
<blockquote>
<p>div는 블록 요소를 잘 가지고 있는 태그다. </p>
</blockquote>
<p>부모요소 하위에 자식태그를 생성하면,
자식요소의 width값 자체가 바뀌는 것이 아니라, 부모 요소의 width 값만큼 margin이 생긴다. </p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/9c6dc168-8aea-4424-866d-936630f19445/image.png" alt=""></p>
<p>float1 속성을 부여하게 되면, 가지고 있던 부모의 width 값 만큼의 마진값이 사라진다.
분홍색 박스를 보면, 우측의 값이 사라지고, 하단에 있던 것이 float1 아래 하위로 들어와 겹쳐저 다른 층으로 온다. </p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/20ff37c5-9bf5-44cd-b1ca-ed280a94706a/image.png" alt=""></p>
<p>따라서 겹쳐지지 않도록 하기 위해서는, float1, float2 둘 다 float 속성을 부여해 층을 동일하게 해주면 된다. 
만약 좌측이 아니라 우측에 배치하고싶다면, 해당 속성도 바꾸어주면 된다.</p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/efbbdc45-a957-4bf7-8110-6875ef3346b4/image.png" alt=""></p>
<hr>
<h1 id="②-clear">② Clear</h1>
<p>조금 전에 관찰한 분홍색 박스와 파란색 박스 두 개를 볼 때, 
분홍색 박스 하나에만 float를 설정하면 그 아래로 파란색 박스가 겹쳐지는 문제점이 있었다. </p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/20ff37c5-9bf5-44cd-b1ca-ed280a94706a/image.png" alt=""></p>
<p>이를 해결하기 위해서, 모든 요소에 float를 설정하는 것 말고도, 
아래의 파란색 박스에 clear 속성을 부여하는 방법이 있다. </p>
<p>이를 이용하면 그대로 자신의 위치를 효과를 가진다. 
<img src="https://velog.velcdn.com/images/dung-dung/post/861f04d5-40bd-4ff4-ad8a-2b96cd134e84/image.png" alt=""></p>
<p>주의할 점은, 파란색 요소와 빨간색 요소가 둘 다 위치(right, left)가 같아야 한다는 점이다. </p>
<h3 id="clearfix-">Clearfix :</h3>
<p>clear 속성으로 layout을 바로잡는 속성이다. 
콘텐츠가 범람하는 부분에 이를 적용하면, layout을 조정해 조절할 수 있다.</p>
<p>작성 방법은 아래와 같다.</p>
<pre><code>(범람을 막고싶은 요소)::after {
    content: &quot;&quot;;
    display: block;
    clear: both;
}    </code></pre><hr>
<h1 id="③-flex">③ Flex</h1>
<p>가로 및 세로 배치 방법에 대해서 많은 고민이 있었는데, 이를 해결하기 위해서 flexbox라는 해결책이 나왔다.</p>
<h3 id="flex-container-">flex container :</h3>
<p>{display:flex;}가 선언된 부모 요소이다.
이를 적용하면, 모든 자식요소에 float가 적용된 효과를 받을 수 있다. </p>
<p>❕ 만약, 자식요소가 여러개이고, 각 요소가 동일한 간격을 가지게 하고싶다면,</p>
<pre><code class="language-html">{justify-content: space-between;}</code></pre>
<p>위와 같은 코드를 작성하면 된다.</p>
<hr>
<h1 id="④-position">④ Position</h1>
<h3 id="static-">static :</h3>
<p>모든 요소가 가지는 디폴트 값이다. 생성된 일반적인 위치를 의미한다.</p>
<h3 id="relative-">relative :</h3>
<p>원래 위치를 기준으로 얼마만큼 위치를 이동시킬 것인지를 의미한다. 
left, right, top, bottom 등으로 px 단위로 나타낼 수 있다.</p>
<h3 id="absolute-">absolute :</h3>
<p>position이 static이 아닌 가장 가까운 부모를 기준으로 한다.
body를 기준으로 위치를 움직이므로, margin 등에 영향을 받지 않는다. 
하지만 부모요소를 1순위로 보고, 이를 기준으로 위치만 변경된다.</p>
<h3 id="fixed-">fixed :</h3>
<p>브라우저 창을 기준으로 고정된 위치를 의미한다.
position을 fixed로 두고, bottom, right 등의 값을 정해두면 해당 위치에 고정되어있다.</p>
<h3 id="sticky-">sticky :</h3>
<p>스크롤로 특정 위치에 도달하면 보이는 것을 의미한다. 
이후 더이상 스크롤에 의해 움직이지 않는다.</p>
<hr>
<h1 id="⑤-grid">⑤ Grid</h1>
<h3 id="grid-">grid :</h3>
<p>열이 12개이고 행이 무한한 바둑판을 css에서 의미한다. 
페이지에서의 가이드라인이다.
정렬된 구조에서 오는 안정감을 제공한다.</p>
<h3 id="container-">container :</h3>
<p>grid system이 적용될 영역이다.</p>
<h3 id="row-">row :</h3>
<p>행, 가로부분이다. float 된 column이다.</p>
<h3 id="column-">column :</h3>
<p>열, 세로부분이다. 요소의 위치 결정에서 실질적인 역할을 수행한다.</p>
<h3 id="guttuer-">guttuer :</h3>
<p>row와 column 사이의 간격을 의미한다.
한 column 양 옆의 마진이 gutter을 구분한다.</p>
<hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 프론트엔드 온보딩 트랙 강의리뷰 : 챕터 8]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-8</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-8</guid>
            <pubDate>Wed, 29 Mar 2023 18:22:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/c3ea16bd-b226-4efe-ac84-d1f2415cf096/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기프론트엔드-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/my/courses"><strong>[대학11기]프론트엔드 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-8--css-beginner✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨<strong>챕터 8 : CSS Beginner</strong>✨ 입니다.</h4>
<hr>
<h1 id="①-css-적용">① CSS 적용</h1>
<p>css파일을 html파일에 연결하는 과정이 필요하다.</p>
<p>헤드 태그 안에 link 태그로 작성해주는 과정이다.</p>
<pre><code class="language-html">&lt;link rel=&quot;stylesheet&quot; href=&quot;css 파일의 위치&quot;&gt;
</code></pre>
<blockquote>
<p>파일의 위치
./        ➡ 같은 해당 파일과 같은 위치에 있을 때를 의미한다.
../        ➡ 해당 파일의 상위에 있음을 의미한다.</p>
</blockquote>
<hr>
<h1 id="②-css-구성-1">② CSS 구성 (1)</h1>
<h3 id="box-sizing-">box-sizing :</h3>
<p>박스에 적용된 사이즈의 기준 정하기이다.</p>
<p>브라우저에서 자동으로 설정해 띄워준다.</p>
<h4 id="content-box-">content-box :</h4>
<p>요소 사이즈에 패딩과 테두리를 포함하지 않는다.
처음 계획했던 값보다 박스 값이 커지는 현상이 발생한다.
실제로 보여지는 길이에는 패딩이 포함되기 때문이다.</p>
<h4 id="border-box-">border-box :</h4>
<p>요소 사이즈에 패딩과 테두리의 길이와 높이를 포함한다.
사용자가 설정한 값이 박스와 패딩값을 포함한 값으로 인식한다.
패딩사이즈로 인해 외곡되는 현상을 방지할 수 있다.</p>
<hr>
<h1 id="③-css-구성-2">③ CSS 구성 (2)</h1>
<h3 id="규칙-rule-">규칙 rule :</h3>
<p>선택자부터 속성, 값 까지 모두 합친 하나의 블록을 의미한다.</p>
<h3 id="선택자-selector-">선택자 selector :</h3>
<p>어떤 html 요소에 스타일을 적용할 지 선택한다. 
부여하는 속성의 주체값-태그-를 의미한다.</p>
<h3 id="속성-property-">속성 property :</h3>
<p>스타일을 부여할 항목을 의미한다.</p>
<h3 id="값-">값 :</h3>
<p>속성에 해당되는 특성의 값을 의미한다. px일 수도, color일수도 있다.</p>
<h3 id="선언-declaration-">선언 declaration :</h3>
<p>속성과 값을 합한 부분이다. </p>
<h2 id="❔-어떤-요소에-스타일링을-적용할까">❔ 어떤 요소에 스타일링을 적용할까?</h2>
<p>아래는 예시를 위해 작성된 html 코드이다. </p>
<pre><code class="language-html">&lt;h1&gt;모두를 위한 코딩 강의 - 테킷&lt;/h1&gt;
&lt;div&gt;
    &lt;p class=&quot;student&quot;&gt;피눈물나는 코딩&lt;/p&gt;
    &lt;h2 class=&quot;student&quot;&gt;멋쟁이사자처름 스쿨&lt;/h2&gt;
    &lt;h2 class=&quot;original&quot;&gt;오리지널 클래스&lt;/h2&gt;j
&lt;/div&gt;</code></pre>
<p>이를 바탕으로 css 파일의 코드를 작성할 수 있다.</p>
<h3 id="-universal-">* universal :</h3>
<p>모든 요소 전체를 의미한다.
가급적 사용하지 않는다.</p>
<h3 id="여러-종류의-태그에-적용">여러 종류의 태그에 적용</h3>
<pre><code class="language-html">h2, p {
...
}</code></pre>
<p>이와 같이 선택자 부분에 여러 태그를 작성할 수 있다.</p>
<h3 id="특정-클래스에-해당되는-요소에-적용">특정 클래스에 해당되는 요소에 적용</h3>
<pre><code>.student {
...
}</code></pre><p>특정 태그하위의 class 에 해당 css를 적용한다. 
태그가 달라도 괜찮다.</p>
<pre><code>h2.student {
...
}</code></pre><p>특정 태그 하위에 여러 class 중 특정 class에 대해서만 css를 적용할 수 있다.</p>
<h3 id="특정-아이디에-해당되는-요소에-적용">특정 아이디에 해당되는 요소에 적용</h3>
<pre><code>#original {
...
}</code></pre><p>특정 아이디일 경우에는 #를 이용해서 활용한다.</p>
<blockquote>
<h3 id="">#</h3>
<p>id 를 나타낼 때 사용한다</p>
</blockquote>
<blockquote>
<h3 id="-1">.</h3>
<p>class 를 나타낼 때 사용한다</p>
</blockquote>
<h3 id="부모-요소-내-특정-자식요소">부모 요소 내 특정 자식요소</h3>
<pre><code>div p {
...
}</code></pre><p>div 라는 태그 내 자식요소인 p 태그를 의미할 때는 스페이스를 이용한다.</p>
<blockquote>
<h3 id="주석">주석</h3>
<p>/* ... */ </p>
</blockquote>
<hr>
<h1 id="④-css-특성">④ CSS 특성</h1>
<h3 id="동일-태그-규칙이-중복-작성-➡-마지막에-작성된-규칙-적용">동일 태그 규칙이 중복 작성 ➡ 마지막에 작성된 규칙 적용</h3>
<h3 id="부모-태그-규칙-적용-➡-자식-요소에-동일-규칙-적용">부모 태그 규칙 적용 ➡ 자식 요소에 동일 규칙 적용</h3>
<h3 id="부모-태그-규칙과-자식-요소에-다른-규칙-적용-➡-자식-요소의-규칙으로-적용">부모 태그 규칙과 자식 요소에 다른 규칙 적용 ➡ 자식 요소의 규칙으로 적용</h3>
<h3 id="html-파일-자체에-스타일요소에-규칙을-줄-수-있다">html 파일 자체에 스타일요소에 규칙을 줄 수 있다.</h3>
<p>하지만 추후 유지보수 과정에서 힘들어지기때문에, css 파일에서 변화를 주는 것을 추천한다.</p>
<hr>
<h1 id="⑤-box-model">⑤ Box Model</h1>
<p>디스플레이 속성으로 inline, block, inline-block 등이 있다.</p>
<h3 id="inline">inline</h3>
<p>자기 자신의 영역 만큼만 콘텐츠에 변화를 준다.
한 줄에 이어서 표시된다.
좌우의 마진이나 패딩값은 설정 가능하나, 상하의 경우에는 변화가 불가능하다.</p>
<pre><code>&lt;a&gt; &lt;img&gt; &lt;span&gt;
</code></pre><h3 id="block">block</h3>
<p>자기 자긴의 부모만큼의 넓이를 가진다.
개별요소마다 줄을 바꾼다.
width와 height로 요소의 크기를 조절할 수 있다. 
내용과 별개로 자신의 영역을 가진다. </p>
<blockquote>
<h3 id="block-가지지만-inline-가지지-못하는-것">block 가지지만, inline 가지지 못하는 것</h3>
</blockquote>
<ul>
<li>width, height (상하 padding은 레이아웃에 적용x</li>
<li>margin, padding (inline은 좌우만 적용)</li>
</ul>
<h3 id="inline-block">inline-block</h3>
<p>inline과 block의 절충안이다.
두 가지의 특징을 모두 가진다.
줄을 바꾸지 않는다
width, height를 가지고 margin과 padding 또한 가진다.</p>
<h2 id="box-model">box-model</h2>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/4c9abca4-89cb-4b33-a750-0dad858bf0dc/image.png" alt=""></p>
<h3 id="margin">margin</h3>
<p>상하좌우 각각 스페이스값으로 분리해 다른 값을 적용할 수도 있고, 전체에 동일한 값으로 견화를 줄 수 있다. </p>
<pre><code>margin: 상 우 하 좌 ;
margin-top: ;
margin-right: ;
margin-bottom: ;
margin-left: ;</code></pre><p>위 와 같은 순서로, 윗쪽부터 시계방향으로 이동해 값을 설정할 수 있다.</p>
<h3 id="border">border</h3>
<p>하나의 속성에 두께, 유형, 색상을 적용할 수 있다.</p>
<pre><code>border: 두께 유형 색상;
border-width: ;
border-type: ;
border-color: ;</code></pre><h3 id="padding">padding</h3>
<p>하나의 속성에 위쪽부터 시계방향으로 이동해 값을 부여한다.</p>
<pre><code>padding: 상 우 하 좌 ;
padding-top: ;
padding-right: ;
padding-bottom: ;
padding-left: ;</code></pre><hr>
<h1 id="⑥-box-sizing">⑥ Box sizing</h1>
<p>박스에 적용된 사이즈의 기준을 정하는 방법</p>
<p>② CSS 구성 (1) 과 동일한 내용이다</p>
<hr>
<h1 id="⑦-css-단위">⑦ CSS 단위</h1>
<h3 id="px">px</h3>
<p>스크린을 구성하는 작은 점인 pixcel을 기준이다.</p>
<h3 id="-2">%</h3>
<p>부모요소를 기준으로 크기를 결정한다.</p>
<h3 id="emrem">em/rem</h3>
<p>폰트 크기에 비례해서 크기를 결정한다.
상위요소에 em 혹은 rem 값을 곱해서 결정한다.</p>
<blockquote>
<h3 id="em">em</h3>
<p>부모요소의 폰트 크기를 기준으로 </p>
<h3 id="rem">rem</h3>
<p>루트 요소-html의 폰트 크기를 기준으로</p>
</blockquote>
<h3 id="vwvh">vw/vh</h3>
<p>내가 보고있는 브라우저 영역을 가득채워 만든다.
스크롤로 하단의 컨텐츠로 이동한다.</p>
<blockquote>
<h3 id="vw">vw</h3>
<p>각 디바이스별 화면의 너비/높이를 기준으로 %를 차지하도록</p>
</blockquote>
<hr>
<h1 id="⑧-이미지-다루기">⑧ 이미지 다루기</h1>
<p>코드에 이미지를 담는 코드는 아래와 같다.</p>
<pre><code>  &lt;div&gt;
    &lt;img
         src=&quot;이미지 경로&quot;
         alf=&quot;이미가 정상적으로 보이지 않을 경우 보일 문구&quot;
     &gt;
  &lt;/div&gt;</code></pre><p>이미지의 크기 등을 css 파일에서 조정할 수 있다.</p>
<ul>
<li>이미지가 화면 크기에서 벗어나지 않도록 하고싶다면 :<pre><code>    img {
        max-width: 100%;
    }</code></pre></li>
</ul>
<ul>
<li><p>이미지를 부모요소 영역의 가운대로 확대/축소 하고싶다면 :</p>
<pre><code>    img {
        objec-fit: cover;
    }</code></pre></li>
<li><p>이미지의 비율을 지키면서 부모요소 영역의 가운대로 확대/축소 하고싶다면 :</p>
<pre><code>    img {
        objec-fit: contain;
    }</code></pre></li>
<li><p>이미지의 비율을 유지하지 않고 부모요소 크기에 맞춰 변경해 채우고 싶다면 :</p>
<pre><code>    img {
        objec-fit: fill;
    }
</code></pre></li>
</ul>
<pre><code>


---

# ⑨ Overflow

* scroll을 속성값으로 주어 웹 페이지에 가로/세로로 스크롤을 제공할 수 있다.
scroll-x로 가로부분만 보이도록, scroll-y로 세로 부분만 보이도록 만들 수 있다.

* auto 로 브라우저가 자체 스크린 크기에 맞춰서 알아서 스크롤을 보이도록 만들 수 있다.


---
# ⑩ 폰트 꾸미기

### color: ;
16진수의 숫자로 조합해 #000000 등으로 내타낸다

### font-size: 10px;
px 단위로 나타낼 수 있다.

### font-style: ;
italic 으로 기울임을 나타낼 수 있다.

### font-weight: ;
100~900 으로 100 단위로 thin 부터 black 으로 폰트의 두께를 바꿀 수 있다.

### text-decoration: ;
밑줄을 제거하고 싶다면 none 값을 부여하면 된다.
&gt; #### a:link { color: ;} 
클릭한 적 없는 링크를 표현할 수 있다.

&gt; #### a:visited { color: black; } 
클릭해 방문한 적있는 링크를 표현할 수 있다.






---
# ⑪ 테두리 꾸미기

border 속성에 두께, 스타일, 색상 값을 부여해 테두리를 꾸밀 수 있다.

&gt; border-radius
특정 각도로 둥글게 깎을 수 있다.


---
# ⑫ 배경 이미지 설정 

### background-color
배경 색상을 블록 전체에 부여한다.

### background-image: url(이미지 경로);
기본값은 바둑판식 채우기이다.
&gt; background-repeat: no-repeat;
단일 이미지를 꽉 채우고 싶다면 

&gt; background-size
&gt;&gt;: contain;
이미지가 온전히 표시되는 것이 우선된다면
&gt;&gt;: cover;
요소의 배경을 모두 덮고 싶다면

&gt; background-position: center;
이미지를 가운데 배치시키고 싶다면


❕ 이미지를 레이아웃에 맞는 해상도로 크롭해서 사용하는 것이 제일 좋다




---
# ⑬ 요소 정렬하기 

###  요소를 위로 맞추되 가운데 정렬</code></pre><pre><code>    margin: 0 auto;</code></pre><pre><code>부모 block요소의 width를 기준으로 자동 margin 계산 (단, 부모가 width 요소값이 존재해야 한다.)


### 이미지 및 텍스트의 인라인 요소를 블록 요소 내 가운데 정렬

</code></pre><pre><code>    text-align: center;</code></pre><pre><code>부모 요소가 block이고 자식 요소가 inline이다.







---
더 다양한 강의노트 및 강좌 후기 👉🏻 https://blog.naver.com/jimin201396 


</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[멋쟁이사자처럼 | [대학 11기] 프론트엔드 온보딩 트랙 강의리뷰 : 챕터 6]]></title>
            <link>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-6</link>
            <guid>https://velog.io/@dung-dung/%EB%A9%8B%EC%9F%81%EC%9D%B4%EC%82%AC%EC%9E%90%EC%B2%98%EB%9F%BC-%EB%8C%80%ED%95%99-11%EA%B8%B0-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EC%98%A8%EB%B3%B4%EB%94%A9-%ED%8A%B8%EB%9E%99-%EA%B0%95%EC%9D%98%EB%A6%AC%EB%B7%B0-%EC%B1%95%ED%84%B0-6</guid>
            <pubDate>Wed, 29 Mar 2023 13:39:13 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dung-dung/post/c3ea16bd-b226-4efe-ac84-d1f2415cf096/image.png" alt=""></p>
<h4 id="테킷스쿨에는-멋쟁이사자처럼-대학11기프론트엔드-온보딩-트랙-강의가-있습니다">테킷스쿨에는 멋쟁이사자처럼 <a href="https://techit.education/my/courses"><strong>[대학11기]프론트엔드 온보딩 트랙 강의</strong></a>가 있습니다.</h4>
<h4 id="멋쟁이사자처럼-대학-동아리에-소속되어-활동을-시작하며-이-강의를-수강할-수-있게-되었습니다"><strong>멋쟁이사자처럼 대학 동아리</strong>에 소속되어 활동을 시작하며, 이 강의를 수강할 수 있게 되었습니다.</h4>
<h4 id="이번에-리뷰하려는-것은-조경민-강사의-✨챕터-6--html-beginner✨-입니다">이번에 리뷰하려는 것은 조경민 강사의 ✨<strong>챕터 6 : HTML Beginner</strong>✨ 입니다.</h4>
<hr>
<h1 id="①-html-구성">① HTML 구성</h1>
<p>HyperTextg Markup Language, 즉 다른 페이지로 이동하는 링크를 제공할 수 있을 뿐 아니라 텍스트에 제목, 내용 등을 구분하는 역할-태그를 통해 텍스트에 생명을 불어넣는 역할을 한다.</p>
<h3 id="mark-up-">Mark UP :</h3>
<p>마크업 작업을 통해 태그를 넣어 문장의 의미나 쓰임을 결정해준다.</p>
<pre><code class="language-html">&lt;p class\&gt;멋쟁이사자처럼 입니다 :) &lt;/p&gt;</code></pre>
<p>태그와 내용으로 구성되어있습니다. </p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/c038bc4e-156c-4f9e-be14-881c7f0d3df6/image.png" alt=""></p>
<p>여기에 아래와 같이 속성이름=&quot;속성값&quot;을 추가해 수정할 수 있습니다.</p>
<pre><code class="language-html">&lt;p class=&quot;memo&quot;&gt;멋쟁이사자처럼 입니다 :) &lt;/p&gt;</code></pre>
<h3 id="주석-">주석 :</h3>
<p>작성되어있는 코드이지만, 실제 프로그래밍에는 포함되지 않는 코드 </p>
<h3 id="boilerpalte-">Boilerpalte :</h3>
<p>반복적인 코드 등의 구성을 의미한다.</p>
<hr>
<h1 id="②-html-head">② HTML <head></h1>
<p>  html 문서에 대한 설정 정보 코드는 다음과 같다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;URF-8&quot;&gt; //인코딩 방식
  &lt;meta http-eqiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt; // 기기마다 다른 브라우저 크기 조정
  &lt;title&gt;Title&lt;/title&gt; // 브라우저의 탭 제목
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h3 id="head-">head :</h3>
<p>  웹 문서의 인코딩 설정 값이나 외부에서 가져오는 값 자체에 대한 정보</p>
<hr>
<h1 id="③-블록-요소와-인라인-요소">③ 블록 요소와 인라인 요소</h1>
<h3 id="block-element-">Block Element :</h3>
<p>  태그 자체에서 면을 차지하는 요소이다.</p>
<pre><code class="language-html">  &lt;h1&gt; &lt;h2&gt; &lt;div&gt;   </code></pre>
<h3 id="inline-element-">Inline Element :</h3>
<p>  선을 나누는 요소이다.</p>
<pre><code class="language-html"> &lt;a&gt; &lt;span&gt;</code></pre>
<hr>
<h1 id="④-html">④ HTML</h1>
<h3 id="body-">&lt;body&gt; :</h3>
<p> 실제 브라우저에서 보이는 내용에 해당한다.</p>
<p>   브라우저에서 제목 등을 의미하는 헤딩태그는 아래와 같이 표시한다.</p>
<pre><code class="language-html"> &lt;heading&gt; </code></pre>
<p> 그 예시로는 아래와 같은 태그가 있지만, 글씨를 키우려는 목적으로 사용하지 않는다. 이와 같은 목적이라면 css를 조정해야 한다.</p>
<pre><code class="language-html">   &lt;h1&gt;대제목        
   &lt;h2&gt;소제목        
   &lt;h3&gt;
   &lt;h4&gt;</code></pre>
<h3 id="p-">&lt;p&gt; :</h3>
<p>   paragraph 는 하나의 문단으로 구성해 글을 나타낼 때 필요하다.</p>
<h3 id="br-">&lt;br&gt; :</h3>
<p>  줄바꿈을 할 때 태그 사이에 넣어 작성한다. </p>
<h3 id="list-">list :</h3>
<p> 순서를 매기는 태그로 &lt;ol&gt;,
 리스트를 만드는 태그로 &lt;li&gt;, &lt;ul&gt; 태그가 있다. </p>
<h3 id="a-">&lt;a&gt; :</h3>
<p> 하이퍼텍스트 테그로, url을 넣어 원하는 곳으로 보낼 수 있다.
 다른 요소와 함께 쓰이는 경우가 많다.</p>
<pre><code class="language-html">     &lt;a href=&quot;연결할 링크&quot; target=&quot;_blank&quot;&gt;프론트엔드 스쿨&lt;/a&gt; </code></pre>
<p> 위와 같은 문장을 통해, 프론트엔드 스쿨이라는 부분을 누르면 해당 링크로 새 페이지에서 열 수 있다.     </p>
<h3 id="span-">&lt;span&gt; :</h3>
<p> class 속성을 통해서 css나 js에 쓰일 이름을 더해줄 때 사용된다.
 단독보다 다른 속성과 함께 쓰인다.    </p>
<hr>
<h1 id="⑤-html-실습">⑤ HTML 실습</h1>
<p>  본격적인 실습에 앞서서, VSCODE을 편집기로 사용해 index.html 파일을 만들어준다. 
     <img src="https://velog.velcdn.com/images/dung-dung/post/f72d1b2c-17ef-465c-ae3b-2c410310736a/image.png" alt=""></p>
<blockquote>
<p> TIP!
     추가 파일을 잘 다운로드 했다면, &#39;!&#39; 느낌표 + enter 으로 기본적인 html 구조가 자동으로 작성된다. </p>
</blockquote>
<p>   코드는 아래와 같이 작성해준다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;

&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot; /&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &lt;title&gt;멋쟁이사자처럼&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;!-- 표제 --&gt;
    &lt;h1&gt;모두를 위한 코딩 강의 - 테킷&lt;/h1&gt;

    &lt;div&gt;
        &lt;!-- 부제 --&gt;
        &lt;h2&gt;멋쟁이사자처럼 스쿨&lt;/h2&gt;

        &lt;p&gt;멋쟁이사자처럼 스쿨이 &lt;br /&gt;여러분을 환영합니다.&lt;/p&gt;

        &lt;!-- &lt;p&gt;임금님 귀는 당나귀 귀!&lt;/p&gt; --&gt;

        &lt;ol&gt;
            &lt;li&gt;
                &lt;a href=&quot;https://techit.education/school/kdt-frontend-6th&quot;&gt;
                    프론트엔드 스쿨
                &lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href=&quot;https://techit.education/school/kdt-backend-6th&quot; target=&quot;_blank&quot;&gt;
                    백엔드 스쿨
                &lt;/a&gt;
            &lt;/li&gt;
            &lt;li&gt;
                &lt;a href=&quot;#&quot;&gt; 블록체인 스쿨 &lt;/a&gt;
            &lt;/li&gt;
        &lt;/ol&gt;
    &lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>
<blockquote>
<p>TIP!
     주석 처리는 crl+/ 으로 추가와 삭제가 가능하다. 마우스 커서가 있는 한 줄 자체가 될 수 있다. </p>
</blockquote>
<blockquote>
<p>TIP!
     마우스 우클릭 후 &#39;문서 서식&#39; 혹은 &#39;format&#39; 기능으로 문서 들여쓰기를 수정할 수 있다.</p>
</blockquote>
<p>실행 결과는 아래와 같다!</p>
<p><img src="https://velog.velcdn.com/images/dung-dung/post/a4233ab8-6a54-4f7e-9a8d-f9989054f9f3/image.png" alt=""></p>
<hr>
<p>더 다양한 강의노트 및 강좌 후기 👉🏻 <a href="https://blog.naver.com/jimin201396">https://blog.naver.com/jimin201396</a> </p>
]]></description>
        </item>
    </channel>
</rss>