나만큼이나 독서를 사랑했던 한 남자가 있었다. 그는 독서가이자 소설가이자 시인이면서 도서관에서 일을 했고, 노년에 눈이 멀었지만 글을 읽어줄 수 있는 사람을 찾아 끝까지 독서를 멈추지 않았다. 그는 낙원이 있다면 아마 도서관 형태일 것이라고 말하곤 했고, 세계를 단 한 권의 책에 담아낼 수 있다고 믿었다. 포스트모더니즘 문학의 거장으로 불리는 세계적인 작가 호르헤 보르헤스이다.
- 김혜령의《불안이라는 위안》중에서 -
* 독서와 도서관을 사랑하는 사람. 당신 주변에 그런 사람 혹시 있습니까? 있다면 다행입니다. 독서라는 지상 낙원에서 서로 벗하며 거친 세상을 함께 살아가는 친구가 있다는 것은 다행을 넘어 크나큰 행운입니다. 그런 친구는 그냥 얻어지지 않습니다. 내가 독서를 좋아해야 가능합니다. 책을 사랑해야 책을 사랑하는 사람을 만날 수 있습니다.
우리가 사람들을 배치하고 적절한 자리에 임명하는 사안에 4시간씩 사용하지 않는다면 아마 우리의 실수를 처리하느라 400시간을 소비해야 할 거고, 나에겐 그럴만한 시간이 없다. - GM 전 회장 알프레드 슬론
채용에 노력을 덜 기울이는 것에 비례해서 뒷수습하는 비용이 기하급수적으로 커집니다. 채용이 중요하다는 사실은 알고 있으면서도 이를 위한 투자를 제대로 하지 못하는 경영자가 많습니다. 성공하는 경영의 룰 넘버 1(rule number 1)은 분명코 제대로 된 채용에 있습니다. 가장 중요한 채용에 가장 많은 시간을 쏟아야 합니다.
너의 상처를 숨기지 말라. 상처는 피부에 새겨진 훈장이다. 상처는 그대가 오랫동안 전투에서 경험을 쌓았음을 나타내는 증표이므로, 적들은 그 상처를 보고 두려움을 느낄 것이다. 이것으로 하여 종종 적들은 대화를 원할 것이고, 그대와의 충돌을 피하려 할 것이다. 상처를 낸 칼보다 상처 그 자체가 더 큰 목소리를 내는 것이다. - 파울로 코엘료, ‘아크라 문서’에서
생각하기에 따라 상처는 고통을 넘어 도움으로 작용되기도 합니다. 생애 내내 우리를 따라다니며 많은 도움을 줍니다. 그것들은 우리의 삶에 대한 의지를 상기시켜 주는 훌륭한 훈장이 되기도 합니다. 그런 관점에서 바라보면 흉터는 일종의 축복이라 할 수 있습니다.
독서가 집어넣는 인풋이라면, 글쓰기는 꺼내는 아웃풋입니다. 독서를 많이 한 아이가 구슬 서 말을 가진 부자라면, 글을 쓰는 아이는 구슬을 꿰어서 목걸이로 만드는 장인과 같습니다.
- 김성효의《엄마와 보내는 20분이 가장 소중합니다》중에서 -
* 독서와 글쓰기의 중요성을 강조하는 엄마를 만나니 참 반갑습니다. 하다못해 자동차도 기름이 들어가야 굴러갑니다. 독서는 지식과 생각의 기름입니다. 다양한 타인의 생각, 다양한 타인의 경험을 통해 지식과 생각의 지평을 넓힐 수 있습니다. 하지만 이것을 글로 표현해 내지 못하면 의미가 없습니다. 독서와 글쓰기는 기술이고 무기입니다. 훈련을 해야 자기 것이 될 수 있습니다.
일, 관계, 사랑 그중 어떤 것이라도, 당신이 두려웠던 일을 다시 시작하든, 해 보기도 전에 두려운 일을 시작하든, 나는 당신의 그 '해 봄'을 응원합니다. 예상되는 두려움을 이겨 내는 당신의 그 해 봄. 예상되지 않는 두려움을 이겨 내는 당신의 그 해 봄. 어떤 의미로든 용기 내어 한 발 나아가 본다는 그 해 봄. 해 본다는 건, 그 행동만으로 꽤 값어치 있는 일이기 때문입니다. 그것이 성공으로 가건, 새로운 시련으로 다가오건.
- 정영욱의《잘했고 잘하고 있고 잘 될 것이다》중에서 -
* 세상이 좋아지고 따뜻한 이유도 당신의 해 봄 덕분이고, 세상이 아름답게 자라나는 것도 당신의 해 봄 덕입니다. 어떤 일은 굳이 일어나지 않더라도 '해 봄' 자체만으로 의미가 있고, 이미 기적이 일어난 것과 같으니. 당신의 그 해 봄을 응원합니다. 당신의 그 '해 봄', 그 '해 봄'. 말만으로도 푸른 새싹이 돋아날 것 같습니다.
ES6(ECMAScript 표준의 6번째 에디션, ECMAScript2015)에 대한 이야기를 하기 전에 자바스크립트와ECMAScript에 대한 것부터 간략히 소개한다.
넷스케이프(Netscape)에서 1995년 개발한 자바스크립트(javascript)는 웹 브라우저에서 동적인 기능을 제공하기 위한 언어다. 현재는 대부분의 브라우저에서 이 언어를 제공하고 있다. 그런데 표준 규격없이 여러 브라우저에서 독자적인 특성이 추가되면서 호환성 문제가 발생하기 시작했다. 이에 ECMA 국제 기구에서 “ECMAScript Standard”라는 표준을 만들게 되었다. 정확히 이야기 하자면 현재의 자바스크립트는 ECMAScript와 BOM(Browser Object Model)와 DOM(Document Object Model)을 포괄하는 개념이다.
개별적인 설명에 앞서 개발자가 필히 알아야 할 ES6 10가지 기능을 나열하자면 아래와 같다.
기본 매개 변수 (Default Parameters)
템플릿 리터럴 (Template Literals)
멀티 라인 문자열 (Multi-line Strings)
비구조화 할당 (Destructuring Assignment)
향상된 객체 리터럴 (Enhanced Object Literals)
화살표 함수 (Arrow Functions)
Promises
블록 범위 생성자 Let 및 Const (Block-Scoped Constructs Let and Const)
클래스 (Classes)
모듈 (Modules)
1. 기본 매개 변수 (Default Parameters)
var link = function (height, color, url) {
var height = height || 50
var color = color || 'red'
var url = url || 'http://azat.co'
...
}
함수에 넘겨주는 인자값에 대한 default 처리를 위해 위와 같이 처리 했었다면 ES6에서는 아래와 같이 간단히 처리할 수 있다.
var link = function(height = 50, color = 'red', url = 'http://azat.co') {
...
}
단, 주의해야 할 점이 있다. 인자값으로 0 또는 false가 입력될 때 두 예시의 결과는 다르다. ES5에서는||처리 시 0 또는 false 값이 입력 되어도 거짓이 되므로 기본값으로 대체된다. 하지만 ES6의 기본 매개 변수를 사용하면 undefined 를 제외한 입력된 모든 값(0, false, null 등)을 인정한다.
2. 템플릿 리터럴 (Template Literals)
ES5에서는 아래와 같이 문자열을 처리해야 했다.
var name = 'Your name is ' + first + ' ' + last + '.'
var url = 'http://localhost:3000/api/messages/' + id
하지만 ES6에서는 템플릿 리터럴을 제공하므로 "`" (back-ticked) 문자열 안에${NAME}라는 새로운 구문을 사용해서 아래와 같이 간단히 처리할 수 있다.
var name = `Your name is ${first} ${last}.`
var url = `http://localhost:3000/api/messages/${id}`
3. 멀티 라인 문자열 (Multi-line Strings)
ES5에서는 멀티 라인 문자열을 처리하기 위해 아래와 같은 방법들을 사용해야 했다.
var roadPoem = 'Then took the other, as just as fair,\n\t'
+ 'And having perhaps the better claim\n\t'
+ 'Because it was grassy and wanted wear,\n\t'
+ 'Though as for that the passing there\n\t'
+ 'Had worn them really about the same,\n\t'
var fourAgreements = 'You have the right to be you.\n\
You can only be you when you do your best.'
하지만 ES6에서는 "`" (back-ticked) 문자열을 이용해서 아래와 같이 간단히 처리할 수 있다.
var roadPoem = `Then took the other, as just as fair,
And having perhaps the better claim
Because it was grassy and wanted wear,
Though as for that the passing there
Had worn them really about the same,`
var fourAgreements = `You have the right to be you.
You can only be you when you do your best.`
4. 비구조화 할당 (Destructuring Assignment)
ES5에서는 구조화된 데이터를 변수로 받기 위해 아래와 같이 처리해야 했다.
// browser
var data = $('body').data(), // data has properties house and mouse
house = data.house,
mouse = data.mouse
// Node.js
var jsonMiddleware = require('body-parser').json
var body = req.body, // body has username and password
username = body.username,
password = body.password
하지만 ES6에서는 비구조화 할당을 사용해 아래와 같이 처리할 수 있다.
var {house, mouse} = $('body').data() // we'll get house and mouse variables
var {jsonMiddleware} = require('body-parser')
var {username, password} = req.body
주의할 점은 var로 할당하려는 변수명과 구조화된 데이터의 property명이 같아야 한다. 또한 구조화된 데이터가 아니라 배열의 경우{}대신[]를 사용해서 위와 유사하게 사용할 수 있다.
accountServiceES5ObjectCreate와 accountServiceES5는 동일하게 사용할 수 있으나 다른 구조를 가진다. accountServiceES5ObjectCreate는 accountServiceES5와 다르게__proto__에port와url속성을 가진 객체를 담고 있다.
화살표 함수가 한 줄의 명령문과 함께 사용되면 표현식이 되어 명령문의 결과를 암시적으로 반환한다.
ES5에서의 처리 예시.
var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map(function (value) {
return "ID is " + value // explicit return
});
ES6에서의 처리 예시.
var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map(value => `ID is ${value}`) // implicit return
여러 개의 인자를 사용하는 경우는 변수 목록을()로 감싸줘야 한다.
ES5에서의 처리 예시.
var ids = ['5632953c4e345e145fdf2df8', '563295464e345e145fdf2df9'];
var messages = ids.map(function (value, index, list) {
return 'ID of ' + index + ' element is ' + value + ' ' // explicit return
});
ES6에서의 처리 예시.
var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map((value, index, list) => `ID of ${index} element is ${value} `) // implicit return
또한 본문을 괄호로 감싸 객체 표현식을 반환할 수 있으며...을 이용해 가변 파라미터를 사용할 수도 있다.
var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map((value, index, ...abc) => ({v:value, i:index, a:abc}))
8. 블록 범위 생성자 Let 및 Const (Block-Scoped Constructs Let and Const)
let과 const는 중괄호("{}")로 정의된 블록으로 유효 범위(스코프)를 지정하는 새로운 var이다. 단, let은 변수를 const는 상수를 선언한다.
function calculateTotalAmount (vip) {
var amount = 0
if (vip) {
var amount = 1
}
{ // more crazy blocks!
var amount = 100
{
var amount = 1000
}
}
return amount
}
console.log(calculateTotalAmount(true))
위 예시의 결과는 1000 이다. var는 전역 또는 함수 내부로 유효 범위를 갖기 때문에 예시에 사용된 함수 내부의 "{}" 들은 아무런 역할을 하지 못한다. 아래는 위 예시에서 var를 let으로 바꾼 ES6 예시다.
function calculateTotalAmount (vip) {
var amount = 0 // probably should also be let, but you can mix var and let
if (vip) {
let amount = 1 // first amount is still 0
}
{ // more crazy blocks!
let amount = 100 // first amount is still 0
{
let amount = 1000 // first amount is still 0
}
}
return amount
}
console.log(calculateTotalAmount(true))
이 예시의 결과는 0 이다. let 으로 선언된 변수는 "{}" 블록 내부로 유효 범위가 한정되므로 100, 1000으로 할당된 변수는 해당 블록 내부에서만 유효하기 때문이다.if블록 내부에서 let으로 선언된 amount 또한 해당if블록 내에서만 유효하므로 아무런 변경이 일어나지 않는다.
아래의 예시는 const를 사용한 예시다. const는 상수를 선언하는 것으로 여러번 선언될 수 없지만 let과 같이 블록 내부로 유효 범위가 한정되므로 아래의 예시는 오류가 발생하지 않는다.
ES6는 확정되었지만 아직 모든 브라우저에서 완전하게 지원되지 않는다. 따라서 지금 당장 ES6 사용하고 싶다면Babel과 같은 컴파일러를 사용해야 한다. Babel은 독립 실행형 도구로 실행하거나 빌드 시스템에서 사용할 수 있다.Grunt,Gulp및Webpack용 Babel 플러그인이 있다.