(41)

[JavaScript] 쿠키(Cookie) 사용하기

쿠키에 대한 자세한 설명은 아래에 https://mag1c.tistory.com/187 쿠키와 세션 (Cookie & Session) HTTP 프로토콜의 특징 비연결성 ( Connectionless ) 클라이언트가 서버에 요청(Request)할 때, 그에 대한 응답(Response)을 한 후, 연결을 끊는다. 비상태성 ( Stateless ) 클라이언트의 상태 정보를 가지지 않는 mag1c.tistory.com 자바스크립트에서의 Cookie 사용하기 document.cookie 프로퍼티를 이용하여 생성, 삭제 및 조회가 가능하다. document.cookie는 name=value 쌍으로 구성되어 있고, 각 쌍은 ; 로 구분한다. 쌍 하나는 하나의 독립된 쿠키를 나타내며, ; 을 기준으로 document...

[JavaScript] async await

Promise사용 시 불편한 점들 1. then()을 연속적으로 호출하여 문제 발생 시 혼란을 겪을 수 있다. 2. 복잡한 구조의 비동기처리 코드 작성 시 코드의 가독성이 저하된다. 3. 동기코드와 비동기코드가 섞여있을 때 예외처리 하기가 난해하다. async / await Promise의 불편한 점들을 해결하기 위해 ES7에서 async/await가 추가되었다. async function f() { return 1; } f().then(alert); // 1 async는 function 앞에 위치하며, async가 붙은 함수는 항상 Promise를 반환한다. Promise객체를 생성하지 않더라도 Promise 객체가 리턴되는 것에 주의하자. await는 async함수 내부에서만 동작한다. async f..

[JavaScript] Promise

프로미스(Promise) 비동기 처리를 위해 사용되는 객체이며, 콜백 패턴의 한계를 보완하기 위해 사용한다. 장점 비동기 처리 시점을 명확하게 표현 가능 연속된 비동기 처리 작업을 수행하기 편하며, 작업 상태를 쉽게 확인 가능 코드의 유지보수성이 증가. const promise = () => new Promise((resolve, reject) => { let sum = 1 + 1 if(sum == 2) { resolve('correct') } else { reject('incorrect') } }) promise().then((message) => { console.log(message) }).catch((message) => { console.log(message) }) resolve와 reject ..

[JavaScript] 콜백 함수

콜백 함수 ( Callback Function ) 함수 안에 실행하는 또 다른 함수이며 파라미터로 함수를 전달하는 함수이다. 또한 함수 이름없이 익명으로 전달이 가능한 함수를 말한다. function introduce (lastName, firstName, callback) { var fullName = lastName + firstName; callback(fullName); } function hello (name) { console.log("제 이름은 " + name + "입니다"); } function bye (name) { console.log("지금까지 " + name + "이었습니다."); } introduce("나", "지만", hello); //제 이름은 나지만입니다 introduce("..

[JavaScript] ajax 정리 (JSON, XMLHttpRequest, 비동기 전송방식)

AJAX ( Asynchronous JavaScript And XML ) 자바스크립트를 이용하여 비동기적으로 서버와 브라우저가 데이터를 교환할 수 있는 통신방식이다. 서버와 통신하기 위해 XMLHttpRequest 객체를 사용한다. JSON, XML, HTML, 일반 텍스트 형식 등을 포함한 다양한 포맷을 주고 받을 수 있다. 비동기 전송방식(비동기식 처리모델) 병렬적인 테스크를 수행한다. 화면이 종료되지 않더라도 대기하지 않고 다음 작업을 수행한다. (이벤트핸들러, Timer, Ajax) 사용자의 이벤트가 있으면 전체 페이지의 새로고침이 아닌 일부분만 갱신할 수 있게 해준다. XMLHttpRequest ( XHR ) 서버와 상호작용할 때 사용하며, XHR을 사용하면 페이지의 새로고침 없이도 URL에서 ..

[JavaScript] 화살표 함수(Arrow Function)

화살표 함수 사용하기 화살표 함수표현은 함수를 보다 간략하게 표현하기 위한 표현 방식이다. let sum = (a, b) => a + b; alert( sum(1, 2) ); // 3 //위의 화살표 함수와 동일한 표현이다. let sum = function(a, b) { return a + b; }; (a,b) => a+b는 실행되는 순간 a+b를 평가하고 그 결과를 반환한다. 인수가 한 개만 존재한다면 괄호를 생략할 수 있다. let mul = a => a * 2; 인수가 존재하지 않을 때는 괄호가 있어야하며, 괄호를 비워놓으면 된다. let void = () => console.log("텅텅 빔"); 화살표 함수를 사용하면 아래와 같이 동적인 함수 생성이 가능하다. let age = prompt("..

[JavaScript] 정규표현식(RegExp)

정규표현식(RegExp) 정규표현식이란 특정 문자 조합을 찾기 위한 패턴이며, 이 패턴을 이용해 텍스트를 판별할 때 사용한다. 사용하는 이유 회원 가입 등 사용자가 입력해야 하는 상황에 사용자가 어떤 값을 입력 해야할 지 예측할 수 없을 때 하나하나 조건문, 반복문을 사용하면 너무 많은 코드를 사용하게 된다. 그 때 정규 표현식을 사용한다면 짧은 코드로 수월하게 처리할 수 있다. 생성방법 생성자 함수 생성방식 바뀔 수 있는 패턴이나, 사용자 입력 등 외부 출처에서 가져오는 패턴의 경우 사용하는 것이 좋다. new RegExp('[a-z]', 'gi'); 생성자 함수를 사용할 경우 보통의 문자열 이스케이프 규칙을 준수해야 한다. 이스케이프 규칙 특수 문자를 문자열에 사용할 때 앞에 역빗금(\)을 붙인다. ..

[JavaScript] 자바스크립트의 배열 Array

배열(Array) 자바스크립트에서 배열은 이름과 인덱스로 참조되는 정렬된 값의 집합으로 정의된다. 배열을 구성하는 각각의 값을 배열 요소element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 한다. 배열 생성 배열 요소의 타입이 고정되어 있지 않다. 배열 요소의 인덱스가 연속적이지 않아도 되며, 따라서 특정 배열 요소가 비어 있을 수도 있다. Array객체로 다룬다. const arr1 = new Array(); arr1[1] = 10; arr1[3] = '이십'; console.log(arr1); //다차원배열 let arr = [[0,1], [2,3], [4,5], [6,7]] 자바스크립트는 내장된 데이터 타입으로 다차원 배열을 제공하지 않는다. 자바스크립트에서는 모든 것..

[JavaScript] 문서 객체 모델 - DOM 조작하기

