[스파르타코딩클럽] 웹개발 종합반 - 2주차

JHL·2021년 7월 23일
0

매 주차 강의자료 시작에 PDF파일을 올려두었어요!

왕초보 시작반과 동일한 강의입니다 ! ☺️

[수업 목표]

  1. Javascript 문법에 익숙해진다.
  2. jQuery로 간단한 HTML을 조작할 수 있다.
  3. Ajax로 서버 API(약속)에 데이터를 주고, 결과를 받아온다.

[목차]

모든 토글을 열고 닫는 단축키
Windows : Ctrl + alt + t
Mac : + + t


01. 2주차 오늘 배울 것

  • 오늘 배울 것 이야기 - 2주차: jQuery, Ajax

    오늘은 HTML파일을 받았다고 가정하고, Javascript로 다시 서버에 데이터를 요청하고 받는 방법을 배워볼거예요.

    jQuery를 이용해 Javascript로 HTML을 쉽게 제어하고,
    Ajax를 이용해 다시 서버에 데이터를 요청하고 받아보겠습니다.

    https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6434b1c6-1baf-4746-a253-19cd70fd5825/Untitled.png

02. Javascript 복습

  • 1) Javascript 잠깐 복습 - 짝/홀수에 따라 다른 얼럿 띄우는 onclick 함수 함께 만들어보기

    • 짝수 번 눌렀을 때는 "짝짝짝👏", 홀수 번 눌렀을 때는 "홀홀홀🎅" 얼럿을 띄우는 버튼을 만들어 볼게요!

    • 짝/홀수 판단하는 방법

      let even = 4;
      console.log(even % 2); // 2로 나눈 나머지가 0입니다.
      let odd = 5;
      console.log(odd % 2); // 2로 나눈 나머지가 1입니다.
    • [코드스니펫] 짝/홀수 onclick 함수(완성)

          <script>
              let count = 1;
              function hey() {
                  if (count % 2 == 0) {
                      alert('짝짝짝👏');
                  } else {
                      alert('홀홀홀🎅');
                  }
      						count += 1;
              }
          </script>
  • 2) Javascript 만으로 충분할까요?

    • 예를 들어 버튼의 색깔을 바꾸고 싶다면?
    • 예를 들어 div 박스를 하나 감추고 싶다면?
    • → 이런 것들 쉽게 해주는 것이, jQuery!

03. JQuery 시작하기

  • 3) jQuery 란?

    • HTML의 요소들을 조작하는, 편리한 Javascript를 미리 작성해둔 것. 라이브러리!

      Javascript로도 모든 기능(예 - 버튼 글씨 바꾸기 등)을 구현할 수는 있지만,

      1) 코드가 복잡하고, 2) 브라우저 간 호환성 문제도 고려해야해서,
      jQuery라는 라이브러리가 등장하게 되었답니다.

    • jQuery와 Javascript - 코드 비교해보기

      jQuery는 Javascript와 다른 특별한 소프트웨어가 아니라 미리 작성된 Javascript 코드입니다. 전문 개발자들이 짜둔 코드를 잘 가져와서 사용하는 것임을 기억해주세요! (그렇게 때문에, 쓰기 전에 "임포트"를 해야합니다!)

      Javascript로 길고 복잡하게 써야 하는 것을

      document.getElementById("element").style.display = "none";

      jQuery로 보다 직관적으로 쓸 수 있어요. 편리하죠? :-)

      $('#element').hide();

