본문 바로가기

(3)

비동기식 처리모델 Ajax

참조: https://poiemaweb.com/js-ajax Ajax | PoiemaWeb 비동기식 처리 모델(Asynchronous processing model or Non-Blocking processing model)은 병렬적으로 작업을 수행한다. 즉, 작업이 종료되지 않은 상태라도 대기하지 않고 다음 작업을 실행한다는 의미이다. 예를 들어 서버에서 데이터를 가져와 화면에 표시하는 작업을 수행할 경우 서버에 데이터를 요청한 이후 서버로부터 데이터가 전달될 때까지 대기하지 않고(Non-Blocking) 즉시 다음 작업을 수행한다. 이후 서 poiemaweb.com 웹 페이지 전체를 새로 갱신하지않고 일부분만 갱신하고 싶다면 '아마도'(짧은 지식으로 이것이 전부다! 라고 하기에는 아직 겁이 많다.. ..

js - ES6 문법 정리

https://itstory.tk/entry/JavaScript-ES6-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC#arrows 불러오는 중입니다... https://woowabros.github.io/experience/2017/12/01/es6-experience.html 신선함으로 다가온 ES6 경험 - 우아한형제들 기술 블로그 신선함으로 다가온 ES6 경험 woowabros.github.io 이글은 위 글들을 참조하였습니다. 최근 스터디를 통해서 '모던 자바'를 익히고 있다. 자바의 모던자바를 배웠을 때, 신세계를 경험한 기분이었는데 JavaScript 또한 새로운 버전의 문법들이 존재했다. (부스트 코스에서 errow function을 언급하면서 ES6의 존재를 알게 되었..

js - 메서드 정의

