<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>devdeok.log</title>
        <link>https://velog.io/</link>
        <description>궁금하거나 추가해야 되는 부분 있으면 댓글 달아주세요~</description>
        <lastBuildDate>Mon, 25 Apr 2022 16:17:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>devdeok.log</title>
            <url>https://images.velog.io/images/re-deok/profile/3af6ed93-8f50-4985-9b99-3b5f988a5a06/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. devdeok.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/re-deok" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Principles of application layer]]></title>
            <link>https://velog.io/@re-deok/Principles-of-application-layer</link>
            <guid>https://velog.io/@re-deok/Principles-of-application-layer</guid>
            <pubDate>Mon, 25 Apr 2022 16:17:34 GMT</pubDate>
            <description><![CDATA[<p><strong>Application layer</strong></p>
<p><strong>Conceptual, implementation aspects of network application protocols</strong></p>
<p>Client-server paradigm</p>
<p>Peer-to-peer paradigm</p>
<p>Transport-layer service models</p>
<hr>
<p><strong>Server</strong></p>
<p>Always on host</p>
<p>Permanent IP address</p>
<p>Data centers for scaling</p>
<hr>
<p><strong>Clients</strong></p>
<p>Communicate with server</p>
<p>May be intermittently connected</p>
<p>May have dynamic IP addresses</p>
<p>Do not communicate directly with each other</p>
<hr>
<p><strong>P2P architecture</strong></p>
<p>No always on server</p>
<p>Arbitrary end systems directly communicatee</p>
<p>Peers request and provide service</p>
<p>“Self scalability”</p>
<p>new peers bring new service capacity, as well as new service demands</p>
<p>새로운 peer가 늘어나면 전송 속도가 빨라짐</p>
<p>Peers are intermittently connected and change IP address</p>
<hr>
<p><strong>Process communicating</strong></p>
<p><strong>Process</strong> : program running within a host</p>
<p>Within same host, inter-process communication (defined by OS)</p>
<p><strong>client process</strong> initiates communication</p>
<p><strong>server process</strong> waits to be contacted</p>
<hr>
<p><strong>Sockets</strong></p>
<p>Process sends/receives messages to/from its <strong>socket</strong></p>
<p>Socket analogous to door</p>
<p><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7eb7f2c3-3a2b-4cf6-ae39-2b4c91a1ee47%2FUntitled.png?table=block&id=2d22223f-decc-4033-ad97-8580d00fc8a6&spaceId=ca403c46-29f7-46a8-88f9-bef16b04553e&width=1920&userId=6f86fa7a-34c9-44ce-87f7-e399ac605399&cache=v2" alt="Untitled"></p>
<hr>
<p><strong>Addressing processes</strong></p>
<p>To receive messages, process must have identifier</p>
<p>Host → 32-bit IP address (IPv4)</p>
<p>identifier = (IP address, port number)</p>
<p><strong>example port numbers</strong> :</p>
<p>HTTP server : 80</p>
<p>Mail server : 25</p>
<p><strong>To send HTTP message to <a href="http://gaia.cs.umass.edu">http://gaia.cs.umass.edu</a> web server :</strong></p>
<p>IP address : 128.119.245.12</p>
<p>port number : 80</p>
<hr>
<p><strong>App-layer protocol defines</strong></p>
<p><strong>Types of messages exchanged</strong></p>
<p>e.g. Request, response</p>
<p><strong>Message syntax</strong></p>
<p>What field in messages &amp; how fields are delineated</p>
<p><strong>Message semantics :</strong></p>
<p>Meaning of information in fields</p>
<p><strong>Rules</strong></p>
<p>When and how processes send &amp; respond to message</p>
<p><strong>Open protocols :</strong></p>
<p>Defined in RFCs</p>
<p>e.g. HTTP, SMTP</p>
<p><strong>Proprietary protocols :</strong></p>
<p>e.g. Skype</p>
<hr>
<p><strong>Characteristics of Applications</strong></p>
<p><strong>Data Integrity</strong></p>
<p>100% 신뢰할 수 있는 데이터 전송 - e.g. file transfer, web transactions</p>
<p>데이터 손실의 관용(tolerant) - e.g. voice, video application</p>
<p><strong>Timing</strong></p>
<p>효율적으로 사용하기 위한 낮은 지연시간 - e.g. Internet telephony, interactive games</p>
<p><strong>Throughput</strong></p>
<p>효율적으로 사용하기 위한 최소 전송량(throughput)</p>
<p>사용자가 얻을 어떠한 전송량(whatever throughput)</p>
<p><strong>Security</strong></p>
<p>암호화(Encryption), 데이터 무결성(data integrity)</p>
<hr>
<p><strong>TCP(Transmission Control Protocol) service</strong> :</p>
<p><strong>신뢰있는 전송, Reliable transport</strong> : 전송 중 데이터의 손실이 없게끔 함</p>
<p><strong>흐름 제어, Flow control</strong> : Receiver가 데이터를 받을 때 수용하지 못하고 버려지는 상황을 없게 함</p>
<p><strong>혼잡 제어, Congestion control</strong> : 라우터의 queue에서 오래 대기를 하지 않게 하거나 데이터가 버려지지 않게 함</p>
<p><strong>연결지향, Connection-oriented</strong> : source가 destination으로 보낼 때 destination이 받을 수 있는 상태인지 확인하고 보냄</p>
<p>Does not porvide : timing, minimum throughput guarantee, security</p>
<hr>
<p><strong>UDP(User Datagram Protocol) service</strong> :</p>
<p><strong>비신뢰성, Unreliable</strong></p>
<p>Does not  provide : reliability, flow control, congestion control, timing, throughput guarantee, security, or connection setup</p>
<p><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffce977de-f8ba-41aa-91ba-afb4e6c791fd%2FUntitled.png?table=block&id=43d3cc36-6258-4a2a-9a39-ab506675bdc6&spaceId=ca403c46-29f7-46a8-88f9-bef16b04553e&width=1920&userId=6f86fa7a-34c9-44ce-87f7-e399ac605399&cache=v2" alt="Untitled"></p>
<hr>
<h3 id="quiz">Quiz</h3>
<p><strong>Network 기반 application들의 상호작용 모델은 크게, client-server model과 peer-to-peer model이 있다. 이 두 모델의 차이점을 두 모델의 차이점을 두 문장 내외로 기술하시오.</strong></p>
<p>서버가 컨텐츠를 가지고 있고 클라이언트에게 주는 방식</p>
<p>서버가 컨텐츠를 가지고 있지만 엔드시스템인 사용자에게도 컨텐츠가 복제되어있음. 그렇기 때문에 사용자가 다른 사용자에게 컨텐츠를 제공할 수 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Protocol layers]]></title>
            <link>https://velog.io/@re-deok/Protocol-layers</link>
            <guid>https://velog.io/@re-deok/Protocol-layers</guid>
            <pubDate>Mon, 25 Apr 2022 16:14:48 GMT</pubDate>
            <description><![CDATA[<p><strong>Internet protocol stack</strong></p>
<p><strong>Application</strong> : supporting network application e.g. FTP, SMTP, HTTP</p>
<p>서비스가 실현되기 위해 client와 server간에 어떠한 데이터를 보낼 것인지 정함</p>
<p><strong>Transport</strong> : process-process data transfer e.g. TCP, UDP</p>
<p>end to end로 잘 전송되게끔 하는 것</p>
<p><strong>Network</strong> : routing of datagrams from source to destination e.g. IP, routing protocols</p>
<p>link들이 모여서 network가 됨</p>
<p><strong>Link</strong> : data transfer between neighboring network elements e.g. Ethernet, 802.11 (WiFi), PPP</p>
<p>각각의 router들 사이에 link가 존재</p>
<p><strong>Physical</strong> : bits “on the wire”</p>
<hr>
<p><strong>ISO/OSI reference model (모범답안)</strong></p>
<p><strong>Presentation</strong> : allow applications to interpret meaning of data</p>
<p>e.g. eencryption, compression, machine-specific conventions</p>
<p><strong>Session</strong> : synchronization, checkpointing, recovery of data exchange</p>
<p><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7d5d4f52-b988-4d39-95ac-c1ad49603c67%2FUntitled.png?table=block&id=f6f83e0e-2266-4d2f-8295-b0f0a303b540&spaceId=ca403c46-29f7-46a8-88f9-bef16b04553e&width=1920&userId=6f86fa7a-34c9-44ce-87f7-e399ac605399&cache=v2" alt="Untitled"></p>
<hr>
<p><strong>Comparison of OSI and TCP/IP Protocol ARchitecture</strong></p>
<p><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9f6fda67-c5f5-4d1b-9c27-9ae5bfb6e21b%2FUntitled.png?table=block&id=821eedb2-0b17-4b54-95ff-0a09032db22b&spaceId=ca403c46-29f7-46a8-88f9-bef16b04553e&width=1920&userId=6f86fa7a-34c9-44ce-87f7-e399ac605399&cache=v2" alt="Untitled"></p>
<p><strong>application</strong> : DNS, HTTP, SMTP, FTP, POP, BitTorrent, DHT</p>
<p><strong>transport</strong> : UDP, TCP, SCTP, DCCP</p>
<p><strong>network</strong> : RIP, OSPF, BGP, PIM-SM, DVMRP, ICMP, IGMP, IPv4, IPv6, DHCP</p>
<p><strong>link</strong> : ARP, Ethernet, IEEE 802.11</p>
<hr>
<p><strong>Why Layering - Example</strong></p>
<p><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4566f8b0-ea6c-49d3-b537-b0fe59eeb34c%2FUntitled.png?table=block&id=8a8b6331-7936-4ae1-9981-31674ba0f3cb&spaceId=ca403c46-29f7-46a8-88f9-bef16b04553e&width=1920&userId=6f86fa7a-34c9-44ce-87f7-e399ac605399&cache=v2" alt="Untitled"></p>
<hr>
<p><strong>Encapsulation</strong></p>
<p><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffeff2464-54a8-49ac-bfb7-4b8b557621f8%2FUntitled.png?table=block&id=f0049bff-cd9c-4cb5-ac9e-5e32f2041e01&spaceId=ca403c46-29f7-46a8-88f9-bef16b04553e&width=1920&userId=6f86fa7a-34c9-44ce-87f7-e399ac605399&cache=v2" alt="Untitled"></p>
<p><strong>Segment</strong> : Ht | Message → transport</p>
<p><strong>Datagram</strong> : Hn | Ht | Message→ network</p>
<p><strong>Frame</strong> : Hl | Hn | Ht | Message → link</p>
<ul>
<li>H : Header</li>
</ul>
<hr>
<h3 id="quiz">Quiz</h3>
<p><strong>Protocol stack에서 layer의 순서가 중요한가? 중요하다면 왜 중요한지, 중요하지 않다면 왜 중요하지 않은지 기술하시오.</strong></p>
<ul>
<li><strong>Internet protocol stack과 OSI reference model과의 차이가 무엇인가?</strong></li>
</ul>
<pre><code>OSI는 실제로 서비스가 돌아가는 걸 만듦

Internet stack “missing” these layers

if needed, must be implemented in application</code></pre><ul>
<li><p><strong>Protocol들이 계층적 관계를 갖고 있어서 가질 수 있는 장점은 무엇인가?</strong></p>
<p>  각각의 layer에 있는 기능들을 독립적으로 구현, 중복된건 역할분담</p>
</li>
<li><p><strong>Protocol들이 계층적 관계를 갖고 있어서 초래되는 한계는 무엇인가?</strong></p>
<p>  불필요한 기능을 이용해야 할 경우 발생</p>
<p>  overhead 증가</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[delay, throughput]]></title>
            <link>https://velog.io/@re-deok/delay-throughput</link>
            <guid>https://velog.io/@re-deok/delay-throughput</guid>
            <pubDate>Fri, 22 Apr 2022 18:57:14 GMT</pubDate>
            <description><![CDATA[<p><strong>ISP(Internet Service Provider)</strong></p>
<p>packet switching을 사용하기 때문에 여러 사용자가 데이터를 보내므로 지연시간과 버려지는 데이터가 발생함</p>
<hr>
<p><strong>Packet queue in router buffers</strong></p>
<p>Packet arrival rate to link (temporarily) exceeds output link capacity</p>
<p>Packet queue, wait for turn</p>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/a4671480-7520-475b-b8af-61ac5ad8950e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220422%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220422T185502Z&X-Amz-Expires=86400&X-Amz-Signature=35ded791e5468f917a7741b7c8402fb0bafcc77ca451c6227e7ba47112c69532&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<p>컴퓨터이기 때문에 비어있는 메모리 공간이 가득차게 되면 버려지는 데이터가 존재함</p>
<hr>
<p><strong>Four sources of packet delay</strong></p>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/d8427409-8ec0-43fd-ab80-b248cfc295c4/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220422%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220422T185510Z&X-Amz-Expires=86400&X-Amz-Signature=ee2fa55ae14390b26a2f10907f110bde4dc4eedcc30a8c822e258e559a986143&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/c53ffa7f-d6dc-4b10-8e9f-ee57fba2fa07/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220422%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220422T185652Z&X-Amz-Expires=86400&X-Amz-Signature=5399391709a3fe44856b9fbf4bc656f78c06886b6bd57e87ff29ad011a2128e5&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<hr>
<p><strong>Queueing delay</strong></p>
<p><strong>Throughput</strong></p>
<p>sender와 receiver가 통신할 때 전송되는 데이터의 rate</p>
<hr>
<h3 id="quiz">Quiz</h3>
<p>** A---------N1---------N2---------B **</p>
<p>** 위 그림과 같이 A와 B가 두 개의 라우터를 걸쳐 연결이 되어 있다.**</p>
<p><strong>3.1. L bytes 크기의 packet을 A에서 전송하기 시작해서 B에 도착하기까지의 지연 시간을 계산하는 데에, 각 전송 단계에서 nodal delay 네가지 요소들 중 어떤 요소들이 고려되어야 하는지 적으시오. 즉, A→N1, N1→N2, N2→B 각 단계에 대해서 기술하시오.</strong></p>
<p>Four sources of packet delay 참고</p>
<p><strong>3.2 Nodal delay 네가지 요소 중에서 가장 가변적인 것이 무엇인가? 그 이유는 무엇인가?</strong></p>
<p>Queueing, 사용자가 데이터를 보내므로 가변적임</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Network core]]></title>
            <link>https://velog.io/@re-deok/Network-core</link>
            <guid>https://velog.io/@re-deok/Network-core</guid>
            <pubDate>Fri, 22 Apr 2022 18:52:08 GMT</pubDate>
            <description><![CDATA[<p><strong>Network edges</strong></p>
<p>Hosts : clinets and servers</p>
<p>Serves often in data centers</p>
<hr>
<p><strong>Access networks, physical media</strong></p>
<p><strong>Access network</strong> : 인터넷에 접속하기 위한 네트워크, <strong>end systems</strong>(moblie network, home network, Institutional network)</p>
<p>Wired, wireless communication links</p>
<hr>
<p><strong>Network core</strong></p>
<p><strong>global ISP, regional ISP</strong></p>
<p>Interconnected routers</p>
<p>Network of networks</p>
<hr>
<p><strong>Edge router</strong></p>
<p><strong>Access net work : hom network</strong></p>
<p>to/from headend or central office</p>
<p>cable or DSL modem</p>
<p>router, firewall, NAT</p>
<p>wired Ethernet(1 Gbps)</p>
<p>wireless access point (54 Mbps)</p>
<hr>
<p><strong>단말기 → eNB(중계망) → Centralized Core Network(S-GW → P-GW) → Internet</strong></p>
<p><strong>카톡의 원리(Distributed Core Network)</strong></p>
<p>단말기(나) → eNB(내 통신사) → eNB(카톡) → eNB(친구 통신사) → 단말기(친구)</p>
<p><strong>Network Edge : Data Center Network</strong></p>
<p><strong>Mesh of interconnected routers</strong></p>
<p><strong>Packet-switching</strong></p>
<p>Hosts break application-layer messages into packets</p>
<p>Froward packeys from oene router to the next</p>
<p>Across links on path from source to destination</p>
<p>Each packet transmitted at full link capacity</p>
<hr>
<p><strong>Store and forward</strong></p>
<p>Entire packet must arrive at router before it can be transmitted on next link</p>
<p><strong>bps</strong> = bits per second</p>
<p><strong>L</strong> = 7.5 Mbits, <strong>R</strong> = 1.5 Mbps</p>
<p>one-hop transmission delay = 5 sec (= L/R)</p>
<p>End-end delay = 2L/R (assuming zero propagation delay)</p>
<hr>
<p><strong>Queuing and loss</strong></p>
<p>If arrival rate (in bits) to link exceeds transmission rate of link for a period of time</p>
<p>Packets will queue, wait to be transmitted on link</p>
<p>Packets can be dropped (lost) if memory (buffer) fills up</p>
<hr>
<p><strong>Forwarding</strong></p>
<p>move packets from router’s input to appropriate router output</p>
<p>router는 경로를 어디로 내보내야 하는지 적혀 있어야 함</p>
<p>router는 local forwarding table을 가지고 있음</p>
<p>local forwarding table을 통해서 packet을 destination에 맞게 보냄</p>
<hr>
<p><strong>Routing</strong></p>
<p>determines source-destination route taken by packets</p>
<p>Routing algorithm (최소 경로)</p>
<hr>
<p><strong>FDM vs TDM</strong></p>
<p>FDM (Frequency Division)</p>
<p>TDM (Time Division)</p>
<hr>
<p><strong>Packet switching</strong></p>
<p>데이터를 보낼 때 packet단위로 보냄으로써 독점하지않고 효과적으로 데이터를 공유할 수 있음</p>
<p>circuit switching에서 call setup과 call close 사이에 자원이 낭비되는 일이 생겼지만 packet switching에서는 자원이 낭비되는 일이 없다.</p>
<p>e.g. </p>
<p><img src="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/d67b0eaf-9037-420b-8a39-129a2cf3aa5a/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220422%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220422T185126Z&X-Amz-Expires=86400&X-Amz-Signature=dfd04748381c9ee12d3c500618cf36c0458f464c416ee1f44782f457dea164e0&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject" alt="Untitled"></p>
<p>packet switching은 데이터를 간헐적으로 보낼 때 효율적으로 보낼 수 있다.</p>
<p>N을 통제하지 못한다면 router에 packet이 쌓여 delay가 발생함</p>
<p>단위 시간당 일정한 데이터가 보장되어야 함</p>
<p>circuit switching을 보완함</p>
<ul>
<li><p><strong>packet switching으로 인해서 얻는 이익과 생기는 부담에 대해서 설명</strong></p>
<ol>
<li><p><strong>store and forward</strong></p>
<p> 하나의 <strong>router</strong>를 기준으로 <strong>source</strong>가 X bits per packet을 보낼 때 <strong>router</strong>는 Y bps의 속도로 <strong>destination</strong>으로 보냄</p>
</li>
<li><p><strong>Queuing and loss</strong></p>
<p> 하나의 A router에 두개의 컴퓨터가 연결되어 있고 B router는 세개의 컴퓨터와 연결되어 있다.</p>
<p> 여기서 A router와 B router는 연결되어 있고 A router에 연결된 컴퓨터들이 B router에 연결된 컴퓨터들에게 데이터를 전송해주려고 할 때 router 사이의 속도가 상이하므로 queue를 만들어서 보냄</p>
</li>
<li><p>packet switching은 데이터를 간헐적으로 보낼 때 효율적으로 보낼 수 있다.</p>
</li>
<li><p>데이터가 연속적으로 올 경우 비효율적임.</p>
</li>
<li><p>데이터를 보내는 인원을 통제하지 못할 경우 라우터에 패킷이 쌓여 지연시간이 발생함</p>
</li>
</ol>
</li>
</ul>
<hr>
<h3 id="quiz">Quiz</h3>
<ul>
<li><p><strong>packet switching으로 인해서 얻는 이익과 생기는 부담에 대해서 설명</strong></p>
<ol>
<li><p><strong>store and forward</strong></p>
<p> 하나의 <strong>router</strong>를 기준으로 <strong>source</strong>가 X bits per packet을 보낼 때 <strong>router</strong>는 Y bps의 속도로 <strong>destination</strong>으로 보냄</p>
</li>
<li><p><strong>Queuing and loss</strong></p>
<p> 하나의 A router에 두개의 컴퓨터가 연결되어 있고 B router는 세개의 컴퓨터와 연결되어 있다.</p>
<p> 여기서 A router와 B router는 연결되어 있고 A router에 연결된 컴퓨터들이 B router에 연결된 컴퓨터들에게 데이터를 전송해주려고 할 때 router 사이의 속도가 상이하므로 queue를 만들어서 보냄</p>
</li>
<li><p>packet switching은 데이터를 간헐적으로 보낼 때 효율적으로 보낼 수 있다.</p>
</li>
<li><p>데이터가 연속적으로 올 경우 비효율적임.</p>
</li>
<li><p>데이터를 보내는 인원을 통제하지 못할 경우 라우터에 패킷이 쌓여 지연시간이 발생함</p>
</li>
</ol>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[What is the internet]]></title>
            <link>https://velog.io/@re-deok/What-is-the-internet</link>
            <guid>https://velog.io/@re-deok/What-is-the-internet</guid>
            <pubDate>Fri, 22 Apr 2022 18:33:40 GMT</pubDate>
            <description><![CDATA[<p><strong>Hosts</strong> = end systems</p>
<p><strong>Communication links</strong></p>
<p>Transmission rate : bandwidth</p>
<p><strong>Packet</strong> <strong>switches</strong></p>
<p><strong>packet</strong> : 요청과 응답이 오가는 과정의 데이터들이 잘라져서 보내짐. 이때 잘라진 단위를 packet이라함. 신호를 넘겨주는 switch들은 packet단위로 보내줌</p>
<p><strong>forward packet (chunks of data)</strong></p>
<p><strong>Routers and switches</strong> </p>
<p>global ISP : 다양한 국가들을 연결</p>
<p>regional ISP : 지역별 컴퓨터들이 연결</p>
<ul>
<li>Internet service provider</li>
</ul>
<hr>
<p><strong>Protocols</strong></p>
<p>Control sending and receiving of messages</p>
<p>e.g. TCP, IP, HTTP, Skype, 802.11</p>
<hr>
<p><strong>Internet standards</strong></p>
<p>인터넷은 표준임(표준은 철저히 테스트를 해놓은 것임)</p>
<p>Thoroughly tested specification</p>
<p>Formalized regulation that must be followed</p>
<p><strong>RFC</strong> : Request for comments</p>
<p><strong>IETF</strong> : Internet Engineering Task Force</p>
<hr>
<p><strong>network protocol</strong></p>
<p><strong>computer</strong> - TCP connection request → <strong>server</strong></p>
<p><strong>computer</strong> ← TCP connection response - <strong>server</strong></p>
<p><strong>computer -</strong> Get <a href="http://www.awl.com">http://www.awl.com</a> → <strong>server</strong></p>
<hr>
<p><strong>Internet Administration</strong></p>
<p><strong>ISOC</strong>(Internet Society) - <strong>IAB</strong>(Internet Architecture Board) - <strong>IRTF</strong>(IRSG-RG) / <strong>IETF</strong>(IESG-Area-WG)</p>
<hr>
<h3 id="quiz">Quiz</h3>
<p>** Internet에서 protocol의 역할이 무엇인지?**
<br></p>
<p>어떻게 보낼 것이며 언제 보낼건지, 어떻게 응답하고 어떻게 요청하는지를 정해주는 약속</p>
<p>각각의 서버에 접속하기 위해 공통으로 해야하는 일을 구분</p>
<p>인터넷의 입장에서 소프트웨어</p>
<p>둘 이상의 엔터티들이 성공적으로 상호작용하는 방법</p>
<p><strong>Protocols define format, order of msgs sent and received among network netities and actions taken on msg transmission, receipt</strong></p>
<hr>
<p>protocol은 국가간의 외교 절차, 병원에서의 진료 절차 등. 인터넷에 국한되지 않음. 오랫동안 해왔던 관습을 의미함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] Linux(EC2)에서 maven 빌드 중 나온 에러 사항 및 해결 방법]]></title>
            <link>https://velog.io/@re-deok/Maven-EC2Linux%EC%97%90%EC%84%9C-maven-%EB%B9%8C%EB%93%9C-%EC%A4%91-%EB%82%98%EC%98%A8-%EC%97%90%EB%9F%AC-%EC%82%AC%ED%95%AD-%EB%B0%8F-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@re-deok/Maven-EC2Linux%EC%97%90%EC%84%9C-maven-%EB%B9%8C%EB%93%9C-%EC%A4%91-%EB%82%98%EC%98%A8-%EC%97%90%EB%9F%AC-%EC%82%AC%ED%95%AD-%EB%B0%8F-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Wed, 03 Nov 2021 20:08:25 GMT</pubDate>
            <description><![CDATA[<h3 id="개요">개요...</h3>
<p> 팀프로젝트를 위해 AWS 사용방법을 익히고자 방학동안 만들었던 spring boot REST API를 EC2에 올려서 메이븐 빌드하는 과정에 생긴 <strong>에러사항</strong>을 기록하고자 한다.</p>
<h3 id="첫번째-에러">첫번째 에러</h3>
<blockquote>
<p>*<em>Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project myweb: The plugin org.apache.maven.plugins:maven-resources-plugin:3.2.0 requires Maven version 3.1.0 *</em></p>
</blockquote>
<p> 이 에러는 해결 방법이 간단하다. <code>pom.xml</code>파일에서 다음 코드를 작성하고 빌드하면 된다.</p>
<pre><code class="language-xml">    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;
                &lt;version&gt;3.1.0&lt;/version&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/build&gt;
&lt;&gt;</code></pre>
<h3 id="두번째-에러">두번째 에러</h3>
<blockquote>
<p><strong>Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project myweb: Fatal error compiling: invalid target release: 11</strong></p>
</blockquote>
<p><img src="https://images.velog.io/images/re-deok/post/1f36d538-0be0-4170-b3ac-7360860575e2/1.PNG" alt=""></p>
<p>이건 pom.xml에 작성된 자바 버전이 11이지만 ec2 서버의 자바 버전이 1.8이어서 나오게 되었다. 이것도 간단하다. ec2 서버의 자바 버전을 바꿔주면 된다.
서버는 linux이기 때문에 다음 명령어를 통해 자바 버전을 바꿔준다.</p>
<blockquote>
<p><strong>sudo yum list java*jdk-devel</strong> : 서버에서 설치할 수 있는 자바 버전을 나타낸다.
<strong>sudo yum install -y {java version}</strong> : 위 명령어를 통해 확인한 자바 버전을 설치한다.
<strong>sudo update-alternatives --config java</strong> : 설치한 자바 버전으로 바꾼다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/re-deok/post/c47316bd-5227-47ff-8e4a-0af59a025991/2.PNG" alt=""></p>
<p>바뀐 자바 버전은 <code>java -version</code> 명령어로 확인가능하다.
<img src="https://images.velog.io/images/re-deok/post/b6ec8047-c4bf-4130-b20c-a1489d5c3a3b/3.PNG" alt=""></p>
<p>아 근데 여기서 나는 허술하게 자바 컴파일러 버전은 냅둬버렸다...계속 위와 같은 에러 메시지가 계속 나와서 뒷골 땡겼었는데 자바 버전과 마찬가지로 컴파일러도 버전을 맞춰서 바꿔주면 된다...</p>
<blockquote>
<p><strong>sudo update-alternatives --config javac</strong> : 설치한 자바 버전으로 바꾼다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/re-deok/post/d39c10e9-c26e-45e3-ad83-49aa77304af3/4.PNG" alt=""></p>
<p>자바와 자바 컴파일러 버전을 확인한다.
<img src="https://images.velog.io/images/re-deok/post/889bd631-2981-4069-9361-7b93188b143f/5.PNG" alt="">
드디어...똑같아졌다...
<img src="https://images.velog.io/images/re-deok/post/0ca7f4fe-ef78-4c1f-979e-239ada377ccb/6.PNG" alt="">
그리고 드디어 빌드 성공...힘든 싸움이었다...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Android] Retrofit2를 이용해서 Android Studio에 REST API 연동]]></title>
            <link>https://velog.io/@re-deok/Android-Retrofit2%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-Android-Studio%EC%97%90-RESTful-API-%EC%97%B0%EB%8F%99</link>
            <guid>https://velog.io/@re-deok/Android-Retrofit2%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-Android-Studio%EC%97%90-RESTful-API-%EC%97%B0%EB%8F%99</guid>
            <pubDate>Tue, 19 Oct 2021 15:12:04 GMT</pubDate>
            <description><![CDATA[<h2 id="1-retrofit-tutorial">1. Retrofit tutorial</h2>
<p><a href="https://codinginflow.com/tutorials/android/retrofit/part-1-simple-get-request">Retrofit Tutorials</a>
위 링크를 참고해서 만들었습니다.</p>
<h2 id="2-준비물">2. 준비물</h2>
<ul>
<li><strong>Android Studio</strong></li>
<li><strong>REST API</strong></li>
<li><strong>Retrofit</strong></li>
</ul>
<p>저는 여기서 <strong>REST API</strong>를 <strong>Spring Boot</strong>를 통해서 만들었습니다.</p>
<h2 id="3-rest-api에서-보낼-데이터">3. REST API에서 보낼 데이터</h2>
<p><img src="https://images.velog.io/images/re-deok/post/606b6013-0db5-477d-9b0b-c30168e28d3f/%EC%BA%A1%EC%B2%98.PNG" alt="">
<strong>MySQL</strong>에 다음과 같은 데이터가 <strong>board table</strong>에 저장되어 있습니다.
이 데이터는 <strong>REST API</strong>에서 다음과 같은 코드를 통해 <strong>json 타입</strong>으로 서버에서 보내집니다.</p>
<pre><code class="language-java">@RestController
@RequestMapping(&quot;/api&quot;)
public class BoardApiController{
    @Autowired
    private BoardRepository repository;

    @GetMApping(&quot;/boards&quot;)
    List&lt;Board&gt; all(){
        return repository.findAll();
    }</code></pre>
<p><strong>Spring Boot</strong>에서 바로 실행 했을 경우 주소창에 <strong><code>localhost:8080/api/boards</code></strong>를 입력하게 되면 다음과 같은 json타입으로 데이터가 나온 것을 볼 수 있습니다.
<strong><center>❗❗❗URL은 밑에 또 쓰이게 되니 집중해서 보기❗❗❗</center></strong></p>
<p><img src="https://images.velog.io/images/re-deok/post/1ad79d8d-c2f1-40cb-9496-9598ffd1c6b4/%EC%BA%A1%EC%B2%98.PNG" alt="">
다음 <strong>json data</strong>를 구성하는 <strong>id</strong>, <strong>title</strong>, <strong>content</strong>를 <strong>안드로이드 버츄얼 디바이스</strong>(<strong>AVD</strong>)에 출력해보겠습니다.</p>
<h2 id="4-android-studio-setting">4. Android Studio Setting</h2>
<p>각 파일마다 다음과 같은 코드를 입력해줍니다.</p>
<h4 id="androidmanifestxml">AndroidManifest.xml</h4>
<pre><code class="language-java">&lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;</code></pre>
<h4 id="buildgradle">build.gradle</h4>
<pre><code class="language-java">dependencies{
    implementation &#39;com.squareup.retrofit2:retrofit:2.4.0&#39;
    implementation &#39;com.squareup.retrofit2:converter-gson:2.4.0&#39;
}</code></pre>
<p><strong>build.gradle</strong> 파일에 다음 코드를 작성했으면 상단에 <strong>sync now</strong>를 눌러주고 기다립니다.</p>
<h2 id="5-android-code">5. Android code</h2>
<h4 id="postjava">Post.java</h4>
<pre><code class="language-java">import com.google.gson.annotations.SerializedName;

public class Post {
    private long id;
    private String title;
    private String content;

    public long getId() {
        return id;
    }
    public String getTitle() {
        return title;
    }
    public String getContent() {
        return content;
    }
}</code></pre>
<h4 id="mainactivityjava">MainActivity.java</h4>
<pre><code class="language-java">import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {
    private TextView textViewResult;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textViewResult = findViewById(R.id.text_view_result);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(&quot;{서버를 돌릴 ip주소}:8080&quot;)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
        Call&lt;List&lt;Post&gt;&gt; call = jsonPlaceHolderApi.getPosts();
        call.enqueue(new Callback&lt;List&lt;Post&gt;&gt;() {
            @Override
            public void onResponse(Call&lt;List&lt;Post&gt;&gt; call, Response&lt;List&lt;Post&gt;&gt; response) {
                if (!response.isSuccessful()) {
                    textViewResult.setText(&quot;Code: &quot; + response.code());
                    return;
                }
                List&lt;Post&gt; posts = response.body();
                for (Post post : posts) {
                    String content = &quot;&quot;;
                    content += &quot;ID: &quot; + post.getId() + &quot;\n&quot;;
                    content += &quot;Title: &quot; + post.getTitle() + &quot;\n&quot;;
                    content += &quot;Content: &quot; + post.getContent() + &quot;\n\n&quot;;
                    textViewResult.append(content);
                }
            }
            @Override
            public void onFailure(Call&lt;List&lt;Post&gt;&gt; call, Throwable t) {
                textViewResult.setText(t.getMessage());
            }
        });
    }
}</code></pre>
<h4 id="activity_mainxml">activity_main.xml</h4>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;
    android:padding=&quot;8dp&quot;
    tools:context=&quot;.MainActivity&quot;&gt;
    &lt;androidx.core.widget.NestedScrollView
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;match_parent&quot;&gt;

        &lt;TextView
            android:id=&quot;@+id/text_view_result&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:textColor=&quot;@color/purple_500&quot; /&gt;
    &lt;/androidx.core.widget.NestedScrollView&gt;

&lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;</code></pre>
<h4 id="restapijava">RestApi.java</h4>
<pre><code class="language-java">import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;

public interface RestApi {
    @GET(&quot;api/boards&quot;)
    Call&lt;List&lt;Post&gt;&gt; getPosts();
}</code></pre>
<p>자 여기서는 아까 <strong>Spring Boo</strong>t를 실행해서 브라우저에 검색했던 <strong><code>localhost:8080/api/boards</code></strong>의 <strong><code>api/boards</code></strong>를 <strong>@Get 어노테이션</strong> 안에 넣어주게 되면 해당 URL로 매핑됩니다.</p>
<h2 id="5-출력화면">5. 출력화면</h2>
<p>정상적으로 AVD에 <strong>Spring Boot</strong>에서 보낸 <strong>json 데이터</strong>가 출력된 것을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/re-deok/post/9db5d32e-da1f-4e00-a0d8-f922e5275806/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h2 id="6-추가사항">6. 추가사항</h2>
<p><img src="https://images.velog.io/images/re-deok/post/afa79fe1-eb89-4787-98c8-279b47e56158/%EC%BA%A1%EC%B2%98.PNG" alt="">
다음과 같이 출력될 경우 네트워크 보안 정책상 권한을 받아야 하므로 <strong>AndroidManifest.xml</strong>에 다음과 같은 코드를 첨부해야 출력화면과 같이 정상적으로 데이터가 나오게 됩니다.</p>
<h4 id="androidmanifestxml-1">AndroidManifest.xml</h4>
<pre><code class="language-java">&lt;application&gt;
android:usesCleartextTraffic=&quot;true&quot;
&lt;/application&gt;</code></pre>
<h4 id="ip주소-보는-법windows-10">IP주소 보는 법(Windows 10)</h4>
<p><code>window키 + R</code> → <code>cmd</code> 실행 → <code>ipconfig</code> 입력→ <code>IPv4</code>주소 확인</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링] Annotation 정리]]></title>
            <link>https://velog.io/@re-deok/Spring-Boot-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@re-deok/Spring-Boot-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 10 Oct 2021 11:14:09 GMT</pubDate>
            <description><![CDATA[<h1 id="annotation">Annotation</h1>
<p> <code>Annotation</code>이란 method나 class 위에 <code>@</code>가 붙은 텍스트를 말한다. Method나 class 위에 붙은 annotation은 특별한 기능을 수행하게 된다. 즉, 프로그램에게 추가적인 정보를 제공해주는 <code>메타데이터</code>라 볼 수 있다.</p>
<blockquote>
<p><code>메타 데이터(meta data)</code> : 데이터를 위한 데이터</p>
</blockquote>
<h1 id="spring-annotation">Spring Annotation</h1>
<p> <code>Spring Framework</code>은 <code>Spring MVC</code> 패턴을 따르며 각 모듈별로 사용하는 annotation이 상이하다. 간단하게 <code>Controller</code>, <code>Model</code>, <code>Repository</code>, <code>Service</code>에서 자주 쓰이는 annotation을 (매우 간단하게...)정리하고자 한다.</p>
<blockquote>
<p>❗ 꼭 작성된 모듈에서 <code>annotation</code>을 사용하지 않아도 됩니다.</p>
</blockquote>
<h2 id="controller">Controller</h2>
<h4 id="restcontroller">@RestController</h4>
<ul>
<li>RestController를 알기 전에 먼저 <code>@Controller</code>를 알아야 한다. 둘의 결정적인 차이는 <code>HTTP Response Body</code>가 생성되는 방식의 차이다.
<code>@Controller</code>는 아래와 같은 과정을 통해 주로 <code>View</code>를 반환할 때 사용한다.</li>
</ul>
<h4 id="requestmapping">@RequestMapping</h4>
<ul>
<li><p>요청 URL을 어떤 메서드가 처리할 지 mapping해주는 어노테이션이다.
컨트롤러나 컨트롤러의 메서드에 적용한다.</p>
<pre><code class="language-java">// 예시
@RequestMapping(&quot;/list&quot;), @RequestMapping(&quot;/home, /about&quot;)
@RequestMapping(&quot;/admin&quot;, method=RequestMehod.GET)</code></pre>
</li>
</ul>
<h4 id="getmapping">@GetMapping</h4>
<ul>
<li><code>@RequestMapping(Method=ReqeustMethod.GET)</code>과 같음
<code>@PostMapping</code>, <code>@PutMapping</code>, <code>@PatchMapping</code>, <code>@DeleteMapping</code>은 유추 가능하므로 생략</li>
</ul>
<h2 id="model">Model</h2>
<h4 id="entity">@Entity</h4>
<ul>
<li>테이블과 연결될 클래스에 사용한다.
기본적으로 클래스의 카멜케이스 이름을 언더바 네이밍으로 테이블 이름을 매칭해준다.<blockquote>
<p>예시) <code>UserTable</code> → <code>user_table</code></p>
</blockquote>
</li>
</ul>
<h4 id="id">@Id</h4>
<ul>
<li>해당 테이블의 PK값에 사용한다.</li>
</ul>
<h4 id="generatedvalue">@GeneratedValue</h4>
<ul>
<li>PK값의 생성 규칙을 표시할 때 사용한다. 주로 사용되는 <code>Auto_Increment</code>를 사용하기 위해서는 <code>GenerationType.IDENTITY</code>를 사용하며 다음과 같이 코드를 작성한다.<pre><code class="language-java">@GeneratedValue(strategy = GenerationType.{option})</code></pre>
</li>
<li>GenerationType의 종류는 다음과 같다.</li>
</ul>
<ol>
<li>IDENTITY : 데이터베이스에 위임</li>
<li>AUTO : 방언에 따라 자동 지정, GenerationType을 명시하지 않을 경우 <code>기본값</code>으로 사용된다.</li>
<li>SEQUENCE : 테이터베이스 시퀀스 오브젝트 사용</li>
<li>TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용</li>
</ol>
<h4 id="onetoone-manytomany-onetomany">@OneToOne, @ManyToMany, OneToMany</h4>
<ul>
<li>관계를 매핑할 때 사용된다.</li>
</ul>
<pre><code class="language-java">// 예시
@OneToMany(mappedBy = &quot;{Table name}&quot;, fetch=FetchType.{option})</code></pre>
<h4 id="jointable">JoinTable</h4>
<ul>
<li>해당 테이블을 Join함<pre><code class="language-java">//예시
@JoinTale(
      name = &quot;{Table name}&quot;,
          joinColumes = @JoinColumn(name = &quot;{Attribute name}&quot;),
          inverseJoinColumns = @JoiColumn(name = &quot;{Attribute name}&quot;))</code></pre>
</li>
</ul>
<h2 id="repository">Repository</h2>
<h4 id="entitygraph">@EntityGraph</h4>
<ul>
<li><p>JPA가 어떠한 Entity를 불러올 때 이 Entity와 관계된 Entity를 불러올지에 대한 정보를 제공한다.</p>
</li>
<li><p>EntityGraph는 <code>Fetch</code>와 <code>Load</code> 두가지 타입으로 나뉜다. 
<code>FETCH</code> :entity graph에 명시된 attribute는 <code>FetchType.EAGER</code>이고 명시되지 않은 attribute는 FetchType.LAZY이다.
<code>LOAD</code> : entity graph에 명시된 attribute는 <code>FetchType.EAGER</code>이고 명시되지 않은 attribute는 명시되어 있는 <code>FetchType</code>이나 기본값인 <code>FetchType</code>이다.</p>
<pre><code class="language-java">//예시
@EntityGraph(attributePaths = {&quot;Entity Name&quot;})</code></pre>
</li>
</ul>
<h4 id="query">@Query</h4>
<ul>
<li>직접 Query문을 작성한다.<pre><code class="language-java">//예시
@Query(&quot;Query&quot;)</code></pre>
</li>
</ul>
<h2 id="service">Service</h2>
<h4 id="service-1">@Service</h4>
<ul>
<li>Service 로직을 구현할 클래스에 사용한다.</li>
</ul>
<h2 id="기타">기타</h2>
<h4 id="springbootapplication">@SpringBootApplication</h4>
<p>해당 어노테이션이 붙어잇는 메인 어플리케이션 클래스의 위치를 프로젝트 디폴트 패키지의 루트에 위치시키는 것을 추천한다.</p>
<p><code>@Configuration</code>, <code>@EnableAutoConfiguration</code>, <code>@ComponentScan</code> 3가지를 하나의 어노테이션으로 합친 것이다.</p>
<h4 id="requiredargsconstructor">@RequiredArgsConstructor</h4>
<ul>
<li>초기화 되지 않은 final 필드나, <code>@NotNull</code>이 붙은 필드에 대해 <code>생성자(Constructor)</code>를 만들어 준다.</li>
</ul>
<h4 id="slf4j">@Slf4j</h4>
<ul>
<li>Logging에 대한 abstract layer를 제공하는 interface의 모음, Interface를 사용하여 logging을 구현하게 되면 좋은 점은 추후에 필요로 의해 logging library를 변경할 때 코드의 변경 없이 가능하다.
<code>한마디로 로그 남길 때 쓰인다.</code></li>
</ul>
<h4 id="autowired">@Autowired</h4>
<ul>
<li>필요한 <code>dependency</code> 객체의 Type에 해당하는 <code>Bean</code>을 찾아 주입한다.</li>
<li><code>Contructor</code>, <code>Setter</code>, <code>Field</code>와 같이 3가지 경우에 사용되며 기본값으로 true이기 때문에 <code>Dependency Injection</code>할 대상을 찾지 못한다면 어플리케이션 구동에 실패한다.</li>
</ul>
<h4 id="component">@Component</h4>
<p><code>@Compoenent</code>는 개발자가 직접 작성한 Class를 <code>Bean</code>으로 등록하기 위한 Annotation이다.</p>
<pre><code class="language-java">@Component
public class Hello{
    public Hello(){
        System.out.println(&quot;Hello World&quot;);
    }
}
@Component(value=&quot;mtstudent&quot;)
public class Hello{
    public Hello(){
        System.out.println(&quot;Hello World&quot;);
    }
}</code></pre>
<p> Component에 대한 추가 정보가 없다면 Class의 이름을 CamelCase로 변경하는 것이 <code>Bean id</code>로 사용된다.
 하지만 <code>@Bean</code>과 다르게 <code>@Component</code>는 name이 아닌 value를 이용해 Bean의 이름을 지정한다.</p>
<h4 id="confuguration">@Confuguration</h4>
<p><code>Configuration</code>을 클래스에 적용하고 <code>@Bean</code>을 해당 클래스의 메소드에 적용하면 <code>@Autowired</code>로 <code>Bean</code>을 부를 수 있다.</p>
<h4 id="bean">@Bean</h4>
<ul>
<li><code>Bean</code>을 정의할 때 사용한다.</li>
</ul>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://devlog-wjdrbs96.tistory.com/166">[Spring]@Autowired란 무엇인가?</a></li>
<li><a href="https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/EntityGraph.EntityGraphType.html">docs.spring.io/EntityGraphType</a></li>
<li><a href="https://songii00.github.io/2020/03/25/2020-03-25-@GeneratedValue(strategy%20=%20GenerationType.IDENTITY)%EA%B8%B0%EB%B3%B8%ED%82%A4%20%EC%98%81%EC%86%8D%EC%84%B1%20%EA%B4%80%EB%A6%AC/">@GeneratedValue(strategy = GenerationType.IDENTITY) : 기본키 영속성 관리</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Intellij에서 Querydsl 사용시 Q Class import 문제]]></title>
            <link>https://velog.io/@re-deok/Intellij%EC%97%90%EC%84%9C-Querydsl-%EC%82%AC%EC%9A%A9%EC%8B%9C-Q-Class-import-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@re-deok/Intellij%EC%97%90%EC%84%9C-Querydsl-%EC%82%AC%EC%9A%A9%EC%8B%9C-Q-Class-import-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Sat, 25 Sep 2021 10:15:44 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><img src="https://images.velog.io/images/re-deok/post/8de252b0-6e3c-4496-a4b5-66a52ba3a921/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>다음 사진과 같은 코드를 작성하는데 Qclass인 QUser가 인식되지 않은 문제를 겪었다.