04. JQuery 다뤄보기

  • 4) jQuery 사용하기

    • 미리 작성된 Javascript 코드를 가져오는 것을 '임포트'라고 부릅니다.

      • [코드스니펫] jQuery CDN

        ```html
        https://www.w3schools.com/jquery/jquery_get_started.asp
        ```

        jQuery CDN 부분을 참고해서 임포트하기: (링크)

    • 와 사이에 아래를 넣으면 끝!

      수업 자료를 잘 따라온 분이라면, 나홀로메모장 코드에 이미 다음과 같이 임포트 되어있을거예요. 다시한번 잘 살펴보세요!

      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    • jQuery를 사용하는 방법

      css와 마찬가지로, jQuery를 쓸 때에도 "가리켜야" → 조작할 수 있습니다.
      예) 특정 인풋박스의 값을 → 가져와줘!
      예) 특정 div를 → 안보이게 해줘!

      css에서는 선택자로 class를 썼지요?
      jQuery에서는 id 값을 통해 특정 버튼/인풋박스/div/.. 등을 가리키게 됩니다.

      백문이불여일견! 자주 쓰는 jQuery들을 함께 다뤄보면서 익혀보죠!

  • 5) 자주쓰는 jQuery들 다뤄보기

    • 들어가기 전에 - 모든 jQuery를 외워야 하나요?

      절대!! 아닙니다. 예를 들어 스크롤 움직임을 감지한다거나, 화면 사이즈를 안다거나, jQuery가 할 수 있는 일은 무척 많습니다.

      그러니, 필요할 때에 필요한 기능을 구글링해서 쓰면 되는 거예요!

    • [코드스니펫] 1주차 완성본

      <!doctype html>
      <html lang="en">
      
      <head>
          <!-- Required meta tags -->
          <meta charset="utf-8">
          <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
      
          <!-- Bootstrap CSS -->
          <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
                integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
      
          <!-- Optional JavaScript -->
          <!-- jQuery first, then Popper.js, then Bootstrap JS -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
          <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
                  integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
                  crossorigin="anonymous"></script>
          <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
                  integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
                  crossorigin="anonymous"></script>
      
          <title>스파르타코딩클럽 | 부트스트랩 연습하기</title>
      
          <link href="https://fonts.googleapis.com/css2?family=Jua&display=swap" rel="stylesheet">
      
          <style>
              * {
                  font-family: 'Jua', sans-serif;
              }
      
              .wrap {
                  width: 900px;
                  margin: auto;
              }
      
              .comment {
                  color: blue;
                  font-weight: bold;
              }
      
              .posting-box {
                  width: 500px;
                  margin: 0px auto 20px auto;
      
                  border: 2px solid black;
                  padding: 30px;
      
                  border-radius: 10px;
              }
          </style>
          <script>
              function hey(){
                  alert('안녕!!!');
              }
          </script>
      </head>
      
      <body>
      
      <div class="wrap">
          <div class="jumbotron">
              <h1 class="display-4">나홀로 링크 메모장!</h1>
              <p class="lead">중요한 링크를 저장해두고, 나중에 볼 수 있는 공간입니다</p>
              <hr class="my-4">
              <p class="lead">
                  <a onclick="hey()" class="btn btn-primary btn-lg" href="#" role="button">포스팅박스 열기</a>
              </p>
          </div>
          <div class="posting-box">
              <div class="form-group">
                  <label for="exampleInputEmail1">아티클 URL</label>
                  <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp"
                         placeholder="">
              </div>
              <div class="form-group">
                  <label for="exampleFormControlTextarea1">간단 코멘트</label>
                  <textarea class="form-control" id="exampleFormControlTextarea1" rows="3"></textarea>
              </div>
              <button type="submit" class="btn btn-primary">기사저장</button>
          </div>
          <div class="card-columns">
              <div class="card">
                  <img class="card-img-top"
                       src="https://d1blyo8czty997.cloudfront.net/tour-photos/n/4708/1200x600/5791761964.jpg"
                       alt="Card image cap">
                  <div class="card-body">
                      <a href="https://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                      <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                      <p class="comment">여기에 코멘트가 들어갑니다.</p>
                  </div>
              </div>
              <div class="card">
                  <img class="card-img-top"
                       src="https://d1blyo8czty997.cloudfront.net/tour-photos/n/4708/1200x600/5791761964.jpg"
                       alt="Card image cap">
                  <div class="card-body">
                      <a href="https://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                      <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                      <p class="comment">여기에 코멘트가 들어갑니다.</p>
                  </div>
              </div>
              <div class="card">
                  <img class="card-img-top"
                       src="https://d1blyo8czty997.cloudfront.net/tour-photos/n/4708/1200x600/5791761964.jpg"
                       alt="Card image cap">
                  <div class="card-body">
                      <a href="https://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                      <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                      <p class="comment">여기에 코멘트가 들어갑니다.</p>
                  </div>
              </div>
              <div class="card">
                  <img class="card-img-top"
                       src="https://d1blyo8czty997.cloudfront.net/tour-photos/n/4708/1200x600/5791761964.jpg"
                       alt="Card image cap">
                  <div class="card-body">
                      <a href="https://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                      <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                      <p class="comment">여기에 코멘트가 들어갑니다.</p>
                  </div>
              </div>
              <div class="card">
                  <img class="card-img-top"
                       src="https://d1blyo8czty997.cloudfront.net/tour-photos/n/4708/1200x600/5791761964.jpg"
                       alt="Card image cap">
                  <div class="card-body">
                      <a href="https://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                      <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                      <p class="comment">여기에 코멘트가 들어갑니다.</p>
                  </div>
              </div>
              <div class="card">
                  <img class="card-img-top"
                       src="https://d1blyo8czty997.cloudfront.net/tour-photos/n/4708/1200x600/5791761964.jpg"
                       alt="Card image cap">
                  <div class="card-body">
                      <a href="https://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                      <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                      <p class="comment">여기에 코멘트가 들어갑니다.</p>
                  </div>
              </div>
          </div>
      </div>
      </body>
      
      </html>
      1. input 박스의 값을 가져와보기

        <div class="posting-box">
            <div class="form-group">
                <label for="exampleInputEmail1">아티클 URL</label>
                <input id="post-url" type="email" class="form-control" aria-describedby="emailHelp"
                    placeholder="">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">간단 코멘트</label>
                <input type="password" class="form-control" placeholder="">
            </div>
            <button type="submit" class="btn btn-primary">기사 저장</button>
        </div>
        // 크롬 개발자도구 콘솔창에서 쳐보기
        // id 값이 post-url인 곳을 가리키고, val()로 값을 가져온다.
        $('#post-url').val();
      1. div 보이기 / 숨기기

        <div class="posting-box" id="post-box">
            <div class="form-group">
                <label for="exampleInputEmail1">아티클 URL</label>
                <input id="post-url" type="email" class="form-control" aria-describedby="emailHelp"
                    placeholder="">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">간단 코멘트</label>
                <input type="password" class="form-control" placeholder="">
            </div>
            <button type="submit" class="btn btn-primary">기사 저장</button>
        </div>
        // 크롬 개발자도구 콘솔창에 쳐보기
        // id 값이 post-box인 곳을 가리키고, hide()로 안보이게 한다.(=css의 display 값을 none으로 바꾼다)
        $('#post-box').hide();
        
        // show()로 보이게 한다.(=css의 display 값을 block으로 바꾼다)
        $('#post-box').show();
      1. css의 값 가져와보기 (우리는 display 속성 값을 가져와볼게요!)

        $('#post-box').hide();
        $('#post-box').css('display');
        
        $('#post-box').show();
        $('#post-box').css('display');
      1. 태그 내 텍스트 입력하기

        1) input box의 경우

        $('#post-url').val('여기에 텍스트를 입력하면!');

        2) 다른 것들 - 예) 버튼의 텍스트 바꾸기

        // 가리키고 싶은 버튼에 id 값을 준다음
        <button id="btn-posting-box" type="button" class="btn btn-primary">포스팅 박스 열기</button>
        $('#btn-posting-box').text('포스팅 박스 닫기');
      1. 태그 내 html 입력하기
      • ~
        내에, 동적으로 html을 넣고 싶을 땐? (예를 들어, 포스팅되면 → 카드 추가)
        // 사이에 html을 넣고 싶은 태그에 id값을 준 다음
        <div id="cards-box" class="card-columns">
            <div class="card">
              <img class="card-img-top" src="https://www.fodors.com/wp-content/uploads/2018/10/4_UltimateRome_PiazzaNavona-975x650.jpg" alt="Card image cap">
              <div class="card-body">
                <a href="https://naver.com/" class="card-title">여기 기사 제목이 들어가죠</a>
                <p class="card-text">여기에 기사 내용이 들어가겠죠</p>
                <p class="card-text comment">여기엔 코멘트가 들어갑니다</p>
              </div>
            </div>
          </div>

        1) 버튼을 넣어보기

        let temp_html = '<button>나는 추가될 버튼이다!</button>';
        $('#cards-box').append(temp_html);

        2) 버튼 말고, 카드를 넣어보기

        // 주의: 홑따옴표(')가 아닌 backtick(`)으로 감싸야 합니다.
        // 숫자 1번 키 왼쪽의 버튼을 누르면 backtick(`)이 입력됩니다.
        // backtick을 사용하면 문자 중간에 Javascript 변수를 삽입할 수 있습니다.
        let img_url = 'https://www.eurail.com/content/dam/images/eurail/Italy%20OCP%20Promo%20Block.adaptive.767.1535627244182.jpg';
        let link_url = 'https://naver.com/';
        let title = '여기 기사 제목이 들어가죠';
        let desc = '기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...';
        let comment = '여기에 코멘트가 들어갑니다.';
        
        let temp_html = `<div class="card">
                            <img class="card-img-top"
                                src="${img_url}"
                                alt="Card image cap">
                            <div class="card-body">
                                <a href="${link_url}" class="card-title">${title}</a>
                                <p class="card-text">${desc}</p>
                                <p class="card-text comment">${comment}</p>
                            </div>
                        </div>`;
        $('#cards-box').append(temp_html);

