Coding Archive

๋…ธ๋งˆ๋“œ ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ(5) ๋ณธ๋ฌธ

๐Ÿ–ฅ๏ธ Clone Coding

๋…ธ๋งˆ๋“œ ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ(5)

์ฝ”๋“ฑ์–ด 2022. 6. 9. 17:22

#4 LOGIN

 

 

0. Input Values

๋ชจ๋“  ๊ฒƒ์€ HTML์—์„œ ์‹œ์ž‘๋˜์–ด์•ผ ํ•œ๋‹ค. HTML์—์„œ ์ž‘์„ฑํ•˜๊ณ  JS๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

 

 

  • ๋จผ์ €, HTML ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

1. ์œ ์ €๊ฐ€ ์ด๋ฆ„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก input ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

์•ˆ์— ํ…์ŠคํŠธ๋ฅผ ๋„ฃ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, type="text"ํ•ด์ฃผ๊ณ , ์•ˆ์— ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•  ๋ง์€ placeholder ์•ˆ์— ์จ์ค€๋‹ค.

 

2. ์˜†์— Log In ๋ฒ„ํŠผ์„ ๋งŒ๋“ ๋‹ค.

 

3. divํƒœ๊ทธ๋กœ ์œ„์˜ ๊ฒƒ๋“ค ๋ฌถ์–ด์ฃผ๊ณ , id="login-form"์„ ์ง€์ •ํ•ด์ค€๋‹ค.

 

 

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ทธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

1. html element๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜ ์•ˆ์— ๋„ฃ๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ

const loginInput = document.querySelector("#login-form input");
const loginButton = document.querySelector("#login-form button");

querySelector๋กœ idํƒœ๊ทธ๋ฅผ ์“ธ๋•Œ๋Š” #๋ฅผ ์จ์•ผ ํ•˜์ง€๋งŒ getElementById๋กœ idํƒœ๊ทธ๋ฅผ ์“ธ ๋• #๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

 

2. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, onLoginBtnClickํ•จ์ˆ˜ ์‹คํ–‰

loginButton.addEventListener("click, onLoginBtnClick);

 

3. ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

function onLoginBtnClick(){
console.log(loginInput.value);  // loginInput์˜ value๋ฅผ ๋ณด์—ฌ์คŒ.
}

 

 

 

1. Form Submission

JavaScript์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹  ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด HTML์˜ ๊ธฐ๋ณธ ์†์„ฑ์„ ์ตœ๋Œ€ํ•œ ์ด์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ž…๋ ฅํ•ด์•ผ๋งŒ ํ•˜๊ณ , ๊ธ€์ž ์ˆ˜๊ฐ€ 15๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๋„๋ก ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค๋ฉด?

input ํƒœ๊ทธ์˜ ๋‹ค์–‘ํ•œ ์†์„ฑ๋“ค์„ ์ด์šฉ, input์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” input์ด form ์•ˆ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

(form์•ˆ์— input์ด ์žˆ์–ด์•ผ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™๋œ๋‹ค.)

<form id="login-form">
  <input
    required
    maxlength="15"
    type="text"
    placeholder="What is your name?"
  />
  <input type="submit" value="Log In" />
 </form>

 

๋ฌธ์ œ!

๋‚˜๋Š” ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์ƒˆ๋กœ๊ณ ์นจ ํ•˜์ง€ ์•Š๊ณ , user ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์€๋ฐ ์ž๊พธ ์ƒˆ๋กœ๊ณ ์นจ ๋œ๋‹ค.

form์ด submit ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. input ์•ˆ์— ์žˆ๋Š” button์„ ๋ˆ„๋ฅด๋ฉด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ form์ด submit ๋œ๋‹ค.

 

 

 

2. Events

form์„ submit ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๋„๋ก ๋˜์–ด์žˆ๋‹ค. (← ์ด๊ฑด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.)

preventDefault() ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค!

 

์ด preventDefault ํ•จ์ˆ˜๋Š” EventListener ํ•จ์ˆ˜์˜ '์ฒซ ๋ฒˆ์งธ argument' ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์ฒซ arument๋Š” ์ง€๊ธˆ ๋ง‰ ๋ฒŒ์–ด์ง„ event๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. event ์ •๋ณด๋ฅผ ๋‹ด๋Š” object์ด๋‹ค.

 

JS๋Š” (๊ธฐ๋ณธ์ ์œผ๋กœ) argument๋ฅผ ๋‹ด์•„์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด argument๊ฐ€ ๊ธฐ๋ณธ ์ •๋ณด๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

ex) ๋ˆ„๊ฐ€ submit์ฃผ์ฒด์ธ์ง€, ๋ช‡ ์‹œ์— submit์„ ํ–ˆ๋Š”์ง€ ๋“ฑ๋“ฑ console์— ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