문서 객체 모델(DOM) HTML에 접근하기 위한 모델(인터페이스)이며, HTML을 컨트롤하기 위한 방법 그 자체를 기술한 것이다. 문서 내의 모든 요소를 정의하고, 각각의 요소에 접근하는 방법을 제공한다. 우리는 이 DOM으로 모든 HTML요소 및 속성, CSS스타일을 변경할 수 있으며, 이벤트를 추가하고, 이벤트에 반응할 수 있다. DOM은 W3C의 표준 객체 모델이다. DOM에 접근해 보자 문서가 로드될 때(모든 DOM을 사용할 수 있게 되는 때) 실행되는 함수를 정의하였다. 새로운 H1 element를 생성하고, element에 text를 추가하며, H1을 이 문서의 트리에 추가한다. 브라우저는 HTML문서를 로드한 후 해당 문서에 대한 모델을 메모리에 생성한다. 이 때 생성된 객체들의 구조를 D..

[JavaScript] 쿠키(Cookie) 사용하기

Tech/JavaScript & TypeScript 2023. 1. 22. 16:43
728x90

쿠키에 대한 자세한 설명은 아래에

https://mag1c.tistory.com/187
 

쿠키와 세션 (Cookie & Session)

HTTP 프로토콜의 특징 비연결성 ( Connectionless ) 클라이언트가 서버에 요청(Request)할 때, 그에 대한 응답(Response)을 한 후, 연결을 끊는다. 비상태성 ( Stateless ) 클라이언트의 상태 정보를 가지지 않는

mag1c.tistory.com


 

 

 

자바스크립트에서의 Cookie 사용하기


document.cookie 프로퍼티를 이용하여 생성, 삭제 및 조회가 가능하다.

 

document.cookie는 name=value 쌍으로 구성되어 있고, 각 쌍은  ; 로 구분한다.

쌍 하나는 하나의 독립된 쿠키를 나타내며,  ; 을 기준으로 document.cookie의 값을 분리하면 원하는 쿠키를 찾을 수 있다.

document.cookie에 값을 할당하면, 브라우저는 이 값을 받아 해당 쿠키를 갱신하며, 다른 쿠키의 값은 변경되지 않는다.

//Name이 'user'인 쿠키의 Value만 갱신
document.cookie = "user=John";

쿠키의 이름과 값엔 제약이 없어 모든 글자가 허용된다.

형식의 유효성을 일관성있게 유지하기 위해 내장함수 encodeURIComponent를 사용하여 이스케이프 처리를 해야 한다.

let name = "name";
let value = "John Smith";

//인코딩 처리 -> my%20name=John%20Smith
document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
쿠키의 한계
1. encodeURIComponent로 인코딩한 후의 name=value 쌍이 4KB를 넘으면 쿠키에 저장할 수 없다.
2. 도메인 하나당 저장할 수 있는 쿠키의 수는 20여개로 한정되어 있다. 개수는 브라우저에 따라 차이가 있다.

 

 

 

쿠키의 옵션


쿠키에는 여러 옵션들이 존재한다.

 

 

개발자도구(F12) Application >> Cookies에서 쿠키를 확인할 수 있다.

 

1. Name & Value

데이터를 저장하고 읽는 데 사용하는 옵션으로 반드시 지정해주어야 한다.

document.cookie = "user=John"

 

2. Path

옵션을 입력하지 않으면 현재 도메인의 경로로 자동 입력된다.

특별한 경우가 아니라면 path=/와 같이 루트로 설정해 웹사이트의 모든 페이지에서 쿠키에 접근할 수 있도록 해야한다.

예를들어, path=/admin으로 설정한 쿠키는 /admin과 그 하위 경로에는 접근 가능하지만
/home과 같은 다른 경로에서는 사용할 수 없다.
document.cookie = "user=John; path=/"

 

3. Domain

쿠키에 접근 가능한 domain을 지정한다.

옵션을 입력하지 않으면 현재 domain의 경로로 자동 입력된다.

domain에 루트도메인을 명시적으로 설정하여 서브 도메인에서도 메인 도메인에서 생성한 쿠키 정보를 사용할 수 있다.

document.cookie = "user=John; domain=site.com"

 

4. Expires / Max-age

expires(유효 일자), max-age(만료 일자) 옵션을 지정하여, 쿠키의 만료 기간을 설정할 수 있다.

expires는 GMT 혹은 UTC포맷으로 설정해야한다.

세션 쿠키(Session Cookie)
expires, max-age 옵션이 지정되어있지 않아, 브라우저가 닫힐 때 삭제되는 쿠키.

max-age는 expires의 대안으로, 쿠키 만료기간을 설정할 수 있게 해준다.

현재부터 설정하고자 하는 만료일시까지의 시간을 로 환산한 값을 설정한다.

//expires
//toUTCString() 메서드를 사용하여 UTC포맷으로 쉽게 변환이 가능하다.
let date = new Date(Date.now() + 86400e3);
date = date.toUTCString();
document.cookie = "user=John; expires=" + date;

//max-age
document.cookie = "user=John; max-age=3600";

 

5. Secure

해당 옵션을 설정 시, HTTPS로 통신하는 경우에만 쿠키가 전송된다.

// 설정한 쿠키는 HTTPS 통신시에만 접근할 수 있음
document.cookie = "user=John; secure";

 

6. HttpOnly

HttpOnly 옵션이 설정된 쿠키는 document.cookie로 쿠키 정보를 읽을 수 없다.

document.cookie = "user=John; httpOnly"

 

7. Samesite

XSRF 공격을 막기 위해 만들어진 옵션이다.

samesite 옵션을 XSRF 토큰 같은 다른 보안기법과 함께 사용하면 보안을 강화할 수 있다.

2017년 이전 버전의 브라우저에서는 samesite를 지원하지 않는다.

samesite(=strict)
사이트 외부에서 요청을 보낼 때, 해당 옵션이 있는 쿠키는 절대로 전송되지 않는다.

samesite=lax
GET방식의 작업 혹은 최상위 레벨 탐색(브라우저 주소창에서 URL변경 등)에서의 작업이 이루어질 때만 쿠키가 서버로 전송된다.
document.cookie = "user=John; samesite"

 

 

 

쿠키 함수


getCookie(name)

정규 표현식을 사용하여 가장 빠르게 접근할 수 있다.

// 주어진 이름의 쿠키를 반환하는데,
// 조건에 맞는 쿠키가 없다면 undefined를 반환합니다.
function getCookie(name) {
  let matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
  ));
  return matches ? decodeURIComponent(matches[1]) : undefined;
}

 

setCookie(name, value, options)

function setCookie(name, value, options = {}) {

  options = {
    path: '/',
    // 필요한 경우, 옵션 기본값을 설정할 수도 있습니다.
    ...options
  };

  if (options.expires instanceof Date) {
    options.expires = options.expires.toUTCString();
  }

  let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

  for (let optionKey in options) {
    updatedCookie += "; " + optionKey;
    let optionValue = options[optionKey];
    if (optionValue !== true) {
      updatedCookie += "=" + optionValue;
    }
  }

  document.cookie = updatedCookie;
}