05. JQuery 적용하기(나홀로메모장)

  • 6) '나홀로메모장'에 포스팅박스 열기/닫기 기능을 함께 붙여보기

    • [코드스니펫] 나홀로메모장 URL

      http://spartacodingclub.shop/
    • (1) 완성된 모습 먼저 보기

      '포스팅박스 열기' 버튼을 누르면 숨겨진 창이 나타나고 버튼의 내용이 '포스팅박스 닫기'로 바뀝니다. 다시 한 번 버튼을 클릭하면 원래 모습으로 돌아갑니다.

      https://s3-us-west-2.amazonaws.com/secure.notion-static.com/96dbf31f-f664-40d8-a68e-2b7865fb09d7/Untitled.png

    • (2) 포스팅 박스 열기 버튼에 function을 달기

      <script>
      function openclose() {
      	// 여기에 jQuery를 이용해 코드를 짤 예정    
      }
      </script>
      
      // onclick 속성(attribute)을 추가합니다.
      <button onclick="openclose()" class="btn btn-primary btn-lg">포스팅박스 열기</button>
    • (3) 클릭 해서 포스팅 박스를 여닫게 하기

      • 포스팅 박스에 id 값을 주기

        <div class="form-post" id="post-box">
            <div>
                <div class="form-group">
                    <label for="exampleFormControlInput1">아티클 URL</label>
                    <input class="form-control" placeholder="">
                </div>
                <div class="form-group">
                    <label for="exampleFormControlTextarea1">간단 코멘트</label>
                    <textarea class="form-control" rows="2"></textarea>
                </div>
                <button type="button" class="btn btn-primary">기사저장</button>
            </div>
        </div>
      • 포스팅 박스 제어하기

        function openclose() {
            // id 값 post-box의 display 값이 block 이면
            if ($('#post-box').css('display') == 'block') {
                // post-box를 가리고
                $('#post-box').hide();
            } else {
                // 아니면 post-box를 펴라
                $('#post-box').show();
            }
        }
      • posting-box를 시작부터 감춰두기 (css의 display:none 속성!)

        이런 것을, inline-style (인라인 스타일) 이라고 부릅니다.

        여기저기 쓰면 복잡하겠지만, 이렇게 쓰면
        직관적으로 "아 처음부터 안보이는 태그구나!"를 알 수 있겠죠!

        (물론, class주고, css에서 display:none 속성을 주는 것도 방법이구요!)

        <div class="form-post" id="post-box" style="display:none">
            <div>
                <div class="form-group">
                    <label for="exampleFormControlInput1">아티클 URL</label>
                    <input class="form-control" placeholder="">
                </div>
                <div class="form-group">
                    <label for="exampleFormControlTextarea1">간단 코멘트</label>
                    <textarea class="form-control" rows="2"></textarea>
                </div>
                <button type="button" class="btn btn-primary">기사저장</button>
            </div>
        </div>
    • (4) '포스팅박스 열기' 버튼의 글씨 바꿔주기

      • 포스팅박스 열기 버튼에 id 값 주기

        <button id="btn-posting-box" onclick="openclose()" class="btn btn-primary btn-lg">포스팅박스 열기</a>
      • 버튼 텍스트를 바꿔주기

        function openclose() {
            // id 값 post-box의 display 값이 block 이면
            if ($('#post-box').css('display') == 'block') {
                // post-box를 가리고
                $('#post-box').hide();
        				// 가렸으니까 이제 열기로 바꿔두기
                $('#btn-posting-box').text('포스팅 박스 열기');
            } else {
                // 아니면 post-box를 펴라
                $('#post-box').show();
        				// 폈으니까 이제 닫기로 바꿔두기
                $('#btn-posting-box').text('포스팅 박스 닫기');
            }
        }
    • (5) 완성코드

      • [코드스니펫] 포스팅박스(완성)

        <!doctype html>
        <html lang="en">
        
        <head>
            <!-- Required meta tags -->
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        
            <!-- Bootstrap CSS -->
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
                integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
        
            <!-- Optional JavaScript -->
            <!-- jQuery first, then Popper.js, then Bootstrap JS -->
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
                integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
                crossorigin="anonymous"></script>
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
                integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
                crossorigin="anonymous"></script>
        
            <title>스파르타코딩클럽 | 부트스트랩 연습하기</title>
        
            <link href="https://fonts.googleapis.com/css2?family=Jua&display=swap" rel="stylesheet">
        
            <style>
                * {
                    font-family: 'Jua', sans-serif;
                }
        
                .wrap {
                    margin: auto;
                    width: 900px;
                }
        
                .comment {
                    font-weight: bold;
                    color: blue;
                }
        
                .posting-box {
                    margin: 10px auto 30px auto;
                    width: 500px;
        
                    border: 3px solid black;
                    border-radius: 5px;
        
                    padding: 25px;
                }
            </style>
            <script>
                function openclose() {
                    let status = $('#post-box').css('display');
                    if (status == 'block') {
                        $('#post-box').hide()
                        $('#posting-box-btn').text('포스팅박스 열기')
                    } else {
                        $('#post-box').show()
                        $('#posting-box-btn').text('포스팅박스 닫기')
                    }
                }
            </script>
        </head>
        
        <body>
            <div class="wrap">
                <div class="jumbotron">
                    <h1 class="display-4">나홀로 링크 메모장!</h1>
                    <p class="lead">중요한 링크를 저장해두고, 나중에 볼 수 있는 공간입니다</p>
                    <hr class="my-4">
                    <p class="lead">
                        <a id="posting-box-btn" onclick="openclose()" class="btn btn-primary btn-lg" href="#"
                            role="button">포스팅박스 열기</a>
                    </p>
                </div>
                <div class="posting-box" id="post-box">
                    <div class="form-group">
                        <label for="exampleInputEmail1">아티클 URL</label>
                        <input id="post-url" type="email" class="form-control" aria-describedby="emailHelp" placeholder="">
                    </div>
                    <div class="form-group">
                        <label for="exampleInputPassword1">간단 코멘트</label>
                        <input type="password" class="form-control" placeholder="">
                    </div>
                    <button type="submit" class="btn btn-primary">기사 저장</button>
                </div>
                <div class="card-columns" id="cards-box">
                    <div class="card">
                        <img class="card-img-top"
                            src="https://d2ur7st6jjikze.cloudfront.net/offer_photos/29590/185689_medium_1525763241.jpg?1525763241"
                            alt="Card image cap">
                        <div class="card-body">
                            <a href="http://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                            src="https://d2ur7st6jjikze.cloudfront.net/offer_photos/29590/185689_medium_1525763241.jpg?1525763241"
                            alt="Card image cap">
                        <div class="card-body">
                            <a href="http://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                            src="https://d2ur7st6jjikze.cloudfront.net/offer_photos/29590/185689_medium_1525763241.jpg?1525763241"
                            alt="Card image cap">
                        <div class="card-body">
                            <a href="http://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                            src="https://d2ur7st6jjikze.cloudfront.net/offer_photos/29590/185689_medium_1525763241.jpg?1525763241"
                            alt="Card image cap">
                        <div class="card-body">
                            <a href="http://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                    <div class="card">
                        <img class="card-img-top"
                            src="https://d2ur7st6jjikze.cloudfront.net/offer_photos/29590/185689_medium_1525763241.jpg?1525763241"
                            alt="Card image cap">
                        <div class="card-body">
                            <a href="http://naver.com" class="card-title">여기 기사 제목이 들어가죠</a>
                            <p class="card-text">기사의 요약 내용이 들어갑니다. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라만세 무궁화 삼천리 화려강산...</p>
                            <p class="card-text comment">여기에 코멘트가 들어갑니다.</p>
                        </div>
                    </div>
                </div>
            </div>
        </body>
        
        </html>

