🦁_21.12.10 TIL

BoriΒ·2021λ…„ 12μ›” 10일
2
post-thumbnail

21λ…„ 12μ›” 10일

πŸ“ Javascript

πŸ“Ž DOM_2(Document Object Model, λ¬Έμ„œ 객체 λͺ¨λΈ)

DOM μ œμ–΄ λͺ…λ Ήμ–΄

  • μš”μ†Œ μ œμ–΄ : DOM APIλ₯Ό μ΄μš©ν•˜λ©΄ μš”μ†Œλ₯Ό μƒˆλ‘­κ²Œ μƒμ„±ν•˜κ³ , μœ„μΉ˜ν•˜κ³ , μ œκ±°ν•  수 μžˆλ‹€.
<!-- 예제 1 -->
<ul></ul>
<button>Make me MORE!</button>
const myBtn = document.querySelector(β€œbutton”);
const myUl = document.querySelector(β€œul”);

myBtn.addEventListener(β€˜click’, function(){
  // li μš”μ†Œλ₯Ό 생성
  const myLi = document.createElement(β€˜li’);
  // μƒμ„±λœ liλ₯Ό ul에 μΆ”κ°€
  myUl.appendChild(myLi);
})

// document.createElement(target); target μš”μ†Œλ₯Ό 생성
// document.createTextNode(target); target ν…μŠ€νŠΈλ₯Ό 생성
// element.appendChild(target);    target μš”μ†Œλ₯Ό element의 μžμ‹μœΌλ‘œ μœ„μΉ˜
// element.removeChild(target);    element의 target μžμ‹ μš”μ†Œλ₯Ό 제거
<!-- 예제 2 -->
<div id="parentElement">
  <span id="childElement">hello guys~</span>
</div>
let span = document.createElement("span");
let sibling = document.getElementById("childElement");
let parentDiv = document.getElementById("parentElement");

// parentElement.insertBefore(target, location); 
// targetμš”μ†Œλ₯Ό element의 μžμ‹μΈ location μœ„μΉ˜λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
parentDiv.insertBefore(span, sibling);

  • JavaScript λ¬Έμžμ—΄μ„ μ‚¬μš©ν•΄ element, text λ…Έλ“œλ₯Ό 생성, μΆ”κ°€ν•˜κΈ°
<p></p>
<input type="text">
<button>Write Something!</button>
const myBtn = document.querySelector("button");
const myP = document.querySelector("p");
const myInput = document.querySelector("input");

myBtn.addEventListener('click', function(){
	myP.textContent = myInput.value;
});

// input μš”μ†Œμ— 'input' 이벀트λ₯Ό μ—°κ²°ν•˜λ©΄ μ‹€μ‹œκ°„μœΌλ‘œ 값이 반영되게 λ§Œλ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
myInput.addEventListener('input', ()=>{
  myP.textContent = myInput.value;
});

myP.innerHTML = "<strong>I'm Strong!!</strong>";
myP.outerHTML = "<div></div>";

// innerHTML 은 μš”μ†Œ 내에 포함 된 HTML λ§ˆν¬μ—…μ„ κ°€μ Έμ˜€κ±°λ‚˜ μ„€μ •
// innerText 속성은 μš”μ†Œμ™€ κ·Έ μžμ†μ˜ λ Œλ”λ§ 된 ν…μŠ€νŠΈ μ½˜ν…μΈ λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 
// (innerTextλŠ” "μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ”" μš”μ†Œλ§Œ 처리)
// textContent 속성은 λ…Έλ“œμ˜ ν…μŠ€νŠΈ μ½˜ν…μΈ λ₯Ό ν‘œν˜„

innerHTML μ‚¬μš©μ‹œ 주의 사항

μ‚¬μ΄νŠΈμ˜ 곡격 κ²½λ‘œκ°€ λ˜μ–΄ 잠재적인 λ³΄μ•ˆ μœ„ν—˜μ΄ λ°œμƒν•  수 μžˆλ‹€.

const name = "John";
// assuming 'el' is an HTML DOM element
el.innerHTML = name; // harmless in this case

// ...

name = "<script>alert('I am John in an annoying alert!')</script>";
el.innerHTML = name; // harmless in this case

innerText 와 textContent의 차이