function onLoginSubmit(event) {
event.preventDefault();  // ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์„ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๊ธฐ(event object๋Š” preventDefaultํ•จ์ˆ˜๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ–๊ณ  ์žˆ์Œ)
console.log(event);
}

loginForm.addEventListener("submit", onLoginSubmit);  // submit ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, onLoginSubmitํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ์˜๋ฏธ

 

 

 

 

3. Events part Two

addEventListener ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ์ง์ ‘ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰์‹œ์ผœ์ฃผ๊ณ , ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด๋‹น event์— ๋Œ€ํ•œ ์ •๋ณด ์ฆ‰, object๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

addEventListener์˜ ํ•จ์ˆ˜์—์„œ object์— ๋Œ€ํ•œ ์ž๋ฆฌ๋งŒ ํ• ๋‹นํ•ด์ฃผ๋ฉด, ํ•ด๋‹น  event๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ ์ •๋ณด๋“ค์— ๋Œ€ํ•œ object๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!

์ด๋•Œ ํ•ด๋‹น  event๊ฐ€ ๊ฐ€์ง„ ๊ธฐ๋ณธ Default๊ฐ’์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ํ•˜๊ฒŒ ์œ„ํ•ด์„  preventDefault๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค!

 

 

 

4. Getting Username

h1์˜ ํ…์ŠคํŠธ๋Š” ์ˆจ๊ธฐ๊ณ  ์‹ถ์ง€ ์•Š์œผ๋‹ˆ, loginForm์— hidden์„ ๋”ํ–ˆ์œผ๋‹ˆ h1์—๋งŒ remove๋ฅผ ํ•ด์ค€๋‹ค.

loginForm.classList.remove(HIDDEN_CLASSNAME);

 

hidden์„ ๋‘ ๋ฒˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋‹ˆ, const HIDDEN_CLASSNAME = “hidden”์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

const HIDDEN_CLASSNAME = "hidden";โ€‹

 

์ผ๋ฐ˜์ ์œผ๋กœ string๋งŒ ํฌํ•จ๋œ ๋ณ€์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•˜๊ณ , string์„ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

"Hello " + UserName === `Hello ${UserName}`

"Hello " + username๋ฅผ ``์ด๋ผ๋Š” ๋ฐฑํ‹ฑ ๊ธฐํ˜ธ๋ฅผ ์ด์šฉํ•ด `Hello ${username}` ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค!

 

 

 

5. Saving Username

localStorage ๋ธŒ๋ผ์šฐ์ €์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•œ ํ›„ ๋‚˜์ค‘์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

localStorage.setItem("username", username);

"username" => ์ €์žฅ๋  ์•„์ดํ…œ์˜ ์ด๋ฆ„ (DB box) → key

username => ๋ณ€์ˆ˜ → value

 

 

localStorge์—์„œ value ์ €์žฅ

lcoalStorage.setItem("username", "nico");

 

 

localStorge์—์„œ value ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

lcoalStorage.getItem("username");

 

localStorge์—์„œ value ์ง€์šฐ๊ธฐ

 

lcoalStorage.removeItem("username");

 

 

 

 

6. Loading Username

๋ณธ์ธ์ด ์ƒ์„ฑํ•œ string๋“ค์€ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ๋Œ€๋ฌธ์ž ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•ด๋†“๋Š” ๊ฒŒ ์ข‹๋‹ค.

๋งŒ์•ฝ ์ŠคํŽ ๋ง์ด ํ‹€๋ ธ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ(์–ด๋””๊ฐ€ ํ‹€๋ ธ๋Š”์ง€ ๋งํ•ด์ฃผ์ง€ ์•Š์Œ),

๋ณ€์ˆ˜์˜ ์ŠคํŽ ๋ง์ด ํ‹€๋ ธ๋‹ค๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ธฐ๋ณธ ๋กœ์ง

const savedUsername = localStorage.getItem("username");

if (savedUsername === null) {
// show the form
} else {
// show the greetings
}

 

 

 

7. Super Recap

const loginForm = document.querySelector("#login-form");
const loginInput = document.querySelector("#login-form input");
const greeting = document.querySelector("#greeting");

const HIDDEN_CLASSNAME = "hidden";
const USERNAME_KEY = "username";

function onLoginSumit(event) {
  event.preventDefault();
  //4. event๊ฐ€ ์›๋ž˜ ํ•˜๋Š” ํ–‰๋™์„ ๋ฉˆ์ถค (์ƒˆ๋กœ๊ณ ์นจ)
  loginForm.classList.add(HIDDEN_CLASSNAME);
  //5. loginform์„ ๋‹ค์‹œ ์ˆจ๊น€
  const username = loginInput.value;
  //6. loginInput.value๋ฅผ username์ด๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ์ €์žฅ
  localStorage.setItem(USERNAME_KEY, username);
  //7. username๊ฐ’์„ username์ด๋ผ๋Š” key์™€ ํ•จ๊ป˜ local storage์— ์ €์žฅ
  paintGreeting(username);
  //8. paintGreetingํ•จ์ˆ˜ ํ˜ธ์ถœ
}