06. Quiz_JQuery 연습하기

  • 7) ✍두 개를 같이 연습해야 빨리 늘어요!

    30분 정도 각자 해보고, 튜터와 함께 풀이해봅시다!
    (퀴즈 코드의 빈 칸을 채워서, 완성본으로 만들기!)

    • Q. 퀴즈 코드

      파일을 하나 만들고 아래 코드를 붙여넣어 주세요.
      튜터 님이 html 구조를 간략하게 설명해준 뒤, 각자 코드를 완성해봅시다!

      • [코드스니펫] Jquery 퀴즈

        <!doctype html>
        <html lang="ko">
        
        <head>
            <meta charset="UTF-8">
            <title>jQuery 연습하고 가기!</title>
        
            <!-- JQuery를 import 합니다 -->
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        
            <style type="text/css">
                div.question-box {
                    margin: 10px 0 20px 0;
                }
            </style>
        
            <script>
                function q1() {
                    // 1. input-q1의 입력값을 가져온다. $('# .... ').val() 이렇게!
                    // 2. 만약 입력값이 빈칸이면 if(입력값=='')
                    // 3. alert('입력하세요!') 띄우기
                    // 4. alert(입력값) 띄우기
                }
        
                function q2() {
                    // 1. input-q2 값을 가져온다.
                    // 2. 만약 가져온 값에 @가 있으면 (includes 이용하기 - 구글링!)
                    // 3. info.spartacoding@gmail.com -> gmail 만 추출해서 ( .split('@') 을 이용하자!)
                    // 4. alert(도메인 값);으로 띄우기
                    // 5. 만약 이메일이 아니면 '이메일이 아닙니다.' 라는 얼럿 띄우기
                }
        
                function q3() {
                    // 1. input-q3 값을 가져온다. let txt = ... q1, q2에서 했던 걸 참고!
                    // 2. 가져온 값을 이용해 names-q3에 붙일 태그를 만든다. (let temp_html = `<li>${txt}</li>`) 요렇게!
                    // 3. 만들어둔 temp_html을 names-q3에 붙인다.(jQuery의 $('...').append(temp_html)을 이용하면 굿!)
                }
        
                function q3_remove() {
                    // 1. names-q3의 내부 태그를 모두 비운다.(jQuery의 $('....').empty()를 이용하면 굿!)
                }
        
            </script>
        
        </head>
        
        <body>
            <h1>jQuery + Javascript의 조합을 연습하자!</h1>
        
            <div class="question-box">
                <h2>1. 빈칸 체크 함수 만들기</h2>
                <h5>1-1. 버튼을 눌렀을 때 입력한 글자로 얼럿 띄우기</h5>
                <h5>[완성본]1-2. 버튼을 눌렀을 때 칸에 아무것도 없으면 "입력하세요!" 얼럿 띄우기</h5>
                <input id="input-q1" type="text" /> <button onclick="q1()">클릭</button>
            </div>
            <hr />
            <div class="question-box">
                <h2>2. 이메일 판별 함수 만들기</h2>
                <h5>2-1. 버튼을 눌렀을 때 입력받은 이메일로 얼럿 띄우기</h5>
                <h5>2-2. 이메일이 아니면(@가 없으면) '이메일이 아닙니다'라는 얼럿 띄우기</h5>
                <h5>[완성본]2-3. 이메일 도메인만 얼럿 띄우기</h5>
                <input id="input-q2" type="text" /> <button onclick="q2()">클릭</button>
            </div>
            <hr />
            <div class="question-box">
                <h2>3. HTML 붙이기/지우기 연습</h2>
                <h5>3-1. 이름을 입력하면 아래 나오게 하기</h5>
                <h5>[완성본]3-2. 다지우기 버튼을 만들기</h5>
                <input id="input-q3" type="text" placeholder="여기에 이름을 입력" />
                <button onclick="q3()">이름 붙이기</button>
                <button onclick="q3_remove()">다지우기</button>
                <ul id="names-q3">
                    <li>세종대왕</li>
                    <li>임꺽정</li>
                </ul>
            </div>
        </body>
        
        </html>
    • 참고) 완성본으로 결과물 확인하기

      1-1, 1-2, 2-1, 2-2, ... 소문제 순서대로 접근하면 쉽습니다!

    • A. 완성 코드

      • [코드스니펫] Jquery 퀴즈(완성)

        <!doctype html>
        <html lang="ko">
        
        <head>
            <meta charset="UTF-8">
            <title>jQuery 연습하고 가기!</title>
        
            <!-- JQuery를 import 합니다 -->
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        
            <style type="text/css">
                div.question-box {
                    margin: 10px 0 20px 0;
                }
            </style>
        
            <script>
                function q1() {
                    // 1. input-q1의 입력값을 가져온다.
                    let value = $('#input-q1').val();
                    // 2. 만약 입력값이 빈칸이면 if(입력값=='')
                    if (value == '') {
                        // 3. alert('입력하세요!') 띄우기
                        alert('입력하세요!');
                    } else {
                        // 4. alert(입력값) 띄우기
                        alert(value);
                    }
                }
        
                function q2() {
                    // 1. input-q2 값을 가져온다.
                    let email = $('#input-q2').val();
                    // 2. 만약 가져온 값에 @가 있으면 (includes 이용하기 - 찾아보자!)
                    if (email.includes('@')) {
                        // 3. info.spartacoding@gmail.com -> gmail 만 추출해서
                        // 4. alert(도메인 값);으로 띄우기
                        let domainWithDot = email.split('@')[1];
                        let onlyDomain = domainWithDot.split('.')[0];
                        alert(onlyDomain);
                    } else {
                        // 5. 만약 이메일이 아니면 '이메일이 아닙니다.' 라는 얼럿 띄우기
                        alert('이메일이 아닙니다.');
                    }
                }
        
                function q3() {
                    // 1. input-q3 값을 가져온다.
                    let newName = $('#input-q3').val();
                    if (newName == '') {
                        alert('이름을 입력하세요');
                        return;
                    }
                    // 2. 가져온 값을 이용해 names-q3에 붙일 태그를 만든다. (let temp_html = `<li>${가져온 값}</li>`)
                    let temp_html = `<li>${newName}</li>`;
                    // 3. 만들어둔 temp_html을 names-q3에 붙인다.(jQuery의 $('...').append(temp_html)을 이용하면 굿!)
                    $('#names-q3').append(temp_html);
                }
        
                function q3_remove() {
                    // 1. names-q3의 내부 태그를 모두 비운다.(jQuery의 $('....').empty()를 이용하면 굿!)
                    $('#names-q3').empty();
                }
        
            </script>
        
        </head>
        
        <body>
            <h1>jQuery + Javascript의 조합을 연습하자!</h1>
        
            <div class="question-box">
                <h2>1. 빈칸 체크 함수 만들기</h2>
                <h5>1-1. 버튼을 눌렀을 때 입력한 글자로 얼럿 띄우기</h5>
                <h5>[완성본]1-2. 버튼을 눌렀을 때 칸에 아무것도 없으면 "입력하세요!" 얼럿 띄우기</h5>
                <input id="input-q1" type="text" /> <button onclick="q1()">클릭</button>
            </div>
            <hr />
            <div class="question-box">
                <h2>2. 이메일 판별 함수 만들기</h2>
                <h5>2-1. 버튼을 눌렀을 때 입력받은 이메일로 얼럿 띄우기</h5>
                <h5>2-2. 이메일이 아니면(@가 없으면) '이메일이 아닙니다'라는 얼럿 띄우기</h5>
                <h5>[완성본]2-3. 이메일 도메인만 얼럿 띄우기</h5>
                <input id="input-q2" type="text" /> <button onclick="q2()">클릭</button>
            </div>
            <hr />
            <div class="question-box">
                <h2>3. HTML 붙이기/지우기 연습</h2>
                <h5>3-1. 이름을 입력하면 아래 나오게 하기</h5>
                <h5>[완성본]3-2. 다지우기 버튼을 만들기</h5>
                <input id="input-q3" type="text" placeholder="여기에 이름을 입력" />
                <button onclick="q3()">이름 붙이기</button>
                <button onclick="q3_remove()">다지우기</button>
                <ul id="names-q3">
                    <li>세종대왕</li>
                    <li>임꺽정</li>
                </ul>
            </div>
        </body>
        
        </html>