// Example of use:
setCookie('user', 'John', {secure: true, 'max-age': 3600});

 

deleteCookie(name)

//만료 기간을 음수로 설정하여 쿠키를 삭제
function deleteCookie(name) {
  setCookie(name, "", {
    'max-age': -1
  })
}

 

 

더보기
300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] async await

Tech/JavaScript & TypeScript 2023. 1. 21. 15:19
728x90

Promise사용 시 불편한 점들


1. then()을 연속적으로 호출하여 문제 발생 시 혼란을 겪을 수 있다.

2. 복잡한 구조의 비동기처리 코드 작성 시 코드의 가독성이 저하된다.

3. 동기코드와 비동기코드가 섞여있을 때 예외처리 하기가 난해하다.

 

 

 

async / await


Promise의 불편한 점들을 해결하기 위해 ES7에서 async/await가 추가되었다.

async function f() {
  return 1;
}

f().then(alert); // 1

async는 function 앞에 위치하며, async가 붙은 함수는 항상 Promise를 반환한다.

Promise객체를 생성하지 않더라도 Promise 객체가 리턴되는 것에 주의하자.

await는 async함수 내부에서만 동작한다.

async function f() {

  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("완료!"), 1000)
  });

  let result = await promise; // 프라미스가 이행될 때까지 기다림 (*)

  alert(result); // "완료!"
}

f();

await는 Promise가 처리될 때 까지 함수 실행을 기다리게 만드는 특징이 있다.

비동기 작업의 결과값을 얻을 때 까지 대기했다가 그 결과값과 함께 실행이 재개된다.

Promise가 처리되길 기다리는 동안에 다른 일(다른 스크립트 실행 및 이벤트 처리 등)을 할 수 있기 때문에 효율적이다.

 

프라미스 체이닝을 async/await로 변경하기

아래의 프라미스체이닝 예시를 async/await를 사용해 다시 작성해보자.

fetch('/article/promise-chaining/user.json')
  .then(response => response.json())
  .then(user => fetch(`https://api.github.com/users/${user.name}`))
  .then(response => response.json())
  .then(githubUser => new Promise(function(resolve, reject) { // (*)
    let img = document.createElement('img');
    img.src = githubUser.avatar_url;
    img.className = "promise-avatar-example";
    document.body.append(img);

    setTimeout(() => {
      img.remove();
      resolve(githubUser); // (**)
    }, 3000);
  }))
  .then(githubUser => alert(`${githubUser.name}의 이미지를 성공적으로 출력하였습니다.`));

then 호출을 await로 변경하고, function앞에 async를 붙여 await를 사용할 수 있게 하면 된다.

async function showAvatar() {

  // JSON 읽기
  let response = await fetch('/article/promise-chaining/user.json');
  let user = await response.json();

  // github 사용자 정보 읽기
  let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
  let githubUser = await githubResponse.json();

  // 아바타 보여주기
  let img = document.createElement('img');
  img.src = githubUser.avatar_url;
  img.className = "promise-avatar-example";
  document.body.append(img);

  // 3초 대기
  await new Promise((resolve, reject) => setTimeout(resolve, 3000));

  img.remove();

  return githubUser;
}

showAvatar();

 

 

 

예외처리


그저 try/catch로 일관되게 예외처리를 할 수 있다.

function getTitle(){
  const response = fetch("https://jsonplaceholder.typicode.com/posts");
  return response.then(res => res.json());
}

async function exec(){
  var text;
  try {
    text = await getTitle();
    console.log(text[0].title);
  }
  catch(error){
    console.log(error);
  }
}
exec();

 

 

 

더보기
300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] Promise

Tech/JavaScript & TypeScript 2023. 1. 20. 09:23
728x90

프로미스(Promise)


비동기 처리를 위해 사용되는 객체이며, 콜백 패턴의 한계를 보완하기 위해 사용한다.

 

장점

  • 비동기 처리 시점을 명확하게 표현 가능
  • 연속된 비동기 처리 작업을 수행하기 편하며, 작업 상태를 쉽게 확인 가능
  • 코드의 유지보수성이 증가.

 

const promise = () => new Promise((resolve, reject) => {
    let sum = 1 + 1
    if(sum == 2) {
        resolve('correct')
    } else {
        reject('incorrect')
    }
})

promise().then((message) => {
    console.log(message)
}).catch((message) => {
    console.log(message)
})
resolve와 reject
resolve와 reject는 자바스크립트에서 자체 제공하는 콜백이다.

resolve(value) : 일이 성공적으로 끝난 경우 그 결과를 나타내는 value와 함께 호출
reject(error) : 에러 발생 시 에러 객체를 나타내는 error와 함께 호출
후속 처리 메서드
then
- 두 개의 콜백 함수를 파라미터로 전달받으며, 기본적으로 프로미스를 반환한다.
- 첫 번째 콜백 함수는 성공 시 실행된다.
- 두 번째 콜백 함수는 실패 시 실행된다.

catch
- 비동기 처리 혹은 then 메서드 실행 중 발생한 에러(예외)가 발생하면 호출되며, 프로미스를 반환한다.

 

 

 

프로미스의 상태


프로미스는 생성하고 종료될 때 까지 3가지의 상태를 가진다.

위에 작성했던 코드로 프로미스의 3가지 상태를 알아보자.

1. Pending(대기)

비동기 처리 로직이 완료되지 않은 상태

//생성 시 대기상태가 된다.
const promise = () => new Promise((resolve, reject)

2. Fulfiled(이행)

resolve를 실행하면, 이행 상태가 되며, 이행 시 then을 통해 결과값을 받을 수 있다.

const promise = () => new Promise((resolve, reject) => {
    let sum = 1 + 1
    if(sum == 2) {
        resolve('correct')
    } else {
        reject('incorrect')
    }
})

promise().then((message) => {
    console.log(message)
}).catch((message) => {
    console.log(message)
})

3. Rejected(실패)

Fulfiled의 코드에서, 실패 시 reject를 호출하고, 실패 시의 값을 catch로 받을 수 있다.

 

출처 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise

 

 

 

에러 처리방법


//then의 두 번째 파라미터로 error를 받아서 처리.
promise().then(message, error);

//catch를 이용한 처리를 더 권장한다.
promise().then((message) => {
    console.log(message)
}).catch((message) => {
    console.log(message)
})

 

 

 

프로미스의 연결 ( Promise Chaining )


여러개의 프로미스를 연결하여 사용 가능하다.

then()메서드를 호출하여 새로운 프로미스 객체가 반환되고, 이에 따른 후속처리를 계속 진행할 수 있다.

const url = 'https://jsonplaceholder.typicode.com/posts';    

    // 포스트 id가 1인 포스트를 검색하고 프로미스를 반환한다.
    promiseAjax('GET', `${url}/1`)
      // 포스트 id가 1인 포스트를 작성한 사용자의 아이디로 작성된 모든 포스트를 검색하고 프로미스를 반환한다.
      .then(res => promiseAjax('GET', `${url}?userId=${JSON.parse(res).userId}`))
      .then(JSON.parse)
      .then(render)
      .catch(console.error);

 

 

 

프로미스 사용 예시


프로미스를 이용하여 커지는 원을 만들어보자.

See the Pen Untitled by magic (@mag11c) on CodePen.

 

 

더보기

 

300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] 콜백 함수