innerText

  • ν…μŠ€νŠΈμ˜ λ Œλ”λ§λœ λͺ¨μ–‘을 인식
  • λ…Έλ“œμ— ν¬ν•¨λœ λ³΄μ΄λŠ” ν…μŠ€νŠΈ(visible text)λ₯Ό λ°˜ν™˜
  • innerText의 μ„±λŠ₯이 훨씬 더 무겁고, λ ˆμ΄μ•„μ›ƒ 정보λ₯Ό λ°˜ν™˜ν•˜λ €λ©΄ λ ˆμ΄μ•„μ›ƒμ˜ 정보가 ν•„μš”ν•˜λ‹€.
  • HTMLElement 객체에 λŒ€ν•΄μ„œλ§Œ μ •μ˜
    => innerTextλŠ” cssκ°€ λ Œλ”λ§ 됨
    => 곡백을 μΈμ‹ν•˜μ§€ λͺ»ν•¨(visible text만 처리)

textContent

  • ν…μŠ€νŠΈμ˜ λ Œλ”λ§λœ λͺ¨μ–‘을 μΈμ‹ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 전체 ν…μŠ€νŠΈλ₯Ό λ°˜ν™˜
  • λͺ¨λ“  Node 객체에 λŒ€ν•΄ μ •μ˜λœλ‹€.
    => 곡백, 쀄 λ°”κΏˆκ³Ό 같은 μ„œμ‹μ„ μΈμ‹ν•˜μ—¬ λ§ˆν¬μ—…λ§Œ μ œμ²˜ν•˜μ—¬ λ°˜ν™˜
    => λΈŒλΌμš°μ € ν˜Έν™˜μ„±μ΄ μ’‹κ³ , ν…μŠ€νŠΈ μ»¨ν…μΈ μ˜ row 값을 λ³΄μ—¬μ€˜ νŒŒμ‹±μ΄ 빠름
<div class="cont-txt">
  <span>Hello <span style="display: none">World</span></span>
</div>
const txt = document.querySelector(".cont-txt");
console.log(txt.innerText); // Hello
console.log(txt.textContent); // Hello World

  • 더 μ •λ°€ν•˜κ²Œ λ°°μΉ˜ν•˜κΈ°
<strong class="sayHi"> λ°˜κ°‘μŠ΅λ‹ˆλ‹€. </strong>
const sayHi = document.querySelector(".sayHi");
// sayHi μš”μ†Œκ°€ μ‹œμž‘ν•˜κΈ° 전에 μš”μ†Œ 배치
sayHi.insertAdjacentHTML("beforebegin", "<span>μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ”</span>");
// sayHi μš”μ†Œκ°€ μ‹œμž‘ν•œ ν›„
sayHi.insertAdjacentHTML("afterbegin", "<span>μž¬ν˜„μž…λ‹ˆλ‹€</span>");
// sayHi μš”μ†Œκ°€ λλ‚˜κΈ° μ „
sayHi.insertAdjacentHTML("beforeend", "<span>λ©΄μ ‘μ˜€μ‹œλ©΄</span>");
// sayHi μš”μ†Œκ°€ λλ‚œ ν›„
sayHi.insertAdjacentHTML("afterend", "<span>μΉ˜ν‚¨μ‚¬λ“œλ¦΄κ²Œμš”</span>");

// μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ”μž¬ν˜„μž…λ‹ˆλ‹€ λ°˜κ°‘μŠ΅λ‹ˆλ‹€. λ©΄μ ‘μ˜€μ‹œλ©΄μΉ˜ν‚¨μ‚¬λ“œλ¦΄κ²Œμš” 
  • DOM μ•ˆμ—μ„œ λ…Έλ“œ νƒμƒ‰ν•˜κΈ°
    • parentNode : λΆ€λͺ¨ λ…Έλ“œ 탐색
    • firstChild, lastChild : μžμ‹ λ…Έλ“œ 탐색
    • hasChildNodes() : μžμ‹ λ…Έλ“œκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  Booleanκ°’ λ°˜ν™˜
    • childNodes : μžμ‹ λ…Έλ“œμ˜ μ»¬λ ‰μ…˜ λ°˜ν™˜. ν…μŠ€νŠΈ μš”μ†Œλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  μžμ‹ μš”μ†Œλ₯Ό λ°˜ν™˜
      => Return: NodeList(non-live)
    • children : μžμ‹ λ…Έλ“œμ˜ μ»¬λ ‰μ…˜μ„ λ°˜ν™˜. μžμ‹ μš”μ†Œ μ€‘μ—μ„œ Element type μš”μ†Œλ§Œ λ°˜ν™˜
      => Return: HTMLCollection(live)
    • previousSibling, nextSibling : ν˜•μ œ λ…Έλ“œλ₯Ό 탐색. text nodeλ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  ν˜•μ œ λ…Έλ“œλ₯Ό 탐색
    • previousElementSibling, nextElementSibling : ν˜•μ œ λ…Έλ“œλ₯Ό 탐색. ν˜•μ œ λ…Έλ“œ μ€‘μ—μ„œ Element type μš”μ†Œλ§Œμ„ 탐색
