<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ours_111318.log</title>
        <link>https://velog.io/</link>
        <description>hello~</description>
        <lastBuildDate>Fri, 04 Mar 2022 13:47:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ours_111318.log</title>
            <url>https://images.velog.io/images/ours_111318/profile/c742c5e4-34bd-4443-8736-0a09bad10d7f/2.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ours_111318.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ours_111318" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[백준] 터렛]]></title>
            <link>https://velog.io/@ours_111318/%EB%B0%B1%EC%A4%80-%ED%84%B0%EB%A0%9B</link>
            <guid>https://velog.io/@ours_111318/%EB%B0%B1%EC%A4%80-%ED%84%B0%EB%A0%9B</guid>
            <pubDate>Fri, 04 Mar 2022 13:47:54 GMT</pubDate>
            <description><![CDATA[<p>문제
<img src="https://images.velog.io/images/ours_111318/post/9ff310e1-0e5b-4e6d-be6c-8274fb020a35/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-04%2021.55.35.png" alt=""></p>
<p>풀이
1)각 터렛의 좌표와 반지름이 주어지고 이에 대한 원의 접점을 구하라는 뜻이다.
2)두 원의 반지름 r1, r2<br>  두 원의 중심 사이의 거리 d</p>
<ul>
<li><p>두 원의 접점이 생길 수 있는 경우의 수는 4개</p>
<p>1) 두 원의 접점이 무수히 많은 경우 
: 두 원의 크기가 같은 경우 : d=0
<img src="https://images.velog.io/images/ours_111318/post/5312d781-d95d-4204-be87-4b16c35c501a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-04%2022.02.06.png" alt=""></p>
<p>2)두 원의 접점이 0개인 경우 
  :동심원인 경우 겹치는 부분이 없다 : d=o
:r1, r2, d중에서 가장 큰수가 나머지 두 수의 합보다 큰 경우
<img src="https://images.velog.io/images/ours_111318/post/2c5ee7d2-d0df-45f8-bdbc-6fbf6ce22b39/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-04%2022.04.27.png" alt="">
<img src="https://images.velog.io/images/ours_111318/post/7ea31589-edeb-4f8c-afd7-91c05fbe4c92/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-04%2022.44.04.png" alt=""></p>
<p>3)두 원의 접점이 1개인 경우
  : 외접 r1 + r2 = d
: 내접 r1 - r2 = d 
<img src="https://images.velog.io/images/ours_111318/post/30744cd8-50c7-4ccf-ba61-1826aa9e78a8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-04%2022.08.53.png" alt=""></p>
<p>4)두 원의 접점이 2개인 경우
  : r1 - r2 &lt;d &lt; r1 + r2 
<img src="https://images.velog.io/images/ours_111318/post/cf64f78e-1f11-4c04-85ae-a998714c10bb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-04%2022.10.38.png" alt=""> </p>
</li>
</ul>
<pre><code class="language-python">import math

T = int(input())

for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    d = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)

    if x1 == x2 and y1 == y2:     #원의 중심이 같을때
        if r1 == r2:
            print(-1)
        else:
            print(0)

    else:                         #원의 중심이 같지 않을때 
        if r1 &gt; d + r2 or r2 &gt; d + r1 or d &gt; r1 + r2:   #r1,r2,d중에서 가장 큰 수가 나머지 두 수의 합보다 큰 경우 
            print(0)
        elif abs(r1 - r2) == d or r1 + r2 == d:     #외접,내접일 경우
            print(1)
        else:                                        # 그밖의 경우 
            print(2)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준]설탕배달]]></title>
            <link>https://velog.io/@ours_111318/%EB%B0%B1%EC%A4%80%EC%84%A4%ED%83%95%EB%B0%B0%EB%8B%AC</link>
            <guid>https://velog.io/@ours_111318/%EB%B0%B1%EC%A4%80%EC%84%A4%ED%83%95%EB%B0%B0%EB%8B%AC</guid>
            <pubDate>Thu, 03 Mar 2022 01:47:26 GMT</pubDate>
            <description><![CDATA[<p>문제
<img src="https://images.velog.io/images/ours_111318/post/c697900d-3a22-4200-a054-b6c70e9eb126/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-03%2010.33.48.png" alt=""></p>
<p>예제
<img src="https://images.velog.io/images/ours_111318/post/2f00f429-105e-4196-b0d4-9a1adfe00b36/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-03%2010.33.56.png" alt=""></p>
<p>풀이
1.5Kg설탕을 나머지 없이 담을 수 있다면, 5로 나눈 몫을 출력 
2.5Kg설탕에 나머지가 생긴다면 3Kg에 담기(입력값은 -3, 카운트 +1)
3.입력값이 0보다 작아지면, -1 출력하고 종료 </p>
<pre><code class="language-python">
num = int(input())
count = 0 

while True:
    if num % 5 == 0:                #입력값의 나머지가 0 일때
        count += int(num//5)        #5로 나눈 몫을 카운트에 넣음
        print(count)
        break

    num -= 3                         #입력값에서 -3
    count += 1                       #카운트 1 증가 
    if num &lt; 0:                      #입력값이 0보다 작으면
        print(-1)                    #-1을 출력 
        break</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준]베르트랑 공준 ]]></title>
            <link>https://velog.io/@ours_111318/%EB%B0%B1%EC%A4%80%EB%B2%A0%EB%A5%B4%ED%8A%B8%EB%9E%91-%EA%B3%B5%EC%A4%80</link>
            <guid>https://velog.io/@ours_111318/%EB%B0%B1%EC%A4%80%EB%B2%A0%EB%A5%B4%ED%8A%B8%EB%9E%91-%EA%B3%B5%EC%A4%80</guid>
            <pubDate>Wed, 02 Mar 2022 14:41:38 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/ours_111318/post/841a025e-62f7-45de-8600-46e607a998c5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-02%2022.16.56.png" alt=""></p>
<p>풀이</p>
<p>1.소수를 구하는 함수를 만든다.
2.n&lt; i &lt;= 2n 의 범위 안에서 소수를 찾으면 count +=1 을 해준다.
3.count를 출력한다.</p>
<pre><code class="language-python">import math

def num(n):                            # 소수구하는 함수 num
    if n == 1:                         # 1은 소수가 아님.
        return False
    else:                                         #제곱근이 있는 수 중에 
        for i in range(2,int(math.sqrt(n))+1):   
            if n % i == 0:                        #약수가 있으면 false
                return False
        return True

all_list = list(range(2, 246912))         #문제에서 제한한 범위
save_list = []                            #빈 리스트 생성
for i in all_list:                        #2부터 2*123,456범위에
    if num(i):                            #num 함수에 해당하면
        save_list.append(i)               #리스트에 추가

n = int(input())                          #입력받은 정수 n