Tech/JavaScript & TypeScript 2023. 1. 19. 23:30
728x90

콜백 함수 ( Callback Function )


함수 안에 실행하는 또 다른 함수이며 파라미터로 함수를 전달하는 함수이다.

또한 함수 이름없이 익명으로 전달이 가능한 함수를 말한다.

function introduce (lastName, firstName, callback) {
    var fullName = lastName + firstName;
    
    callback(fullName);
}
 
function hello (name) {
    console.log("제 이름은 " + name + "입니다");
}
 
function bye (name) {
    console.log("지금까지 " + name + "이었습니다.");
}
 
introduce("나", "지만", hello);
//제 이름은 나지만입니다
 
introduce("나", "지만", bye);
//지금까지 나지만이었습니다.

 

다른 동작을 수행하는 함수를 정의해두고 파라미터로 사용하면, 다른 동작들을 수행하는 것이 가능하다.

함수를 나눠줌으로써 코드의 재사용성이 극대화되며, 관리에 용이하다.

 

 

 

사용 원칙


1. 익명함수 사용

함수의 내부에서 실행되기 때문에 익명으로 사용이 가능하다.

let goat =["돌격", "막걸리", "아티스트"]
 
goat.forEach((i,idx)=>{
    console.log(idx + ":" + i);
});

 

2. 함수의 이름만 넘기기

함수를 콜백함수로 사용할 경우, 함수의 이름만 넘겨주면 된다.(함수를 인자로 사용할 때 ()를 붙일 필요가 없다.)

function whosYourDaddy(name, callback){
    console.log("우리 아부지 성함은 " + name +"입니다");
    callback();
}

function test(){
    console.log("니 내 아나?");
}

whosYourDaddy('김철수', test);

 

 

 

콜백 함수 주의사항 - this를 사용 시


콜백함수에서의 this는 기본적으로 값에 의한 호출(call by value)을 하기 때문에, window객체를 가리킨다.

const userData = {
    signUp: '2023-01-19 23:23:23',
    id: 'mag123c',
    name: 'what',
    setName: function(firstName, lastName) {
        this.name = firstName + ' ' + lastName;
    }
}

function getUserName(firstName, lastName, callback) {
    callback(firstName, lastName);
}
 
getUserName('Kim', 'ChulSoo', userData.setName);
 
console.log(userData.name); // Not Set
console.log(window.name); // Kim ChulSoo

call과 apply를 사용하여 this를 보호하자.

(...생략...)
function getUserName(firstName, lastName, callback) {
    callback.call(obj, firstName, lastName);
}
 
getUserName('Kim', 'ChulSoo', userData.setName, userData);
 
console.log(userData.name); // Kim ChulSoo
(...생략...)
function getUserName(firstName, lastName, callback) {
    callback.apply(obj, [firstName, lastName]);  //apply는 파라미터를 배열로 전달한다.
}
 
getUserName('Kim', 'ChulSoo', userData.setName, userData);
 
console.log(userData.name); // Kim ChulSoo

 

 

 

콜백 Hell


콜백 지옥 : 매개변수로 넘겨지는 콜백 함수가 반복되어 코드의 들여쓰기 수준이 감당하기 힘들 수준으로 깊어지는 현상

비동기 방식의 장점은 다른 요청이 중단되지 않는다는 점이다.

하지만 비동기 호출이 자주 일어나는 경우 콜백 지옥이 발생한다.

step1(function(value1){
    step2(value1, function(value2){
        step3(value2, function(value3){
            step4(value3. function(value4){
                step5(value4, function(value5){
                    step6(value5, function(value6){
                        step7(value6, function(value7){
                            step8(value7, function(value8){
                                step9(value8, function(value9){
                                    step10(value9, function(value10));
                                });
                            });
                        });
                    });
                });
            });
        });
    });
});

 

 

 

 

더보기

 

300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] ajax 정리 (JSON, XMLHttpRequest, 비동기 전송방식)

Tech/JavaScript & TypeScript 2023. 1. 19. 22:50
728x90

AJAX ( Asynchronous JavaScript And XML )


자바스크립트를 이용하여 비동기적으로 서버와 브라우저가 데이터를 교환할 수 있는 통신방식이다.

서버와 통신하기 위해 XMLHttpRequest 객체를 사용한다.

JSON, XML, HTML, 일반 텍스트 형식 등을 포함한 다양한 포맷을 주고 받을 수 있다.

비동기 전송방식(비동기식 처리모델)
병렬적인 테스크를 수행한다.
화면이 종료되지 않더라도 대기하지 않고 다음 작업을 수행한다.
(이벤트핸들러, Timer, Ajax)
 

사용자의 이벤트가 있으면 전체 페이지의 새로고침이 아닌 일부분만 갱신할 수 있게 해준다.

 

 

 

XMLHttpRequest ( XHR )


서버와 상호작용할 때 사용하며, XHR을 사용하면 페이지의 새로고침 없이도 URL에서 데이터를 가져올 수 있다.

XML 뿐만 아니라 모든 종류의 데이터를 가져올 수 있다.

const xhr = new XMLHttpRequest();   //객체 생성
xhr.open('GET', 'js/test.json');   //비동기 방식 open
xhr.setRequestHeader('Content-type', 'application/json')   //MIME-type 지정
xhr.send();    //전송
xhr.onload = function(){
    if(xhr.status===200){    //status = response 상태 코드 반환 : 200 정상응답
        console.log(xhr.responseText);
    }
}

 