<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>Document</title>
  </head>
  <body>
    <!-- μ£Όμ„μž…λ‹ˆλ‹€ 주석. -->
    <article class="cont">
      <h1>μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” 이런 μ‚¬λžŒμž…λ‹ˆλ‹€.</h1>
      <p>μ§€κΈˆλΆ€ν„° μžκΈ°μ†Œκ°œ μ˜¬λ¦¬κ² μŠ΅λ‹ˆλ‹€</p>
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Deserunt incidunt
      voluptates laudantium fugit, omnis dolore itaque esse exercitationem quam
      culpa praesentium, quisquam repudiandae aut. Molestias qui quas ea iure
      officiis.
      <strong>κ°μ‚¬ν•©λ‹ˆλ‹€!</strong>
    </article>

    <script>
      const cont = document.querySelector(".cont");
      // 첫번째 μžμ‹μ„ μ°ΎμŠ΅λ‹ˆλ‹€.
      console.log(cont.firstElementChild); // <h1>μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” 이런 μ‚¬λžŒμž…λ‹ˆλ‹€.</h1>

      // λ§ˆμ§€λ§‰ μžμ‹μ„ μ°ΎμŠ΅λ‹ˆλ‹€.
      console.log(cont.lastElementChild); // strong>κ°μ‚¬ν•©λ‹ˆλ‹€!</strong>

      // λ‹€μŒ ν˜•μ œμš”μ†Œλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
      console.log(cont.nextElementSibling); // script

      // 이전 ν˜•μ œμš”μ†Œλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
      console.log(cont.previousSibling); // #text

      // λͺ¨λ“  μ§κ³„μžμ‹μ„ μ°ΎμŠ΅λ‹ˆλ‹€.
      console.log(cont.children); // HTMLCollection(3)

      // λΆ€λͺ¨ μš”μ†Œλ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
      console.log(cont.parentElement); // body
    </script>
  </body>
</html>

πŸ“Ž 이벀트 흐름

  • λΈŒλΌμš°μ € ν™”λ©΄μ—μ„œ 이벀트 λ°œμƒ
    => λΈŒλΌμš°μ €μ˜ 이벀트 λŒ€μƒ μ°ΎκΈ° μ‹œμž‘
  • 이벀트 λŒ€μƒμ„ μ°Ύμ•„κ°ˆ λ•Œ κ°€μž₯ μƒμœ„μ˜ window 객체뢀터 DOM 트리λ₯Ό 따라 λ‚΄λ €κ°„λ‹€.
    => μ΄λ•Œ λΈŒλΌμš°μ €λŠ” 쀑간에 λ§Œλ‚˜λŠ” λͺ¨λ“  캑처링 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ‹€ν–‰
    => 캑처링(capturing) 단계
  • 이벀트 λŒ€μƒμ„ μ°Ύκ³  캑처링이 λλ‚˜λ©΄ λ‹€μ‹œ DOM 트리λ₯Ό 따라 μ˜¬λΌκ°„λ‹€.
    => μ˜¬λΌκ°€λ©΄μ„œ λ§Œλ‚˜λŠ” λͺ¨λ“  버블링 이벀트 λ¦¬μŠ€ν„°λ₯Ό μ‹€ν–‰
    => 버블링(bubbling) 단계