07. 서버-클라이언트 통신 이해하기

  • 8) 서버→클라이언트: "JSON"을 이해하기

    • 서울시 OpenAPI에 접속해보기

      • [코드스니펫] 미세먼지OpenAPI

        http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99
    • 크롬 익스텐션 JSONView를 설치해볼까요? 그럼 좀 더 예쁘게 JSON을 볼 수 있습니다.

      • [코드스니펫] - Jsonview

        https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=ko
    • JSON은, Key:Value로 이루어져 있습니다. 자료형 Dictionary와 아주- 유사하죠

      위 예제에서는 RealtimeCityAir라는 키 값에 딕셔너리 형 value가 들어가있고,
      그 안에 row라는 키 값에는 리스트형 value가 들어가있습니다.

      https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8f29b7c4-6b71-4b7f-9013-a8afb772dd1a/Untitled.png

  • 9) 클라이언트→서버: GET 요청 이해하기

    API는 은행 창구와 같은 것!

    같은 예금 창구에서도 개인 고객이냐 기업 고객이냐에 따라
    가져와야 하는 것 / 처리해주는 것이 다른 것처럼,

    클라이언트가 요청 할 때에도, "타입"이라는 것이 존재합니다.

    • GET → 통상적으로! 데이터 조회(Read)를 요청할 때
      예) 영화 목록 조회

    • POST → 통상적으로! 데이터 생성(Create), 변경(Update), 삭제(Delete) 요청 할 때
      예) 회원가입, 회원탈퇴, 비밀번호 수정

      이 중에서 오늘은 GET 방식에 대해 배워보겠습니다. (POST는 4주차에 배웁니다)

    • GET

      기생충

      https://movie.naver.com/movie/bi/mi/basic.nhn?code=161967
      
      위 주소는 크게 두 부분으로 쪼개집니다. 바로 "?"가 쪼개지는 지점인데요.
      "?" 기준으로 앞부분이 <서버 주소>, 뒷부분이 [영화 번호] 입니다.
      
      * 서버 주소: https://movie.naver.com/movie/bi/mi/basic.nhn
      * 영화 정보: code=161967

      GET 방식으로 데이터를 전달하는 방법

      ? : 여기서부터 전달할 데이터가 작성된다는 의미입니다.
      & : 전달할 데이터가 더 있다는 뜻입니다.

      예시) google.com/search?q=아이폰&sourceid=chrome&ie=UTF-8

             위 주소는 google.com의 search 창구에 다음 정보를 전달합니다!
             q=아이폰                        (검색어)
             sourceid=chrome        (브라우저 정보)
             ie=UTF-8                      (인코딩 정보)

      여기서 잠깐, 그럼 code라는 이름으로 영화번호를 주자!는 것은
      누가 정하는 것일까요?

      → 네, 바로 프론트엔드 개발자와 백엔드 개발자가 미리 정해둔 약속입니다.

      프론트엔드: "code라는 이름으로 영화번호를 주면 될까요?"
      백엔드: "네 그렇게 하시죠. 그럼 code로 영화번호가 들어온다고 생각하고 코딩하고 있을게요"

08. Ajax 시작하기

  • 10) Ajax 시작하기

    • 크롬 개발자 도구에 다음과 같이 써보세요

      참고! Ajax는 jQuery를 임포트한 페이지에서만 동작 가능합니다.

      즉, http://google.com/ 과 같은 화면에서 개발자도구를 열면, jQuery가 임포트 되어있지 않기 때문에 아래와 같은 에러가 뜹니다.

      Uncaught TypeError: $.ajax is not a function
      → ajax라는 게 없다는 뜻

      • [코드스니펫] 미세먼지 OpenAPI

        [http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99](http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99)
      • [코드스니펫] Ajax 기본 골격

        ```jsx
        $.ajax({
          type: "GET",
          url: "여기에URL을입력",
          data: {},
          success: function(response){
            console.log(response)
          }
        })
        ```

        Ajax 코드 해설

        $.ajax({
          type: "GET", // GET 방식으로 요청한다.
          url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
          data: {}, // 요청하면서 함께 줄 데이터 (GET 요청시엔 비워두세요)
          success: function(response){ // 서버에서 준 결과를 response라는 변수에 담음
            console.log(response) // 서버에서 준 결과를 이용해서 나머지 코드를 작성
          }
        })
    • $ajax 코드 설명

      • type: "GET" → GET 방식으로 요청한다.

      • url: 요청할 url

      • data: 요청하면서 함께 줄 데이터 (GET 요청시엔 비워두세요)

        리마인드
        GET 요청은, url뒤에 아래와 같이 붙여서 데이터를 가져갑니다.
        http://naver.com?param=value¶m2=value2

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

      • success: 성공하면, response 값에 서버의 결과 값을 담아서 함수를 실행한다.

        결과가 어떻게 response에 들어가나요? → 받아 들이셔야 합니다..!
        (대부분의 개발자들도 내부 원리는 코드를 안 뜯어봐서 몰라요.^^;;)

        success: function(response){ // 서버에서 준 결과를 response라는 변수에 담음
          console.log(response) 
        }
  • 11) Ajax 통신의 결과값을 이용해보기

    • 위에서 했던 Ajax 통신을 발전시켜볼게요!

      $.ajax({
        type: "GET", // GET 방식으로 요청한다.
        url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
        data: {}, // 요청하면서 함께 줄 데이터 (GET 요청시엔 비워두세요)
        success: function(response){ // 서버에서 준 결과를 response라는 변수에 담음
          console.log(response) // 서버에서 준 결과를 이용해서 나머지 코드를 작성
        }
      })
    • 개발자도구 콘솔에 찍어보기

      $.ajax({
        type: "GET",
        url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
        data: {},
        success: function(response){
      		// 값 중 도봉구의 미세먼지 값만 가져와보기
      		let dobong = response["RealtimeCityAir"]["row"][11];
      		let gu_name = dobong['MSRSTE_NM'];
      		let gu_mise = dobong['IDEX_MVL'];
      		console.log(gu_name, gu_mise);
        }
      })
    • 모든 구의 미세먼지 값을 찍어보기

      $.ajax({
        type: "GET",
        url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
        data: {},
        success: function (response) {
          let mise_list = response["RealtimeCityAir"]["row"];
          for (let i = 0; i < mise_list.length; i++) {
            let mise = mise_list[i];
            let gu_name = mise["MSRSTE_NM"];
            let gu_mise = mise["IDEX_MVL"];
            console.log(gu_name, gu_mise);
          }
        }
      });
      • 복습할 때 참고! - 해설) 모든 구의 미세먼지 값을 찍어보기

        1. 미세먼지 데이터가 어디에 있는지 찾기

          https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cf6e770d-9618-4c1d-beef-afb23b3cd2c9/Untitled.png

          위 그림과 같이 RealtimeCityAir > row 에 미세먼지 데이터가 들어있습니다. 이걸 꺼내볼까요?

          $.ajax({
            type: "GET",
            url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
            data: {},
            success: function(response){
          		let mise_list = response["RealtimeCityAir"]["row"]; // 꺼내는 부분!
          		console.log(mise_list);
            }
          })
        2. 반복문으로 구 데이터를 출력해보기

          https://s3-us-west-2.amazonaws.com/secure.notion-static.com/dc6ab951-95aa-4415-8977-fc988e04e3cc/Untitled.png

          row의 값을 mise_list에 담았으니, 반복문을 이용해보겠습니다!

          $.ajax({
            type: "GET",
            url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
            data: {},
            success: function (response) {
              let mise_list = response["RealtimeCityAir"]["row"];
              for (let i = 0; i < mise_list.length; i++) {
                let mise = mise_list[i];
                console.log(mise);
              }
            },
          });
        3. 구 데이터에서 구 이름, 미세먼지 수치를 골라내어 출력하기

          https://s3-us-west-2.amazonaws.com/secure.notion-static.com/41a0dbc3-2ad1-458f-baeb-08961f950b25/Untitled.png

          구 이름 키 값인 "MSRSTE_NM", 미세먼지 수치 키값인 "IDEX_MVL"의 밸류를 출력

          $.ajax({
            type: "GET",
            url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
            data: {},
            success: function (response) {
              let mise_list = response["RealtimeCityAir"]["row"];
              for (let i = 0; i < mise_list.length; i++) {
                let mise = mise_list[i];
                let gu_name = mise["MSRSTE_NM"];
                let gu_mise = mise["IDEX_MVL"];
                console.log(gu_name, gu_mise);
              }
            }
          });