XMLHttpRequest.open(method, URL(, async)

method : HTTP method (GET, POST 등)

URL : 주소 또는 파일명

async : default는 true이며 비동기 방식, false는 동기 방식

 

XMLHttpRequest.send

요청을 전송한다. 비동기 요청인 경우 send는 요청을 전송하는 즉시 반환한다.

  • GET의 경우, URL의 일부분인 쿼리스트링으로 데이터를 서버로 전송하며 send메서드 안의 파라미터값은 무시된다.
  • POST의 경우, 데이터를 Request Body에 담아 전송한다.

 

XMLHttpRequest.setRequestHeader

HTTP Request Header의 값을 설정한다.

반드시 open의 뒤에, send의 앞에 호출해야한다.

Content-type
전송할 데이터의 MIME type의 정보를 표현한다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types

1. text타입 : txet/plain, text/html, text/css, text/javascript
2. Application타입 : application/json, application/x-www-form-urlencode
3. File을 업로드하기 위한 타입 : multipart/formed-data
Accept
HTTP 클라이언트가 서버에 요청할 때 서버가 샌드 백 할 데이터의 MIME-type을 Accept로 지정할 수 있다.
Accept헤더를 설정하지 않으면 send 메서드가 호출될 때 Accept 헤더가 */*로 전송된다.
// 서버가 샌드 백 할 데이터의 MIME-type 지정: json
xhr.setRequestHeader('Accept', 'application/json');

 

XMLHttpRequest.readyState

XMLHttpRequest 객체의 현재 상태

const xhr = new XMLHttpRequest();
console.log('UNSENT', xhr.readyState); // readyState = 0

xhr.open('GET', '/api', true);
console.log('OPENED', xhr.readyState); // readyState = 1

xhr.onprogress = () => {
    console.log('LOADING', xhr.readyState); // readyState = 3
};

xhr.onload = () => {
    console.log('DONE', xhr.readyState); // readyState = 4
};

xhr.send(null);
상태 설명
0 UNSET XMLHttpRequest.open() 메서드 호출 이전
1 OPENED XMLHttpRequest.open() 메서드 호출 완료
2 HEADERS_RECEIVED XMLHttpRequest.send() 메서드 호출 완료
3 LOADING 서버 응답 중
4 DONE 서버 응답 완료
status
서버의 문서 상태를 표현한다(200 : 존재 / 404 : 미존재)

onreadystatechange
readyState의 프로퍼티 값이 변할 때 마다 자동으로 호출되는 함수 설정

 

 

 

JSON ( JavaScript Object Notation )


클라이언트와 서버 간 데이터 교환을 위한 규칙(데이터 포맷)

일반적인 텍스트 포맷보다 효과적인 데이터 구조화가 가능하다.

가볍고 가독성이 좋다.

자바스크립트의 객체 리터럴과 매우 흡사하지만 순수한 텍스트로 구성된 규칙이 있는 데이터 구조이다.

//Key Value형태이며 Key값은 반드시 큰따옴표를 사용해야 한다
{
  "name": "Lee",
  "gender": "male",
  "age": 20,
  "alive": true
}
//JSON을 가져오는 예시

//1. JSON URL을 가져온다
var requestURL = 'https://mdn.github.io/learning-area/javascript/oojs/json/superheroes.json';
//2. XHR 인스턴스 생성
var request = new XMLHttpRequest();
//3. 요청하기
request.open('GET', requestURL);
//4. 요청 보내기
request.responseType = 'json';
request.send();
//5. 서버의 응답 대기 및 처리
request.onload = function() {
  var superHeroes = request.response;
  populateHeader(superHeroes);
  showHeroes(superHeroes);
}
//위의 단계에서 JSON데이터를 자바스크립트 객체로 변환했다.

//6. 활용하기
function populateHeader(jsonObj) {
  var myH1 = document.createElement('h1');
  myH1.textContent = jsonObj['squadName'];
  header.appendChild(myH1);

  var myPara = document.createElement('p');
  myPara.textContent = 'Hometown: ' + jsonObj['homeTown'] + ' // Formed: ' + jsonObj['formed'];
  header.appendChild(myPara);
}

 

JSON.stringify()

객체를 JSON 문자열로 변환한다.

console.log(JSON.stringify({ x: 5, y: 6 }));
//'{"x":5,"y":6}"

console.log(JSON.stringify([new Number(3), new String('false'), new Boolean(false)]));
//"[3,"false",false]"

console.log(JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] }));
//"{"x":[10,null,null,null]}"

console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
//""2006-01-02T15:04:05.000Z""

 

JSON.parse()

JSON 데이터를 가진 문자열을 객체로 변환한다.

 

const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);

console.log(obj.count);
//42

console.log(obj.result);
//true

 

 

더보기

 

 

 

300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] 화살표 함수(Arrow Function)

Tech/JavaScript & TypeScript 2023. 1. 17. 23:39
728x90

화살표 함수 사용하기


화살표 함수표현은 함수를 보다 간략하게 표현하기 위한 표현 방식이다.

let sum = (a, b) => a + b;
alert( sum(1, 2) ); // 3

//위의 화살표 함수와 동일한 표현이다.
let sum = function(a, b) {
  return a + b;
};
(a,b) => a+b는 실행되는 순간 a+b를 평가하고 그 결과를 반환한다.

 

인수가 한 개만 존재한다면 괄호를 생략할 수 있다.

let mul = a => a * 2;

 

인수가 존재하지 않을 때는 괄호가 있어야하며, 괄호를 비워놓으면 된다.

let void = () => console.log("텅텅 빔");

 

화살표 함수를 사용하면 아래와 같이 동적인 함수 생성이 가능하다.

let age = prompt("19세 미만 출입금지.", 18);

let welcome = (age > 19) ?
() => alert('출입') :
() => alert("불가");

 

화살표 함수의 제한점

1. this나 super에 대한 바인딩이 없다.

//화살표 함수의 this는 상위의 this를 그대로 가져온다.
 
let board = {
  title: "1",
  content: ["a", "b", "c"],
 
  showList() {
    this.content.forEach(                           // this === board
      content => alert(this.title + ': ' + content) // this === board
    );
  }
};
 
board.showList();
 
// 1 : a
// 1 : b
// 1 : c

 

 

2. 메서드생성자사용할 수 없다.

//메소드를 호출한 객체를 가리키지 않고 상위 컨택스트인
//전역 객체 Window를 가리키게 된다. -> undefined

const dog = {
  name: 'guzzi',
  howl: () => console.log(`mung ${this.name}`)
};
dog.howl(); // mung undefined
//프로토타입 메서드 역시 마찬가지다.

const dog = {
  name: 'guzzi',
};
 
Object.prototype.howl = () => console.log(`mung ${this.name}`);
 
dog.howl(); // mung undefined
//생성자 함수는 프로토타입 프로퍼티를 가지며
//프로토타입 프로퍼티가 가리키는 프로토타입 객체의 생성자를 사용한다.
//화살표함수는 프로토타입 프로퍼티를 가지고 있지 않다.

const dog = (name) => {
	this.name = name
};
 
// 화살표 함수는 프로토타입 프로퍼티가 없다
console.log(dog.hasOwnProperty('prototype')); // false 
const cat = new dog("guzzi"); // TypeError: dog is not a constructor

3. 일반적으로 범위를 지정할 때 사용하는 call, apply, bind메서드를 사용할 수 없다.

this를 변경할 수 없다

window.x = 1;
const normal = function () { return this.x; };
const arrow = () => this.x;
 
console.log(normal.call({ x: 10 })); // 10
console.log(arrow.call({ x: 10 }));  // 1

4. addEventListener의 콜백함수로 사용해서는 안된다.

addEventListener의 콜백 함수를 화살표 함수로 정의하면 this가 상위 컨택스트인 전역 객체 window를 가리킨다.

따라서 addEventListener의 콜백 함수 내에서 this를 사용하는 경우, function 키워드로 정의한 일반 함수를 사용해야한다.

//addEventListener의 콜백함수로 사용해서는 안된다.
var button = document.getElementById('myButton');
 
button.addEventListener('click', () => {
  console.log(this === window); // => true
  this.innerHTML = 'Clicked button';
});

 

 

 

더보기
300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] 정규표현식(RegExp)

Tech/JavaScript & TypeScript 2023. 1. 17. 14:33
728x90

정규표현식(RegExp)


정규표현식이란 특정 문자 조합을 찾기 위한 패턴이며, 이 패턴을 이용해 텍스트를 판별할 때 사용한다.

 

 

 

사용하는 이유


회원 가입 등 사용자가 입력해야 하는 상황에 사용자가 어떤 값을 입력 해야할 지 예측할 수 없을 때 하나하나 조건문, 반복문을 사용하면 너무 많은 코드를 사용하게 된다. 그 때 정규 표현식을 사용한다면 짧은 코드로 수월하게  처리할 수 있다.

 

 

 

생성방법


생성자 함수 생성방식

바뀔 수 있는 패턴이나, 사용자 입력 등 외부 출처에서 가져오는 패턴의 경우 사용하는 것이 좋다.

new RegExp('[a-z]', 'gi');

생성자 함수를 사용할 경우 보통의 문자열 이스케이프 규칙을 준수해야 한다.

이스케이프 규칙
특수 문자를 문자열에 사용할 때 앞에 역빗금(\)을 붙인다.

 

리터럴 방식

슬래시로 패턴을 감싸 작성스크립트를 불러올 때 컴파일된다.

바뀔 일이 없는 패턴의 경우 리터럴 방식을 사용하면 성능이 향상된다.//

const RegExp = /abcd+efg/

 

 

 

패턴


패턴 구분자 ( / )

패턴을 구분하는 문자이다.

메타문자

정규 표현식에서 일정한 의미를 가지고 사용되는 특수문자이다.

메타문자의 분류에 따른 종류는 https://zephyrus1111.tistory.com/310에 자세히 서술되어있다.

어서션

줄이나 단어의 시작과 끝을 나타내는 경계와 일치가 가능한 방법을 찾아내는 패턴

종류 기능
^ 문자열의 시작에 일치하는 문자
$ 문자열의 마지막에 있는 문자
\b 단어의 경계에 대응
\B 단어의 경계가 아닌 부분에 대응

문자클래스(en-US)

문자를 구별한다

종류 기능
. 임의의 한 문자를 의미하며 모든 문자 선택
\d 숫자[0-9]
\D 문자
\w 밑줄 포함 영,숫자
\W 단어 문자가 아닌 문자
\s 공백 문자
\S 공백 문자가 아닌 하나의 문자 대응
\t 탭 문자
\v 수직 탭 문자

그룹과 범위

표현 문자의 그룹과 범위를 나타냄

종류 기능
| or을 의미
[ ] 문자 그룹
\n 줄바꿈 문자
(x) 포획 괄호
문자열을 묶어준다
(?:x) 비포획 괄호
문자열 전체에 동작할 수 있게 하고 싶을 때
x(?=y) x중에서 y가 뒤따라오는 x
x(?!y) x중에서 y가 뒤따라오지 않는 x

수량자

일치시킬 문자 또는 표현식의 수

종류 기능
? ?의 앞 문자가 없거나 하나 있음
+ +앞의 문자가 하나 이상 반복됨
* * 앞의 문자가 0개 이상 반복됨
*? 앞 문자열이 0번이상 반복되는지를 확인하며 가능한 적게 일치하는 값을 찾는다.
+? 앞 문자열이 1번이상 반복되는지를 확인하며 가능한 적게 일치하는 값을 찾는다.
{n} {n}의 앞 문자가 n개 있음
{n,} {n}의 앞 문자가 n개 이상
{n,m} 앞 문자가 n개이상 m개이하로 있다

 

 

 

메서드


종류 기능
test() 문자열이 정규표현식과 매칭되면 true, 아니면 false
match() 문자열에서 정규표현식에 매칭되는 모든 항목들을 배열로 반환
exec() match와 유사하지만 첫 번째 매칭결과만 반환
replace() 문자열에서 일치하는 문자를 다른 문자로 대체
replaceAll() 문자열에서 일치하는 부분을 모두 탐색 후 모두 대체 문자열로 바꾼다.
search() 문자열에서 찾고자 하는 문장의 인덱스 값
split() 문자열을 정규표현식에 매칭되는 항목으로 split

 

 

 

예시

개별 숫자 - /[0-9]/g
전체에서  0~9사이에 아무 숫자 '하나'  찾음 

개별 문자 - /[to]/g
전체에서 t  혹은 o  를 모두 찾음 
단어 - /filter/g
전체에서  f 따로 i 따로 찾는게 아니라 'filter' 라는 단어에 매칭되는것을 찾음 

단어 제외 - /\b(?:(?!to)\w)+\b/g
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 도 제외됨. 

단어 제외 - \b(?!\bto\b)\w+\b
전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 는 제외 안됨.  이게 더 정확하다고 볼수있을듯.
이메일 - /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
'시작을'  0~9 사이 숫자 or a-z A-Z 알바펫 아무거나로 시작하고  /
중간에 - _  . 같은 문자가 있을수도 있고 없을수도 있으며 / 

그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 /
@ 가 반드시 존재하고  /

0-9a-zA-Z 여기서 하나가 있고  /
중간에 - _  . 같은 문자가 있을수도 있고 없을수도 있으며 /
그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의
문자가 없거나 연달아 나올수 있으며 /
반드시  .  이 존재하고  /
[a-zA-Z] 의 문자가 2개나 3개가 존재 /
이 모든것은 대소문자 구분안함 
핸드폰 번호 - /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/
시작을 숫자 01로 시작하며 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며 /
하이픈 - 하나 존재할수도 있으며 /
숫자 3~4개 이어지고 / 

또 하이픈 - 하나 존재할수도 있으며 /
숫자 4개가 이어짐 

 

300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] 자바스크립트의 배열 Array

Tech/JavaScript & TypeScript 2023. 1. 17. 11:49
728x90

배열(Array)


자바스크립트에서 배열은 이름과 인덱스로 참조되는 정렬된 값의 집합으로 정의된다.

배열을 구성하는 각각의 값을 배열 요소element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 한다.

 

 

배열 생성


배열 요소의 타입이 고정되어 있지 않다.

배열 요소의 인덱스가 연속적이지 않아도 되며, 따라서 특정 배열 요소가 비어 있을 수도 있다.

Array객체로 다룬다.

const arr1 = new Array();
arr1[1] = 10;
arr1[3] = '이십';
console.log(arr1);

 

 

 

//다차원배열
let arr = [[0,1], [2,3], [4,5], [6,7]]

 

자바스크립트는 내장된 데이터 타입으로 다차원 배열을 제공하지 않는다.

자바스크립트에서는 모든 것이 객체이기 때문에 배열의 각 요소를 다시 배열로 정의해 중첩하는 식으로 다차원 배열을 구현하게 된다. 중첩 배열 형태인 것이다.

그렇기 때문에 다차원이 되면 배열 탐색 속도가 느려지고 언어적인 특성상 배열 요소 자체가 객체이다.

따라서 대량의 데이터 처리에 불리하기에 권장하지 않는다.


 

 

배열 생성


1. var arr = [배열요소1, 배열요소2,...];          // 배열 리터럴을 이용하는 방법
2. var arr = Array(배열요소1, 배열요소2,...);     // Array 객체의 생성자를 이용하는 방법
3. var arr = new Array(배열요소1, 배열요소2,...); // new 연산자를 이용한 Array 객체 생성 방법

 

 

배열 순회


// 기본 for문
let data = [1, 2, 3 ];
for(let i = 0; i < data.length; i++){
  console.log(i);
}
// for Each
let data = [1, 2, 3 ];
data.forEach(function(value){
    console.log("valueis", value);
});
// For of
let data = [1, 2, 3 ];
for( let value of data ){
    console.log( value);
}
// for in : 상위 객체의 함수가 출력될수 있기 때문에 조심해서 사용하도록 한다.
let data = [1, 2, 3 ];
for( let idx in data ){
    console.log( data[idx]);
}

 

 

메서드


메서드 설명
push() 배열의 가장 맨 뒤에 요소 추가
pop() 배열의 가장 맨 뒤 요소 삭제
reverse() 배열의 순서를 반대로
sort() 오름차순 정렬 (문자열 기준)
splice(start, del, item1......) 기존 요소 제거 및 요소 추가
start INDEX부터 del만큼 제거, item이 있다면 item1, item2......추가
join()
toString()
모든요소를 하나의 문자열로 반환
join은 구분자 사용가능하며 기본값은 ','
slice(start, end) start INDEX부터 end-1 INDEX까지의 배열 반환
concat() 배열 뒤에 새로운 배열을 합침
map() 기존의 배열을 콜백함수에 의해 새로운 배열을 만들 때 사용
filter() 해당 배열의 모든 요소에 대하여 반복적으로 콜백함수를 실행
콜백함수의 조건의 대한 결과 값이 true인 요소들만을 새로운 배열에 담아 반환한다.
every() 배열 내 모든 요소들에 대한 조건이 모두 만족할 때 true를 반환
some() 배열 내 모든 요소들에 대한 조건이 하나라도 만족할 때 true를 반환
reduce()
reduceRight()
배열의 모든 요소를 하나의 값으로 줄이기 위해 두 개의 인수를 전달받는 콜백함수 실행
reduce는 배열의 0번INDEX에서 마지막INDEX, reduceRight는 반대
entries()
keys()
values()
entries() : 객체의 Key, Value값을 새로운 배열에 담는다
keys() : Key값만
values() : Value값만

 

//filter
var arr1=[1, -3, 10, 100, -20, 30];
var result=arr1.filter(function(ele){
    return ele>10;
})
console.log(result);   //[100, 30]
//every, some
var arr1=[1, -3, 10, 100, -20, 30];
var result=arr1.every(function(ele){
    return ele>10;
})
console.log(result);  //false

var result2=arr1.some(function(ele){
    return ele>10;
})
console.log(result2);  //true
//reduce, reduceRight
var arr1=[1, -3, 10, 100, -20, 30];
function minus(x,y){
    return x-y;
}
console.log(arr1.reduce(minus));       //-116
console.log(arr1.reduceRight(minus));  //-58

 

300x250
mag1c

mag1c

2년차 주니어 개발자.

[JavaScript] 문서 객체 모델 - DOM 조작하기

Tech/JavaScript & TypeScript 2023. 1. 13. 23:00
728x90

문서 객체 모델(DOM)


HTML에 접근하기 위한 모델(인터페이스)이며, HTML을 컨트롤하기 위한 방법 그 자체를 기술한 것이다.
문서 내의 모든 요소를 정의하고, 각각의 요소에 접근하는 방법을 제공한다.
우리는 이 DOM으로 모든 HTML요소 및 속성, CSS스타일을 변경할 수 있으며, 이벤트를 추가하고, 이벤트에 반응할 수 있다.

DOM은 W3C의 표준 객체 모델이다.


DOM에 접근해 보자


문서가 로드될 때(모든 DOM을 사용할 수 있게 되는 때) 실행되는 함수를 정의하였다. 새로운 H1 element를 생성하고, element에 text를 추가하며, H1을 이 문서의 트리에 추가한다.

<html>
  <head>
    <script>
       // run this function when the document is loaded
       window.onload = function() {

         // create a couple of elements in an otherwise empty HTML page
         var heading = document.createElement("h1");
         var heading_text = document.createTextNode("Big Head!");
         heading.appendChild(heading_text);
         document.body.appendChild(heading);
      }
    </script>
  </head>
  <body>
  </body>
</html>


브라우저는 HTML문서를 로드한 후 해당 문서에 대한 모델을 메모리에 생성한다.
이 때 생성된 객체들의 구조를 DOMTREE라 부른다.

DOM-TREE 구조


DOM Tree와 네 가지 노드


DOM의 모든 요소들은 document 객체의 자식이며, 모든 요소들, 어트리뷰트, 텍스트는 하나의 객체이다.

문서노드

트리 최상단에 위치해있으며, 모든 요소 노드에 접근하기 위해서는 문서노드를 거쳐가야 한다.

요소노드

HTML요소 자체를 표현하며, 문서의 구조를 서술한다.
중첩에 의해 부모자식관계를 가지며, 이 관계를 통해 정보를 구조화한다.
모든 요소노드는 요소별 특성을 표현하기 위해 HTMLElement 객체를 상속한 객체로 구성된다.

어트리뷰트노드

HTML요소의 속성을 표현한다.
해당 속성이 지정된 요소의 자식이 아니라 해당 요소의 일부(형제)로 표현된다.
해당 요소노드를 찾아 접근하게 되면, 속성을 참조 및 수정이 가능해진다.

텍스트노드

HTML요소의 텍스트를 표현하는 최하단노드이다.


DOM 사용하기


DOM Query를 사용하기 위해 기본적으로 document 개체가 필요하다.

getElementById('id')

id속성값으로 요소노드를 한 개 선택한다.
만약 복수개가 선택되면 가장 마지막 요소를 선택한다.

<ul>
    <li id="one" class="red1">썬타워503호</li>
    <li id="two" class="red1">썬타워502호</li>
    <li id="three" class="red1">썬타워501호</li>
    <li id="four">서울</li>
</ul>
<script>
    document.getElementById('one').style.backgroundColor='yellow';
    console.dir(document.getElementById('one'));
</script>


console.dir을 통해 해당 요소의 노드구조를 파악할 수 있으며, 어떤 프로퍼티에 어떻게 접근해야하는지 확인할 수 있다.
이를 통해 자유자재로 돔을 이동하는 것을 트래버싱(Traversing)이라 한다.

console.dir


querySelector

요소노드를 1개 선택하는 document 객체의 메서드
만약 여러개가 선택이 되면 첫 번째 요소만 선택되며, querySelectorAll을 사용하여 전체를 선택할 수 있다.

// ID는 #, class는 .을 사용해야 한다.
document.querySelector('#one').style.backgroundColor='yellow';

getElementByClassName

클래스를 통한 노드의 선택

document.getElementByClassName('red1').style.backgroundColor='yellow';


노드 탐색


firstChild, lastChild

공백이나 줄바꿈 문자를 텍스트노드 취급하기 때문에, 공백제거 시 가독성이 나빠지는 태그에서는
firstElementchild, lastElementChild를 사용할 것을 권장한다.

<ul>
    <li id="one" class="red1">서울</li>
    <li id="two" class="red1">부산</li>
    <li id="three" class="red1">제주</li>
    <li id="four">경기</li>
</ul>
<script>
    console.log(document.querySelector('ul').firstChild);    // #text
</script>

//<ul>과 <li>사이의 공백을 다 제거하고 난 후 실행하면 <li>값을 가져온다.

hasChildNodes()

자식노드 확인 후 Boolean값을 리턴한다.

const tf = document.querySelector('ul');
console.log(tf.hasChildNodes());  // true

childNodes

자식노드의 컬렉션(텍스트를 포함한 모든 자식요소)을 리턴한다.

console.log(tf.childNodes);
// NodeList(9) [text, li#one.red1, text, li#two.red1, text, li#three.red1, text, li#four, text]

children

자식노드의 컬렉션(Element타입)을 리턴한다.

console.log(tf.children);
// HTMLCollection(4) [li#one.red1, li#two.red1, li#three.red1, li#four, one: li#one.red1, two: li#two.red1, three: li#three.red1, four: li#four]

previousSibling, nextSibling

형제(이웃)노드를 탐색한다. (텍스트노드 포함)

console.log(tf.previousSibling);  // #text
console.log(tf.nextSibling);      // #text

perviousElementSibling, nextElementSibling

형제(이웃)노드를 탐색한다. (텍스트노드 미포함)

console.log(tf.previousElementSibling);   // h1
console.log(tf.nextElementSibling);       // h2#quiz

nodeName, nodeType, nodeValue

노드 탐색
nodeValue의 값 : 1(요소 노드) 2(속성 노드) 3(텍스트 노드) 8(주석 노드) 9(문서 노드)

console.log(tf.nodeName);
console.log(tf.nodeType);
console.log(tf.nodeValue);

className

class 속성값 취득 및 변경
className 프로퍼티에 값을 할당하는 경우 class가 존재하지 않으면 속성을 생성하고 값을 지정한다.
class 속성값이 여러개라면 공백으로 구분된 문자열이 리턴되므로 split을 활용하여 배열로 변경해 사용한다.

classList

DOMTokenList를 반환하는 읽기 전용 프로퍼티

  • 메서드 종류 : add, remove, item, toggle, contains, replace 등

See the Pen Untitled by magic (@mag11c) on CodePen.




어트리뷰트 관련 속성


hasAttribute

지정한 어트리뷰트를 가지고 있는지

getAttribute

어트리뷰트의 값을 취득

setAttribute

지정한 어트리뷰트의 값을 설정

removeAttribute

지정한 어트리뷰트 제거

<input type="text">
<script>
    const input = document.querySelector('input[type=text]');
    console.log(input);
    //value 어트리뷰트 값이 없다면
    if(!input.hasAttribute('value')){
        input.setAttribute('placeholder', '값을 입력해주세요');
    }
    // focus로 인풋안에 들어왔는지 확인.

    // value값 가져오기
    console.log(input.getAttribute('value'));

    //value 제거
    input.removeAttribute('value');
</script>



텍스트 변경


innerHTML

요소의 텍스트에 접근할 수 있는 프로퍼티

innerText

해당 요소의 모든 자식요소를 포함하는 모든 컨텐츠를 하나의 문자열로 가져올 수 있다.
W3C에표준에 맞지않고, css에 순종적이라 css속성에따라 받아올 수 없으며, textContent대비 느려 비사용 권장

textContent

요소의 텍스트 컨텐츠를 취득 및 변경한다.
textContent를 통해 요소에 새로운 텍스트를 할당하면 텍스트를 쉽게 변경 가능하다.

<ul>
    <li id="one" class="red1">서울</li>
    <li id="two" class="red1">부산</li>
    <li id="three" class="red1">제주</li>
    <li id="four">경기</li>
</ul>
<script>
    one.textContent = '<h1>22</h1>';
    console.log(one.textContent);          // <h1>22</h1>;
    // 마크업 적용
    one.innerHTML += '<h1>22</h1>';
    one.innerHTML += '<img src ="경로">';
</script>



컨텐츠 추가


createElement

메서드의 파라미터로 태그명을 만들어 반환한다.

createTextNode

텍스트노드를 생성한다.

appendChild

한 노드를 특정 부모노드의 자식리스트 중 마지막 자식으로 붙인다.

removeChild

파라미터로 전달받은 자식노드를 삭제한다.

<ul>
    <li id="one" class="red1">서울</li>
    <li id="two" class="red1">부산</li>
    <li id="three" class="red1">제주</li>
    <li id="four">경기</li>
</ul>
<script>
    const newEl = document.createElement('li');
    const newText = document.createTextNode('오우쨔스');
    newEl.appendChild(newText);
    const container = document.querySelector('ul');
    container.appendChild(newEl);
    container.removeChild(document.querySelector('#two'));
</script>

'부산'이 삭제되고 '오우쨔스'가 추가되었다.


참조

https://developer.mozilla.org/ko/docs/Web/API/Document_Object_Model

300x250
mag1c

mag1c

2년차 주니어 개발자.

방명록