function paintGreeting(username) {
/** paintGreetingํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ๋ฐ›๊ณ ์žˆ๋Š”๋ฐ, 
 ์ง€๊ธˆ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์œ ์ €๊ฐ€ form์•ˆ์— ์žˆ๋Š” input์— ์ž…๋ ฅํ•œ username์ด๋ผ๋Š” ์ธ์ž๋ฅผ ๋ฐ›๊ณ  ์žˆ์Œ**/
  greeting.innerText = "Hello " + username; //`Hello ${username}`
  //9. ๋น„์–ด์žˆ๋Š” h1์š”์†Œ ์•ˆ์— innerText๋ฅผ ํ•จ
  greeting.classList.remove(HIDDEN_CLASSNAME);
  //10. ๊ทธ ๋‹ค์Œ์— h1 ์š”์†Œ๋กœ๋ถ€ํ„ฐ hidden์ด๋ผ๋Š” ํด๋ž˜์Šค ๋ช…์„ ์ œ๊ฑฐ
}

const savedUsername = localStorage.getItem(USERNAME_KEY); 
//1. localStorage์—์„œ username key๋ฅผ ์ฐพ์œผ๋ ค ํ•จ

if (savedUsername === null) {
  loginForm.classList.remove(HIDDEN_CLASSNAME);
  //2. savedUserName๊ฐ€ null์ด๋ผ๋ฉด loginForm์˜ hidden class๋ฅผ ์ œ๊ฑฐ
  loginForm.addEventListener("submit", onLoginSumit);
  /**3. ๊ทธ ํ›„ loginform์— addEventListener๋ฅผ ๋”ํ•˜๊ณ , submit์„ ๊ธฐ๋‹ค๋ฆผ
  submit event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด onLoginSubmitํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰**/
} else {  // 12. ์ฐฝ์„ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๋”๋ผ๋„ USERNAME_KEY๊ฐ€ ์ง€์›Œ์ง€์ง€ ์•Š๊ณ ,์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์กฐ๊ฑด๋ฌธ์€ false๊ฐ€ ๋จ
  paintGreeting(savedUsername);
  /** 13. paintGreetingํ•จ์ˆ˜๋กœ ์งํ–‰
  ์ด ๊ฒฝ์šฐ์—๋Š” paintGreeting ํ•จ์ˆ˜๊ฐ€ local storage์— ์ €์žฅ๋œ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›๊ฒŒ ๋˜๊ณ ,
  ์ด ์ „์— ํ–ˆ๋˜ ์ž‘์—…์ด ๋ฐ˜๋ณต๋จ**/
}

์‚ฌ์‹ค  paintGreetings ํ•จ์ˆ˜๋Š” ๋”ฐ๋กœ ์ธ์ž๋ฅผ ๋ฐ›์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. (= ์•„๋ฌด๊ฒƒ๋„ ๋ณด๋‚ด์ง€ ์•Š์•„๋„ ๋œ๋‹ค. )

์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” localStorage์— ์œ ์ € ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฑธ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
=>

localStorage์— ๋ญ”๊ฐ€๋ฅผ ์ €์žฅํ•˜๋ฉด paintGreetings๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ˆœ๊ฐ„์—, ๊ทธ ์œ ์ € ์ •๋ณด๋Š” ์ด๋ฏธ localStorage์— ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

+) Q

paintGreetings(savedUsername)์˜ paintGreetings์— ์ธ์ž ๊ฐ’์ด username๊ณผ ๋‹ฌ๋ผ๋„ ์‹คํ–‰์ด ๋˜๋Š” ๊ฑด์ง€?

function paintGreetings ์•ˆ์—์„œ๋งŒ ์ผ์น˜ํ•˜๋ฉด ์ธ์ž ๊ฐ’์€ ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋Ÿฌ๋„ ์ƒ๊ด€์—†์ด ์‹คํ–‰๋œ๋‹ค.
(๊ฐ•์˜ ๊ธฐ์ค€) function์—์„œ ์ธ์ž ๊ฐ’์œผ๋กœ username๋ผ๋Š” ์ด๋ฆ„์„ ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— function ์•ˆ์—์„œ๋Š” username์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์“ฐ๋ฉด ๋˜๊ณ , function ๋ฐ–์—์„œ๋Š” paintGreetings(savedUsername)๋กœ ๋ถ€๋ฅด๋“  ์ƒ๊ด€์—†๋‹ค.
์„œ๋กœ ๋‹ค๋ฅธ ์ธ์ž ๊ฐ’ ์ด๋ฆ„์œผ๋กœ ๋ถˆ๋Ÿฌ๋„ ๊ณตํ†ต๋ถ€๋ถ„์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด function์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

Comments