디렉토리를 보더라도 <code>target/generated-sources/com/redeok/myweb/model</code>에 <code>QClass</code>들이 정상적으로 들어가 있는 것을 확인했다. 하지만 여기서 주목해야할 점은 디렉토리의 색이 일반 자바파일이 들어가 있는 파란색폴더가 아니라 주황색 폴더인 것이다.
주황색 폴더는 <code>Excluded</code>로 분류되며, 파란색 폴더는 <code>Sources</code>로 분류된다.</p>
<h3 id="해결-방법">해결 방법</h3>
<p>해결 방법은 간단하다. Intellj의 <code>File</code>탭에 들어가 <code>Project Structure</code>를 누른다.
<img src="https://images.velog.io/images/re-deok/post/efde1439-1f13-410e-a4ef-2669261f7bfb/%EC%BA%A1%EC%B2%98.PNG" alt="">
그럼 다음 사진과 같이 나올 것이다. import할 Class가 들어있는 폴더에 오른쪽 클릭을 한다.
<img src="https://images.velog.io/images/re-deok/post/b3882934-5a88-48ee-a5eb-3e2b720b0a39/image.png" alt="">
다음과 같이 <code>Sources</code>로 설정을 변경하게 되면 정상적으로 import할 수 있게 된다. </p>
<p>해결완료~!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링] Spring MVC]]></title>
            <link>https://velog.io/@re-deok/%EC%8A%A4%ED%94%84%EB%A7%81-Spring-MVC</link>
            <guid>https://velog.io/@re-deok/%EC%8A%A4%ED%94%84%EB%A7%81-Spring-MVC</guid>
            <pubDate>Tue, 17 Aug 2021 12:04:03 GMT</pubDate>
            <description><![CDATA[<h3 id="mvc">MVC?</h3>
<ul>
<li><strong>MVC</strong>는 Model-View-Controller의 약자.</li>
<li><strong>Model</strong> : <strong>모델</strong>은 <strong>뷰</strong>가 렌더링하는데 필요한 데이터이다. 예를 들어 사용자가 요청한 상품 목록이나, 주문 내역이 이에 해당한다.</li>
<li><strong>View</strong> : 웹 어플리케이션에서 <strong>뷰(View)</strong>는 실제로 보이는 부분이며, <strong>모델</strong>을 사용해 렌더링을 한다. <strong>뷰</strong>는 JSP, JSF, PDF, XML등으로 결과를 표현한다.</li>
<li><strong>Controller</strong> : <strong>컨트롤러</strong>는 사용자의 액션에 응답하는 컴포넌트이다. <strong>컨트롤러</strong>는 <strong>모델</strong>을 업데이트하고, 다른 액션을 수행한다.</li>
</ul>
<p><strong>MVC Model 1 아키텍쳐</strong>
<img src="https://cphinf.pstatic.net/mooc/20180219_180/1519003368125BcfqV_PNG/1.png" alt="">
<code>브라우저의 요청 -&gt; JSP page가 요청을 받음 -&gt; Java Bean -&gt; Database -&gt; Java Bean -&gt; JSP page의 응답 -&gt; 브라우저에 요청 결과 표시</code>
이 경우에는 JSP 자체에 Java 코드와 HTML 코드가 섞이게 되어 유지 보수를 하기에 어려움을 겪게 된다.</p>
<p><strong>MVC Model 2 아키텍쳐</strong>
Model 1 아키텍쳐에서 유지 보수의 어려움을 해결하고자 나온 모델이다.
<img src="https://cphinf.pstatic.net/mooc/20180219_65/1519003382079lUcI5_PNG/2.png" alt="">
<code>브라우저 요청 -&gt; 서블릿(컨트롤러) -&gt; Java Bean -&gt; Database -&gt; JSP page(View)의 응답 -&gt; 브라우저에 요청 결과 표시</code></p>
<p><strong>MVC Model 2 발전형태</strong>
<img src="https://cphinf.pstatic.net/mooc/20180219_149/15190034013354diDI_PNG/3.png" alt="">
<strong>프론트 컨트롤러</strong>는 요청을 처리하지 않고 <strong>컨트롤러</strong>에서 처리한다. 이런 <strong>컨트롤러</strong>는 <strong>Java Bean</strong> 등을 이용해서 결과를 만들어 내고 만들어진 결과를 <strong>모델</strong>에 담아 <strong>프론트 컨트롤러</strong>에 보내면 <strong>프론트 컨트롤러</strong>는 알맞은 <strong>뷰</strong>에게 <strong>모델</strong>을 전달해서 결과를 출력한다.</p>
<p><strong>Spring Web Module</strong>
<img src="https://cphinf.pstatic.net/mooc/20180219_73/1519003417760TqmnB_PNG/4.png" alt="">
Model2 MVC 패턴을 지원하는 Spring Module</p>
<h3 id="spring-mvc-기본-동작-흐름">Spring MVC 기본 동작 흐름</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180219_116/1519003779294ejdEx_PNG/1.png" alt=""></p>
<blockquote>
<p><strong>Clinet의 request -&gt; Dispatcher Servlet class(Controller를 찾음) -&gt; Handler Mapping -&gt; Handler Apapter(결정된 Controller로 보냄) -&gt; 로직 수행(Service) -&gt; Controller(View name을 리턴함) -&gt; View Resolver -&gt; View(jsp, html) 출력</strong></p>
</blockquote>
<ul>
<li><code>Dispatcher Servlet</code> : <strong>Client</strong>의 <strong>요청</strong>을 처리해 줄 <strong>컨트롤러</strong>와 <strong>메서드</strong>가 무엇인지 <code>Handler Mapping</code>에게 물어본다.</li>
<li><code>Handler Mapping</code> : <code>Handler Mapping</code>이 받은 요청은 <code>컨트롤러</code>가 알아서 동작하는 것이 아니기 때문에 <strong>xml 파일</strong>이나 <strong>java 파일</strong>에 <strong>어노테이션</strong>으로 설정한다.</li>
</ul>
<h3 id="요청-처리를-위해-사용되는-컴포넌트">요청 처리를 위해 사용되는 컴포넌트</h3>
<ul>
  <li>DispatcherServlet
    <ul>
      <li> HandlerMapping
      <li> HandlerAdapter
      <li> MultipartResolver
      <li> LocaleResolver
      <li> ThemeResolver
      <li> HandlerExceptionResolver
      <li> RequestToViewNameTranslater
      <li> ViewResolver
      <li> FlashMapManager
    </ul>
</ul>

<h3 id="dispatcherservlet">DispatcherServlet</h3>
<ul>
<li><strong>프론트 컨트롤러(Front Controller)</strong></li>
<li><strong>클라이언트</strong>의 모든 요청을 받아 처리할 <strong>핸들러</strong>에게 넘기고 <strong>핸들러</strong>가 처리한 결과를 받아 사용자에게 응답 결과를 보여준다.</li>
<li><code>DispatcherServlet</code>은 여러 컴포넌트를 이용해 작업을 처리한다.</li>
<li>이론적으로 한개 이상 사용할 수 있지만 보통 한개만 선언해서 사용한다.</li>
</ul>
<h3 id="dispatcherservlet-내부-동작-흐름">DispatcherServlet 내부 동작 흐름</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180219_281/1519003870301bOehw_PNG/2.png" alt="">
내부에 위 사진과 같은 코드가 있다. 라고 생각하면 된다.</p>
<ul>
<li><strong>요청 선처리 작업</strong>
<img src="https://cphinf.pstatic.net/mooc/20180219_91/1519003885824QT31y_PNG/3.png" alt="">
<code>Spring MVC</code>는 <strong>지역화</strong>라는 것을 지원한다. <strong>지역화(Localization)</strong>란 같은 사이트에 들어갔음에도 불구하고 어떤 사용자에게 영어로 된 화면이 보여지고 또 다른 사용자에게는 한국어로 된 화면이 보여지듯이 처리할 수 있는 것을 말한다.<strong>(한마디로 다국어처리가 가능하다.)</strong> 이는 <strong>브라우저</strong>에 언어를 세팅해두면 <strong>헤더 정보</strong>에서 <strong>언어 설정 값</strong>을 이용하여 <code>Locale</code>을 결정할 수 있다.</li>
</ul>
<p>*RequestContextHolder : 스레드 로컬 객체, 요청을 받아 응답할 때까지 HttpServletRequest, HttpServletResponse 등을 Spring이 관리하는 객체 안에서 사용할 수 있도록 해주는 것이다.</p>
<h3 id="요청-선처리-작업시-사용된-컴포넌트">요청 선처리 작업시 사용된 컴포넌트</h3>
<ul>
<li>org.springframework.web.servlet.LocaleResolver
  지역 정보를 결정해주는 전략 오브젝트, 디폴트인 <code>AcceptHeaderLocalResolver</code>는 <code>HTTP</code> 헤더의 정보를 보고 지역정보를 설정한다.</li>
<li>org.springframework.web.servlet.FlashMapManager
  <code>FlashMap</code>객체를 조회(retrieve) &amp; 저장을 위한 인터페이스
  <code>RedirectAttributes</code>의 <code>addFlashAttribute</code>메소드를 이용해서 저장한다.
  리다이렉트 후 조회를 하면 바로 정보는 삭제된다.</li>
<li>org.springframework.web.context.request.RequestContextHolder
  일반 빈에서 <code>HttpServletRequest</code>, <code>HttpServletResponse</code>, <code>HttpSession</code> 등을 사용할 수 있도록 한다.
  해당 객체를 <strong>일반 빈</strong>에서 사용하게 되면, <strong>Web에 종속</strong> 될 수 있다.</li>
<li>org.springframework.web.multipart.MultipartResolver
  멀티파트 파이리 업로드를 처리하는 전략<h3 id="요청-전달">요청 전달</h3>
<img src="https://cphinf.pstatic.net/mooc/20180219_20/1519003954110F9wyd_PNG/4.png" alt=""></li>
</ul>
<h3 id="요청-처리">요청 처리</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180219_167/1519004040926yL8eC_PNG/5.png" alt=""></p>
<h3 id="예외-처리">예외 처리</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180219_26/1519004078279fGdRP_PNG/6.png" alt=""></p>
<h3 id="뷰-렌더링">뷰 렌더링</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180219_66/1519004113425TanBR_PNG/7.png" alt=""></p>
<h3 id="요청-처리-종료">요청 처리 종료</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180219_296/1519004150778ofOPV_PNG/8.png" alt=""></p>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/58979?isDesc=false">부스트 코스 MVC-1</a>
<a href="https://www.boostcourse.org/web326/lecture/258533/?isDesc=false">부스트 코스 MVC-2</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링] IoC / DI 컨테이너]]></title>
            <link>https://velog.io/@re-deok/%EC%8A%A4%ED%94%84%EB%A7%81-IoC-DI-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88</link>
            <guid>https://velog.io/@re-deok/%EC%8A%A4%ED%94%84%EB%A7%81-IoC-DI-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88</guid>
            <pubDate>Mon, 16 Aug 2021 12:44:25 GMT</pubDate>
            <description><![CDATA[<h3 id="컨테이너container란">컨테이너(Container)란?</h3>
<ul>
<li><strong>컨테이너</strong>는 <strong>인스턴스</strong>의 생명주기(라이프 사이클)를 관리한다.</li>
<li>생성된 <strong>인스턴스</strong>들에게 추가적인 기능을 제공한다.</li>
<li><strong>톰캣(WAS)</strong>은 <strong>Servlet 컨테이너</strong>를 통해 <strong>Servelt 요청</strong>을 해결한다.</li>
</ul>
<h3 id="ioc란">IoC란?</h3>
<ul>
<li><code>IoC</code>란 <code>Inversion of Control</code>의 약자이다. <strong>inversion</strong>은 사전적 의미로는 &#39;도치, 역전&#39;이다. 보통 <code>IoC</code>를 제어의 역전이라고 번역한다.</li>
<li>개발자는 프로그램의 흐름을 제어하는 코드를 작성한다. 하지만 이 흐름의 제어를 개발자가 하는 것이 아닌 다른 프로그램이 그 흐름을 제어하는 것을 <code>IoC</code>라 말한다.</li>
<li>즉, 개발자가 객체를 생성하는 것이 아니라 컨테이너에서 가져오는 것이다.</li>
<li><code>Spring</code>에서 <code>Bean Factory</code>와 <code>Appllcation Context</code>가 이런 공장의 역할을 해준다.</li>
</ul>
<h3 id="di란">DI란?</h3>
<ul>
<li><code>DI</code>는 <code>Dependency Injection</code>의 약자로, <strong>의존성 주입</strong>이란 뜻이다.</li>
<li><code>DI</code>는 클래스 사이의 의존 관계를 <code>빈(Bean)</code>설정 정보를 바탕으로 <strong>컨테이너</strong>가 자동으로 연결해주는 것을 말한다.</li>
</ul>
<p><strong>DI 적용 X</strong>
<img src="https://cphinf.pstatic.net/mooc/20181218_284/1545136782491NSgAa_JPEG/3.7.2-1.jpg" alt="">
<strong>Spring에서 DI 적용</strong>
<img src="https://cphinf.pstatic.net/mooc/20181218_190/1545137156742y8WiS_JPEG/3.7.2-2.jpg" alt=""></p>
<p><img src="https://images.velog.io/images/re-deok/post/b5acc1b4-f265-45a3-9f38-60cc8bfe8118/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p><code>Spring</code>에서는 <strong>인스턴스</strong>를 생성하는 코드는 보이지 않고 <strong>어노테이션</strong>을 이용해서 컨테이너에게 맡기면서 사용한다.</p>
<h3 id="spring에서-제공하는-iocdi-컨테이너">Spring에서 제공하는 IoC/DI 컨테이너</h3>
<ul>
<li><strong>BeanFactory</strong> : <strong>IoC/DI</strong>에 대한 <strong>기본 기능</strong>을 가지고 있다.</li>
<li><strong>ApplicationContext</strong> : <strong>BeanFactory</strong>의 모든 기능을 포함하며, 일반적으로 <strong>BeanFactory</strong>보다 추천된다. <strong>트랜잭션처리</strong>, <strong>AOP</strong> 등에 대한 처리를 할 수 있다. <strong>BeanPostProcessor</strong>, <strong>BeanFactoryPostProcessor</strong>등을 자동으로 등록하고, <strong>국제화 처리</strong>, <strong>어플리케이션 이베트</strong> 등을 처리할 수 있다.</li>
</ul>
<blockquote>
<p><strong>BeanPostProcessor</strong> : 컨테이너의 기본 로직을 오버라이팅해서 인스턴스화의 의존성 처리 로직 등을 개발자가 원하는 대로 구현을 할 수 있게 해준다.
<strong>BeanFactoryPostProcessor</strong> : 설정 메타 데이터를 커스텀 마이징 할 수 있는 부분이다.</p>
</blockquote>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/58970/?isDesc=false">부스트 코스</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데이터베이스] DDL(CREATE, DROP)]]></title>
            <link>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DDLCREATE-DROP</link>
            <guid>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DDLCREATE-DROP</guid>
            <pubDate>Mon, 16 Aug 2021 12:02:26 GMT</pubDate>
            <description><![CDATA[<h3 id="mysql-데이터-타입">MySQL 데이터 타입</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180131_89/1517386938999sf3SM_PNG/2_8_3_MySQL__-1.PNG" alt="">
<img src="https://cphinf.pstatic.net/mooc/20180131_46/1517386952668I67cM_PNG/2_8_3_MySQL__-2.PNG" alt=""></p>
<h3 id="테이블-생성">테이블 생성</h3>
<p><img src="https://images.velog.io/images/re-deok/post/691a302a-f20d-4ed7-9540-0522ce5d16d0/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<ul>
<li>데이터 형 외에도 <strong>속성값의 빈 값 허용 여부</strong>는 <code>NULL</code> 또는 <code>NOT NULL</code>로 설정</li>
<li><code>DEFAULT</code> 키워드와 함께 입력하지 않았을 때의 <strong>기값</strong>을 지정</li>
<li>입력하지 않고 <strong>자동으로 1씩 증가</strong>하는 번호를 위한 <code>AUTO_INCREMENT</code></li>
<li><code>EMPLOYEE</code>와 같은 구조를 가진 <code>EMPLOYEE2</code>테이블 생성
<img src="https://images.velog.io/images/re-deok/post/9c2c71d5-c637-4efa-bc77-562d8f0b5e90/%EC%BA%A1%EC%B2%98.PNG" alt=""></li>
<li><code>book</code> 테이블 생성
<img src="https://images.velog.io/images/re-deok/post/91778778-09eb-4520-940f-cfcee535ec39/%EC%BA%A1%EC%B2%98.PNG" alt=""></li>
</ul>
<h3 id="테이블-컬럼-추가삭제">테이블 컬럼 추가/삭제</h3>
<p><img src="https://images.velog.io/images/re-deok/post/a0d5a5a7-06df-4fbd-ab62-8817cc943aed/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<ul>
<li><p><code>book</code>테이블에 <code>저자(author)</code>컬럼을 <code>varchar(20)</code>형식으로 추가
<img src="https://images.velog.io/images/re-deok/post/f3b640f2-b637-476b-b8e4-b5d63fe76e06/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
<li><p><code>book</code>테이블의 <code>가격(price)</code>컬럼을 삭제
<img src="https://images.velog.io/images/re-deok/post/a71579ab-4d3f-4125-8f7a-9b1a2338cf3b/%EC%BA%A1%EC%B2%98.PNG" alt=""> 중간에 있는 쿼리는 오타가 나서 취소시켰다...</p>
</li>
</ul>
<h3 id="테이블-컬럼-수정">테이블 컬럼 수정</h3>
<p><img src="https://images.velog.io/images/re-deok/post/b978fea9-22a7-46e2-83ed-f21de8f536b3/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<ul>
<li>change 키워드를 사용하고 컬럼을 새롭게 재정의 (이름부터 속성까지 전부)</li>
</ul>
<h3 id="테이블-이름-변경">테이블 이름 변경</h3>
<p><img src="https://images.velog.io/images/re-deok/post/424b7b1f-971f-4940-a2c2-7dacf4d504ba/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="테이블-삭제">테이블 삭제</h3>
<p><img src="https://images.velog.io/images/re-deok/post/68c6bb93-8b4b-4aa3-b339-f18e6757ce12/%EC%BA%A1%EC%B2%98.PNG" alt="">
참고로, <strong>제약 조건</strong>이 있을 경우에는 <code>drop table</code> 명령으로도 테이블이 삭제되지 않을 수 있다.
그럴 경우는 테이블을 생성한 반대 순서로 삭제해야 한다.</p>
<ul>
<li><p>테이블 삭제 후 <code>desc</code> 명령을 수행하면, 존재하지 않는 테이블이라고 표시된다.</p>
</li>
<li><p><code>EMPLOYEE2</code>테이블 삭제</p>
</li>
<li><p>추가했을 때 에러
<img src="https://images.velog.io/images/re-deok/post/1ea89492-c9dd-4cf8-a150-a5d8e79c555d/%EC%BA%A1%EC%B2%98.PNG" alt=""> <code>department</code>테이블을 보게 되면 <strong>100</strong>이라는 deptno를 가지고 있지 않기 때문에 추가할 때 에러가 생기게 된다.
<img src="https://images.velog.io/images/re-deok/post/c3c69ef8-f118-4ce6-aea4-e372ca6fac9e/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
<li><p>정상적으로 추가했을 때
<img src="https://images.velog.io/images/re-deok/post/e5dcd4e9-6df7-4a4d-a470-5ff9005e88ee/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
</ul>
<p>위와 같이 <code>department</code>테이블이 <code>employee</code>테이블의 <code>deptno</code>컬럼에 영향을 끼치기 때문에 삭제되지 않는다.</p>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/58936/?isDesc=false">부스트 코스</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데이터베이스] DML (INSERT, UPDATE, DELETE)]]></title>
            <link>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DML-INSERT</link>
            <guid>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DML-INSERT</guid>
            <pubDate>Mon, 16 Aug 2021 11:27:43 GMT</pubDate>
            <description><![CDATA[<h3 id="데이터-입력insert문">데이터 입력(INSERT문)</h3>
<p><img src="https://images.velog.io/images/re-deok/post/f15378ce-94a6-48e7-87bc-85f824f0345a/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<ul>
<li><p>필드명을 지정해주는 방식은 디폴트 값이 세팅되는 필드는 생략할 수 있다.</p>
</li>
<li><p>필드명을 지정해주는 방식은 추후, 필드가 추가/변경/수정되는 변경에 유연하게 대처 가능하다. </p>
</li>
<li><p>필드명을 생략했을 경우 모든 필드 값을 반드시 입력해야 한다.</p>
</li>
<li><p><code>ROLE</code>테이블에 <code>role_id</code>는 <strong>200</strong>, <code>description</code>에는 <strong>CEO</strong>로 데이터를 저장</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/re-deok/post/c4aaf47e-a07a-4c13-8f2d-295d5444484e/%EC%BA%A1%EC%B2%98.PNG" alt=""> <code>ROLE</code>테이블의 구조와 항목 확인
<img src="https://images.velog.io/images/re-deok/post/a1522e85-4245-490e-9553-03ec1c7e38f2/%EC%BA%A1%EC%B2%98.PNG" alt=""> 추가 후 확인</p>
<ul>
<li><code>description</code>만 추가하고 싶은 경우
<img src="https://images.velog.io/images/re-deok/post/1f7dbbe9-3180-4436-8506-beab7dce401b/%EC%BA%A1%EC%B2%98.PNG" alt=""> 다음과 같이 에러가 나오게 된다. 이는 위에 테이블 구조를 보게 되면 <code>role_id</code>가 <strong>PK(PRIMARY KEY)</strong>로 지정되었는데 <code>DEFAULT</code>가 NULL값이므로 지정되어 있는데 <strong>PK</strong>는 NULL값이 될 수 없으므로 에러가 발생하게 된다.</li>
</ul>
<p><em><code>role_id</code>만 추가할 경우
<img src="https://images.velog.io/images/re-deok/post/28adf489-5e97-46cd-a847-1c0f6bd589fe/%EC%BA%A1%EC%B2%98.PNG" alt=""> <code>description</code>은 *</em>PK**지정이 되지 않았으므로 <code>role_id</code>만 추가 가능하다.</p>
<h3 id="데이터-수정update문">데이터 수정(UPDATE문)</h3>
<p><img src="https://images.velog.io/images/re-deok/post/991c46ab-72de-4ec5-8757-ba94fe161817/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<ul>
<li>조건식을 통해 특정 ROW만 변경할 수 있다.</li>
<li>조건식을 주지 않으면 전체 ROW가 영향을 미치므로 조심해서 사용해야 한다.</li>
<li><code>WHERE</code>를 <strong>사용하지 않으면 전체 데이터가 모두 바뀌므로 주의</strong>해야 한다.</li>
<li><code>ROLE</code>테이블에 <code>role_id</code>가 <strong>200</strong>일 경우 <code>description</code>을 <code>CTO</code>로 수정
<img src="https://images.velog.io/images/re-deok/post/e516f427-d7ff-4284-9563-541bbdb7d8a4/%EC%BA%A1%EC%B2%98.PNG" alt=""> <code>ROLE</code>테이블을 확인해보니 잘 수정된 것을 볼 수 있다.</li>
</ul>
<h3 id="데이터-삭제delect문">데이터 삭제(DELECT문)</h3>
<p><img src="https://images.velog.io/images/re-deok/post/213ba2f2-5a7b-49bc-92ff-64bdae36de3e/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<ul>
<li>조건식을 통해 특정 ROW만 삭제할 수 있다.</li>
<li>조건식을 주지 않으면 전체 ROW가 영향을 미치므로 조심해서 사용해야 한다.</li>
<li><code>ROLE</code>테이블에서 <code>role_id</code>가 <strong>200</strong>인 정보를 삭제
<img src="https://images.velog.io/images/re-deok/post/a9af0597-0ab3-4942-940c-5dfb091b98e6/%EC%BA%A1%EC%B2%98.PNG" alt=""> <code>role_id</code>가 <strong>200</strong>인 정보가 삭제된 것을 볼 수 있다.</li>
</ul>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/258487/?isDesc=false">부스트 코스</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데이터베이스] DML (SELECT)]]></title>
            <link>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DML-SELECT</link>
            <guid>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DML-SELECT</guid>
            <pubDate>Mon, 16 Aug 2021 08:42:12 GMT</pubDate>
            <description><![CDATA[<h3 id="데이터-조작어data-manipulation-language-dml의-종류">데이터 조작어(Data Manipulation Language, DML)의 종류</h3>
<p>데이터 조작어는 모두 동사로 시작한다.
시작하는 동사에 따라 다음과 같이 4가지 조작어가 있다.</p>
<ul>
<li>SELECT-검색</li>
<li>INSERT-등록</li>
<li>UPDATE-수정</li>
<li>DELETE-삭제</li>
</ul>
<h3 id="select-구문의-기본-문형">SELECT 구문의 기본 문형</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180131_187/1517374752273Ba8n9_PNG/2_8_2_select__.PNG" alt=""> SELECT 옆에 괄호 안에 있는 DISTINCT는 필수가 아니다. 이와 마찬가지로 ALIAS도 필수가 아니다.</p>
<h3 id="select-전체-데이터-검색">SELECT 전체 데이터 검색</h3>
<p><code>*</code>은 모든 컬럼을 보여준다.</p>
<p><img src="https://images.velog.io/images/re-deok/post/af056016-6b8d-4394-b1b4-43ea000ff11c/%EC%BA%A1%EC%B2%98.PNG" alt=""> <strong>department</strong>의 테이블을 볼 수 있다.</p>
<h3 id="select-특정-컬럼-검색">SELECT 특정 컬럼 검색</h3>
<p><img src="https://images.velog.io/images/re-deok/post/21f70972-05af-4d35-913f-0e8799cc798b/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="select-컬럼에-alias-부여하기">SELECT 컬럼에 Alias 부여하기</h3>
<p><img src="https://images.velog.io/images/re-deok/post/059db1ba-8588-4ed4-8864-a50dcbd73666/%EC%BA%A1%EC%B2%98.PNG" alt="">
위 사진에서는 <strong>Alias</strong>를 부여할 때 공백 다음에 별칭을 써주었는데
<img src="https://images.velog.io/images/re-deok/post/d504c99b-552b-4780-bd8c-575225ce7fe2/%EC%BA%A1%EC%B2%98.PNG" alt=""> 다음과 같이 명시적으로 사용할 수도 있다.
이는 콤마가 아닐 경우에는 <code>from</code>이거나 <strong>ALIAS</strong>로 생각하게 되므로 명시적으로 쓰지 않고 공백 다음에 사용할 수 있다.</p>
<h3 id="select-컬럼의-합성concatenation">SELECT 컬럼의 합성(Concatenation)</h3>
<p><img src="https://images.velog.io/images/re-deok/post/25cce890-58e3-4a11-a5e3-e6928eafb8d6/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="select-중복행의-제거">SELECT 중복행의 제거</h3>
<p><img src="https://images.velog.io/images/re-deok/post/72979e13-8087-48ea-a5a2-2144e1e67eaa/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="select-정렬하기">SELECT 정렬하기</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180227_237/15196955203980m2pE_PNG/2.PNG" alt=""></p>
<p><img src="https://images.velog.io/images/re-deok/post/008eba7b-780a-47a3-9323-33816ef57b3b/%EC%BA%A1%EC%B2%98.PNG" alt=""> 이름을 기준으로 정렬했으며 <code>order by</code>를 사용할 경우 기본적으로 <strong>ascending</strong>으로 정렬된다.
<img src="https://images.velog.io/images/re-deok/post/2c4cb00c-2eec-467a-847f-7952530f7eb7/%EC%BA%A1%EC%B2%98.PNG" alt=""> <code>order by [컬럼명, n번째 컬럼]</code> 뒤에 desc`를 붙여 <strong>desending</strong>으로 정렬할 수 있다. </p>
<p><img src="https://images.velog.io/images/re-deok/post/23c5f719-effe-42d8-9b4e-1d6e97b96d78/%EC%BA%A1%EC%B2%98.PNG" alt=""> <strong>2번째 컬럼</strong>을 <code>desc</code>로 정렬하였다.</p>
<h3 id="select-특정-행-검색---where절">SELECT 특정 행 검색 - WHERE절</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180227_23/1519695801630edbfc_PNG/3.PNG" alt=""></p>
<ul>
<li><p>산술비교 연산자
<code>employee</code>테이블에서 <strong>고용일(hiredate)이 1981년 이전</strong>의 <strong>사원이름</strong>과 <strong>고용일</strong>을 출력
<img src="https://images.velog.io/images/re-deok/post/8797f1e2-f0c7-4f13-9a78-55a34afceede/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
<li><p>논리비교 연산자
<code>employee</code> 테이블에서 <strong>부서번호가 30</strong>인 <strong>사원이름</strong>과 <strong>부서번호</strong> 출력
<img src="https://images.velog.io/images/re-deok/post/cfb423ed-40bb-40e4-979f-603e0110d65a/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
<li><p><code>IN</code> 키워드
<code>employee</code>테이블에서 <strong>부서번호가 10또는 30</strong>인 <strong>사원이름</strong>과 <strong>부서번호</strong>를 출력
<img src="https://images.velog.io/images/re-deok/post/d7e74e81-f2c2-4ffd-8c0c-edb3f1e1ff51/%EC%BA%A1%EC%B2%98.PNG" alt=""> 두번째 <strong>쿼리</strong>는 논리연산자를 통해 같은 결과를 가졌다.</p>
</li>
<li><p><code>AND</code> 키워드
<img src="https://images.velog.io/images/re-deok/post/c20842a3-4878-4317-896b-65ebdfb36114/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
<li><p><code>LIKE</code> 키워드
<strong>와일드 카드</strong>를 사용하여 <strong>특정 문자를 포함한 값에 대한 조건을 처리</strong>
<code>%</code>는 <strong>0에서부터 여러 개의 문자열을 나타낸다.</strong>
<code>_</code>는 <strong>단 하나의 문자를 나타내는 와일드 카드</strong></p>
</li>
</ul>
<p><strong>A</strong>로 시작하는 이름을 가진 사원들 출력
<img src="https://images.velog.io/images/re-deok/post/e5269f3b-bd0e-45b6-a6fa-e547000c13f0/%EC%BA%A1%EC%B2%98.PNG" alt="">
<strong>A</strong>로 이름이 끝나는 사원들 출력
<img src="https://images.velog.io/images/re-deok/post/3b229937-7652-4039-9d3a-0d472eeedede/%EC%BA%A1%EC%B2%98.PNG" alt=""> 없네요.
이름 안에 <strong>A</strong>가 들어가는 사원들 출력
<img src="https://images.velog.io/images/re-deok/post/f480c399-4031-42b7-9702-df54b0afb53e/%EC%BA%A1%EC%B2%98.PNG" alt="">
이름의 두번째 스펠링이 &#39;A&#39;인 사원들 출력
<img src="https://images.velog.io/images/re-deok/post/17989ba9-749f-4436-96ab-3cd3ffdfd18c/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="select-함수의-사용">SELECT 함수의 사용</h3>
<ul>
<li><code>UPPER</code>, <code>UCASE</code>, <code>LOWER</code>, <code>LCASE</code> : 문자열을 대문자 혹은 소문자로 나타낸다.
<code>LOWER</code>함수를 이용해서 이름을 소문자로 출력
<img src="https://images.velog.io/images/re-deok/post/7951c140-c0af-4064-8d6d-648ab48497e9/%EC%BA%A1%EC%B2%98.PNG" alt=""></li>
</ul>
<p><em><code>SUBSTRING</code> : 문자열을 조건에 맞게 잘라낸다.
 *</em>Happy Day** 문자열에서 3번째 문자를 시작으로 2개의 문자를 자름
 <img src="https://images.velog.io/images/re-deok/post/ac2261be-b61d-432e-9897-627b87f4f901/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p> *<code>LPAD</code>, <code>RPAD</code> : 출력 시 공백이 존재할 경우 해당 부분 오른쪽 혹은 왼쪽에 지정한 문자를 채워준다.
 <img src="https://images.velog.io/images/re-deok/post/c2452c56-9c22-4438-8151-9f36647e6fc1/%EC%BA%A1%EC%B2%98.PNG" alt="">
 <img src="https://images.velog.io/images/re-deok/post/d2e2eae9-c87f-47d4-abef-4dda4f244141/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<ul>
<li><p><code>TRIME</code>, <code>LTRIM</code>, <code>RTRIM</code> : 공백을 지워준다.
<img src="https://images.velog.io/images/re-deok/post/8b043ff0-73d8-4030-b52a-26818ba184b5/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
<li><p><code>ABS(x)</code> : x의 절대값을 구해준다.</p>
</li>
<li><p><code>MOD(n,m)</code> / <code>%</code> : n을 m으로 나눈 나머지 값을 출력한다.</p>
</li>
<li><p><code>FLOOR(x)</code> : x보다 크지 않은 가장 큰 정수를 반환한다. BiGINT로 자동 변환한다.</p>
</li>
<li><p><code>CEILING(x)</code> : x보다 작지 않은 가장 작은 정수를 반환한다.</p>
</li>
<li><p><code>POW(x,y)</code>, <code>POWER(x,y)</code> : x의 y제곱을 반환한다.</p>
</li>
<li><p><code>GREATEST(x,y,...)</code> : 가장 큰 값을 반환한다.</p>
</li>
<li><p><code>LEAST(x,y,...)</code> : 가장 작은 값을 반환한다.</p>
</li>
<li><p><code>CURDATE()</code>, <code>CURRENT_TIME</code> : 오늘 날짜를 YYYY-MM-DD나 YYYYMMDD 형식으로 반환한다.</p>
</li>
<li><p><code>CURTIME()</code>, <code>CURRENT_TIME</code> : 현재 시각을 HH:MM:SS나 HHMMSS 형식으로 반환한다.</p>
</li>
<li><p><code>NOW()</code>, <code>SYSDATE()</code>, <code>CURRENT_TIMESTAMP</code> : 오늘 현시각을 YYYY-MM-DD HH:MM:SS나 YYYYMMDDHHMMSS 형식으로 반환한다.</p>
</li>
<li><p><code>DATE_FORMAT(date, format)</code> : 입력된 date를 format 형식으로 반환한다.</p>
</li>
<li><p><code>PERIOD_DIFF(p1, p2)</code> : YYMM이나 YYYYMM으로 표기되는 p1과 p2의 차이 개월을 반환한다.</p>
</li>
</ul>
<h3 id="select-cast-형변환">SELECT CAST 형변환</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180227_7/1519696097137n1dmo_PNG/4.png" alt="">
<img src="https://images.velog.io/images/re-deok/post/34f40f0a-a856-4814-856c-d62c9819a48f/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="select-그룹함수">SELECT 그룹함수</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180131_87/151738015308653Cmb_PNG/2_8_2_select_%28%29.PNG" alt="">
지금까지 본 함수들은 컬럼 하나에 결과가 하나 나오는 단일 함수였고 그룹함수는 여러 개의 컬럼을 가지고 하나의 결과가 나오게 한다.
<img src="https://images.velog.io/images/re-deok/post/820f0d35-5410-4216-88a2-9ae8e965bbb8/%EC%BA%A1%EC%B2%98.PNG" alt=""> 다음과 같이 여러 컬럼을 통해 결과를 보여주는 것을 알 수 있다.</p>
<ul>
<li><p><code>AVG, SUM</code>
<code>employee</code>테이블에서 <strong>부서번호가 30인</strong> 직원의 <strong>급여 평균</strong>과 <strong>총합계</strong>를 출력
<img src="https://images.velog.io/images/re-deok/post/371cab48-e440-41dd-ae4c-f4c99de318a7/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
<li><p><code>GROUP BY [컬럼명]</code> : <code>컬럼명</code>에 해당하는 컬럼들을 보여준다.
<code>employee</code>테이블에서 <strong>부서별 직원의 부서번호</strong>, <strong>급여 평균</strong>과 <strong>총합계</strong>를 출력 
<img src="https://images.velog.io/images/re-deok/post/090d9a48-c473-4ff8-bd91-62a379b6f9d5/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
</li>
</ul>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/258484/?isDesc=false">부스트 코스</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데이터베이스] MySQL-2]]></title>
            <link>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-MySQL-2</link>
            <guid>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-MySQL-2</guid>
            <pubDate>Mon, 16 Aug 2021 08:07:12 GMT</pubDate>
            <description><![CDATA[<h3 id="관계형-db-rdb">관계형 DB (RDB)</h3>
<p>현재 사용중인 MySQL은 관계형 DB이다. 관계형 DB는 데이터들이 테이블 형태로 저장된다. </p>
<h3 id="데이터를-저장하는-공간-테이블table">데이터를 저장하는 공간 테이블(Table)</h3>
<ul>
<li>데이터베이스를 생성해도 테이블은 존재하지 않는다.</li>
<li>테이블을 사용하려면 테이블을 생성하는 SQL을 사용해야 한다.</li>
<li>테이블에 값을 저장하려면 저장하기 위한 SQL을 사용해야 한다.</li>
</ul>
<h3 id="테이블table의-구성요소">테이블(table)의 구성요소</h3>
<p><img src="https://cphinf.pstatic.net/mooc/20180131_276/1517366013781n0BtX_PNG/2_8_1_%28table%29_.PNG" alt=""></p>
<ul>
<li>테이블 : RDBMS의 기본적인 저장 구조 한 개 이상의 column과 0개 이상의 row로 구성된다.</li>
<li>열(Column) : 테이블 상의 단일 종류의 데이터를 나타낸다. 특정 데이터 타입 미 크기를 가지고 있다.</li>
<li>행(Row) : Column들의 값의 조합. 레코드라 불린다. 기본키(PK)에 의해 구분. 기본키는 중복을 허용하지 않으며 없어서는 안된다.</li>
<li>Field : Row와 Column의 교차점으로 Field는 데이터를 포함할 수 있고 없을 때는 NULL 값을 가지고 있다.</li>
</ul>
<h3 id="현재-데이터베이스에-존재하는-테이블-목록-확인하기">현재 데이터베이스에 존재하는 테이블 목록 확인하기</h3>
<blockquote>
<p>Database를 선택 후, Database의 전체 테이블 목록을 출력 :</p>
</blockquote>
<p><img src="https://images.velog.io/images/re-deok/post/7f10a83c-40e7-40a2-b299-207c60b2e603/%EC%BA%A1%EC%B2%98.PNG" alt="">
<code>use connectdb</code> 쿼리를 통해 connectdb로 이동하여 <code>show tables</code> 쿼리를 통해 connectdb의 테이블을 확인해 보았다.</p>
<h3 id="테이블-구조를-확인하기-위한-describe-명령">테이블 구조를 확인하기 위한 DESCRIBE 명령</h3>
<p>테이블 구조를 확인하기 위해, <code>DESCRIBE</code> 명령을 사용할 수 있다.
짧게 DESC라고 사용해도 된다.
<img src="https://images.velog.io/images/re-deok/post/9cf807c6-cbda-4ab8-acb6-20630206a835/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/258482?isDesc=false">부스트코스</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데이터베이스] MySQL-1
]]></title>
            <link>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-MySQL</link>
            <guid>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-MySQL</guid>
            <pubDate>Sun, 15 Aug 2021 13:00:11 GMT</pubDate>
            <description><![CDATA[<h3 id="sqlstructured-query-language">SQL(Structured Query Language)</h3>
<ul>
<li><code>SQL</code>은 데이터를 보다 쉽게 검색하고 <strong>추가</strong>, <strong>삭제</strong>, <strong>수정</strong> 같은 조작을 할 수 있도록 고안된 컴퓨터 언어이다.</li>
<li><code>관계형 데이터베이스</code>에서 데이터를 <strong>조작</strong>하고 <strong>쿼리</strong>하는 표준 수단이다.</li>
<li><code>DML(Data Manipulation Language)</code> : 데이터를 <strong>조작</strong>하기 위해 사용한다.
<code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code>, <code>SELECT</code> 등이 여기에 해당한다.</li>
<li><code>DDL(Data Definition Language)</code> : <code>데이터베이스</code>의 <strong>스키마</strong>를 <strong>정의</strong>하거나 <strong>조작</strong>하기 위해 사용한다.
 <code>CREATE</code>, <code>DROP</code>, <code>ALTER</code> 등이 여기에 해당한다.</li>
<li><code>DCL(Data Control Language)</code> : 데이터를 <strong>제어</strong>하는 언어이다. <strong>권한</strong>을 관리하고, 데이터의 <strong>보안</strong>, <strong>무결성</strong> 등을 정의한다.
<code>GRANT</code>, <code>REVOKE</code> 등이 여기에 해당한다.</li>
</ul>
<h3 id="database-생성하기">Database 생성하기</h3>
<ul>
<li>콘솔에서 다음과 같이 명령을 실행한다. <code>MySQL</code> <strong>관리자 계정</strong>인 <code>root</code>로 <code>데이터베이스 관리 시스템</code>에 접속한다.<blockquote>
<p>mysql -uroot -p <br>-u[username] : 유저는 username, -p는 패스워드 옵션</p>
</blockquote>
</li>
<li><strong>window 사용자</strong>는 설치시에 입력했던 <strong>암호</strong>를 입력한다. <strong>맥사용자</strong>는 <strong>암호</strong>가 없으니 그냥 엔터를 입력하면 된다.
<img src="https://images.velog.io/images/re-deok/post/4f0b4aa3-622c-4296-bba5-aad9a4057374/%EC%BA%A1%EC%B2%98.PNG" alt=""></li>
<li>관리자 계정으로 <code>MySQL</code>에 접속했다면, 다음과 같은 명령으로 <code>데이터베이스</code>를 생성한다.<blockquote>
<center>mysql> create database <span style = "color:red">[DB이름]</span>;
</blockquote>
</li>
</ul>
<p><img src="https://images.velog.io/images/re-deok/post/b0ab0545-e0f1-47e3-a38c-821237143f4a/%EC%BA%A1%EC%B2%98.PNG" alt="">
  다음과 같이 작성 시 DB이름에 해당하는 <code>데이터베이스</code>를 <strong>생성</strong>하게 된다. <code>데이터베이스</code>를 <strong>생성</strong>할 수 있는 <strong>유저</strong>는 <strong>권한</strong>이 따로 있어야 하지만 현재 <code>root</code>로 접속했기 때문에 모든 걸 할 수 있다.</p>
<h3 id="database-사용자-생성과-권한-주기">Database 사용자 생성과 권한 주기</h3>
<ul>
<li><code>Database</code>를 생성했다면, 해당 <code>데이터베이스</code>를 사용하느 <strong>계정</strong>을 생성해야 한다. 또한 해당 계정이 데이터베이스를 이용할 수 있는 <strong>권한</strong>을 주어야 한다. 아래와 같은 명령을 이용해서 사용자 <strong>생성</strong>과 <strong>권한</strong>을 줄 수 있다.</li>
<li>db이름 뒤의 <strong>**<em>는 *</em>모든 권한</strong>을 의미한다. <strong>@`%`</strong>는 <strong>어떤 클라이언트에서든 접근 가능</strong>하다는 의미이고, <strong>@`localhost`</strong>는 <strong>해당 컴퓨터에서만 접근 가능</strong>하다는 의미이다.</li>
<li><strong>flush privileges</strong>는 <strong>DBMS에게 적용</strong>하라는 의미이다. 해당 명령은 반드시 실행해줘야 한다.</li>
</ul>
<blockquote>
<p>grant all privileges on <span style="color:red">[db이름]</span>.<em>to <span style="color:red">[username]</span>@&#39;%&#39;identified by &#39;<span style="color:red">암호</span>&#39;;
grant all privileges on <span style="color:red">[db이름]</span>.</em>to <span style="color:red">[username]</span>@&#39;localhost&#39;identified by &#39;<span style="color:red">암호</span>&#39;;
flush privileges;</p>
<center>위 <strong>쿼리</strong>는 **MySQL 5.x** 버전에서만 된다.
</blockquote>
<p>  <img src="https://images.velog.io/images/re-deok/post/0c759b5c-b60c-475c-8c3a-89ce3c653c01/%EC%BA%A1%EC%B2%98.PNG" alt=""> <strong>MySQL 8.x</strong>버전을 쓰다면 위 사진과 같이 <code>쿼리</code>를 작성한 뒤에 사용자에게 권한을 부여해야 한다.</p>
<p>  해당 계정이 잘 만들어졌는지 확인하기 위해 다음 명령어를 실행하여 확인한다.</p>
<blockquote>
<p>mysql -h<span style="color:red">[호스트명]</span> -u<span style="color:red">[DB계정명]</span> -p <span style="color:red">[데이터베이스 이름]</span></p>
</blockquote>
<p><strong>db이름</strong>이 <strong>connectdb</strong>, <strong>db계정</strong>이 <strong>connectuser</strong>, <strong>암호</strong>가 <strong>connect123!@#</strong>일 경우 콘솔창에 다음과 같이 입력한다. 이때 패스워드는 미리 입력하지 않은 상태로 한칸 띄워준 뒤에 <strong>데이터베이스 이름</strong>을 작성한다.</p>
<blockquote>
<p>mysql -h<span style="color:red">1270.0.1</span> -u<span style="color:red">connectuser</span> -p <span style="color:red">connectdb</span></p>
</blockquote>
<p>  <img src="https://images.velog.io/images/re-deok/post/24488657-25b4-482f-b052-924c56b37040/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>  그럼 다음과 같이 패스워드를 입력하는 커맨드라인이 나오게 되고 비밀번호를 입력하게 된다면 다음과 같은 결과가 나오게 된다.
<img src="https://images.velog.io/images/re-deok/post/77477c4a-3feb-4a94-ae24-2d2b4f407e07/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="mysql-연결-끊기">MySQL 연결 끊기</h3>
<ul>
<li><code>exit;</code> 혹은 <code>quit;</code>를 입력하면 된다.
<img src="https://images.velog.io/images/re-deok/post/5d1ea126-3c13-4639-9839-ad352b21134e/%EC%BA%A1%EC%B2%98.PNG" alt=""></li>
</ul>
<h3 id="mysql-버전과-현재-날짜-구하기">MySQL 버전과 현재 날짜 구하기</h3>
<p>프롬프트에서는 <code>SQL</code>을 입력한다. <code>SQL</code>은 <strong>semicolon(;)</strong>으로 끝난다. <code>SQL</code>은 <code>쿼리(Query)</code>라고 읽는다. <code>쿼리</code>는 <code>DBMS</code>에게 명령을 내릴 때 사용하는 문장이라고 생각하면 쉽다.
<code>SELECT</code>는 어떤 내용을 <strong>조회</strong>할 때 사용하는 키워드이다. (<code>SELECT</code>는 <code>DML</code>에 해당)
<code>MySQL</code>은 <code>쿼리</code>에 해당하는 결과의 <strong>전체 row</strong>를 출력하고 마지막에 전체 row 수와 쿼리 실행에 걸린 시간을 표시한다.</p>
<p>  <img src="https://images.velog.io/images/re-deok/post/7c422e03-10c1-415e-a0fd-b6a0509715bf/%EC%BA%A1%EC%B2%98.PNG" alt="">
  마지막줄을 보게 되면 결과를 표시해주는데 결과가 전체의 몇 줄이고, 몇 row인지 보여주며 쿼리가 실행되는 시간도 표시해준다.</p>
<h3 id="키워드는-대소문자를-구별-x">키워드는 대소문자를 구별 X</h3>
<p>  다음 <code>쿼리</code>들은 모두 같다 : </p>
<blockquote>
<p><strong>SELECT VERSION(), CURRENT_DATE;
  select version(), current_date;
  SeLeCt vErSiOn(), current_DATE;</strong></p>
</blockquote>
<h3 id="쿼리를-이용한-계산식의-결과">쿼리를 이용한 계산식의 결과</h3>
<blockquote>
<p><strong>SELECT SIN(PI()/4), (4+1*5);</strong></p>
</blockquote>
<p>  <img src="https://images.velog.io/images/re-deok/post/71505d7f-009f-4bff-bfd0-0341d6e2a8ce/%EC%BA%A1%EC%B2%98.PNG" alt="">
  계산도 됨.</p>
<h3 id="여러-문장을-한-줄에-연속으로-붙여서-실행가능">여러 문장을 한 줄에 연속으로 붙여서 실행가능</h3>
<blockquote>
<p><strong>SELECT VERSION(); SELECT NOW();</strong></p>
</blockquote>
<p>  <img src="https://images.velog.io/images/re-deok/post/e621b82b-a958-4926-ad5c-fbdd76d76ca2/%EC%BA%A1%EC%B2%98.PNG" alt="">
  붙여 써도 알아서 해줌.</p>
<h3 id="하나의-sql은-여러-줄로-입력가능">하나의 SQL은 여러 줄로 입력가능</h3>
<blockquote>
<p><strong>SELECT
 USER()
 ,
 CURRENT_DATE;</strong></p>
</blockquote>
<p>  <img src="https://images.velog.io/images/re-deok/post/a03e5b78-4b44-4580-8c7a-d73348e88ba9/%EC%BA%A1%EC%B2%98.PNG" alt="">
  가독성이 좋아짐</p>
<h3 id="sql을-입력하는-도중에-취소가능">SQL을 입력하는 도중에 취소가능</h3>
<p>긴 쿼리를 작성하다가 중간에 취소해야 하는 경우 \c를 붙여주면 된다.</p>
<blockquote>
<p>** SELECT
  USER()
  \c**</p>
</blockquote>
<h3 id="dbms에-존재하는-데이터베이스-확인">DBMS에 존재하는 데이터베이스 확인</h3>
<pre><code>작업하기 위한 데이터베이스를 선택하기 위해서는 어떤 데이터베이스가 존재하는 지 알아보아야 한다.</code></pre><p>  현재 서버에 존재하는 데이터베이스를 찾아보기 위해서 <code>SHOW statment</code>를 사용한다.
  <img src="https://images.velog.io/images/re-deok/post/4797b698-090f-418d-947b-438d2b477d96/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<h3 id="사용중인-데이터베이스-전환">사용중인 데이터베이스 전환</h3>
<p>  Database를 선택하기 위해, &quot;use&quot; command 사용:</p>
<blockquote>
<p><strong>use mydb;</strong></p>
</blockquote>
<p>데이터베이스를 전환하려면, 이미 데이터베이스가 존재해야하며 현재 접속중인 계정이 해당 데이터베이스를 사용할 수 있는 권한이 있어야 한다.
<img src="https://images.velog.io/images/re-deok/post/4ff42dba-0c60-4f13-8b2c-e6375d375ed9/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>  다음과 같이 나갔다가 <code>root계정</code>으로 <strong>connectdb</strong>에 접속한 것을 볼 수 있다.</p>
<p>  (두번째 <code>mysql -root -p</code>는 잘못 입력했다...)</p>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/258481?isDesc=false">부스트코스</a>
<a href="https://www.ciokorea.com/news/35385">SQL이란 무엇인가</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[데이터베이스] DBMS]]></title>
            <link>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DBMS</link>
            <guid>https://velog.io/@re-deok/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-DBMS</guid>
            <pubDate>Sun, 15 Aug 2021 09:34:54 GMT</pubDate>
            <description><![CDATA[<h3 id="intro">intro</h3>
<p><img src="https://images.velog.io/images/re-deok/post/a84360b4-11ac-4f79-be6c-1352e939bf23/What-is-Database-s1.png" alt="">
프로그램에서 다루는 데이터가 많아지면 많아질 수록 데이터의 관리는 어려워진다. 이러한 데이터를 쉽고 편리하게 다룰 수 있도록 하기 위해 나온 것이 <code>DBMS(DataBase Management System)</code>이다.</p>
<h3 id="데이터베이스의-기본개념">데이터베이스의 기본개념</h3>
<ul>
<li>데이터의 집합(a Set of Data)</li>
<li>여러 응용 시스템(프로그램)들의 통합된 정보들을 저장하여 운영할 수 있는 공용(share) 데이터의 집합</li>
<li>효율적으로 저장, 검색, 업데이트를 할 수 있도록 데이터 집합들끼리 연관시키고 조직화되어야 한다.</li>
</ul>
<h3 id="데이터베이스의-특성">데이터베이스의 특성</h3>
<ul>
<li><strong>실시간 접근성(Real-time Accessability)</strong>
사용자의 요구를 즉시 처리할 수 있다.</li>
<li><strong>계속적인 변화(Continuous Evolution)</strong>
  정확한 값을 유지하려고 삽입/삭제/수정 작업 등을 이용해 데이터를 지속적으로 업데이트할 수 있다.   </li>
<li><strong>동시 공유성(Concurrent Sharing)</strong>
  사용자마다 서로 다른 목적으로 사용하므로 동시에 여러 사람이 동일한 데이터에 접근하고 이용할 수 있다.</li>
<li><strong>내용 참조(content Reference)</strong>
  저장한 데이터 레코드의 위치나 주소가 아닌 사용자가 요구하는 데이터의 내용, 즉 데이터 값에 따라 참조할 수 있어야 한다.</li>
</ul>
<h3 id="데이터베이스-관리-시스템database-management-system--dbms">데이터베이스 관리 시스템(Database Management System = DBMS)</h3>
<ul>
<li><code>데이터베이스</code>를 관리하는 소프트웨어</li>
<li>여러 응용 소프트웨어(프로그램) 또는 시스템이 동시에 <code>데이터베이스</code>에 접근하여 사용할 수 있게 한다.</li>
<li>필수 3기능
  정의 기능 : <code>데이터 베이스</code>의 논리적, 물리적 구조를 정의
  조작 기능 : 데이터를 검색, 삭제, 갱신, 삽입, 삭제하는 기능
  제어 기능 : <code>데이터베이스</code>의 내용 정확성과 안전성을 유지하도록 제어하는 기능</li>
<li>Oracle, SQL Server, MySQL, DB2 등의 사용 또는 공개 DBMS가 있다.</li>
</ul>
<h3 id="데이터베이스-관리-시스템의-장단점">데이터베이스 관리 시스템의 장/단점</h3>
<p><code>데이터베이스</code>가 없다면 파일 시스템같은 것을 이용해야 하는데 파일에 텍스트를 넣어놓고 데이터를 가져가 쓰는 형식이어야 한다. 요즘에는 JSON과 같은 형태로 편하게 가져다 사용할 수 있는 형태도 있지만 일반적인 텍스트를 저장하는 파일들을 생각해보면 파일에는 데이터가 중복이되는지 안되는지 관리해주지 않는다. 이러한 문제를 DBMS는 해결해 줄 수 있다.</p>
<ul>
  <li> <strong>장점</strong>
    <ul>
      <li> 데이터 중복이 최소화
      <li> 데이터의 일관성 및 무결성 유지
      <li> 데이터 보안 보장
    </ul>
  <li> <strong>단점</strong>
    <ul>
      <li> 운영비가 비싸다. (기술자 월급/Oracle의 경우 비용 지불/학습 비용)
      <li> 백업 및 복구에 대한 관리가 복잡
      <li> 부분적 데이터베이스 손실이 전체 시스템을 정지
    </ul>
</ul>

<h3 id="생각해보기">생각해보기</h3>
<p>Q. Database와 DBMS란?</p>
<p>A. Database는 데이터들을 모아놓은 곳이고 DBMS는 모아놓은 데이터를 관리하는 시스템이다.</p>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/58930?isDesc=false">부스트 코스</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 서버]]></title>
            <link>https://velog.io/@re-deok/%EC%9B%B9-%EC%84%9C%EB%B2%84</link>
            <guid>https://velog.io/@re-deok/%EC%9B%B9-%EC%84%9C%EB%B2%84</guid>
            <pubDate>Sun, 15 Aug 2021 08:53:18 GMT</pubDate>
            <description><![CDATA[<h2 id="웹-서버">웹 서버</h2>
<p><code>웹 브라우저</code>를 실행한 후 입력창에 URL 주소를 입력하면, URL 주소에 해당하는 화면이 보이게 된다. 우리가 현실에서 주소를 보고 집을 찾아가는 것처럼, <code>웹 브라우저</code>는 URL 주소에 해당하는 <code>웹서버(Web Server)</code>에 연결하고, 해당 주소에서 볼 수 있는 내용을 읽어 들여 보여주게 된다.</p>
<h3 id="웹-서버란">웹 서버란?</h3>
<ul>
<li><p><code>웹 서버</code>는 소프트웨어(Software)를 보통 말하지만, <code>웹 서버</code> 소프트웨어가 동작하는 컴퓨터를 말한다.</p>
</li>
<li><p><code>웹 서버</code>의 가장 중요한 기능은 <code>클라이언트(Client)</code>가 요청하는 <code>HTML 문서</code>나 <code>각종 리소스(Resource)</code>를 전달하는 것이다. </p>
<blockquote>
<p><code>클라이언트</code>는 보통 웹 브라우저</p>
</blockquote>
</li>
<li><p><code>웹 브라우저</code>나 <code>웹 크롤러</code>가 요청하는 리소스는 컴퓨터에 저장된 <code>정적(static)인 데이터</code>이거나 <code>동적인 결과</code>가 될 수 있다.</p>
<blockquote>
<ul>
<li><code>정적인 데이터</code> : 이미지, HTML 파일, CSS 파일, JavaScript 파일과 같이 컴퓨터에 저장된 파일</li>
<li><code>동적인 결과</code> : 웹 서버에 의해 실행되는 프로그램으로 만들어진 결과물</li>
<li><code>웹 크롤러</code> : 네이버나 구글 같은 검색 사이트에서 다른 웹사이트 정보를 읽어갈 때 사용하는 소프트웨어</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="웹-브라우저와-웹-서버">웹 브라우저와 웹 서버</h3>
<p><img src="https://mdn.mozillademos.org/files/8659/web-server.svg" alt=""></p>
<p> <code>클라이언트</code>와 <code>웹 서버</code> 간에는 보통 <code>HTTP</code>를 통해 통신을 하게 된다. URL 주소가 <code>HTTP</code>로 시작되는 이유는 <code>HTTP</code>를 사용한다는 것을 의미한다. </p>
<blockquote>
<p><code>HTTP</code>는 <code>HyperText Transfer Protocol</code>의 약자로 인터넷상의 데이터를 주고 받기 위한 통신 규약을 의미한다.</p>
</blockquote>
<p> 사용하는 <code>웹 브라우저</code>에 <code>Ctrl+Shift+I</code>를 누르게 되면 개발자 모드가 나오게 된다. 여기서 <code>Network</code>탭에 들어간 뒤에 새로고침을 해보자.
<img src="https://images.velog.io/images/re-deok/post/ab73a8c9-7d81-477e-9fe7-385008f0ab57/image.png" alt=""></p>
<p>다음과 같이 js파일, css파일, 이미지 파일 등 여러 파일들이 보이게 된다. 
이는 <code>웹 브라우저</code>가 <code>www.naver.com</code>이라는 <code>웹 서버</code>에 접속한 뒤에 해당 주소에서 기본으로 보이는 <code>HTML 문서</code>를 요청한 것이다.</p>
<p>  <code>웹 서버</code>는 사용자가 요청한 <code>HTML 문서</code>를 <code>웹 브라우저</code>에게 전달하고 <code>웹 브라우저</code>는 <code>웹 서버</code>로부터 전송받은 <code>HTML 문서</code>를 읽어들인 후 해석을 하게 된다. <code>HTML 문서</code>를 알맞게 보여주기 위해 필요한 이미지, CSS, JavaScript와 같은 리소스들에 대해 URL을 추출하고 <code>웹 서버</code>에게 동시에 여러 개의 리소스를 다시 요청하게 된다. <code>웹 서버</code>는 여러 리소스 요청을 다시 받아들여 브라우저에게 전송하게 된다.
  <code>웹 브라우저</code>는 해석한 <code>HTML 문서</code>와 <code>웹 서버</code>에게 응답받은 여러 개의 리소스들을 하나로 합쳐 그 결과를 <code>렌더링</code>하여 화면에 보여주게 된다.</p>
<blockquote>
<p><code>렌더링</code> : 여러 리소스들을 하나로 합쳐서 보여주는 작업</p>
</blockquote>
<h3 id="웹-서버-소프트웨어의-종류">웹 서버 소프트웨어의 종류</h3>
<ul>
<li>가장 많이 사용하는 <code>웹 서버</code>는 Apache, Nginx, Microsoft IIS</li>
<li><code>Apache 웹 서버</code>는 Apache Software Foundation에서 개발한 웹서버로 <code>오픈소스 소프트웨어(Open-source Software)</code>이며, 거의 대부분 운영체제에서 설치 및 사용할 수 있다.</li>
<li><code>Nignx</code>는 차세대 웹 서버로 불리며 더 적은 자원으로 더 빠르게 데이터를 서비스하는 것을 목적으로 만들어진 서버이며 Apache 웹 서버와 마찬가지로 <code>오픈소스 소프트웨어</code>이다.</li>
</ul>
<h3 id="생각해보기">생각해보기</h3>
<p>Q. <strong>네이버</strong>와 <strong>구글</strong> 같은 검색 사이트에서 검색어를 입력하게 되면 검색어가 포함된 <code>웹 페이지</code>를 보여주게 되는데 <strong>네이버</strong>와 <strong>구글</strong>은 검색어가 포함된 <code>웹페이지</code>를 어떻게 알 수 있는지?</p>
<p>A. <strong>구글</strong>의 경우 <code>웹 크롤러</code>를 사용하여 사용자가 검색하기 이전에 방대한 <code>웹페이지</code> 정보를 모아 <code>검색 색인</code>에 정리하게 된다.
 사용자가 검색어를 입력하였을 때에는 웹 상의 방대한 정보를 <strong>구글</strong>의 <strong>검색 알고리즘</strong>인 <code>Google 랭킹 시스템</code>을 통해 검색 색인에서 유용하고 관련성 높은 검색 결과를 제공하여 사용자가 원하는 정보를 찾을 수 있도록 도와준다.</p>
<hr>
<p><strong>참고</strong>
<a href="https://www.boostcourse.org/web326/lecture/58946?isDesc=false">부스트 코스</a>
<a href="https://httpd.apache.org/">Apache</a>
<a href="https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%84%9C%EB%B2%84">웹 서버 - 위키피디아</a>
<a href="https://www.google.com/intl/ko/search/howsearchworks/algorithms/">구글 검색 원리</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹의 동작(HTTP 프로토콜 이해)]]></title>
            <link>https://velog.io/@re-deok/%EC%9B%B9%EC%9D%98-%EB%8F%99%EC%9E%91HTTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EC%9D%B4%ED%95%B4</link>
            <guid>https://velog.io/@re-deok/%EC%9B%B9%EC%9D%98-%EB%8F%99%EC%9E%91HTTP-%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C-%EC%9D%B4%ED%95%B4</guid>
            <pubDate>Sat, 14 Aug 2021 18:00:38 GMT</pubDate>
            <description><![CDATA[<h2 id="인터넷네트워크-통신의-이해">인터넷(네트워크 통신)의 이해</h2>
<p>보통 인터넷이라하면 <code>www</code>를 생각한다. 그 만큼 많은 사람들이 웹 브라우저를 사용한다.
물리적인 하나의 컴퓨터에는 여러개의 <code>서버</code>가 동작할 수 있다. 각각의 <code>서버</code>들은 <code>포트</code>라는 값으로 구분되어 동작한다.</p>
<ul>
<li>인터넷 != WWW(World Wide Web)
인터넷 기반의 대표 서비스 중 하나</li>
</ul>
<table>
<thead>
<tr>
<th align="left">이름</th>
<th>프로토콜</th>
<th>포트</th>
<th>기능</th>
</tr>
</thead>
<tbody><tr>
<td align="left">WWW</td>
<td>HTTP</td>
<td>80</td>
<td>웹서비스</td>
</tr>
<tr>
<td align="left">Email</td>
<td>SMTP/POP3/IMAP</td>
<td>25/110/114</td>
<td>이메일 서비스</td>
</tr>
<tr>
<td align="left">FTP</td>
<td>FTP</td>
<td>21</td>
<td>파일 전송 서비스</td>
</tr>
<tr>
<td align="left">DNS</td>
<td>TCP/UDP</td>
<td>53</td>
<td>네임 서비스</td>
</tr>
<tr>
<td align="left">NEWS</td>
<td>NNTP</td>
<td>119</td>
<td>인터넷 뉴스 서비스</td>
</tr>
</tbody></table>
<ul>
<li>인터넷(Internet)
TCP/IP 기반의 네트워크가 전세계적으로 확대되어 하나로 연결된 네트워크들의 네트워크 (네트워크의 결합체)</li>
</ul>
<h3 id="httphypertext-transfer-protocol란">HTTP(HyperText Transfer Protocol)란?</h3>
<p>인터넷은 웹에서 서로 통신하기 위해 HTTP를 사용한다.
HTTP는 어떤 종류의 데이터도 전송할 수 있도록 설계되어 있다.
예를 들어 이미지, 동영상, 텍스트 등 종류를 가리지 않고 전송 가능하다.</p>
<ul>
<li>HTTP는 서버와 클라이언트가 인터넷상에서 데이터를 주고 받기 위한 프로토콜(protocol)이다.</li>
<li>HTTP는 계속 발전하여 HTTP/2까지 버전이 등장한 상태이다.</li>
</ul>
<h3 id="http-작동방식">HTTP 작동방식</h3>
<p><img src="https://images.velog.io/images/re-deok/post/fcbae79c-9e47-4f21-ba8f-767413f8acbb/client-server-1.png" alt="">
클라이언트가 <code>요청</code>을 서버에 보내면 서버는 클라이언트에게 <code>응답</code>을 보낸다. 여기서 클라이언트가 &quot;먼저&quot; <code>요청</code>을 보낸다.</p>
<ul>
  <li> HTTP는 서버/클라이언트 모델을 따른다. 
<li> 장점
  <ul>
      <li> 불특정 다수를 대상으로 하는 서비스에는 적합하다.
      <li> 클라이언트와 서버가 계속 연결된 형태가 아니기 때문에 클라이언트와 서버 간의 최대 연결 수보다 훨씬 많은 요청과 응답을 처리할 수 있다.
  </ul>
<li>단점
  <ul>
      <li> 연결을 끊어버리기 때문에, 클라이언트의 이전 상황을 알 수 없다.
      <li> 이러한 특징을 무상태(Stateless)라 말한다.
      <li> 이러한 특징 때문에 정보를 유지하기 위해 `Cookie`와 같은 기술이 등장했다.
  </ul>
</ul>

<h3 id="urluniform-resource-locator">URL(Uniform Resource Locator)</h3>
<p><img src="https://images.velog.io/images/re-deok/post/affd44cf-47e8-40b9-94b2-626be2af0bfb/601c27acee136f00183aa4f5.jpg" alt="">
URL은 위 사진과 같이 <strong>프로토콜의 종류</strong>://<strong>자원이 있는 서버의 IP주소 or 도메인 주소 or 포트번호</strong>/<strong>자원의 위치</strong>/<strong>웹페이지</strong>로 되어 있다.</p>
<p>물리적인 서버를 찾기 위해 반드시 필요한 것은 <code>IP주소</code>나 <code>도메인 주소</code>이다. 이렇게 찾은 물리적인 서버 안에 존재하는 소프트웨어 서버를 찾기 위해서는 <code>포트</code>값이 필요하다.
여기서 <code>IP주소</code>는 집주소라 생각하고 <code>포트</code>를 집안에 있는 방들이라 생각하면 된다.
<code>http 서버는 기본 포트 값이 80번이다.</code></p>
<ul>
<li>인터넷상 자원의 위치</li>
<li>특정 웹 서버의 특정 파일에 접근하기 위한 경로 혹은 주소</li>
</ul>
<h3 id="httphypertext-transfer-protocol">HTTP(HyperText Transfer Protocol)</h3>
<p><img src="https://images.velog.io/images/re-deok/post/5df52d76-92d2-4e5e-941f-bff9c39310f5/%EC%BA%A1%EC%B2%98.PNG" alt=""></p>
<p>웹이 동작하는 부분을 살펴보면 반드시 클라이언트가 먼저 원하는 서버에 접속을 해야한다. 그리고 클라이언트는 서버에게 요청을 하게 되는데 서버는 아무거나 주지 않고 반드시 클라이언트가 접속해서 요청을 했을 때 요청에 따른 응답 결과를 다시 클라이언트한테 응답해주는 과정을 거치게 된다.
 이 응답이 끝나고 나면 위에서 말한 stateless와 같이 서버와 클라이언트의 연결은 끊기는 상태로 유지가 된다.</p>
<p> <code>요청 헤더</code> 부분의 첫번째 줄을 보면 GET이 보이는데 이 부분이 <code>요청 메서드</code>이다. 이 다음에 나오는 부분을 <code>요청 URI</code>라 하는데 요청하는 자원의 위치를 명시해주는 부분이다.
 마지막으로 나오는 부분이 http 프로토콜의 버전으로 웹 브라우저가 사용하는 프로토콜의 버전을 명시해주는 부분이라 생각하면 된다.</p>
<blockquote>
<p><strong>요청 메서드</strong> 종류
  GET : 정보를 요청하기 위해 사용 (SELECT)
  POST : 정보를 밀어넣기 위해 사용 (INSERT)
  PUT : 정보를 업데이트하기 위해 사용 (UPDATE)
  DELETE : 정보를 삭제하기 위해 사용 (DELETE)
  HEAD : (HTTP)헤더 정보만 요청, 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해 사용
  OPTIONS : 웹서버가 지원하는 메서드의 종류를 요청
  TRACE : 클라이언트의 요청을 그대로 반환, echo 서비스로 서버 상태를 확인하기 위한 목적으로 주로 사용</p>
</blockquote>
<p> <code>요청 바디</code>에는 아무 것도 없는 것을 볼 수 있는데 실제 GET이라는 방식은 요청할 때 가지고 가야하는 자원들도 모두 URI에 붙여서 가지고 가기 때문에 <code>요청 바디</code> 부분이 비어있는 것이다.
 <code>바디 요소</code>는 요청 메서드가 POST나 PUT을 사용할 때 들어오게 된다.</p>
<p> <code>응답 데이터 포맷</code>도 <code>요청 헤더</code> 부분과 같이 <code>헤더 부분</code>, <code>빈 줄 부분</code>, <code>응답 바디</code> 부분으</p>
<p> 요청되는 데이터는 정해진 규칙이 존재하는데 이것을 <code>요청 데이터 포맷</code>이라 한다. 웹 브라우저는 <code>요청 메시지</code>를 갖는데 여기에 <code>헤더</code>부분, <code>빈 줄</code> 부분이 <code>요청 바디</code> 부분 이렇게 세 부분으로 나누어 진다. 첫 줄에는 반드시 응답 HTTP 프로토콜의 버전 그 다음은 응답 코드 그리고 응답 메시지 등이 나올 수 있다. 나머지 <code>헤더</code>부분에는 날짜, 웹 서버 이름/버전, 콘텐츠 타임, 캐시 제어 방식, 콘텐츠 길이 등의 값이 나오게 된다.</p>
<p> <code>응답 바디</code>는 실제 응답 리소스 데이터가 나오는 부분이다.</p>
<hr>
<p><strong>참고</strong></p>
<ul>
<li><a href="https://www.boostcourse.org/web326/lecture/58942?isDesc=false">부스트코스</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview">An overview of HTTP</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백엔드 로드맵]]></title>
            <link>https://velog.io/@re-deok/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5</link>
            <guid>https://velog.io/@re-deok/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5</guid>
            <pubDate>Fri, 13 Aug 2021 09:25:00 GMT</pubDate>
            <description><![CDATA[<h2 id="backend-roadmap">Backend roadmap</h2>
<p><img src="https://images.velog.io/images/re-deok/post/5ade2063-5eb7-4e18-bb3c-9b06818988b4/image.png" alt=""></p>
<hr>
<p>출처 : <a href="https://github.com/devJang/developer-roadmap">devJang/developer-roadmap</a></p>
]]></description>
        </item>
    </channel>
</rss>