=> μ΄λŸ¬ν•œ κ³Όμ •μ—μ„œ 이벀트 λ¦¬μŠ€ν„°κ°€ μ°¨λ‘€λ‘œ μ‹€ν–‰λ˜λŠ” 것
= 이벀트 μ „νŒŒ(event propagation)

ν‘œμ€€ DOM μ΄λ²€νŠΈμ—μ„œ μ •μ˜ν•œ 이벀트 νλ¦„μ˜ 3단계

  1. 캑처링 단계(Capture Phase) : μ΄λ²€νŠΈκ°€ ν•˜μœ„ μš”μ†Œλ‘œ μ „νŒŒλ˜λŠ” 단계
  2. 타킷 단계(Target Phase) : μ΄λ²€νŠΈκ°€ μ‹€μ œ 타깃 μš”μ†Œμ— μ „λ‹¬λ˜λŠ” 단계
  3. 버블링 단계(Bubbling Phase) : μ΄λ²€νŠΈκ°€ μƒμœ„ μš”μ†Œλ‘œ μ „νŒŒλ˜λŠ” 단계
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <article class="parent">
      <button class="btn" type="button">λ²„νŠΌ</button>
    </article>

    <script>
      const parent = document.querySelector(".parent");
      const btnFirst = document.querySelector(".btn");
      btnFirst.addEventListener("click", (event) => {
          console.log("btn capture!");
        }, true);

      window.addEventListener("click", () => {
          console.log("window capture!");
        }, true); // true : 캑처링 λ‹¨κ³„μ˜ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

      document.addEventListener("click", () => {
          console.log("document capture!");
        }, true);

      parent.addEventListener("click", () => {
          console.log("parent capture!");
        }, true);

      btnFirst.addEventListener("click", (event) => {
        console.log("btn bubble!");
      }); // true 값이 μ—†μœΌλ―€λ‘œ 버블링 μ΄λ²€νŠΈκ°€ μΌμ–΄λ‚œλ‹€

      parent.addEventListener("click", () => {
        console.log("parent bubble!");
      });

      document.addEventListener("click", () => {
        console.log("document bubble!");
      });

      window.addEventListener("click", () => {
        console.log("window bubble!");
      });
    </script>
  </body>
</html>

Event 객체

  • 이벀트 κ°μ²΄λŠ” 이벀트λ₯Ό λ°œμƒμ‹œν‚¨ μš”μ†Œμ™€ λ°œμƒν•œ μ΄λ²€νŠΈμ— λŒ€ν•œ μœ μš©ν•œ 정보λ₯Ό 제곡
    => μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ 이벀트 κ°μ²΄λŠ” λ™μ μœΌλ‘œ 생성
    => 이벀트λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” 이벀트 ν•Έλ“€λŸ¬λ₯Ό 인자둜 전달

이벀트 target, currentTarget

  • event.target : μ΄λ²€νŠΈκ°€ λ°œμƒν•œ κ°€μž₯ μ•ˆμͺ½μ˜ μš”μ†Œ
    =>μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μ§„μ›μ§€μ˜ 정보가 λ‹΄κ²¨μžˆλ‹€.
    => 이 속성을 톡해 이벀트 λ¦¬μŠ€λ„ˆκ°€ μ—†λŠ” μš”μ†Œμ˜ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œλ„ ν•΄λ‹Ή μš”μ†Œμ— μ ‘κ·Ό κ°€λŠ₯
  • event.currentTarget : 이벀트λ₯Ό ν•Έλ“€λ§ν•˜λŠ” ν˜„μž¬ μš”μ†Œ(ν•Έλ“€λŸ¬κ°€ μ‹€μ œ ν• λ‹Ήλœ μš”μ†Œ)
    => 이벀트 λ¦¬μŠ€λ„ˆκ°€ μ—°κ²°λœ μš”μ†Œκ°€ μ°Έμ‘°λ˜μ–΄ μžˆλ‹€.
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button class="here">
      <span>target</span>
    </button>

    <script>
      const here = document.querySelector(".here");
        here.addEventListener("click", function (e) {
        console.log(e.target);
        console.log(e.currentTarget);
      });
    </script>
  </body>
</html>

μ°Έκ³ 
event target과 currentTarget의 차이점
버블링과 캑처링 - λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ νŠœν† λ¦¬μ–Ό