09. Ajax 함께 연습하기

  • 12) 서울시 OpenAPI(실시간 미세먼지 상태)를 이용하기

    • [코드스니펫] Ajax 기본 골격

      $.ajax({
        type: "GET",
        url: "여기에URL을입력",
        data: {},
        success: function(response){
          console.log(response)
        }
      })
    • [코드스니펫] 미세먼지 OpenAPI

      [http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99](http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99)
    • [코드스니펫] Ajax 연습

      <!doctype html>
      <html lang="ko">
      
      <head>
          <meta charset="UTF-8">
          <title>jQuery 연습하고 가기!</title>
      
          <!-- jQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      
          <style type="text/css">
              div.question-box {
                  margin: 10px 0 20px 0;
              }
          </style>
      
          <script>
              function q1() {
                  // 여기에 코드를 입력하세요
              }
          </script>
      
      </head>
      
      <body>
          <h1>jQuery+Ajax의 조합을 연습하자!</h1>
      
          <hr />
      
          <div class="question-box">
              <h2>1. 서울시 OpenAPI(실시간 미세먼지 상태)를 이용하기</h2>
              <p>모든 구의 미세먼지를 표기해주세요</p>
              <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
              <button onclick="q1()">업데이트</button>
              <ul id="names-q1">
                  <li>중구 : 82</li>
                  <li>종로구 : 87</li>
                  <li>용산구 : 84</li>
                  <li>은평구 : 82</li>
              </ul>
          </div>
      </body>
      
      </html>
    • [코드스니펫] Ajax 연습(보기)

      http://spartacodingclub.shop/ajaxquiz/01
    • [코드스니펫] Ajax 연습(완성)

      ```jsx
      <!doctype html>
      <html lang="ko">
      
      <head>
          <meta charset="UTF-8">
          <title>jQuery 연습하고 가기!</title>
      
          <!-- jQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      
          <style type="text/css">
              div.question-box {
                  margin: 10px 0 20px 0;
              }
          </style>
      
          <script>
              function q1() {
                  // 여기에 코드를 입력하세요
                  $('#names-q1').empty();
                  $.ajax({
                      type: "GET",
                      url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
                      data: {},
                      success: function (response) {
                          let rows = response["RealtimeCityAir"]["row"];
                          for (let i = 0; i < rows.length; i++) {
                              let gu_name = rows[i]['MSRSTE_NM'];
                              let gu_mise = rows[i]['IDEX_MVL'];
                              let temp_html = `<li>${gu_name} : ${gu_mise}</li>`
                              $('#names-q1').append(temp_html);
                          }
                      }
                  })
              }
          </script>
      
      </head>
      
      <body>
          <h1>jQuery+Ajax의 조합을 연습하자!</h1>
      
          <hr />
      
          <div class="question-box">
              <h2>1. 서울시 OpenAPI(실시간 미세먼지 상태)를 이용하기</h2>
              <p>모든 구의 미세먼지를 표기해주세요</p>
              <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
              <button onclick="q1()">업데이트</button>
              <ul id="names-q1">
              </ul>
          </div>
      </body>
      
      </html>
      ```

      [한걸음 더]
      미세먼지 수치가 70이상인 곳은 빨갛게 보여줄까요?

    • [코드스니펫] - Ajax 연습(완성-한걸음더)

      <!doctype html>
      <html lang="ko">
      
      <head>
          <meta charset="UTF-8">
          <title>jQuery 연습하고 가기!</title>
      
          <!-- jQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      
          <style type="text/css">
              div.question-box {
                  margin: 10px 0 20px 0;
              }
              .bad {
                  color: red;
                  font-weight: bold;
              }
          </style>
      
          <script>
              function q1() {
                  // 여기에 코드를 입력하세요
                  $('#names-q1').empty();
                  $.ajax({
                      type: "GET",
                      url: "http://openapi.seoul.go.kr:8088/6d4d776b466c656533356a4b4b5872/json/RealtimeCityAir/1/99",
                      data: {},
                      success: function (response) {
                          let rows = response["RealtimeCityAir"]["row"];
                          for (let i = 0; i < rows.length; i++) {
                              let gu_name = rows[i]['MSRSTE_NM'];
                              let gu_mise = rows[i]['IDEX_MVL'];
      
                              let temp_html = ''
      
                              if (gu_mise > 70) {
                                  temp_html = `<li class="bad">${gu_name} : ${gu_mise}</li>`
                              } else {
                                  temp_html = `<li>${gu_name} : ${gu_mise}</li>`
                              }
                              
                              $('#names-q1').append(temp_html);
                          }
                      }
                  })
              }
          </script>
      
      </head>
      
      <body>
          <h1>jQuery+Ajax의 조합을 연습하자!</h1>
      
          <hr />
      
          <div class="question-box">
              <h2>1. 서울시 OpenAPI(실시간 미세먼지 상태)를 이용하기</h2>
              <p>모든 구의 미세먼지를 표기해주세요</p>
              <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
              <button onclick="q1()">업데이트</button>
              <ul id="names-q1">
              </ul>
          </div>
      </body>
      
      </html>