while True:
    count = 0                        #소수의 개수
    if n == 0 :                      #0이 입력되면 종료
            break
    for i in save_list:              #save_list에 저장된 소수들 중,
        if n &lt; i &lt;= n*2:             #입력한 값의 범위 내에서 값이 있으면
            count += 1               #있을 때 마다 카운트 +1
    print(count)
    n = int(input())                 #0 입력받기 전까지 계속 해야하므로 </code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[CORS]]></title>
            <link>https://velog.io/@ours_111318/CORS</link>
            <guid>https://velog.io/@ours_111318/CORS</guid>
            <pubDate>Sun, 13 Feb 2022 23:22:48 GMT</pubDate>
            <description><![CDATA[<p>교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제입니다. 웹 애플리케이션은 리소스가 자신의 출처(도메인, 프로토콜, 포트)와 다를 때 교차 출처 HTTP 요청을 실행합니다.</p>
<p>교차 출처 요청의 예시: <a href="https://domain-a.com%EC%9D%98">https://domain-a.com의</a> 프론트 엔드 JavaScript 코드가 XMLHttpRequest를 사용하여 <a href="https://domain-b.com/data.json%EC%9D%84">https://domain-b.com/data.json을</a> 요청하는 경우.</p>
<p>보안 상의 이유로, 브라우저는 스크립트에서 시작한 교차 출처 HTTP 요청을 제한합니다. 예를 들어, XMLHttpRequest와 Fetch API는 동일 출처 정책을 따릅니다. 즉, 이 API를 사용하는 웹 애플리케이션은 자신의 출처와 동일한 리소스만 불러올 수 있으며, 다른 출처의 리소스를 불러오려면 그 출처에서 올바른 CORS 헤더를 포함한 응답을 반환해야 합니다.
<img src="https://images.velog.io/images/ours_111318/post/e39dd546-fbce-46cd-b99f-8686a675101b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-14%2008.20.36.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL]]></title>
            <link>https://velog.io/@ours_111318/SQL</link>
            <guid>https://velog.io/@ours_111318/SQL</guid>
            <pubDate>Sun, 06 Feb 2022 07:56:03 GMT</pubDate>
            <description><![CDATA[<h1 id="sql">SQL</h1>
<p><strong>SQL (Structured Query Language)</strong>
 <a href="https://ko.wikipedia.org/wiki/%EA%B4%80%EA%B3%84%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EA%B4%80%EB%A6%AC_%EC%8B%9C%EC%8A%A4%ED%85%9C">관계형 데이터베이스 관리 시스템</a>(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 <a href="https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4">프로그래밍 언어</a>이다. </p>
<p>관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, <a href="https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%8A%A4%ED%82%A4%EB%A7%88">데이터베이스 스키마</a> 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었다. 많은 수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다.</p>
<p>SQL 문법의 종류는 다음 세 가지가 있다</p>
<ul>
<li><p><a href="https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%A0%95%EC%9D%98_%EC%96%B8%EC%96%B4">데이터 정의 언어</a> (DDL : Data Definition Language)</p>
<ul>
<li><a href="https://ko.wikipedia.org/wiki/CREATE_(SQL)">CREATE</a> (데이터베이스 개체 (테이블, 인덱스, 제약조건 등)의 정의)</li>
<li><a href="https://ko.wikipedia.org/wiki/DROP_(SQL)">DROP</a> (데이터베이스 개체 삭제)</li>
<li><a href="https://ko.wikipedia.org/wiki/ALTER_(SQL)">ALTER</a> (데이터베이스 개체 정의 변경)</li>
</ul>
</li>
<li><p><a href="https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%A1%B0%EC%9E%91_%EC%96%B8%EC%96%B4">데이터 조작 언어</a> (DML : Data Manipulation Language)</p>
<ul>
<li><p><a href="https://ko.wikipedia.org/wiki/INSERT_(SQL)">INSERT</a> INTO (행 데이터 또는 테이블 데이터의 삽입)</p>
</li>
<li><p><a href="https://ko.wikipedia.org/wiki/UPDATE_(SQL)">UPDATE</a> ~ SET (표 업데이트)</p>
</li>
<li><p><a href="https://ko.wikipedia.org/wiki/DELETE_(SQL)">DELETE</a> FROM (테이블에서 특정 행 삭제)</p>
</li>
<li><p><a href="https://ko.wikipedia.org/wiki/SELECT_(SQL)">SELECT</a> ~ FROM ~ WHERE (테이블 데이터의 검색 결과 집합의 취득)</p>
<p>뒷부분의 “동적 SQL”에서 SELECT 문은 한 번 실행에 1행의 결과를 얻는 “단일행 SELECT 문장”과 커서로 여러 줄의 결과를 얻는 “커서 SELECT 문”이 있다</p>
</li>
</ul>
</li>
<li><p><a href="https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%A0%9C%EC%96%B4_%EC%96%B8%EC%96%B4">데이터 제어 언어</a> (DCL : Data Control Language)</p>
<ul>
<li>GRANT (특정 데이터베이스 사용자에게 특정 작업을 수행 권한을 부여)</li>
<li>REVOKE (특정 데이터베이스 이용자로부터 이미 준 권한을 박탈 함.)</li>
<li>SET TRANSACTION ( 트랜잭션 모드 설정 (동시 트랜잭션 격리 수준 (ISOLATION MODE) 등))</li>
<li>BEGIN (<a href="https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98">트랜잭션</a> 시작)</li>
<li><a href="https://ko.wikipedia.org/wiki/COMMIT">COMMIT</a> (트랜잭션의 실행)</li>
<li><a href="https://ko.wikipedia.org/wiki/%EB%A1%A4%EB%B0%B1_(%EB%8D%B0%EC%9D%B4%ED%84%B0_%EA%B4%80%EB%A6%AC)">ROLLBACK</a> (트랜잭션 취소)</li>
<li><a href="https://ko.wikipedia.org/wiki/SAVEPOINT">SAVEPOINT</a> (무작위로 롤백 지점을 설정)</li>
<li>LOCK (TABLE 등의 자원을 차지)</li>
</ul>
</li>
</ul>
<p><em>참조</em></p>
<p><a href="https://ko.wikipedia.org/wiki/SQL">https://ko.wikipedia.org/wiki/SQL</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[MVC]]></title>
            <link>https://velog.io/@ours_111318/MVC</link>
            <guid>https://velog.io/@ours_111318/MVC</guid>
            <pubDate>Sun, 06 Feb 2022 07:48:23 GMT</pubDate>
            <description><![CDATA[<h1 id="mvc">MVC</h1>
<p> <strong>모델-뷰-컨트롤러</strong>(model–view–controller, MVC)는 <a href="https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EA%B3%B5%ED%95%99">소프트웨어 공</a>학에서 사용되는 <a href="https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EB%94%94%EC%9E%90%EC%9D%B8_%ED%8C%A8%ED%84%B4">소프트웨어 디자인 패턴</a>이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향없이 쉽게 고칠 수 있는 애플리케이션을 만들 수있다 </p>
<p> MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.</p>
<p><img src="https://images.velog.io/images/ours_111318/post/10779463-ed6c-4de2-abcc-5c51ff20d6a5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-06%2016.44.30.png" alt=""></p>
<ol>
<li>모델: 데이터와 비즈니스 로직을 관리합니다.</li>
<li>뷰: 레이아웃과 화면을 처리합니다.</li>
<li>컨트롤러: 명령을 모델과 뷰 부분으로 라우팅합니</li>
</ol>
<p><img src="https://images.velog.io/images/ours_111318/post/8574da7f-df1c-408c-8149-3d0d304a8713/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-06%2016.36.38.png" alt=""></p>
<ul>
<li>모델</li>
</ul>
<p>모델은 앱이 포함해야할 데이터가 무엇인지를 정의합니다. 데이터의 상태가 변경되면 모델을 일반적으로 뷰에게 알리며(따라서 필요한대로 화면을 변경할 수 있습니다) 가끔 컨트롤러에게 알리기도 합니다(업데이트된 뷰를 제거하기 위해 다른 로직이 필요한 경우).</p>
<p>다시 쇼핑 리스트 앱으로 돌아가서, 모델은 리스트 항목이 포함해야 하는 데이터 — 품목, 가격, 등. — 와 이미 존재하는 리스트 항목이 무엇인지를 지정합니다.</p>
<ul>
<li>뷰</li>
</ul>
<p>뷰는 앱의 데이터를 보여주는 방식을 정의합니다.</p>
<p>쇼핑 리스트 앱에서, 뷰는 항목이 사용자게에 보여지는 방식을 정의하며, 표시할 데이터를 모델로부터 받습니다.</p>
<ul>
<li>컨트롤러</li>
</ul>
<p>컨트롤러는 앱의 사용자로부터의 입력에 대한 응답으로 모델 및/또는 뷰를 업데이트하는 로직을 포함합니다.</p>
<p>예를 들어보면, 쇼핑 리스트는 항목을 추가하거나 제거할 수 있게 해주는 입력 폼과 버튼을 갖습니다. 이러한 액션들은 모델이 업데이트되는 것이므로 입력이 컨트롤러에게 전송되고, 모델을 적당하게 처리한다음, 업데이트된 데이터를 뷰로 전송합니다.</p>
<p>단순히 데이터를 다른 형태로 나타내기 위해 뷰를 업데이트하고 싶을 수도 있습니다(예를 들면, 항목을 알파벳순서로 정렬한다거나, 가격이 낮은 순서 또는 높은 순서로 정렬). 이런 경우에 컨트롤러는 모델을 업데이트할 필요 없이 바로 처리할 수 있습니다.</p>
<p><em>참조</em></p>
<p><a href="https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC">https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC</a>
<a href="https://developer.mozilla.org/ko/docs/Glossary/MVC">https://developer.mozilla.org/ko/docs/Glossary/MVC</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ORM]]></title>
            <link>https://velog.io/@ours_111318/ORM</link>
            <guid>https://velog.io/@ours_111318/ORM</guid>
            <pubDate>Sun, 06 Feb 2022 07:28:57 GMT</pubDate>
            <description><![CDATA[<h1 id="orm">ORM</h1>
<h2 id="object-relational-mapping-객체-관계-매핑">Object Relational Mapping, 객체-관계 매핑</h2>
<ul>
<li>객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.<ul>
<li>객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.</li>
<li>객체 모델과 관계형 모델 간에 불일치가 존재한다.</li>
<li>ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.</li>
</ul>
</li>
<li>데이터베이스 데이터 &lt;—매핑—&gt; Object 필드<ul>
<li>객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.</li>
</ul>
</li>
<li>Persistant API라고도 할 수 있다.
Ex) JPA, Hibernate 등</li>
</ul>
<p>ORM의 장단점</p>
<ul>
<li>장점<ul>
<li>객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와준다.<ul>
<li>ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터를 조작할 수 있어 개발자가 객체 모델로 프로그래밍하는 데 집중할 수 있도록 도와준다.</li>
<li>선언문, 할당, 종료 같은 부수적인 코드가 없거나 급격히 줄어든다.</li>
<li>각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.</li>
<li>SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 증가한다.</li>
</ul>
</li>
<li>재사용 및 유지보수의 편리성이 증가한다.<ul>
<li>ORM은 독립적으로 작성되어있고, 해당 객체들을 재활용 할 수 있다.</li>
<li>때문에 모델에서 가공된 데이터를 컨트롤러에 의해 뷰와 합쳐지는 형태로 디자인 패턴을 견고하게 다지는데 유리하다.</li>
<li>매핑정보가 명확하여, ERD를 보는 것에 대한 의존도를 낮출 수 있다.</li>
</ul>
</li>
<li>DBMS에 대한 종속성이 줄어든다.<ul>
<li>객체 간의 관계를 바탕으로 SQL을 자동으로 생성하기 때문에 RDBMS의 데이터 구조와 Java의 객체지향 모델 사이의 간격을 좁힐 수 있다.</li>
<li>대부분 ORM 솔루션은 DB에 종속적이지 않다.</li>
<li>종속적이지 않다는것은 구현 방법 뿐만아니라 많은 솔루션에서 자료형 타입까지 유효하다.</li>
<li>프로그래머는 Object에 집중함으로 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다.</li>
<li>또한 자바에서 가공할경우 equals, hashCode의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠른 가공이 가능하다.</li>
</ul>
</li>
</ul>
</li>
<li>단점<ul>
<li>완벽한 ORM 으로만 서비스를 구현하기가 어렵다.<ul>
<li>사용하기는 편하지만 설계는 매우 신중하게 해야한다.</li>
<li>프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.</li>
<li>잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있다.</li>
<li>일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는등 별도의 튜닝이 필요한 경우가 있다.</li>
<li>DBMS의 고유 기능을 이용하기 어렵다. (하지만 이건 단점으로만 볼 수 없다 : 특정 DBMS의 고유기능을 이용하면 이식성이 저하된다.)</li>
</ul>
</li>
<li>프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.<ul>
<li>이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><em>참조</em>
<a href="https://gmlwjd9405.github.io/2019/02/01/orm.html">https://gmlwjd9405.github.io/2019/02/01/orm.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JWT]]></title>
            <link>https://velog.io/@ours_111318/JWT</link>
            <guid>https://velog.io/@ours_111318/JWT</guid>
            <pubDate>Sun, 30 Jan 2022 09:10:28 GMT</pubDate>
            <description><![CDATA[<h2 id="jwt">JWT</h2>
<p><img src="https://images.velog.io/images/ours_111318/post/8a8a6635-98b6-435f-820d-5a9dc5cd0046/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-16%2018.09.23.png" alt=""></p>
<p>회원 인증시, 사용자가 로그인을 하면, 서버는 사용자의 정보를 기반으로한 토큰을 발급한다. 
사용자는 서버에 요청을 할때마다 JWT를 포함하여 전달하며,서버는 클라이언트에게서 요청을 받을때 마다, 해당 토큰이 유효하고 인증이 됬는지를 검증을 하고, 사용자가 요청한 작업에 권한이 있는지를 확인하여 작업을 처리한다. 
서버에서는 사용자에 대한 세션을 유지할 필요가 없다. 사용자가 요청을 했을때 토큰만 확인하면 되므로, 세션관리가 필요없어서 서버자원과 비용을 절감할 수 있는 장점이 있다. </p>
<ul>
<li>API
<img src="https://images.velog.io/images/ours_111318/post/53874b51-f7be-4fad-adb5-6991c538977b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-16%2019.19.13.png" alt=""></li>
</ul>
<p>API는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체.
즉,어떤 서버의 특정한 부분에 접속해서 그 안에 있는 데이터와 서비스를 이용할 수 있게 해주는 소프트웨어 도구라고 할수 있다.</p>
<ol>
<li>API는 서버와 데이터베이스에 대한 출입구 역할을 한다.</li>
<li>API는 애플리케이션과 기기가 원활하게 통신할 수 있도록 한다.</li>
<li>API는 모든 접속을 표준화한다</li>
</ol>
<p>REST API란?
:네트워크를 통해서 컴퓨터들끼리 통신할 수 있게 해주는 아키텍처 스타일을 말한다.
1.인터넷 식별자(URI)와 HTTP 프로토콜을 기반으로 한 단순함이 특징이다. 데이터 포맷으로는 브라우저 간 호환성이 좋은 제이슨(JSON)을 사용한다.
2.REST 방식의 API라면, 클라이언트-서버 모델로 구축되었다는 것을 의미하며, 정보의 페이로드(실제 전달하려는 내용)가 두 지점 사이를 왕복하게 된다,
3.REST API는 단일한 인터페이스를 사용한다.그렇기 때문에 해당 API를 사용하는 애플리케이션들이 동일한 경로를 통해서 접속해야 하고, 그 방식이 단순하게 된다.</p>
<p>:REST는 웹에 최적화되어 있고, 데이터 포맷이 JSON이기 때문에 브라우저들 간에 호환성이 좋다. 그래서 그 성능과 확장성이 뛰어난 것으로도 알려져 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[IoC / Bean]]></title>
            <link>https://velog.io/@ours_111318/IoC-Bean</link>
            <guid>https://velog.io/@ours_111318/IoC-Bean</guid>
            <pubDate>Sun, 30 Jan 2022 09:08:27 GMT</pubDate>
            <description><![CDATA[<h1 id="iocinversion-of-control">Ioc(Inversion of Control)</h1>
<ul>
<li><p><strong>IoC(Inversion of Control)란 &quot;제어의 역전</strong>&quot; 이라는 의미로, 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.</p>
</li>
<li><p>간단히 말해 _<strong>&quot;제어의 흐름을 바꾼다&quot;</strong>_라고 한다.</p>
</li>
<li><p>객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.</p>
</li>
</ul>
<p>기존에는 다음과 순서로 객체가 만들어지고 실행되었다.</p>
<p>1.객체 생성</p>
<p>2.의존성 객체 생성 /클래스 내부에서 생성</p>
<p>3.의존성 객체 메소드 호출</p>
<p>하지만, 스프링에서는 다음과 같은 순서로 객체가 만들어지고 실행된다.</p>
<p>1.객체 생성</p>
<p>2.의존성 객체 주입
스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.</p>
<p>3.의존성 객체 메소드 호출</p>
<p>스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입시켜줌으로써 Bean들은 _<strong>싱글턴 패턴</strong>_의 특징을 가지며,</p>
<p>제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.
<img src="https://images.velog.io/images/ours_111318/post/578747b2-e750-4fce-8df9-3e6d525c69e6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-30%2017.55.51.png" alt=""></p>
<h2 id="bean"><strong>Bean</strong></h2>
<ul>
<li>스프링 IoC 컨테이너가 관리하는 객체들을 <strong>Bean</strong> 이라고 부릅니다.</li>
<li><strong>스프링은 이러한 Bean들의 의존성을 관리하고, 객체를 만들어 주며, Bean으로 등록을 해 주고, 이렇게 만들어진 것들을 관리합니다.</strong> 개발자가 이 부분까지 신경쓰지 않아도, 프레임워크가 알아서 해 주는 것입니다.</li>
<li><strong>그리고 스프링 IoC 컨테이너가 위와 같은 관리를 해 줍니다.</strong> 이러한 Bean들을 담고 있는 스프링 IoC 컨테이너는 두 가지 중 하나를 사용합니다.</li>
</ul>
<blockquote>
<p><strong>ApplicationContext 혹은 BeanFactory</strong></p>
</blockquote>
<blockquote>
<p><strong>ApplicationContext는 BeanFactory를 상속받으므로 둘 다 같은 일을 하는</strong></p>
</blockquote>
<ul>
<li>이러한 스프링에서의 의존성 주입은 <strong>반드시 Bean으로 등록된 객체들 끼리만 가능</strong>합니다. 스프링 IoC 컨테이너는 Bean으로 등록되지 않은 객체에는 의존성 주입을 해 주지 않습니다.<ul>
<li><strong>IntelliJ 에서는 Bean 인 경우 아래 사진처럼 왼쪽에 아이콘으로 표시해 줍니다.</strong></li>
<li>위에서 예시를 들었듯, OwnerController 생성자에서 의존성 주입이 일어나고 있습니다.</li>
<li>그러면 OwnerController, OwnerRepository <strong>모두 Bean이어야 할 것입니다.</strong>
<img src="https://images.velog.io/images/ours_111318/post/21705320-a8a8-4cf2-9b19-e9d290b474cc/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-30%2017.57.42.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="어떻게-spring-ioc-컨테이너에-빈을-등록할까">어떻게 Spring IoC 컨테이너에 빈을 등록할까?</h3>
<p>빈을 만드는 방법은 다양하지만 기본적으로 크게 두가지 방법이 있다.</p>
<p><strong>① Component Scanning</strong></p>
<p><strong>② 빈 설정파일에 직접 빈을 등록</strong></p>
<h4 id="1-자바-어노테이션java-annotation을-사용하는-방법"><strong>1. 자바 어노테이션(Java Annotation)을 사용하는 방법</strong></h4>
<p>JAVA에서 <strong><code>Annotation</code></strong> 이라는 기능이 있습니다. 사전상으로는 주석의 의미이지만 Java 에서는 주석 이상의 기능을 가지고 있습니다. Annotation은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종입니다. 소스코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있습니다.</p>
<p>Java에서는 @Override, @Deprecated 와 같은 기본적인 Annotation을 제공합니다. 아래의 상속 예제에서는 @Override 를 이용하여 상속임을 명시해줍니다.</p>
<hr>
<pre><code class="language-java">**public class Parent { 
    public void doSomething() { 
        System.out.println(&quot;This is Parent&quot;); 
    } 
} 

public class Son extends Parent{ 
    @Override 
    public void doSomething() { 
        System.out.println(&quot;This is Son&quot;); 
    } 
}**</code></pre>
<p>Spring에서는 여러 가지 Annotation을 사용하지만, Bean을 등록하기 위해서는 @Component Annotation을 사용합니다. <strong>@Component Annotation이 등록되어 있는 경우에는 Spring이 Annotation을 확인하고 자체적으로 Bean 으로 등록</strong>합니다.</p>
<p>실제 Spring 프로젝트에서 Controller를 등록할 때에는 아래와 같은 <strong>Annotation</strong>을 사용합니다. 아래의 예시에서 Controller 임을 Spring 에게 알려주기 위하여 <strong>@Controller Annotation</strong>을 사용했습니다.</p>
<hr>
<pre><code class="language-java">**// HelloController.java
@Controller
public class HelloController {
    // Http Get method 의 /hello 경로로 요청이 들어올 때 처리할 Method를 아래와 같이 @GetMapping Annotation을 사용하여 Mapping을 사용할 수 있습니다.
    @GetMapping(&quot;hello&quot;)
    public String hello(Model model){
        model.addAttribute(&quot;data&quot;, &quot;This is data!!&quot;);
        return &quot;hello&quot;;
    }
}**</code></pre>
<p>@Controller Annotation을 intelliJ에서 Ctrl 을 눌러서 이동해보면 아래와 같은 소스를 확인할 수 있습니다. @Controller Annotation에는 @Component Annotation이 있는 것을 확인할 수 있습니다. @Component Annotation 으로 인하여 Spring은 해당 Controller를 Bean 으로 등록합니다.</p>
<pre><code class="language-java">**`// Controller.java

// -- 일부 생략 --
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default &quot;&quot;;

}`**</code></pre>
<h3 id="2-bean-configuration-file에-직접-bean-등록하는-방법"><strong>2. Bean Configuration File에 직접 Bean 등록하는 방법</strong></h3>
<h4 id=""></h4>
<p>@Configuration과 @Bean Annotation 을 이용하여 Bean을 등록할 수 있습니다. 아래의 예제와 같이 @Configuration을 이용하면 Spring Project 에서의 Configuration 역할을 하는 Class를 지정할 수 있습니다. 해당 File 하위에 Bean 으로 등록하고자 하는 Class에 @Bean Annotation을 사용해주면 간단하게 Bean을 등록할 수 있습니다.</p>
<hr>
<pre><code class="language-java">**// Hello.java
@Configuration
public class HelloConfiguration {
    @Bean
    public HelloController sampleController() {
        return new SampleController;
    }
}**</code></pre>
<p><em>참조</em>
<a href="https://velog.io/@gillog/Spring-DIDependency-Injection">https://velog.io/@gillog/Spring-DIDependency-Injection</a>
<a href="https://chanhuiseok.github.io/posts/spring-4/">https://chanhuiseok.github.io/posts/spring-4/</a>
<a href="http://melonicedlatte.com/2021/07/11/232800.html">http://melonicedlatte.com/2021/07/11/232800.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DI (의존성 주입) ]]></title>
            <link>https://velog.io/@ours_111318/%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C-DI-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@ours_111318/%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C-DI-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Sun, 30 Jan 2022 08:41:53 GMT</pubDate>
            <description><![CDATA[<h1 id="di의존성-주입이란">DI(의존성 주입)이란?</h1>
<ul>
<li>DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.</li>
<li>즉, 각 객체간의 의존성을 스프링 컨테이너(Spring Container)가 자동으로 연결해주는 것으로, 개발자가 빈(Bean) 설정파일에 의존관계가 필요한 정보를 추가해주면, 스프링 컨테이너가 자동적으로 연결해 준다</li>
<li>의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다.</li>
<li>의존성 주입은 IoC(Inversion of Control: 제어의 역전)원칙 하에 객체 간의 결합을 약하게 해주고 유지보수가 좋은 코드를 만들어 준다. 또한 의존성 주입은 개발자들이 객체를 생성하는 번거로움과 다양한 케이스를 고려하는 겨우를 줄이고, 변수 사용과 개발에 더욱이 집중할 수있게 해준다.</li>
</ul>
<h1 id="di의존성-주입를-사용하는-이유">DI(의존성 주입)를 사용하는 이유?</h1>
<ol>
<li><p>재사용성을 높여준다.</p>
</li>
<li><p>테스트에 용이하다.</p>
</li>
<li><p>코드를 단순화 시켜준다.</p>
</li>
<li><p>사용하는 이유를 파악하기 수월하고 코드가 읽기 쉬워지는 점이 있다.</p>
</li>
<li><p>종속성이 감소하기 때문에 변경에 민감하지 않다.</p>
</li>
<li><p>결합도(coupling)는 낮추면서 유연성과 확장성은 향상 시킬 수 있다.</p>
</li>
<li><p>객체간의 의존관계를 설정할 수 있다.</p>
</li>
</ol>
<h2 id="스프링에서-의존성을-주입하는-방법"><strong>스프링에서 의존성을 주입하는 방법</strong></h2>
<ul>
<li>생성자에서 주입</li>
<li><strong>필드에서 주입</strong></li>
<li><strong>setter 에서 주입</strong></li>
</ul>
<h4 id="ex">ex)</h4>
<p>Store 객체가 Pencil 객체를 사용하고 있는 경우에 우리는 Store객체가 Pencil 객체에 의존성이 있다고 표현한다.</p>
<pre><code class="language-java">public class Store { 
    private Pencil pencil; 
}</code></pre>
<ul>
<li>두 객체 간의 관계(의존성)를 맺어주는 것을 의존성 주입이라고 하며 생성자 주입, 필드 주입, 수정자 주입 등 다양한 주입 방법이 있다. Spring 4부터는 생성자 주입을 강력히 권장하고 있다. 
<img src="https://images.velog.io/images/ours_111318/post/2b481c74-aa1f-4afb-b050-11277feec349/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-30%2017.38.38.png" alt=""></li>
</ul>
<h3 id="ex-di가-필요한-이유">ex) DI가 필요한 이유</h3>
<pre><code class="language-java">public class Pencil {

}</code></pre>
<pre><code class="language-java">public class Store { 
    private Pencil pencil; 

public Store() { 
    this.pencil = new Pencil(); 
    } 
}</code></pre>
<p><strong>1. 두 클래스가 강하게 결합되어 있음</strong></p>
<p><strong>2. 객체들 간의 관계가 아니라 클래스 간의 관계가 맺어지고 있음</strong></p>
<p>:  위와 같은 문제점이 발생하는 근본적인 이유는 Store에서 불필요하게 어떤 제품을 판매할 지에 대한 관심이 분리되지 않았기 때문이다.</p>
<h3 id="ex의존성-주입dependency-injection을-통한-문제-해결">ex)의존성 주입(Dependency Injection)을 통한 문제 해결</h3>
<ul>
<li>문제를 해결하기 위해서는 우선 다형성이 필요하다. Pencil, Food 등 여러 가지 제품을 하나로 표현하기 위해서는 Product 라는 Interface가 필요하다. 그리고 Pencil에서 Product 인터페이스를 우선 구현해주도록 하자.</li>
</ul>
<pre><code class="language-java">public interface Product {

}</code></pre>
<pre><code class="language-java">public class Pencil implements Product {

 }</code></pre>
<ul>
<li>Store와 Pencil이 강하게 결합되어 있는 부분을 제거해주어야 한다. 이를 제거하기 위해서는 다음과 같이 외부에서 상품을 주입(Injection)받아야 한다</li>
</ul>
<pre><code class="language-java">public class Store { 
    private Product product; 

public Store(Product product) { 
    this.product = product; 
    } 
}</code></pre>
<ul>
<li><p>여기서 Spring이 DI 컨테이너를 필요로 하는 이유를 알 수 있는데, 우선 Store에서 Product 객체를 주입하기 위해서는 애플리케이션 실행 시점에 필요한 객체(빈)를 생성해야 하며, 의존성이 있는 두 객체를 연결하기 위해 한 객체를 다른 객체로 주입시켜야 하기 때문이다.</p>
</li>
<li><p>예를 들어 다음과 같이 Pencil 이라는 객체를 만들고, 그 객체를 Store로 주입시켜주는 역할을 위해 DI 컨테이너가 필요하게 된 것이다.</p>
</li>
</ul>
<pre><code class="language-java">public class BeanFactory { 
    public void store() { 
// Bean의 생성 
    Product pencil = new Pencil(); 

// 의존성 주입 
    Store store = new Store(pencil); 
    } 
}</code></pre>
<ul>
<li><p>이러한 개념은 제어의 역전(Inversion of Control, IoC)라고 불리기도 한다. </p>
</li>
<li><p>어떠한 객체를 사용할지에 대한 책임이 BeanFactory와 같은 클래스에게 넘어갔고, 자신은 수동적으로 주입받는 객체를 사용하기 때문이다. (실제 Spring에서는 BeanFactory를 확장한 Application Context를 사용한다.)</p>
</li>
</ul>
<p>출처:<a href="https://mangkyu.tistory.com/150">https://mangkyu.tistory.com/150</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[#1.미니프로젝트: 두유노우?]]></title>
            <link>https://velog.io/@ours_111318/1.%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%91%90%EC%9C%A0%EB%85%B8%EC%9A%B0</link>
            <guid>https://velog.io/@ours_111318/1.%EB%AF%B8%EB%8B%88%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%91%90%EC%9C%A0%EB%85%B8%EC%9A%B0</guid>
            <pubDate>Sun, 16 Jan 2022 10:28:37 GMT</pubDate>
            <description><![CDATA[<h2 id="두유노우">두유노우?</h2>
<p>두유노우 영단어? 
매일 매일 배운 그날의 영단어와 내가 사용한 학습 매체를 유저들과 공유하고, 함께 학습하고 싶은 단어는 나의 단어장에 저장해 시간이 날 때 암기할 수 있는 웹 사이트입니다.</p>
<h2 id="와이어-프레임">와이어 프레임</h2>
<p><img src="https://images.velog.io/images/ours_111318/post/ccb89c5e-6cb9-4ab8-9a5d-401b91899f38/DoUknow.png" alt=""></p>
<h2 id="상세페이지">상세페이지</h2>
<ol>
<li><p>로그인 페이지</p>
</li>
<li><p>회원가입 페이지</p>
</li>
<li><p>메인 페이지
여러 유저들이 업로드한 페이지 목록(og이미지,단어)들을 확인할 수 있습니다.</p>
</li>
<li><p>업로드 페이지
유저들은 자신이 사용한 학습매체(책, 유튜브 영상 등)의 URL과 새롭게 배운 영어단어들을 작성하여 업로드할 수 있습니다.</p>
</li>
<li><p>상세단어장 페이지
유저들이 업로드한 영단어 목록과 URL 내용 및 썸네일을 확인할 수 있습니다.</p>
</li>
<li><p>내 단어장 페이지
상세단어장 페이지 내 &#39;나도 학습하기&#39; 버튼을 누른 영어단어들이 내 단어장 페이지에 차곡차곡 쌓입니다.</p>
</li>
</ol>
<h2 id="사용기술">사용기술</h2>
<ul>
<li>Flask</li>
<li>MongoDB</li>
<li>JWT</li>
<li>Jinja 2</li>
<li>beautifulsoup4</li>
<li>JQuery</li>
<li>Bootstrap</li>
<li>Bulma</li>
<li>AWS EC2</li>
</ul>
<h2 id="영상">영상</h2>
<p><a href="https://youtu.be/cgFmKRZut84">두유노우?</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL_LEVEL 1]]></title>
            <link>https://velog.io/@ours_111318/SQLLEVEL-1</link>
            <guid>https://velog.io/@ours_111318/SQLLEVEL-1</guid>
            <pubDate>Mon, 20 Dec 2021 07:10:47 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/ours_111318/post/b587ed85-1712-484a-b34e-c6c975bd3db7/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-20%2016.13.54.png" alt=""></p>
<h4 id="1이름이-없는-동물의-아이디"><strong>1.이름이 없는 동물의 아이디</strong></h4>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/59039">https://programmers.co.kr/learn/courses/30/lessons/59039</a></p>
<pre><code class="language-sql">SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL</code></pre>
<h4 id="2이름이-있는-동물의-아이디">2.이름이 있는 동물의 아이디</h4>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/59407">https://programmers.co.kr/learn/courses/30/lessons/59407</a></p>
<pre><code class="language-sql">SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID</code></pre>
<h4 id="3null처리하기">3.NULL처리하기</h4>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/59410">https://programmers.co.kr/learn/courses/30/lessons/59410</a></p>
<pre><code class="language-sql">SELECT ANIMAL_TYPE, IFNULL(NAME,&quot;No name&quot;) as NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Web 2  주차]]></title>
            <link>https://velog.io/@ours_111318/Web-2%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ours_111318/Web-2%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Fri, 17 Dec 2021 12:33:52 GMT</pubDate>
            <description><![CDATA[<p><strong>[수업 목표]</strong></p>
<ol>
<li>jQuery로 간단한 HTML을 조작할 수 있다.</li>
<li>Ajax로 서버 API(약속)에 데이터를 주고, 결과를 받아온다.</li>
</ol>
<hr>
<blockquote>
<p>HTML파일을 받았다고 가정하고, Javascript로 다시 서버에 데이터를 요청하고 받는 방법을 알아보자.
jQuery를 이용해 Javascript로 HTML을 쉽게 제어하고,
Ajax를 이용해 다시 서버에 데이터를 요청하고 받아오는것.</p>
</blockquote>
<p><img src="https://images.velog.io/images/ours_111318/post/b3ed9497-29d8-46fc-92e8-cebbb96bbed0/Untitled%20(7).png" alt=""></p>
<h2 id="1jquery-시작하기">1.JQuery 시작하기</h2>
<p>(1)JQuery 란?</p>
<ul>
<li><p>HTML의 요소들을 조작하는, 편리한 Javascript를 미리 작성  해둔 것. 라이브러리!</p>
<blockquote>
<p>Javascript로도 모든 기능(예 - 버튼 글씨 바꾸기 등)을 구현할 수는 있지만,</p>
</blockquote>
<p>1) 코드가 복잡하고, 
2) 브라우저 간 호환성 문제도 고려해야해서,
jQuery라는 라이브러리가 등장하게 되었다고 한다.</p>
</li>
<li><p>jQuery와 Javascript - 코드 비교</p>
<blockquote>
<p>jQuery는 Javascript와 다른 특별한 소프트웨어가 아니라 미리 작성된 Javascript 코드이다. 
전문 개발자들이 짜둔 코드를 잘 가져와서 사용하는 것이다. (그렇게 때문에, 쓰기 전에 &quot;임포트&quot;를 해야한다는것!)</p>
</blockquote>
</li>
</ul>
<p>Javascript</p>
<pre><code class="language-javascript">document.getElementById(&quot;element&quot;).style.display = &quot;none&quot;;</code></pre>
<p>jQuery</p>
<pre><code class="language-javascript">$(&#39;#element&#39;).hide();</code></pre>
<h2 id="2jquery-다뤄보기">2.JQuery 다뤄보기</h2>
<p>(1)jQuery 사용하기</p>
<ul>
<li><p>미리 작성된 Javascript 코드를 가져오는 것을 &#39;임포트&#39;라고 부른다.</p>
<ul>
<li>jQuery CDN<pre><code class="language-html">https://www.w3schools.com/jquery/jquery_get_started.asp</code></pre>
</li>
</ul>
</li>
<li><p><code>&lt;head&gt; 와 &lt;/head&gt;</code> 사이에 아래 코드를 넣으면 된다.</p>
<pre><code class="language-html">&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js&quot;&gt;&lt;/script&gt;</code></pre>
</li>
<li><p>jQuery를 사용하는 방법</p>
<blockquote>
<p>css와 마찬가지로, jQuery를 쓸 때에도 &quot;가리켜야&quot; → 조작할 수 있다.
예) 특정 인풋박스의 값을 → 가져와줘!
예) 특정 div를 → 안보이게 해줘!    
css에서는 선택자로 class를 사용했지만,
jQuery에서는 id 값을 통해 특정 버튼/인풋박스/div/.. 등을 가리키게 된다</p>
</blockquote>
</li>
<li><p>자주쓰는 jQuery</p>
</li>
</ul>
<ol>
<li>input 박스의 값을 가져와보기<pre><code class="language-javascript">&lt;div class=&quot;posting-box&quot;&gt;
 &lt;div class=&quot;form-group&quot;&gt;
     &lt;label for=&quot;exampleInputEmail1&quot;&gt;아티클 URL&lt;/label&gt;
     &lt;input id=&quot;post-url&quot; type=&quot;email&quot; class=&quot;form-control&quot; aria-describedby=&quot;emailHelp&quot;
         placeholder=&quot;&quot;&gt;
 &lt;/div&gt;</code></pre>
<pre><code class="language-javascript">// 크롬 개발자도구 콘솔창에서 쳐보기
// id 값이 post-url인 곳을 가리키고, val()로 값을 가져온다.
$(&#39;#post-url&#39;).val();</code></pre>
</li>
<li>div 보이기 / 숨기기<pre><code class="language-javascript">&lt;div class=&quot;posting-box&quot; id=&quot;post-box&quot;&gt;
 &lt;div class=&quot;form-group&quot;&gt;
     &lt;label for=&quot;exampleInputEmail1&quot;&gt;아티클 URL&lt;/label&gt;
     &lt;input id=&quot;post-url&quot; type=&quot;email&quot; class=&quot;form-control&quot; aria-describedby=&quot;emailHelp&quot;
         placeholder=&quot;&quot;&gt;
 &lt;/div&gt;
 &lt;div class=&quot;form-group&quot;&gt;
     &lt;label for=&quot;exampleInputPassword1&quot;&gt;간단 코멘트&lt;/label&gt;
     &lt;input type=&quot;password&quot; class=&quot;form-control&quot; placeholder=&quot;&quot;&gt;
 &lt;/div&gt;
 &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;기사 저장&lt;/button&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-javascript">// 크롬 개발자도구 콘솔창에 쳐보기
// id 값이 post-box인 곳을 가리키고, hide()로 안보이게 한다.(=css의 display 값을 none으로 바꾼다)
$(&#39;#post-box&#39;).hide();
</code></pre>
</li>
</ol>
<p>// show()로 보이게 한다.(=css의 display 값을 block으로 바꾼다)
$(&#39;#post-box&#39;).show();</p>
<pre><code>3. css의 값 가져와보기 (display 속성 값)
```javascript
$(&#39;#post-box&#39;).hide();
$(&#39;#post-box&#39;).css(&#39;display&#39;);

$(&#39;#post-box&#39;).show();
$(&#39;#post-box&#39;).css(&#39;display&#39;);</code></pre><ol start="4">
<li>태그 내 텍스트 입력하기
1) input box의 경우<pre><code class="language-javascript">$(&#39;#post-url&#39;).val(&#39;여기에 텍스트를 입력하면!&#39;);</code></pre>
2)버튼의 텍스트 바꾸기<pre><code class="language-javascript">// 가리키고 싶은 버튼에 id 값을 준다음
&lt;button id=&quot;btn-posting-box&quot; type=&quot;button&quot; class=&quot;btn btn-primary&quot;&gt;포스팅 박스 열기&lt;/button&gt;
</code></pre>
</li>
</ol>
<p>$(&#39;#btn-posting-box&#39;).text(&#39;포스팅 박스 닫기&#39;);</p>
<pre><code>5. 태그 내 html 입력하기
`&lt;div&gt; ~ &lt;/div&gt;` 내에,동적으로 html을 넣고 싶을 땐? (예를 들어, 포스팅되면 → 카드 추가)

```javascript
// 사이에 html을 넣고 싶은 태그에 id값을 준 다음
&lt;div id=&quot;cards-box&quot; class=&quot;card-columns&quot;&gt;
    &lt;div class=&quot;card&quot;&gt;

//버튼넣기    
 let temp_html = &#39;&lt;button&gt;나는 추가될 버튼이다!&lt;/button&gt;&#39;;
 $(&#39;#cards-box&#39;).append(temp_html);

//카드넣기
let img_url = &#39;https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg&#39;;
let link_url = &#39;https://naver.com/&#39;;
let title = &#39;여기 기사 제목이 들어가죠&#39;;
let desc = &#39;기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...&#39;;
let comment = &#39;여기에 코멘트가 들어갑니다.&#39;;

let temp_html = `&lt;div class=&quot;card&quot;&gt;
                    &lt;img class=&quot;card-img-top&quot;
                        src=&quot;${img_url}&quot;
                        alt=&quot;Card image cap&quot;&gt;
                    &lt;div class=&quot;card-body&quot;&gt;
                        &lt;a href=&quot;${link_url}&quot; class=&quot;card-title&quot;&gt;${title}&lt;/a&gt;
                        &lt;p class=&quot;card-text&quot;&gt;${desc}&lt;/p&gt;
                        &lt;p class=&quot;card-text comment&quot;&gt;${comment}&lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;`;
$(&#39;#cards-box&#39;).append(temp_html);</code></pre><h2 id="3jquery-적용하기">3.JQuery 적용하기</h2>
<p>(1)&#39;나홀로메모장&#39;에 포스팅박스 열기/닫기 기능을 함께 붙여보기</p>
<ul>
<li>포스팅 박스 열기 버튼에 function을 달기<pre><code class="language-jsx">&lt;script&gt;
function openclose() {
  // 여기에 jQuery를 이용해 코드를 짤 예정    
}
&lt;/script&gt;
</code></pre>
</li>
</ul>
<p>// onclick 속성(attribute)을 추가합니다.
<button onclick="openclose()" class="btn btn-primary btn-lg">포스팅박스 열기</button></p>
<pre><code>

- 클릭 해서 포스팅 박스를 여닫게 하기
    1) 포스팅 박스에 id 값을 주기

    ```jsx
    &lt;div class=&quot;form-post&quot; id=&quot;post-box&quot;&gt;
        &lt;div&gt;
            &lt;div class=&quot;form-group&quot;&gt;
                &lt;label for=&quot;exampleFormControlInput1&quot;&gt;아티클 URL&lt;/label&gt;
                &lt;input class=&quot;form-control&quot; placeholder=&quot;&quot;&gt;
            &lt;/div&gt;
            &lt;div class=&quot;form-group&quot;&gt;
                &lt;label for=&quot;exampleFormControlTextarea1&quot;&gt;간단 코멘트&lt;/label&gt;
                &lt;textarea class=&quot;form-control&quot; rows=&quot;2&quot;&gt;&lt;/textarea&gt;
            &lt;/div&gt;
            &lt;button type=&quot;button&quot; class=&quot;btn btn-primary&quot;&gt;기사저장&lt;/button&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    ```

    2)포스팅 박스 제어하기  
```jsx
   function openclose() {
    // id 값 post-box의 display 값이 block 이면
    if ($(&#39;#post-box&#39;).css(&#39;display&#39;) == &#39;block&#39;) {
        // post-box를 가리고
        $(&#39;#post-box&#39;).hide();
    } else {
        // 아니면 post-box를 펴라
        $(&#39;#post-box&#39;).show();
      }
    }</code></pre><p>   3) posting-box를 시작부터 감춰두기 (css의 display:none 속성!)</p>
<blockquote>
<p>inline-style (인라인 스타일) 
여기저기 쓰면 복잡하겠지만, 이렇게 쓰면
직관적으로 &quot;아 처음부터 안보이는 태그구나!&quot;를 알 수 있다.
(물론, class주고, css에서 display:none 속성을 주는 것도 방법!)</p>
</blockquote>
<pre><code class="language-JSX">&lt;div class=&quot;form-post&quot; id=&quot;post-box&quot; style=&quot;display:none&quot;&gt;
    &lt;div&gt;
        &lt;div class=&quot;form-group&quot;&gt;
            &lt;label for=&quot;exampleFormControlInput1&quot;&gt;아티클 URL&lt;/label&gt;
            &lt;input class=&quot;form-control&quot; placeholder=&quot;&quot;&gt;
    &lt;/div&gt;</code></pre>
<p> (4) &#39;포스팅박스 열기&#39; 버튼의 글씨 바꿔주기</p>
<ul>
<li><p>포스팅박스 열기 버튼에 id 값 주기</p>
<pre><code class="language-jsx">      &lt;button id=&quot;btn-posting-box&quot; onclick=&quot;openclose()&quot; class=&quot;btn btn-primary btn-lg&quot;&gt;포스팅박스 열기&lt;/a&gt;</code></pre>
</li>
</ul>
<ul>
<li><p>버튼 텍스트를 바꿔주기</p>
<pre><code class="language-jsx">      function openclose() {
          // id 값 post-box의 display 값이 block 이면
          if ($(&#39;#post-box&#39;).css(&#39;display&#39;) == &#39;block&#39;) {
              // post-box를 가리고
              $(&#39;#post-box&#39;).hide();
                      // 가렸으니까 이제 열기로 바꿔두기
              $(&#39;#btn-posting-box&#39;).text(&#39;포스팅 박스 열기&#39;);
          } else {
              // 아니면 post-box를 펴라
              $(&#39;#post-box&#39;).show();
                      // 폈으니까 이제 닫기로 바꿔두기
              $(&#39;#btn-posting-box&#39;).text(&#39;포스팅 박스 닫기&#39;);
          }
      }

</code></pre>
</li>
</ul>
<p>(5)완성코드</p>
<pre><code class="language-jsx">  &lt;script&gt;
        function openclose() {
            let status = $(&#39;#post-box&#39;).css(&#39;display&#39;);
            if (status == &#39;block&#39;) {
                $(&#39;#post-box&#39;).hide()
                $(&#39;#posting-box-btn&#39;).text(&#39;포스팅박스 열기&#39;)
            } else {
                $(&#39;#post-box&#39;).show()
                $(&#39;#posting-box-btn&#39;).text(&#39;포스팅박스 닫기&#39;)
            }
        }
    &lt;/script&gt;</code></pre>
<p><img src="https://images.velog.io/images/ours_111318/post/70227b8f-92f4-4dd7-8058-79d243597e2e/1.png" alt=""></p>
<h2 id="4quiz_jquery-연습하기">4.Quiz_JQuery 연습하기</h2>
<p>Q.문제
<img src="https://images.velog.io/images/ours_111318/post/f2150e30-a3f7-44af-ba4b-72d89af93f40/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-19%2021.59.38.png" alt="">
Q.완성코드</p>
<pre><code>&lt;script&gt;
        function q1() {
            // 1. input-q1의 입력값을 가져온다.
            let value = $(&#39;#input-q1&#39;).val();
            // 2. 만약 입력값이 빈칸이면 if(입력값==&#39;&#39;)
            if (value == &#39;&#39;) {
                // 3. alert(&#39;입력하세요!&#39;) 띄우기
                alert(&#39;입력하세요!&#39;);
            } else {
                // 4. alert(입력값) 띄우기
                alert(value);
            }
        }

        function q2() {
            // 1. input-q2 값을 가져온다.
            let email = $(&#39;#input-q2&#39;).val();
            // 2. 만약 가져온 값에 @가 있으면 (includes 이용하기 - 찾아보자!)
            if (email.includes(&#39;@&#39;)) {
                // 3. info.spartacoding@gmail.com -&gt; gmail 만 추출해서
                // 4. alert(도메인 값);으로 띄우기
                let domainWithDot = email.split(&#39;@&#39;)[1];
                let onlyDomain = domainWithDot.split(&#39;.&#39;)[0];
                alert(onlyDomain);
            } else {
                // 5. 만약 이메일이 아니면 &#39;이메일이 아닙니다.&#39; 라는 얼럿 띄우기
                alert(&#39;이메일이 아닙니다.&#39;);
            }
        }

        function q3() {
            // 1. input-q3 값을 가져온다.
            let newName = $(&#39;#input-q3&#39;).val();
            if (newName == &#39;&#39;) {
                alert(&#39;이름을 입력하세요&#39;);
                return;
            }
            // 2. 가져온 값을 이용해 names-q3에 붙일 태그를 만든다. (let temp_html = `&lt;li&gt;${가져온 값}&lt;/li&gt;`)
            let temp_html = `&lt;li&gt;${newName}&lt;/li&gt;`;
            // 3. 만들어둔 temp_html을 names-q3에 붙인다.(jQuery의 $(&#39;...&#39;).append(temp_html)을 이용하면 굿!)
            $(&#39;#names-q3&#39;).append(temp_html);
        }

        function q3_remove() {
            // 1. names-q3의 내부 태그를 모두 비운다.(jQuery의 $(&#39;....&#39;).empty()를 이용하면 굿!)
            $(&#39;#names-q3&#39;).empty();
        }

    &lt;/script&gt;</code></pre><h2 id="5-서버-클라이언트-통신-이해하기">5. 서버-클라이언트 통신 이해하기</h2>
<p>(1) 서버→클라이언트: &quot;JSON&quot;을 이해하기</p>
<ul>
<li>크롬 익스텐션 JSONView 설치하기<ul>
<li>Jsonview</li>
</ul>
</li>
</ul>
<pre><code class="language-html">https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=ko</code></pre>
<ul>
<li>JSON은, Key:Value로 이루어져 있다. 
자료형 Dictionary와 아주 유사한 형태.</li>
</ul>
<blockquote>
<p>예제에서는 RealtimeCityAir라는 키 값에 딕셔너리 형 value가 들어가있고,
        그 안에 row라는 키 값에는 리스트형 value가 들어가있다.</p>
</blockquote>
<p> <img src="https://images.velog.io/images/ours_111318/post/71f03939-2b90-4cf0-a497-4d216b0cd8c4/Untitled%20(8).png" alt=""></p>
<p>(2) 클라이언트→서버: GET 요청 이해하기</p>
<blockquote>
<p>클라이언트가 요청 할 때에도, &quot;타입&quot;이라는 것이 존재.</p>
</blockquote>
<ul>
<li>GET        →      통상적으로! 데이터 조회(Read)를 요청할 때<pre><code>                      예) 영화 목록 조회</code></pre><ul>
<li>POST     →      통상적으로! 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청 할 때<pre><code>                    예) 회원가입, 회원탈퇴, 비밀번호 수정</code></pre></li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>GET</strong></p>
<blockquote>
<p>   <code>https://movie.naver.com/movie/bi/mi/basic.nhn?code=161967</code> 
위 주소는 크게 두 부분으로 나뉜다. 
바로 &quot;?&quot;가 나눠지는 지점인데,</p>
<pre><code>&quot;?&quot; 기준으로 앞부분이 &lt;서버 주소&gt;, 뒷부분이 [영화 번호] 이다.    </code></pre></blockquote>
<ul>
<li>서버 주소: <a href="https://movie.naver.com/movie/bi/mi/basic.nhn">https://movie.naver.com/movie/bi/mi/basic.nhn</a></li>
<li>영화 정보: code=161967</li>
</ul>
</li>
</ul>
<ul>
<li><p>GET 방식으로 데이터를 전달하는 방법</p>
<blockquote>
<p>?  : 여기서부터 전달할 데이터가 작성된다는 의미입니다.
&amp; : 전달할 데이터가 더 있다는 뜻입니다
ex) google.com/search?q=아이폰&amp;sourceid=chrome&amp;ie=UTF-8
위 주소는 google.com의 search 창구에 다음 정보를 전달합니다!</p>
<pre><code>           q=아이폰                        (검색어)
           sourceid=chrome        (브라우저 정보)
           ie=UTF-8                      (인코딩 정보)</code></pre></blockquote>
<blockquote>
<p>그럼 code라는 이름으로 영화번호를 주자!는 것은</p>
<pre><code>  누가 정하는 것일까요?  
  → 네, 바로 프론트엔드 개발자와 백엔드 개발자가 미리 정해둔 **약속**입니다.</code></pre></blockquote>
</li>
<li><p>프론트엔드: *&quot;code라는 이름으로 영화번호를 주면 될까요?&quot;*</p>
</li>
<li><p>백엔드: *&quot;네 그렇게 하시죠. 그럼 code로 영화번호가 들어온다고 생각하고 코딩하고 있을게요&quot;*</p>
</li>
</ul>
<h2 id="6-ajax-시작하기">6. Ajax 시작하기</h2>
<p>(1) Ajax 시작하기</p>
<ul>
<li>크롬 개발자 도구에 다음과 같이 써보세요</li>
</ul>
<blockquote>
<p>참고! Ajax는 jQuery를 임포트한 페이지에서만 동작 가능합니다.</p>
</blockquote>
<blockquote>
<p>즉, <a href="http://google.com/">http://google.com/</a> 과 같은 화면에서 개발자도구를 열면, jQuery가 임포트 되어있지 않기 때문에 아래와 같은 에러가 뜹니다.</p>
</blockquote>
<p> <code>Uncaught TypeError: $.ajax is not a function</code>
 → ajax라는 게 없다는 뜻</p>
<ul>
<li>Ajax 기본 골격</li>
</ul>
<pre><code class="language-jsx">  $.ajax({
     type: &quot;GET&quot;,
     url: &quot;여기에URL을입력&quot;,
     data: {},
     success: function(response){
        console.log(response)
       }
    })</code></pre>
<ul>
<li>Ajax 코드 해설</li>
</ul>
<pre><code class="language-jsx"> $.ajax({
    type: &quot;GET&quot;, // GET 방식으로 요청한다.
    url: &quot;http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99&quot;,
          data: {}, // 요청하면서 함께 줄 데이터 (GET 요청시엔 비워두세요)
          success: function(response){ // 서버에서 준 결과를 response라는 변수에 담음
            console.log(response) // 서버에서 준 결과를 이용해서 나머지 코드를 작성
          }
        })</code></pre>
<ul>
<li>$ajax 코드 설명<ul>
<li>type: &quot;GET&quot; → GET 방식으로 요청한다.</li>
<li>url: 요청할 url</li>
<li>data: 요청하면서 함께 줄 데이터 (GET 요청시엔 비워두세요)</li>
</ul>
</li>
</ul>
<pre><code> &gt;GET 요청은, url뒤에 아래와 같이 붙여서 데이터를 가져갑니다.
        http://naver.com?param=value&amp;param2=value2 

  &gt; POST 요청은, data : {} 에 넣어서 데이터를 가져갑니다.
        data: { param: &#39;value&#39;, param2: &#39;value2&#39; },

 - success: 성공하면, response 값에 서버의 결과 값을 담아서 함수를 실행한다. </code></pre><pre><code class="language-jsx">   success: function(response){ // 서버에서 준 결과를 response라는 변수에 담음
         console.log(response) 
        }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[WEB_1주차]]></title>
            <link>https://velog.io/@ours_111318/WEB1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@ours_111318/WEB1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 14 Dec 2021 10:54:31 GMT</pubDate>
            <description><![CDATA[<h4 id="수업목표">[수업목표]</h4>
<ol>
<li>서버와 클라이언트의 역할에 대해 이해한다.</li>
<li>HTML, CSS의 기초 지식을 이해한다. 부트스트랩을 가져다 쓸 줄 안다!</li>
<li>Javascript 기초 문법을 익힌다.</li>
</ol>
<hr>
<h3 id="1-서버클라이언트웹의-동작-개념"><strong>1. 서버/클라이언트/웹의 동작 개념</strong></h3>
<h4 id="1웹의-동작-개념-html을-받는-경우">(1)웹의 동작 개념 (HTML을 받는 경우)</h4>
<p>  : 우리가 보는 웹페이지는 모두 서버에서 미리 준비해두었던 것을 &quot;받아서&quot;,&quot;그려     주는&quot; 것이다.
    즉, <strong>브라우저</strong>가 하는 일은
       1) 요청을 보낸다.
            (서버가 만들어 놓은 &quot;API&quot;라는 창구에 미리 정해진 약속대로 요청을 보내는 것)</p>
<pre><code>    예) https://naver.com/
    →  &quot;naver.com&quot;이라는 이름의 서버에 있는, &quot;/&quot; 창구에 요청을 보낸 것</code></pre><p>  2) 받은 HTML 파일을 그려준다.         </p>
<p><img src="https://images.velog.io/images/ours_111318/post/0c4924f1-d807-4787-b2ca-eb3b56ed3170/Untitled.png" alt=""></p>
<h4 id="2웹의-동작-개념-데이터만-받는-경우">(2)웹의 동작 개념 (데이터만 받는 경우)</h4>
<pre><code>:그럼 항상 이렇게 HTML만 내려주는걸까? 데이터만 내려 줄 때가 더 많다.
 사실 HTML도 줄글로 쓰면 이게 다 &#39;데이터&#39;.

예) 공연 티켓을 예매하고 있는 상황을 상상해봅시다!
좌석이 차고 꺼질때마다 보던 페이지가 리프레시 되면 난감하겠죠ㅠ?

이럴 때! 데이터만 받아서 받아 끼우게 된답니다.</code></pre><p><img src="https://images.velog.io/images/ours_111318/post/2485f2ac-ff09-4c64-8461-98e13fd0e831/Untitled%20(1).png" alt=""></p>
<p>:데이터만 내려올 경우는, 
 이런 생김새를 JSON 형식이라고 한다.
 <img src="https://images.velog.io/images/ours_111318/post/5b8de029-ae76-4304-986d-4cd74d84e1da/Untitled%20(2).png" alt=""></p>
<h3 id="2html-css-기본-내용"><strong>2.HTML, CSS 기본 내용</strong></h3>
<h4 id="1html">1.HTML</h4>
<p>(1)HTML과 CSS의 개념</p>
<ul>
<li>HTML은 뼈대, CSS는 꾸미기!
: HTML은 구역과 텍스트를 나타내는 코드로, CSS는 잡은 구역을 꾸며주는 것으로 생각   하자. HTML 내 style 속성으로 꾸미기를 할 수 있지만, 이것을 한데 모아 볼 수   있는 CSS 파일이 탄생하게 되었으니, HTML 코드 내에 CSS 파일을 불러와서 적용한다.</li>
<li>또한 CSS를 잘 사용할 줄 아는 것과, &#39;예쁘게&#39; 만드는 것은 다른 영역</li>
</ul>
<p>(2)HTML 기초</p>
<ul>
<li><p>HTML은 크게 head와 body로 구성되며, head안에는 페이지의 속성 정보를, body안에는 페이지의 내용을 담는다.</p>
</li>
<li><p>head 안에 들어가는 대표적인 요소들: meta, script, link, title 등
(페이지의 속성을 정의하거나, 필요한 스크립트들을 부른다. 즉, 눈에 안 보이는 필요한 것들을 담는 것 )</p>
<ul>
<li>body 안에 들어가는 대표적인 요소들</li>
</ul>
<pre><code class="language-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 name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;스파르타코딩클럽 | HTML 기초&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
  &lt;!-- 구역을 나누는 태그들 --&gt;
  &lt;div&gt;나는 구역을 나누죠&lt;/div&gt;
  &lt;p&gt;나는 문단이에요&lt;/p&gt;
  &lt;ul&gt;
      &lt;li&gt; bullet point!1 &lt;/li&gt;
      &lt;li&gt; bullet point!2 &lt;/li&gt;
  &lt;/ul&gt;

  &lt;!-- 구역 내 콘텐츠 태그들 --&gt;
  &lt;h1&gt;h1은 제목을 나타내는 태그입니다. 페이지마다 하나씩 꼭 써주는 게 좋아요. 그래야 구글 검색이 잘 되거든요.&lt;/h1&gt;
  &lt;h2&gt;h2는 소제목입니다.&lt;/h2&gt;
  &lt;h3&gt;h3~h6도 각자의 역할이 있죠. 비중은 작지만..&lt;/h3&gt;
  &lt;hr&gt;
  span 태그입니다: 특정 &lt;span style=&quot;color:red&quot;&gt;글자&lt;/span&gt;를 꾸밀 때 써요
  &lt;hr&gt;
  a 태그입니다: &lt;a href=&quot;http://naver.com/&quot;&gt; 하이퍼링크 &lt;/a&gt;
  &lt;hr&gt;
  img 태그입니다: &lt;img src=&quot;https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png&quot; /&gt;
  &lt;hr&gt;
  input 태그입니다: &lt;input type=&quot;text&quot; /&gt;
  &lt;hr&gt;
  button 태그입니다: &lt;button&gt; 버튼입니다&lt;/button&gt;
  &lt;hr&gt;
  textarea 태그입니다: &lt;textarea&gt;나는 무엇일까요?&lt;/textarea&gt;
&lt;/body&gt;

&lt;/html&gt;
</code></pre>
</li>
</ul>
<p>Pycharm에서 자동정렬 단축키 
     - Windows: <code>Ctrl</code> + <code>Alt</code> + <code>L</code>
     - macOS: <code>option</code> + <code>command</code> + <code>L</code></p>
<p>(3)HTML 부모-자식 구조 살펴보기</p>
<ul>
<li>html 태그는, &quot;누가 누구 안에 있느냐&quot;를 이해하는 것이 가장 중요하다. 나를 감싸고 있는 태그가 바뀌면, 그 안의 내용물도 모두 영향을 받는다</li>
</ul>
<blockquote>
<p>빨간색 div 안에, 초록색/파란색 div가 들어있다. 아래와 같은 상황에서 빨간색 div를 가운데로 옮기면, 내용물인 초록/파란 div도 모두 함께 이동!
즉, 박스를 옮기면 안의 내용물도 함께 옮겨지는 것과 같은 원리!
같은 원리로, 초록 div의 글씨색을 바꾸면, 나는버튼1의 글씨색도 바뀐다!</p>
</blockquote>
<p><img src="https://images.velog.io/images/ours_111318/post/63ac762f-3696-4e0d-b32d-02185be7c387/Untitled%20(3).png" alt=""></p>
<hr>
<p>Q1.간단한 로그인 페이지 만들기
<img src="https://images.velog.io/images/ours_111318/post/4a9474fc-1d00-4e64-855d-b3f6e43622f3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-14%2019.39.48.png" alt=""></p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;로그인페이지&lt;/title&gt;
    &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Gaegu&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;style&gt;
        * {
            font-family: &#39;Gaegu&#39;, cursive;
        }
       .mytitle {
         background-color:  blue;
         width: 400px;
         height: 200px;

         color: white;
         text-align: center;

         background-image: url(&quot;https://www.ancient-origins.net/sites/default/files/field/image/Agesilaus-II-cover.jpg&quot;);
         background-size: cover;
         background-position: center;

         border-radius: 10px;

         padding-top: 20px;
       }
        .wrap {

            width: 300px;
            margin: auto;

        }
        .mybtn {
            width: 100px;
            margin: auto;
            display: block;
        }

    &lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;wrap&quot;&gt;
        &lt;div class=&quot;mytitle&quot;&gt;
          &lt;h1 &gt;로그인 페이지&lt;/h1&gt;
          &lt;h5&gt;아이디, 패스워드를 입력해주세요&lt;/h5&gt;
        &lt;/div&gt;

          &lt;p&gt;ID: &lt;input type=&quot;text&quot; /&gt;&lt;/p&gt;
          &lt;p&gt;PW: &lt;input type=&quot;text&quot; /&gt;&lt;/p&gt;
          &lt;button class=&quot;mybtn&quot;&gt;로그인하기&lt;/button&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h4 id="2css">2.CSS</h4>
<ul>
<li><p>CSS는 어떻게 사용?
: <code>&lt;head&gt; ~ &lt;/head&gt; 안에 &lt;style&gt; ~ &lt;/style&gt;</code> 로 공간을 만들어 작성한다.</p>
<p>  예) mytitle라는 클래스를 가리킬 때, .mytitle { ... } 라고 써줘야 하는 것을 꼭! 기억!</p>
</li>
<li><p>자주 쓰이는 CSS</p>
<blockquote>
<p>배경관련
background-color
background-image
background-size
background-position
사이즈
width
height
폰트
font-size
font-weight
font-famliy
color
border-radius
간격
margin
padding<br>(margin은 바깥 여백, padding은 내 안쪽 여백)</p>
</blockquote>
</li>
<li><p>CSS 파일 분리</p>
<pre><code class="language-html">&lt;!-- style.css 파일을 같은 폴더에 만들고, head 태그에서 불러오기 --&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href = &quot;(css파일이름).css&quot;&gt;</code></pre>
</li>
</ul>
<h4 id="3bootstrap">3.bootstrap</h4>
<ul>
<li>부트스트랩이란? 
예쁜 CSS를 미리 모아둔 것 (CSS를 다룰 줄 아는 것과, 미적 감각을 발휘하여 예쁘게 만드는 것은 다른 이야기이기 때문에, 현업에서는 미리 완성된 부트스트랩을 가져다 쓰는 경우가 많다.)</li>
<li>bootstrap - 시작 템플릿<pre><code class="language-html">&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
</code></pre>
</li>
</ul>
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<pre><code>&lt;!-- Bootstrap CSS --&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&quot;
    integrity=&quot;sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm&quot; crossorigin=&quot;anonymous&quot;&gt;

&lt;!-- Optional JavaScript --&gt;
&lt;!-- jQuery first, then Popper.js, then Bootstrap JS --&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&quot;
    integrity=&quot;sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q&quot;
    crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&quot;
    integrity=&quot;sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl&quot;
    crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;title&gt;스파르타코딩클럽 | 부트스트랩 연습하기&lt;/title&gt;</code></pre></head>

<body>
    <h1>이걸로 시작해보죠!</h1>
</body>

</html>
```
- 부트스트랩 컴포넌트 4.0
[부트스트랩 컴포넌트 4.0](https://getbootstrap.com/docs/4.0/components/alerts/)

<hr>
<p>Q1.나홀로 메모장(포스팅 박스) 만들기 
<img src="https://images.velog.io/images/ours_111318/post/bbf744c4-943b-44f2-b58d-0404d8ae596e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-14%2019.52.34.png" alt=""></p>
<hr>
<h3 id="3javascript">3.Javascript</h3>
<p>(1)자바스크립트 - HTML 연결</p>
<blockquote>
<p><code>&lt;head&gt; ~ &lt;/head&gt;</code>안에 <code>&lt;script&gt; ~ &lt;/script&gt;</code> 로 공간을 만들어 작성한다.
<code>&lt;script&gt; ~ &lt;/script&gt;</code> 내에 자바스크립트를 작성하는 것</p>
</blockquote>
<p><img src="https://images.velog.io/images/ours_111318/post/665f943f-f8e9-43d2-bfb4-fba039fc0921/Untitled%20(6).png" alt=""></p>
<ul>
<li>버튼에 함수를 연결하기. 버튼을 누르면 함수가 불린다.<pre><code class="language-html">&lt;button onclick=&quot;hey()&quot; type=&quot;button&quot; class=&quot;btn btn-primary&quot;&gt;기사저장&lt;/button&gt;</code></pre>
</li>
</ul>
<hr>
<h4 id="1주차-과제">1주차 과제</h4>
<ul>
<li>부트스트랩 또는 템플릿을 활용해서 나만의쇼핑몰의 메인 페이지를 완성하기
<img src="https://images.velog.io/images/ours_111318/post/e6f88aa5-2454-4389-82d9-f48cb4f7b92f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-16%2012.15.13.png" alt=""></li>
</ul>
<pre><code class="language-html">&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;

&lt;head&gt;
    &lt;!-- Required meta tags --&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1, shrink-to-fit=no&quot;&gt;

    &lt;!-- Bootstrap CSS --&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&quot;
          integrity=&quot;sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm&quot; crossorigin=&quot;anonymous&quot;&gt;

    &lt;!-- Optional JavaScript --&gt;
    &lt;!-- jQuery first, then Popper.js, then Bootstrap JS --&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js&quot;
            integrity=&quot;sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q&quot;
            crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js&quot;
            integrity=&quot;sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl&quot;
            crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

    &lt;title&gt;스파르타코딩클럽 | 부트스트랩 연습하기&lt;/title&gt;
    &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Dongle:wght@700&amp;family=Gaegu:wght@400;700&amp;family=Hi+Melody&amp;display=swap&quot; rel=&quot;stylesheet&quot;&gt;
    &lt;style&gt;
        *{
            font-family: &#39;Hi Melody&#39;, cursive;
        }
        .wrap {
            width: 500px;
            margin: auto;
        }

        .image {
            width: 500px;
            height: 400px;

            background-image: url(&quot;https://thumb.mt.co.kr/06/2018/07/2018070411134940004_1.jpg&quot;);
            background-position: center;
            background-size: cover;
        }
        .mybtn {
            margin: auto;
            display: block;
        }

    &lt;/style&gt;

&lt;/head&gt;

&lt;body&gt;
&lt;div class=&quot;wrap&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;item&quot;&gt;
        &lt;h1&gt;향초를 팝니다&lt;span style=&quot;font-size:18px&quot;&gt; 가격: 5,000원/개&lt;/span&gt;&lt;/h1&gt;
        &lt;p&gt;이 향초는 사실 특별한 힘을 가지고 있어요. 항초를 켜고 기도를 하면 자기전 뭐든지 이뤄지게 된답니다. 하나 사가세요!&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class=&quot;order&quot;&gt;
        &lt;div class=&quot;input-group mb-3&quot;&gt;
            &lt;div class=&quot;input-group-prepend&quot;&gt;
                &lt;span class=&quot;input-group-text&quot; &gt;주문자 이름&lt;/span&gt;
            &lt;/div&gt;
            &lt;input type=&quot;text&quot; class=&quot;form-control&quot; placeholder=&quot;&quot; aria-label=&quot;Username&quot;
                   aria-describedby=&quot;basic-addon1&quot;&gt;
        &lt;/div&gt;
        &lt;div class=&quot;input-group mb-3&quot;&gt;
            &lt;div class=&quot;input-group-prepend&quot;&gt;
                &lt;label class=&quot;input-group-text&quot; for=&quot;inputGroupSelect01&quot;&gt; 수량 &lt;/label&gt;
            &lt;/div&gt;
            &lt;select class=&quot;custom-select&quot; id=&quot;inputGroupSelect01&quot;&gt;
                &lt;option selected&gt;--수량을 선택해주세요--&lt;/option&gt;
                &lt;option value=&quot;1&quot;&gt;One&lt;/option&gt;
                &lt;option value=&quot;2&quot;&gt;Two&lt;/option&gt;
                &lt;option value=&quot;3&quot;&gt;Three&lt;/option&gt;
            &lt;/select&gt;
        &lt;/div&gt;
        &lt;div class=&quot;input-group mb-3&quot;&gt;
            &lt;div class=&quot;input-group-prepend&quot;&gt;
                &lt;span class=&quot;input-group-text&quot; &gt;주소&lt;/span&gt;
            &lt;/div&gt;
            &lt;input type=&quot;text&quot; class=&quot;form-control&quot; placeholder=&quot;&quot; aria-label=&quot;Username&quot;
                   aria-describedby=&quot;basic-addon1&quot;&gt;
        &lt;/div&gt;
        &lt;div class=&quot;input-group mb-3&quot;&gt;
            &lt;div class=&quot;input-group-prepend&quot;&gt;
                &lt;span class=&quot;input-group-text&quot; id=&quot;basic-addon1&quot;&gt;전화번호&lt;/span&gt;
            &lt;/div&gt;
            &lt;input type=&quot;text&quot; class=&quot;form-control&quot; placeholder=&quot;&quot; aria-label=&quot;Username&quot;
                   aria-describedby=&quot;basic-addon1&quot;&gt;
        &lt;/div&gt;
        &lt;button type=&quot;button&quot; class=&quot;btn btn-primary mybtn&quot;&gt;주문하기&lt;/button&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</code></pre>
]]></description>
        </item>
    </channel>
</rss>