πŸ“Ž 이벀트 μœ„μž„(Event Delegation)

  • 캑처링과 버블링을 ν™œμš©ν•˜μ—¬ 이벀트 μœ„μž„μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • 이벀트 μœ„μž„μ€ λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ μ—¬λŸ¬ μš”μ†Œλ₯Ό 닀뀄야할 λ•Œ μ‚¬μš©
    => 이벀트 μœ„μž„μ„ μ‚¬μš©ν•˜λ©΄ μš”μ†Œλ§ˆλ‹€ ν•Έλ“€λŸ¬λ₯Ό ν• λ‹Ήν•˜μ§€ μ•Šκ³ , μš”μ†Œμ˜ 곡톡 쑰상에 이벀트 ν•Έλ“€λŸ¬λ₯Ό ν•˜λ‚˜λ§Œ 할당해도 μ—¬λŸ¬ μš”μ†Œλ₯Ό ν•œκΊΌλ²ˆμ— λ‹€λ£° 수 μžˆλ‹€.
  • 이벀트 μœ„μž„μ„ μ‚¬μš©ν•˜λ €λ©΄ μ΄λ²€νŠΈκ°€ λ°˜λ“œμ‹œ 버블링 λ˜μ–΄μ•Ό ν•œλ‹€.
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>이벀트 μœ„μž„</title>
    <style></style>
  </head>
  <body>
    <article class="parent">
      <ol>
        <li><button class="btn-first" type="button">λ²„νŠΌ1</button></li>
        <li><button type="button">λ²„νŠΌ2</button></li>
        <li><button type="button">λ²„νŠΌ3</button></li>
      </ol>
    </article>

    <script>
      // 이벀트 λ¦¬μŠ€λ„ˆλŠ” λΆ€λͺ¨μ— λ‹¬μ•„λ†¨μ§€λ§Œ
      // μžμ‹μ—κ²Œλ„ μ΄λ²€νŠΈκ°€ 싀행될 수 있게 함
      const parent = document.querySelector(".parent");
      parent.addEventListener("click", function (event) {
        console.log(event.target);
        if (event.target.nodeName === "BUTTON") {
          event.target.innerText = "λ²„νŠΌ4";
        }
      });
    </script>
  </body>
</html>

이벀트의 this

  • 이벀트 λ¦¬μŠ€λ„ˆ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œμ˜ this 값은 μ΄λ²€νŠΈκ°€ μ—°κ²°λœ λ…Έλ“œλ₯Ό μ°Έμ‘°ν•œλ‹€.
    => μ΄λ²€νŠΈκ°€ μ—°κ²°λœ μš”μ†Œλ₯Ό 바라본닀.
    => event.currentTarget μ†μ„±μ˜ μ°Έμ‘° κ°’κ³Ό μœ μ‚¬ν•˜λ‹€.
  • λ§Œμ•½ 이벀트 λ¦¬μŠ€λ„ˆ ν•¨μˆ˜λ₯Ό ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μ“΄λ‹€λ©΄ thisκ°€ κ°€λ¦¬ν‚€λŠ” λŒ€μƒμ΄ 달라진닀.
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <article class="parent">
      <ol>
        <li><button class="btn-first" type="button">λ²„νŠΌ1</button></li>
        <li><button type="button">λ²„νŠΌ2</button></li>
        <li><button type="button">λ²„νŠΌ3</button></li>
      </ol>
    </article>

    <script>
      const parent = document.querySelector(".parent");
      parent.addEventListener("click", function (event) {
        console.log(this);
        console.log(event);
        // console.log(event)둜 currentTarget 확인 μ‹œ null κ°’μ΄μ§€λ§Œ
        // console.log(event.currentTarget)λ₯Ό 확인해보면 잘 λ‚˜μ˜¨λ‹€
        console.log(event.currentTarget);
      });

      // ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό 가리킨닀.
      parent.addEventListener("click", () => {
        console.log(this); // window
      });
    </script>
  </body>
</html>