10. Quiz_Ajax 연습하기(1)

  • 13) ✍서울시 OpenAPI(실시간 따릉이 현황)을 이용하기

    • [코드스니펫] 따릉이 OpenAPI

      http://spartacodingclub.shop/sparta_api/seoulbike
    • [코드스니펫] Ajax 퀴즈1

      <!doctype html>
      <html lang="ko">
      
      <head>
          <meta charset="UTF-8">
          <title>JQuery 연습하고 가기!</title>
          <!-- JQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      
          <style type="text/css">
              div.question-box {
                  margin: 10px 0 20px 0;
              }
      
              table {
                  border: 1px solid;
                  border-collapse: collapse;
              }
      
              td,
              th {
                  padding: 10px;
                  border: 1px solid;
              }
          </style>
      
          <script>
              function q1() {
                  // 여기에 코드를 입력하세요
              }
          </script>
      
      </head>
      
      <body>
          <h1>jQuery + Ajax의 조합을 연습하자!</h1>
      
          <hr />
      
          <div class="question-box">
              <h2>2. 서울시 OpenAPI(실시간 따릉기 현황)를 이용하기</h2>
              <p>모든 위치의 따릉이 현황을 보여주세요</p>
              <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
              <button onclick="q1()">업데이트</button>
              <table>
                  <thead>
                      <tr>
                          <td>거치대 위치</td>
                          <td>거치대 수</td>
                          <td>현재 거치된 따릉이 수</td>
                      </tr>
                  </thead>
                  <tbody id="names-q1">
                      <tr>
                          <td>102. 망원역 1번출구 앞</td>
                          <td>22</td>
                          <td>0</td>
                      </tr>
                      <tr>
                          <td>103. 망원역 2번출구 앞</td>
                          <td>16</td>
                          <td>0</td>
                      </tr>
                      <tr>
                          <td>104. 합정역 1번출구 앞</td>
                          <td>16</td>
                          <td>0</td>
                      </tr>
                  </tbody>
              </table>
          </div>
      </body>
      
      </html>
    • [코드스니펫] Ajax 퀴즈1(보기1)

      http://spartacodingclub.shop/ajaxquiz/02_1
    • [코드스니펫] Ajax 퀴즈1(완성1)

      ```jsx
      <!doctype html>
      <html lang="ko">
      
      <head>
          <meta charset="UTF-8">
          <title>jQuery 연습하고 가기!</title>
          <!-- jQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      
          <style type="text/css">
              div.question-box {
                  margin: 10px 0 20px 0;
              }
      
              table {
                  border: 1px solid;
                  border-collapse: collapse;
              }
      
              td,
              th {
                  padding: 10px;
                  border: 1px solid;
              }
          </style>
      
          <script>
              function q1() {
                  $('#names-q1').empty();
                  $.ajax({
                      type: "GET",
                      url: "http://spartacodingclub.shop/sparta_api/seoulbike",
                      data: {},
                      success: function (response) {
                          let rows = response["getStationListHist"]["row"];
                          for (let i = 0; i < rows.length; i++) {
                              let rack_name = rows[i]['stationName'];
                              let rack_cnt = rows[i]['rackTotCnt'];
                              let bike_cnt = rows[i]['parkingBikeTotCnt'];
                              let temp_html = `<tr>
                                                  <td>${rack_name}</td>
                                                  <td>${rack_cnt}</td>
                                                  <td>${bike_cnt}</td>
                                              </tr>`
                              $('#names-q1').append(temp_html);
                          }
                      }
                  })
              }
          </script>
      
      </head>
      
      <body>
          <h1>jQuery +Ajax의 조합을 연습하자!</h1>
      
          <hr />
      
          <div class="question-box">
              <h2>2. 서울시 OpenAPI(실시간 따릉이 현황)를 이용하기</h2>
              <p>모든 위치의 따릉이 현황을 보여주세요</p>
              <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
              <button onclick="q1()">업데이트</button>
              <table>
                  <thead>
                      <tr>
                          <td>거치대 위치</td>
                          <td>거치대 수</td>
                          <td>현재 거치된 따릉이 수</td>
                      </tr>
                  </thead>
                  <tbody id="names-q1">
                  </tbody>
              </table>
          </div>
      </body>
      
      </html>
      ```

      [한걸음 더]
      따릉이 대수가 5대 미만인 곳은 빨갛게 보여주면 어떨까요?

    • [코드스니펫] Ajax 퀴즈1(보기2)

      http://spartacodingclub.shop/ajaxquiz/02_2
    • [코드스니펫] Ajax 퀴즈1(완성2)

      <!doctype html>
      <html lang="ko">
      
      <head>
          <meta charset="UTF-8">
          <title>jQuery 연습하고 가기!</title>
          <!-- jQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      
          <style type="text/css">
              div.question-box {
                  margin: 10px 0 20px 0;
              }
      
              table {
                  border: 1px solid;
                  border-collapse: collapse;
              }
      
              td,
              th {
                  padding: 10px;
                  border: 1px solid;
              }
      
              .urgent {
                  color: red;
                  font-weight: bold;
              }
          </style>
      
          <script>
              function q1() {
                  $('#names-q1').empty();
                  $.ajax({
                      type: "GET",
                      url: "http://spartacodingclub.shop/sparta_api/seoulbike",
                      data: {},
                      success: function (response) {
                          let rows = response["getStationList"]["row"];
                          for (let i = 0; i < rows.length; i++) {
                              let rack_name = rows[i]['stationName'];
                              let rack_cnt = rows[i]['rackTotCnt'];
                              let bike_cnt = rows[i]['parkingBikeTotCnt'];
                              let temp_html = '';
                              if (bike_cnt < 5) {
                                  temp_html = `<tr class="urgent">
                                      <td>${rack_name}</td>
                                      <td>${rack_cnt}</td>
                                      <td>${bike_cnt}</td>
                                    </tr>`
                              } else {
                                  temp_html = `<tr>
                                      <td>${rack_name}</td>
                                      <td>${rack_cnt}</td>
                                      <td>${bike_cnt}</td>
                                    </tr>`
                              }
                              $('#names-q1').append(temp_html);
                          }
                      }
                  })
              }
          </script>
      
      </head>
      
      <body>
          <h1>jQuery+Ajax의 조합을 연습하자!</h1>
      
          <hr />
      
          <div class="question-box">
              <h2>2. 서울시 OpenAPI(실시간 따릉이 현황)를 이용하기</h2>
              <p>모든 위치의 따릉이 현황을 보여주세요</p>
              <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
              <button onclick="q1()">업데이트</button>
              <table>
                  <thead>
                      <tr>
                          <td>거치대 위치</td>
                          <td>거치대 수</td>
                          <td>현재 거치된 따릉이 수</td>
                      </tr>
                  </thead>
                  <tbody id="names-q1">
                  </tbody>
              </table>
          </div>
      </body>
      
      </html>