이 글은 https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/Method_definitions 메서드 정의 ECMAScript 2015 를 시작으로, 객체 초기자(initializer)에 메서드 정의를 위한 더 짧은 구문이 도입되었습니다. 이는 메서드 명에 할당된 함수를 위한 단축입니다. developer.mozilla.org 위 글을 참고하였습니다. ECMAScript 2015 를 시작으로, 객체 초기자(initializer)에 메서드 정의를 위한 더 짧은 구문이 도입되었다. 이는 메서드 명에 할당된 함수를 위한 단축이다. 구문 var obj = { property( parameters… ) {}, *generator( pa..

프로그래밍 공부/JavaScript

비동기식 처리모델 Ajax

728x90

참조:  https://poiemaweb.com/js-ajax

 

Ajax | PoiemaWeb

비동기식 처리 모델(Asynchronous processing model or Non-Blocking processing model)은 병렬적으로 작업을 수행한다. 즉, 작업이 종료되지 않은 상태라도 대기하지 않고 다음 작업을 실행한다는 의미이다. 예를 들어 서버에서 데이터를 가져와 화면에 표시하는 작업을 수행할 경우 서버에 데이터를 요청한 이후 서버로부터 데이터가 전달될 때까지 대기하지 않고(Non-Blocking) 즉시 다음 작업을 수행한다. 이후 서

poiemaweb.com

웹 페이지 전체를 새로 갱신하지않고 일부분만 갱신하고 싶다면 '아마도'(짧은 지식으로 이것이 전부다! 라고 하기에는 아직 겁이 많다.. 아니 10년, 20년이 지나도 확신하듯이 말할 수 있을지는 모르겠다) '비동기식 처리모델'이 필요한 시기인것같다. 하지만 생각보다 쓰는 방법이 쉽지않아 보인다. 실제로 내가 진행하고있는 프로젝트에서도 이 비동기 처리 때문에 꽤 오랫동안 삽질을 했다.(심지어 첫 프로젝트는 그 오류의 원인을 몰라서 임시방편만 처리하고 넘어갔었다) 설명을 진행하면서 삽질했던 부분도 간략히 짚으면서 넘어가겠다. 

1. Ajax (Asynchronous JavaScript and XML) 

브라우저에서 웹 페이지를 요청하거나 링크를 클릭하면 화면 갱신이 발생한다. 이것은 브라우저와 서버의 통신에 의한 것이다.

서버는 요청받은 페이지(HTML)를 반환하는데 이때 HTML에서 로드하는 CSS나 JavaScript 파일들도 같이 반환된다. 클라이언트의 요청에 따라 서버는 정적인 파일을 반환할 수도 있고 서버 사이드 프로그램이 만들어낸 파일이나 데이터를 반환할 수도 있다. 서버로부터 웹페이지가 반환되면 클라이언트(브라우저)는 이를 렌더링하여 화면에 표시한다. 

Ajax는 자바스크립트를 이용해서 비동기적(Asynchronous)으로 서버와 브라우저가 데이터를 교환할 수 있는 통신 방식을 의미한다.

서버로부터 웹페이지가 반환되면 화면 전체를 갱신해야 하는데 일부만을 갱신하고도 동일한 효과를 볼 수 있도록 하는 것이 Ajax이다. 페이지 전체를 로드하여 렌더링할 필요가 없고 갱신이 필요한 일부만 로드하여 갱신하면 되므로 빠른 퍼포먼스와 부드러운 화면 표시 효과를 기대할 수 있다. 

 

2. JSON (JavaScript Object Notation)

클라이언트와 서버 간에는 데이터 교환이 필요하다. JSON은 클라이언트와 서버 간 데이터 교환을 위한 데이터 포맷이다.

JSON은 일반 텍스트 포맷보다효과적인 데이터 구조화가 가능하며 XML 포맷보다 가볍고 사용하기 간편하며 가독성도 좋다.

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

{
    "name": "Lee",
    "gender": "male",
    "age": 20,
    "alive": true
}

key는 반드시 쌍따옴표(작은따옴표 x)로 둘러싸야한다.

2.1 JSON.stringfy

JSON.stringfy 메서드는 객체를 JSON 형식의 문자열로 변환한다.

const o = { name: 'Lee', gender: 'male', age: 20 };

const strObject = JSON.stringify(o);
console.log(typeof strObject, strObject); 

// string {"name":"Lee","gender":"male","age":20}

// 객체 => JSON 형식의 문자열 + prettify
const strPrettyObject = JSON.stringify(o, null, 2);
console.log(typeof strPrettyObject, strPrettyObject);

/*
string {
  "name": "Lee",
  "gender": "male",
  "age": 20
}
*/

 

2.2 JSON.parse

JSON.parse 메서드는 JSON 데이터를 가진 문자열을 객체로 변환한다.

더보기

서버로부터 브라우저로 전송된 JSON 데이터는 문자열이다. 이 문자열을 객체로서 사용하려면 객체화하여야 하는데 이를 역직렬화(Deserializing)이라 한다. 역직렬화를 위해서 내장 객체 JSON의 static 메서드인 JSON.parse를 사용한다.

 

const o = { name: 'Lee', gender: 'male', age: 20 };

// 객체 => JSON 형식의 문자열
const strObject = JSON.stringify(o);
console.log(typeof strObject, strObject);
// string {"name":"Lee","gender":"male","age":20}

// JSON 형식의 문자열 => 객체
const obj = JSON.parse(strObject);
console.log(typeof obj, obj); // object { name: 'Lee', gender: 'male' }


const arr = [1, 5, 'false'];

// 배열 객체 => 문자열
const strArray = JSON.stringify(arr);
console.log(typeof strArray, strArray); // string [1,5,"false"]

// 문자열 => 배열 객체
const objArray = JSON.parse(strArray);
console.log(typeof objArray, objArray); // object [1, 5, "false"]

배열이 JSON 형식의 문자열로 변환되어 있는 경우 JSON.parse는 문자열을 배열 객체로 변환한다. 배열의 요소가 객체인 경우 배열의 요소까지 객체로 변환한다. 

const todos = [
  { id: 1, content: 'HTML', completed: true },
  { id: 2, content: 'CSS', completed: true },
  { id: 3, content: 'JavaScript', completed: false }
];

// 배열 => JSON 형식의 문자열
const str = JSON.stringify(todos);
console.log(typeof str, str);

// JSON 형식의 문자열 => 배열
const parsed = JSON.parse(str);
console.log(typeof parsed, parsed);

 

3. XMLHttpRequest

브라우저는 XMLHttpRequest 객체를 이용하여 Ajax 요청을 생성하고 전송한다. 서버가 브라우저의 요청에 대한 응답을 반환하면 같은 XMLHttpRequest 객체가 그 결과를 처리한다.

(아마도 대다수의 개발자들은 jQuery로 Ajax를 처리하고 있지 않을까 생각한다. jQuery 라이브러리에 의존하지 않고 비동기식 처리를 하기 위해서는 XMLHttpRequest 객체가 필요하다.)

3.1 Ajax request

다음은 Ajax 요청 처리의 예제이다.

// XMLHttpRequest 객체의 생성
const xhr = new XMLHttpRequest();
// 비동기 방식으로 Request를 오픈한다
xhr.open('GET', '/users');
// Request를 전송한다
xhr.send();

 

3.1.1 XMLHttpRequest.open

XMLHttpRequest객체의 인스턴스를 생성하고 XMLHttpRequest.open 메서드를 사용하여 서버로의 요청을 준비한다. XMLHttpRequest.open의 사용법은 아래와 같다.

XMLHttpRequest.open(method, url, async);

 

매개변수 설명
method HTTP method (GET, POST, PUT, DELETE 등)
url 요청을 보낼 URL
async 비동기 조작 여부, 옵션으로 default는 true이며 비동기 방식으로 동작한다.

 

3.1.2 XMLHttpRequest.send

XMLHttpRequest.send 메서드로 준비된 요청을 서버에 전달한다.

기본적으로 서버로 전송하는 데이터는 GET, POST 메서드에 따라 그 전송 방식에 차이가 있다.

  • GET 메서드의 경우, URL의 일부분인 쿼리문자열(query String)로 데이터를 서버로 전송한다.
    (ex: www.naver.com?id=myid&password=mypassword) 
  • POST 메서드의 경우, 데이터(페이로드)를 Request Body에 담아 전송한다.

XMLHttpRequest.send 메서드에는 request body에 담아 전송할 인수를 전달할 수 있다.

xhr.send(null);
// xhr.send('string');
// xhr.send(new Blob()); // 파일 업로드와 같이 바이너리 컨텐트를 보내는 방법
// xhr.send({ form: 'data' });
// xhr.send(document);

만약 요청 메서드가 GET인 경우, send 메서드의 인수는 무시되고 request bodynull로 된다.

 

3.1.3 XMLHttpRequest.setRequestHeader

XMLHttpReqest.setRequestHeader 메서드는 HTTP Reqeust Header의 값을 설정한다. setReqeustHeader 메서드는 반드시 XMLHttpRequest.open 메서드 호출 이후에 호출한다. 

자주 사용하는 Request Header인 Content-type, Accept에 대해 알아보자.

Content-type

Content-type은 request body에 담아 전송할 데이터의 MIME-type의 정보를 표현한다. 자주 사용되는 MIME-type은 아래와 같다.

타입 서브타입
text타입 text/plain, text/html, text/css, text/javascript
Application타입 application/json, applicaion/x-www-form-urlencode
File을 업로드하기 위한 타입 multipart/formed-data

 다음은 request body에 담아 서버로 전송할 데이터MIME-type을 지정하는 예이다.

// json으로 전송하는 경우
xhr.open('POST', '/users');

// 클라이언트가 서버로 전송할 데이터의 MIME-type 지정: json
xhr.setRequestHeader('Content-type', 'application/json');

const data = { id: 3, title: 'JavaScript', author: 'Park', price: 5000};

xhr.send(JSON.stringify(data));

 

// x-www-form-urlencoded으로 전송하는 경우
xhr.open('POST', '/users');

// 클라이언트가 서버로 전송할 데이터의 MIME-type 지정: x-www-form-urlencoded
// application/x-www-form-urlencoded는 key=value&key=value...의 형태로 전송
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

const data = { title: 'JavaScript', author: 'Park', price: 5000};

xhr.send(Object.keys(data).map(key => `${key}=${data[key]}`).join('&'));
// escaping untrusted data
// xhr.send(Object.keys(data).map(key => `${key}=${encodeURIComponent(data[key])}`).join('&'));

 

Accept

HTTP 클라이언트가 서버에 요청할 때 서버가 돌려줄 데이터의 MIME-type을 Accept로 지정할 수 있다.

다음은 서버가 센드백할 데이터의 MIME-type을 지정하는 예다.

// 서버가 센드백할 데이터의 MIME-type 지정: json
xhr.setRequestHeader('Accept', 'application/json');

 만약 Accept 헤더를 설정하지 않으면, send 메서드가 호출될 때 Accept 헤더가 */*으로 전송된다.

 

3.2 Ajax response

다음은 Ajax 응답 처리의 예다.

// XMLHttpRequest 객체의 생성
const xhr = new XMLHttpRequest();

// XMLHttpRequest.readyState 프로퍼티가 변경(이벤트 발생)될 때마다 onreadystatechange 이벤트 핸들러가 호출된다.
xhr.onreadystatechange = function (e) {
  // readyStates는 XMLHttpRequest의 상태(state)를 반환
  // readyState: 4 => DONE(서버 응답 완료)
  if (xhr.readyState !== XMLHttpRequest.DONE) return;

  // status는 response 상태 코드를 반환 : 200 => 정상 응답
  if(xhr.status === 200) {
    console.log(xhr.responseText);
  } else {
    console.log('Error!');
  }
};

위 코드를 자세히 보자. (이 부분을 제대로 읽지 않으면 나와 같은 삽질을 할 것이다!) 

XMLHttpRequst.send 메서드를 통해 서버에 Request를 전송하면 서버는 Response를 반환한다. 하지만 언제 Response가 클라이언트에 도달할 지는 알 수 없다. XMLHttpRequest.onreadystatechangeResponse가 클라이언트에 도달하여 발생된 이벤트를 감지하고 콜백함수를 실행하여 준다. 이때 이벤트는 Request에 어떤 변화가 감지된 경우 즉 XMLHttpRequest.readyState 프로퍼티가 변경된 경우 발생한다. 

// XMLHttpRequest 객체의 생성
var xhr = new XMLHttpRequest();
// 비동기 방식으로 Request를 오픈한다
xhr.open('GET', 'data/test.json');
// Request를 전송한다
xhr.send();

// XMLHttpRequest.readyState 프로퍼티가 변경(이벤트 발생)될 때마다 콜백함수(이벤트 핸들러)를 호출한다.
xhr.onreadystatechange = function (e) {
  // 이 함수는 Response가 클라이언트에 도달하면 호출된다.
};

XMLHttpRequest 객체는 response가 클라이언트에 도달했는지를 추적할 수 있는 프로퍼티를 제공한다. 이 프로퍼티는 XMLHttpRequest.readyState 다. 만일 XMLHttpReqeust.readyState의 값이 4인 경우, Response가 돌아온 경우이다. (이 설정을 제대로 안한다면 비동기 처리는 4회를 반복하게 되고 (2번은 정보를 받아오지 못함) 같은 데이터를 2번 받아오게 된다)

readXMLHttpRequest.readyState의 값은 아래와 같다.

Value State Description
0 UNSET XMLHttpRequest.open() 메소드 호출 이전
1 OPENED XMLHttpRequest.open() 메소드 호출 완료
2 HEADERS_RECEIVED XMLHttpRequest.send() 메소드 호출 완료
3 LOADING 서버 응답 중(XMLHttpRequest.responseText 미완성 상태)
4 DONE 서버 응답 완료

 

// XMLHttpRequest 객체의 생성
var xhr = new XMLHttpRequest();
// 비동기 방식으로 Request를 오픈한다
xhr.open('GET', 'data/test.json');
// Request를 전송한다
xhr.send();

// XMLHttpRequest.readyState 프로퍼티가 변경(이벤트 발생)될 때마다 콜백함수(이벤트 핸들러)를 호출한다.
xhr.onreadystatechange = function (e) {
  // 이 함수는 Response가 클라이언트에 도달하면 호출된다.

  // readyStates는 XMLHttpRequest의 상태(state)를 반환
  // readyState: 4 => DONE(서버 응답 완료)
  if (xhr.readyState !== XMLHttpRequest.DONE) return;

  // status는 response 상태 코드를 반환 : 200 => 정상 응답
  if(xhr.status === 200) {
    console.log(xhr.responseText);
  } else {
    console.log('Error!');
  }
};

 

XMLHttpReqeust의 readyState가 4인 경우, 서버 응답이 완료된 상태이므로 이후 XMLHttpReqeust.status가 200(정상 응답)임을 확인하고 정상인 경우, XMLHttpRequest.responseText(= 받아온 데이터)를 취득한다. XMLHttpRequestText에는 서버가 전송한 데이터가 담겨 있다. 

 

728x90

'프로그래밍 공부 > JavaScript' 카테고리의 다른 글

js - ES6 문법 정리  (0) 2020.02.15
js - 메서드 정의  (0) 2020.02.13
프로그래밍 공부/JavaScript

js - ES6 문법 정리

728x90

https://itstory.tk/entry/JavaScript-ES6-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC#arrows

불러오는 중입니다...

https://woowabros.github.io/experience/2017/12/01/es6-experience.html

 

신선함으로 다가온 ES6 경험 - 우아한형제들 기술 블로그

신선함으로 다가온 ES6 경험

woowabros.github.io

이글은 위 글들을 참조하였습니다.

최근 스터디를 통해서 '모던 자바'를 익히고 있다. 자바의 모던자바를 배웠을 때, 신세계를 경험한 기분이었는데 JavaScript 또한 새로운 버전의 문법들이 존재했다. (부스트 코스에서 errow function을 언급하면서 ES6의 존재를 알게 되었다) 

그 새로운 문법들을 차례대로 짚어보려고 한다. 

먼저 ECMAScript란 자바스크립트 언어의 표준이다.

Introduction

ECMAScript 2015로도 알려진 ECMAScript 6는 ECMAScript 표준의 가장 최신 버전이다.(현재 이미 ES10(2019)이 존재한다.ES11(2020)이 나왔거나 나올 예정인 것 같다.. 역시 가장 인기있는 언어답게 매년 꾸준히 새버전이 나오고 있는 것 같다. 년도 맨 뒷자리 -1 이 매년 꾸준히 나오고 있다) 그중에 ES6는 새로운 언어 기능이 포함된 주요 업데이트이며, 2009년도에 표준화된 ES5 이후로 언어 기능에 대한 첫 업데이트이기도 하다.  ECMAScript 6 언어의 전체 스펙을 확인하려면 ES6 Standard를 확인하면 된다.

ES6는 아래의 새로운 기능을 포함한다.

 

  • arrows
  • classes
  • enhanced object literals
  • template strings
  • destructuring
  • default + rest + spread
  • let + const
  • iterators + for..of
  • generators
  • unicode
  • modules
  • module loaders
  • map + set + weakmap + weakset
  • proxies
  • symbols
  • subclassable built-ins
  • promises
  • math + number + string + array + object APIs
  • binary and octal literals
  • reflect api
  • tail calls

ECMAScript 6 에 추가된 기능 

Arrows

Arrows function은 => 문법을 사용하는 축약형 함수이다. C#, Java8, CoffeScript의 해당 기능과 문법적으로 유사하다. Arrows는 표현식의 결과 값을 반환하는 표현식 본문(expression bodies)뿐만 아니라 상태 블럭 논문(statement block bodies)도 지원한다. 하지만 일반 함수가 자신을 호출하는 객체를 가리키는 dynamic this와 달리 arrows 함수는 코드의 상위 스코프(lexical scope)를 가리키는 lexical this를 가진다. (화살표 함수는 자신의 this가 바인드 되지 않기 때문에 함수의 스코프에서의 this 가 적용된다)

var evens = [2, 4, 6, 8,];

// Expression bodies (표현식의 결과가 반환됨) 
var odds = evens.map(v => v + 1); // [3, 5, 7, 9] 
var nums = evens.map((v, i) => v + i); // [2, 5, 8, 11] 
var pairs = evens.map(v => ({even: v, odd: v + 1})); // [{even: 2, odd: 3}, ...] 

// Statement bodies (블럭 내부를 실행만 함, 반환을 위해선 return을 명시) 
nums.forEach(v => {
	if (v % 5 === 0) {
    	  fives.push(v);
    }
}); 

// Lexical this 
// 출력결과 : Bob knows John, Brian 
var bob = {
	_name: "Bob",
    _friends: ["John, Brian"],
    printFriends() {
    	this._friends.forEach(f => 
        	console.log(this._name + " knows " + f)); 
    } 
}



printFriends() 함수서브루틴은 다음과 문법상 동일하게 동작합니다.

this._friends.forEach(function (f) { 
	console.log(this._name + " knows " + f)); 
}.bind(this));

 

화살표 함수의 더 자세한 설명은 MDN Arrow Functions를 참고하자. printFriends() 함수의 선언 표기법이 궁금하면 MDN Object Initializer를 참고하자

Classes

ES6 클래스는 프로토타입 기반 객체지향 패턴을 더 쉽게 사용할 수 있는 대체재이다. 클래스 패턴 생성을 더 쉽고 단순하게 생성할 수 있어 사용하기도 편하고 상호운용성도 증가된다. constructor 메서드(자바의 생성자 개념)도 사용할 수 있고 extends를 통한 클래스 상속도 가능하다.

class SkinnedMesh extends THREE.Mesh { 
	constructor(geometry, materials) { 
    	super(geometry, materials); 
        this.idMatrix = SkinnedMesh.defaultMatrix();
        this.bones = []; this.boneMatrices = []; //... 
    } 
    
    update(camera) { 
    	//... 
    	super.update(); 
    } 
    
    get boneCount() { 
    	return this.bones.length; 
    } 
    
    set matrixType(matrixType) {
    	this.idMatrix = SkinnedMesh[matrixType](); 
    } 
    
    static defaultMatrix() { 
    	return new THREE.Matrix4(); 
    } 
}

 

더 자세한 설명은 MDN Classes를 참고하자.

 

Enhanced Object Literals

ES6에서 객체 리터럴은 선언문에서 프로토타입 설정, foo: foo선언을 위한 단축 표기법, 메서드 정의, super 클래스 호출 및 동적 속성명을 지원하도록 향상 되었다. 그에 따라 객체 리터럴 및 클래스 선언이 더 밀집되어져, 객체기반 설계가 더 편리해졌다.

var obj = { 
    // __proto__ 
    __proto__: theProtoObj, 
    
    // ‘handler: handler’의 단축 표기 
    handler, 
    
    // Methods 
    toString() { 
    	// Super calls 
        return "d " + super.toString(); 
    }, 
    
    // Computed (dynamic) property names 
    [ 'prop_' + (() => 42)() ]: 42 
};

더 자세한 설명은 MDN Grammar and types: Object literals를 참고하자.


let & const

const는 블록 범위이며 값이 지정되면 나중에 바꿀 수 없다. 또한, 재선언 될 수도 없다.

const schoolName = "ABC";

schoolName = "CBA"; //Error

 

let

let은 블록 범위이며 값이 지정되어도 값을 바꿀 수 있다.

function test() {
	let x = "a";
    if (true) {
    	let x = "b";
        console.log(x); // b
    }
    console.log(x); // a
}

 

Modules

Export, Import 를 이용해 function이나 variables 들을 다른 곳에서 사용할 수 있다.

// utility.js
export const squares = (arr) => {return arr.map(x => x * x)};

// math.js
import { square } from "utility";
console.log(squares([1,2,3])); // [1,4,9]

 

Promises

비동기 프로세싱을 위해 사용된다. (Asychrnously)
가독성이 좋으며 중첩된 콜백의 단점을 완화한다.
(Callback 코드를 읽기도 관리하기도 힘들어지는 것을 완화할 수 있다)

Promise의 세가지 상태

  • 대기중(pending)
  • 이행됨(fulfilled)
  • 거부됨(rejected)
var promiseTest = (num) => {
	return new Promise((resolve, reject) => {
    	if (num > 3) {
        	resolve(num);
        } else {
        	reject("err");
        }
    }
}

promiseTest(5)
	.then(val => console.log(val)) // 5
    .catch(err => console.log(err));
    

 

참고한 글중에 우아한 형제들 기술블로그에서 ES6 사용으로 코드가 간결해진 사례들을 소개한다. 
직접적으로 내가 써본적은 없기 때문에... 간접적으로 체험하는게 최선이지만 이전 코드에 비해서 많은 간결성과 더불어 의미를 한눈에 알아보기 쉽게 바꿀 수 있다는 것을 알 수 있다. 

728x90

'프로그래밍 공부 > JavaScript' 카테고리의 다른 글

비동기식 처리모델 Ajax  (0) 2020.02.21
js - 메서드 정의  (0) 2020.02.13
프로그래밍 공부/JavaScript

js - 메서드 정의

728x90

 이 글은 https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/Method_definitions

 

메서드 정의

ECMAScript 2015 를 시작으로, 객체 초기자(initializer)에 메서드 정의를 위한 더 짧은 구문이 도입되었습니다. 이는 메서드 명에 할당된 함수를 위한 단축입니다.

developer.mozilla.org

위 글을 참고하였습니다.

 

ECMAScript 2015 를 시작으로, 객체 초기자(initializer)에 메서드 정의를 위한 더 짧은 구문이 도입되었다. 이는 메서드 명에 할당된 함수를 위한 단축이다.

구문

var obj = {
  property( parameters… ) {},
  *generator( parameters… ) {},
  
// 키(속성) 계산값과도 함께:
  [property]( parameters… ) {},
  *[generator]( parameters… ) {},
  
// ES5 getter/setter 구문과 비교해 보세요:
  get property() {},
  set property(value) {}
};

설명

단축 구문은 ECMAScript 5에 도입된 getter  setter 구문과 비슷합니다.
다음 코드가 주어지면:

var obj = {
  foo: function() {},
  bar: function() {}
};

이제 이를 아래로 줄일 수 있습니다.

var obj = {
  foo() {},
  bar() {}
};
더보기

주의 : 단축 구문은 익명(anonymous) 함수 (…foo: function() {}… 에서처럼) 대신 유명(named) 함수를 사용합니다. 유명 함수는 함수 본체에서 호출될 수 있습니다 (이는 참조할 식별자가 없기에 익명 함수에게는 불가능합니다). 자세한 사항은, function 참조.

 

       단축 생성기 메서드 

생성기 메서드는 단축 구문을 사용해서도 정의될 수 있습니다. 단축 구문 내 별표(*)는 생성기 속성명 앞에 와야 함을 주의하세요. 즉, * g(){}는 작동하지만 g *(){}는 아닙니다. 

// 유명 속성 사용 (ES2015 이전)
var obj2 = {
  g: function*() {
    var index = 0;
    while(true)
      yield index++;
  }
};

// 단축 구문을 쓰는 같은 객체
var obj2 = {
  * g() {
    var index = 0;
    while(true)
      yield index++;
  }
};

var it = obj2.g();
console.log(it.next().value); // 0
console.log(it.next().value); // 1

메서드 정의는 생성 불가능합니다

       메서드 정의는 생성 불가능합니다

var obj = {
  method() {},
};
new obj.method; // TypeError: obj.method는 생성자가 아닙니다

var obj = {
  * g() {}
};
new obj.g; // TypeError: obj.g는 생성자가 아닙니다 (ES2016에서 바뀜)

 

       간단한 테스트 사례

var obj = {
  a : "foo",
  b(){ return this.a; }
};
console.log(obj.b()); // "foo"

 

        속성 계산명

단축 구문은 속성 계산명(computed property name)도 지원한다.

var bar = {
  foo0 : function (){return 0;},
  foo1(){return 1;},
  ["foo" + 2](){return 2;},
};

console.log(bar.foo0()); // 0
console.log(bar.foo1()); // 1
console.log(bar.foo2()); // 2

 

자바 스크립트를 공부할 때, 가볍게 훑으면서 지나갔더니 이전방식의 메서드 정의도 생소하게 느껴졌다. Node.js 강의를 보면서 코드를 보다보니 이해가 안가는 부분이 있어 구글링을 하다가, 메서드 정의를 이렇게도 할 수 있구나 하는 것을 알게되었다. (역시 기초는 탄탄해야한다)

728x90

'프로그래밍 공부 > JavaScript' 카테고리의 다른 글

비동기식 처리모델 Ajax  (0) 2020.02.21
js - ES6 문법 정리  (0) 2020.02.15