πŸ“Ž TDD(Test Driven Development)

  • ν…ŒμŠ€νŠΈ 주도 개발
    => ν…ŒμŠ€νŠΈλ₯Ό ν†΅ν•œ κΈ°λŠ₯의 κ΅¬ν˜„
    => 이번 μ‹œκ°„μ— Unit Test(λ‹¨μœ„ ν…ŒμŠ€νŠΈ) ν•™μŠ΅!

Unit Test(λ‹¨μœ„ ν…ŒμŠ€νŠΈ)

  • νŠΉμ • μ‘°κ±΄μ—μ„œ ν•¨μˆ˜(Unit)κ°€ μ–΄λ–»κ²Œ μž‘λ™ν•΄μ•Όν•˜λŠ”μ§€ μ •μ˜ν•˜κ³ , μ •μ˜λŒ€λ‘œ ν•¨μˆ˜κ°€ 잘 μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 방법둠

Jasmine

  • TDD 라이브러리
  • Jasmine - μ΅œμ‹ λ²„μ „ λ‹€μš΄λ°›κΈ°
  • ν™˜κ²½ ꡬ성은 standalone 방식을 이용
    • standalone 방식 : λͺ¨λ“  자슀민 μ½”λ“œλ₯Ό λΈŒλΌμš°μ €μ— μ˜¬λ €μ„œ μ‹€ν–‰ν•˜λŠ” 방법
      => μ‹€ν–‰ κ²°κ³Όλ₯Ό κ°„λ‹¨ν•˜κ²Œ 확인할 수 μžˆλ‹€
      => μ‹€λ¬΄μ—μ„œλŠ” 거의 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • karma λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν•¨κ²Œ μ„€μΉ˜ν•˜λŠ” 방식(μžλ™ν™”) : μ‹€λ¬΄μ—μ„œ 주둜 μ‚¬μš©ν•˜λŠ” 방식
  • κ°„λ‹¨ν•œ ν•¨μˆ˜ ν…ŒμŠ€νŠΈ 해보기
  • 객체지ν–₯적 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ TDD

TDD의 단계

  • TDDμ—μ„œλŠ” μ½”λ”©ν•  λ•Œ κΈ°λŠ₯을 λ°”λ‘œ κ°œλ°œν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ¨Όμ € μž‘μ„±
    => ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 단계λ₯Ό κ±°μΉœλ‹€.
    • 적색(red) 단계 : μ„±κ³΅ν•˜κΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈμ— μ‹€νŒ¨ν•˜λŠ” 단계
    • 녹색(green) 단계 : ν…ŒμŠ€νŠΈμ— μ„±κ³΅ν•˜λŠ” 단계
    • λ¦¬νŒ©ν„°(refactor) 단계 : ν…ŒμŠ€νŠΈμ— μ„±κ³΅ν•œ μ½”λ“œλ₯Ό 기반으둜 μ½”λ“œμ˜ ν’ˆμ§ˆμ„ λ†’μ΄λŠ” 단계
      => λ¦¬νŒ©ν† λ§

=> 이 세가지 λ‹¨κ³„μ˜ λŠμž„μ—†λŠ” 반볡


마무리

  • μˆ˜μ—… 쀑간에 고ꡬ마 λ¨Ήλ‹€κ°€ λ“€μΌ°λ‹€ ν—€ν—€
  • TDD에 λŒ€ν•΄ λͺ°λžλŠ”데 κ°„λ‹¨ν•˜κ²Œ λ§Œλ“€μ–΄μ„œ κ·ΈλŸ°μ§€ μ‹ κΈ°ν•˜κ³  μž¬λ―Έμžˆμ—ˆλ‹€μ•„
  • λ‚΄ 생각엔 멋사 ν”„λ‘ νŠΈμ—”λ“œ 슀쿨 1κΈ° 뢄듀은 λ‹€λ“€ λ“œλ¦½λ ₯이 λŒ€λ‹¨ν•˜λ‹€
    => 쀌 μΌœλ†“κ³  책상 λ•…λ•…μΉ˜λ©΄μ„œ μ›ƒμ–΄μž¬κΌˆλŠ”λ° 말이죠. ν—ˆν—ˆ

1개의 λŒ“κΈ€

comment-user-thumbnail
2021λ…„ 12μ›” 17일

μš°μ™€ TDD λž€ μ΄λŸ°κ±°μ˜€κ΅°μ—¬!!

λ‹΅κΈ€ 달기