11. Quiz_Ajax 연습하기(2)

  • 14) ✍랜덤 고양이 사진 API를 이용하기

    • [코드스니펫] 고양이OpenAPI

      ```html
      [https://api.thecatapi.com/v1/images/search](https://api.thecatapi.com/v1/images/search)
      ```

      힌트:

      "jQuery 이미지태그 src 바꾸기" 라고 구글에 검색해보세요!

    • [코드스니펫] Ajax퀴즈2

      <!doctype html>
      <html lang="ko">
        <head>
          <meta charset="UTF-8">
          <title>JQuery 연습하고 가기!</title>
          <!-- JQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
          
          <style type="text/css">
            div.question-box {
              margin: 10px 0 20px 0;
            }
            div.question-box > div {
              margin-top: 30px;
            }
            
          </style>
      
          <script>
            function q1() {
              // 여기에 코드를 입력하세요
            }
          </script>
      
        </head>
        <body>
          <h1>JQuery+Ajax의 조합을 연습하자!</h1>
      
          <hr/>
      
          <div class="question-box">
            <h2>3. 랜덤 고양이 사진 API를 이용하기</h2>
            <p>예쁜 고양이 사진을 보여주세요</p>
            <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
            <button onclick="q1()">고양이를 보자</button>
            <div>
              <img id="img-cat" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"/>
            </div>
          </div>
        </body>
      </html>
    • [코드스니펫] Ajax퀴즈2(보기)

      http://spartacodingclub.shop/ajaxquiz/03
    • [코드스니펫] Ajax퀴즈2(완성)

      <!doctype html>
      <html lang="ko">
        <head>
          <meta charset="UTF-8">
          <title>JQuery 연습하고 가기!</title>
          <!-- JQuery를 import 합니다 -->
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
          
          <style type="text/css">
            div.question-box {
              margin: 10px 0 20px 0;
            }
            div.question-box > div {
              margin-top: 30px;
            }
            
          </style>
      
          <script>
            function q1() {
              $.ajax({
                type: "GET",
                url: "https://api.thecatapi.com/v1/images/search",
                data: {},
                success: function(response){
                    let imgurl = response[0]['url'];
                    $("#img-cat").attr("src", imgurl);
                  }
                })
            }
          </script>
      
        </head>
        <body>
          <h1>JQuery+Ajax의 조합을 연습하자!</h1>
      
          <hr/>
      
          <div class="question-box">
            <h2>3. 랜덤 고양이 사진 API를 이용하기</h2>
            <p>예쁜 고양이 사진을 보여주세요</p>
            <p>업데이트 버튼을 누를 때마다 지웠다 새로 씌여져야 합니다.</p>
            <button onclick="q1()">고양이를 보자</button>
            <div>
              <img id="img-cat" width="300" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"/>
            </div>
          </div>
        </body>
      </html>

12. 2주차 끝 & 숙제 설명

1주차에 완성한 쇼핑몰에, 환율 정보를 넣어주세요!
로딩이 완료되면, 환율 API을 이용해서 환율을 표시해주세요.

  • 결과 예시

    https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0ef39bbb-508b-4c70-b014-dfedc4da98e1/Untitled.png

  • 환율 API 참고

    • [코드스니펫] 환율API

      ```html
      http://spartacodingclub.shop/sparta_api/rate
      ```

      쇼핑몰에 환율을 표시해주세요. 빨간 박스가 달러-원 환율입니다! ($1 = 1113.07원)

      https://s3-us-west-2.amazonaws.com/secure.notion-static.com/373e44c0-cfa2-4e2a-ad37-686f1a580706/Untitled.png

  • 힌트

    로딩 완료 후 환율을 써주려면 어떻게 해야할까요?
    먼저, "javascript 로딩 후 실행"이라고 검색해볼까요?

    • [코드스니펫] 로딩 후 호출하기

      $(document).ready(function(){
      	alert('다 로딩됐다!')
      });

HW. 2주차 숙제 해설

  • [코드스니펫] 2주차 숙제 답안 코드

    <!doctype html>
    <html lang="en">
    
    <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    
        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
              integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    
        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
                integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
                crossorigin="anonymous"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
                integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
                crossorigin="anonymous"></script>
    
        <title>스파르타코딩클럽 | 부트스트랩 연습하기</title>
    
        <link href="https://fonts.googleapis.com/css2?family=Jua&display=swap" rel="stylesheet">
    
        <style>
            * {
                font-family: 'Jua', sans-serif;
            }
    
            .item-img {
                width: 500px;
                height: 300px;
    
                background-image: url("https://t1.daumcdn.net/liveboard/nts/5bcccfbd33da4865817b9c606b6b852e.JPG");
                background-position: center;
                background-size: cover;
            }
    
            .price {
                font-size: 20px;
            }
    
            .item-desc {
                width: 500px;
                margin-top: 20px;
                margin-bottom: 20px;
            }
    
            .item-order {
                width: 500px;
            }
    
            .btn-order {
                margin: auto;
                width: 100px;
    
                display: block;
            }
    
            .wrap {
                width: 500px;
                margin: auto;
            }
    
            .rate {
                color: blue;
            }
        </style>
    
        <script>
            $(document).ready(function () {
                get_rate();
            });
    
            function get_rate(){
                $.ajax({
                    type: "GET",
                    url: "http://spartacodingclub.shop/sparta_api/rate",
                    data: {},
                    success: function (response) {
                        let now_rate = response['rate'];
                        $('#now-rate').text(now_rate);
                    }
                })
            }
    
            function order() {
                alert('주문이 완료되었습니다!');
            }
        </script>
    </head>
    
    <body>
    <div class="wrap">
        <div class="item-img"></div>
        <div class="item-desc">
            <h1>양초를 팝니다 <span class="price">가격:3,000원/개</span></h1>
            <p>이 양초는 사실 특별한 힘을 지니고 있어요!</p>
            <p class="rate">달러-원 환율: <span id="now-rate">1219.15</span></p>
        </div>
        <div class="item-order">
            <div class="input-group mb-3">
                <div class="input-group-prepend">
                    <span class="input-group-text">주문자이름</span>
                </div>
                <input type="text" class="form-control" aria-label="Default" aria-describedby="inputGroup-sizing-default">
            </div>
            <div class="input-group mb-3">
                <div class="input-group-prepend">
                    <label class="input-group-text" for="inputGroupSelect01">수량</label>
                </div>
                <select class="custom-select" id="inputGroupSelect01">
                    <option selected>-- 수량을 선택하세요 --</option>
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                </select>
            </div>
            <div class="input-group mb-3">
                <div class="input-group-prepend">
                    <span class="input-group-text">주소</span>
                </div>
                <input type="text" class="form-control" aria-label="Default" aria-describedby="inputGroup-sizing-default">
            </div>
            <div class="input-group mb-3">
                <div class="input-group-prepend">
                    <span class="input-group-text">전화번호</span>
                </div>
                <input type="text" class="form-control" aria-label="Default" aria-describedby="inputGroup-sizing-default">
            </div>
            <button type="button" onclick="order()" class="btn btn-primary btn-order">주문하기</button>
        </div>
    </div>
    </body>
    
    </html>

Copyright ⓒ TeamSparta All rights reserved.

0개의 댓글