Object (객체)


 

▽ 3.1 Object(객체)를 작성할 때는, 리터럴 구문을 사용한다.

// bad
const item = new Object();

// good
const item = {};

 : 객체는 new object(), Object.create(), literal표기법을 사용해 초기화할 수 있습니다. 여기서는 리터럴 표기법을 사용합니다.

 

 

▽ 3.2 동적 프로퍼티명을 갖는 오브젝트를 작성할 때, 계산된 프로퍼티명(computed property names)을 이용한다.

function getKey(k) {
  return `key named ${k}`;
}

// bad
const obj = {
  id: 5,
  name: "San Francisco",
};
obj[getKey("enabled")] = true;

// good
const obj = {
  id: 5,
  name: "San Francisco",
  [getKey("enabled")]: true
};

: 계산된 프로퍼티명은 JS Object의 프로퍼티 이름을 동적으로 설정할 수 있게 만들어주는 ES6의 기능입니다. 유효한 값을 반환하는 변수나 함수를 [대괄호] 안에 작성하여 객체의 프로퍼티를 동적으로 추가할 수 있습니다. 위 예시와 같이 변수 뿐 아니라 함수를 대괄호에 작성해 객체 프로퍼티를 추가할 수 있습니다. 이런 방식을 사용한다면 Object의 모든 프로퍼티를 한 블록 내에서 정의할 수 있습니다.

 

 

▽ 3.3 메서드의 단축구문을 사용한다.

// bad
const atom = {
  value: 1,

  addValue: function (value) {
    return atom.value + value;
  },
};

// good
const atom = {
  value: 1,

  addValue(value) {
    return atom.value + value;
  },
};

: 메서드 단축구문 또한 ES6에 도입되었습니다. 객체 초기자(initializer)에 메서드 정의를 위한 단축구문입니다. function은 메서드 정의에서 더 이상 필요없게 되었습니다.

 

 

▽ 3.4 속성의 단축구문을 사용한다.

const lukeSkywalker = "Luke Skywalker";

// bad
const obj = {
  lukeSkywalker: lukeSkywalker,
};

// good
const obj = {
  lukeSkywalker,
};

: 위 예시와 같이 객체의 속성값이 변수로 할당되었다면, 변수 이름만 적어주면 됩니다.

 

 

▽ 3.5 속성의 단축 구문은 오브젝트 선언의 시작 부분에 그룹화한다.

const anakinSkywalker = "Anakin Skywalker";
const lukeSkywalker = "Luke Skywalker";

// bad
const obj = {
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  lukeSkywalker,
  episodeThree: 3,
  mayTheFourth: 4,
  anakinSkywalker,
};

// good
const obj = {
  // 단축 속성 구문 - 시작
  lukeSkywalker,
  anakinSkywalker,
  // 단축 속성 구문 - 끝
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  episodeThree: 3,
  mayTheFourth: 4,
};

: 속성의 단축구문을 시작구문에 그룹화하면, 어떤 프로퍼티가 단축구문을 이용하고 있는지 알기 편합니다.


 (Airbnb와 다른 부분 시작)

 

▽ 3.6 속성명이 키워드(default, if, ...)일 경우에는 꼭 따옴표를 붙인다. 또한, -문자와 같이 속성명으로 지정할수 없는 경우에는 꼭 따옴표를 붙인다.

// bad
const bad = {
  foo: 3,
  default: 20,
  data-blah: 5
};

// good
const good = {
  foo: 3,
  "default": 20,
  "data-blah": 5,
  10: "naver"
};

 

 

▽ 3.7 hasOwnPropertypropertyIsEnumerableisPrototypeOf 와 같은 Object.prototype 메서드를 직접적으로 사용하지 않는다.

// bad
console.log(object.hasOwnProperty(key));

// good
console.log(Object.prototype.hasOwnProperty.call(object, key));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from "has";
// ...
console.log(has.call(object, key));

: JS에서 객체를 상속하기 위해 프로토타입 방식을 사용합니다. 한편,  hasOwnPropertypropertyIsEnumerableisPrototypeOf 와 같은 builtin 메서드는 객체에서 직접호출하거나 Object.prototype을 사용해 호출합니다. 3.7 항목은 Object.prototype를 사용해 호출할 때 직접적인 사용을 지양하도록 합니다. 직접적으로 사용할 경우 발생될 문제점은 다음과 같습니다.

  • Object.create(null) : null로 객체를 생성하면 Object.prototype을 상속받지 않습니다.
  • builtin 방식으로 제공되는 메서드는 키를 이미 가진 채로 제공되는데, 객체와 builtin 메서드에 같은 이름을 가진 키가 있다면 잘못된 결과를 반환할 수 있습니다.

 

▽ 3.8 얕은 복사(shallow-copy)를 하기 위해서 Object.assign보다는 spread 연산자(...)를 선호한다. 오브젝트에서 몇몇 속성을 제거한 새로운 오브젝트를 얻고자 할때는 rest 파라미터(...)를 사용한다.

// very bad
const original = { a: 1, b: 2 };
const copy = Object.assign(original, { c: 3 }); // this mutates `original`
delete copy.a; // so does this

// bad
const original = { a: 1, b: 2 };
const copy = Object.assign({}, original, { c: 3 }); // copy => { a: 1, b: 2, c: 3 }

// good
const original = { a: 1, b: 2 };
const copy = { ...original, c: 3 }; // copy => { a: 1, b: 2, c: 3 }

const { a, ...noA } = copy; // noA => { b: 2, c: 3 }

: JS에는 얕은 복사(Shallow-copy)와 깊은 복사(Deep-copy)가 있습니다. 

  • 얕은 복사 : 객체를 직접 대입함. 참조에 의한 할당. 원본과 복사본은 같은 데이터주소를 가지고 있어, 한쪽만 변경돼도 둘 다 변경된다.
  • 깊은 복사 : 새로운 객체의 프로퍼티만 복사. 원복과 복사본은 다른 데이터주소를 가지고 있다. 

Object.assign는 얕은 복사, spread는 깊은 복사(1depth 한정)가 이루어집니다. spread는 장황하지 않고, 네이티브 지원이 없는 환경에서도 폴리필이 필요하지 않습니다.(ex. BABEL)

 

naver github STYLE_GUIDE.md

 

 

Object 부분은 다른 컨벤션 부분보다 기초지식이 없으면 이해하기 어렵다는 생각이 들었습니다. 이 페이지에 나온 부분들은 추후 따로 다뤄보도록 하겠습니다. 다행이도 다음 Array부분부터는 좀 더 친숙한 부분이 많네요...ㅎㅎ

References


 이 부분은 변수 선언(참조)에 대한 내용입니다.

 

  2.1 변수 선언은 가급적 const를 사용하고, var는 사용하지 않는다.

//bad
var a = 1;
var b = 2;

//good
const a = 1;
const b = 2;

: const를 사용해야 참조를 재할당할 수 없으므로, 버그발생 및 코드난독을 해소할 수 있습니다.

 

 

 ▽ 2.2 참조를 재할당 해야된다면 var 대신 let을 사용한다.

//bad
var count = 1;
if (true) {
	count += 1;
}

//good, use the let!
let count = 1;
if (true) {
	count += 1;
}

 : let은 블록범위, var는 함수범위이기 때문입니다.

 

 

  2.3 let과 const는 선언된 블록 안에서만 존재하는 블록 스코프이다.

// const와 let은 선언된 블록의 안에서만 존재한다.
{
	let a = 1;
	let b = 1;
	let c = 1;
}
console.log(a);
console.log(b);
console.log(c);
//결과
ReferenceError
ReferenceError
1

 

 

naver github STYLE_GUIDE.md

 

사전지식

  • 데이터 타입에는 기본형(Primitive)과 참조형(References=Non-Primitive)이 있습니다.
  • JavaScript는 object를 제외한 모든 것이 Primitive한 성격을 가지고 있습니다.
  • Primitive type : 데이터의 실제 값을 할당합니다.
  • Reference type : 데이터의 위치 값을 할당합니다.

Primitives Type


  • data가 변수에 저장될 때, 고정된 크기(Byte)로 저장됩니다.
  • 변수 선언, 초기화, 할당 시 메모리 영역에 직접 접근합니다.
  • 종류는 string, number, boolean, null, undefined, symbol, bigint가 있습니다.
const foo = 1;
let bar = foo;

bar = 9;

console.log(foo, bar);

 ▽ 1.1 기본형은 그 값을 직접 조작한다.

//결과
1, 9

 

Reference Type (Complex)


  • data의 크기가 정해져 있지 않고, 변수에 할당될 때 데이터에 대한 참조만 저장됩니다.
  • 종류로는 object, array, function이 있습니다.

  1.2 참조형(Complex)는 참조를 통해 값을 조작한다.

const foo = [1, 2];
const bar = foo;

bar[0] = 9;

console.log(foo(0), bar[0]);
//결과
9, 9

 

naver github STYLE_GUIDE.md

로컬 서버
란? 내 컴퓨터에 프로젝트의 서버환경을 구축하는 것입니다.

 

로컬에서 웹페이지 개발 시, 테스트의 목적으로 아주 알맞으며 Front-End 현업에서 많이 사용됩니다.

 

node.js를 사용해 간단하게 로컬 서버를 구현할 수 있습니다.

 

먼저 node.js와 관련된 글을 읽고, 설치 후 이 글을 읽는 것을 추천드립니다.

 

해당 글 :  2022.11.01 - [etc/node.js] - [Node.js] 개념 및 설치방법(Mac OS)

 

[Node.js] 개념 및 설치방법(Mac OS)

Chrome V8 JavaScript 엔진으로 빌드된 [JavaScript 런타임] * 런타임 : 특정언어(JavaScript 등)가 동작할 수 있는 환경입니다. * 자바스크립트는 독립적 언어가 아닌 ‘스크립트 언어’입니다. 스크립트 언

hwon-da.tistory.com

 

NVM을 사용하여 로컬 서버 만들기


1. 먼저 VScode의 터미널을 열어 npm init -y를 입력합니다. 그러면 해당 디렉토리에 package.json 파일이 생성됩니다.

 

$ npm init -y

 

2. 그 뒤 다음 명령어를 실행시키면 package-lock.json 파일이 생성됩니다.

 

$ npm i parcel -bundler -D

(이 때 i = install 의 약어, -D = 개발의존성 패키지 설치의 약어입니다.)

 

3. package.json 파일의 script 부분을 다음과 같이 수정해줍니다. 각 뜻은 각주에 넣어놓았습니다.

(이 때 dist 폴더는 sㄷrc의 typescript 코드가 nodejs에서 작동하기 위해 javascript 코드로 컴파일된 결과물입니다.)

 

 

4. 해당 디렉토리에 index.htmlmain.js를 생성하고, 연결해줍니다. 연결이 잘 됐는지 확인을 위해 console.log 구문도 넣어봅니다.

 

 

5. index.html에서 터미널을 열고 다음 명령을 실행시킵니다. 그러면 http://localhost:1234 (로컬서버)가 생성되었습니다.

 

$ npm run dev

 

6. 직접 주소를 쳐서, 혹은 터미널의 링크에 마우스를 갖다대어 타고 들어갈 수 있습니다.

console.log의 내용도 잘 들어왔습니다.

 

 

 

VScode 라이브 서버 사용하기


 

1. index.html에서 마우스 우클릭을 하면, Open with Live Server 메뉴가 보입니다.

  Open with Live Server : 라이브 서버가 생성됩니다.

  Stop Live Server : 라이브 서버가 중단됩니다.

 

2. 또는 VScode 하단의 Go Live 버튼을 누르면 라이브 서버가 생성됩니다. 다시 누르면 중단됩니다.

 

VScode 라이브 서버의 포트번호는 5500으로 픽스됩니다.

 

라이브 서버는 간편하지만 현업에서 사용하지 않고, 주로 혼자 개발용으로 쓰는 경우가 많습니다.

 

 

 

 

 

'etc > node.js' 카테고리의 다른 글

npm은 또 뭐야? (mac에서 사용하기)  (2) 2022.11.09
[Node.js] 개념 및 설치방법(Mac OS)  (0) 2022.11.01

 git을 사용하는 이유는 버젼관리, 협업, 백업 등에 용이하기 때문입니다.

 

 한편, 공개 레파지토리에 커밋한 파일은 팀원뿐 아니라 불특정 다수에게 공개되기 마련입니다.

버전관리에 필요없는 파일이나 보안상 문제가 되는 파일, 특히 로그파일 또는 빌드 시스템이 자동으로 만들어낸 파일은 git에서 관리할 필요가 없어집니다.

 

 필요한 파일들만 git add 하면 되지 않느냐? -> 프로젝트를 진행하다보면 파일의 양이 워낙 방대해져 관리하기 힘들어집니다.

이러한 문제를 해결하기 위해 .gitignore 을 활용할 수 있습니다.

.gitignore 파일을 만들고 그 안에 무시할 파일의 패턴을 적어 파일을 untracking할 수 있습니다.

 

 

 

주의할 점 : git add 전에 .gitignore을 포함할 것.

위 그림과 같이 일단 Staged 된 파일은 무시할 수 없으므로, 해당 파일을 삭제하고 다시 올려야 한다.

 

.gitignore 적용하기


특징

  • 프로젝트의 최상위에 위치해야 적용됩니다.
  • 표준 Glob 패턴을 사용합니다. (정규표현식과 모양은 비슷하지만 다른 패턴, 추후 정리 후 링크)
  • 파일 내 # (우물정)로 시작하는 코드라인은 무시합니다.
  • 파일 내 / (슬래쉬)로 시작하면 하위 디렉터리에 적용되지 않습니다.
  • 파앨 내 / (슬래쉬)로 끝나면 해당 디렉터리를 적용합니다.
  • 파일 내 ! (느낌표)로 시작하는 패턴의 파일은 무시하지 않습니다.

 

적용 (먼저 github에 remote 된 레파지토리가 있는 환경)

NPM TEST 폴더 현재 상황

 

1. .gitignore 파일을 해당 디렉토리 내에 생성하고, 무시할 파일 목록을 작성합니다.

(현재 node_modules 폴더와 DS_STORE 파일을 무시할 예정입니다.)

 

 

2. $ git add . 로 파일들을 추가합니다.

 

 

3. $ git commit, $ git push origin master를 통해 레파지토리에 파일을 스테이징 합니다.

 

 

4. 결과물을 즐긴다. (node_modules와 DS_STORE는 트래킹하지 않는 것을 볼 수 있습니다.)

Node Package Manager
: 프로젝트를 효율적으로 관리하고, 손쉽게 기능을 고도화한다.

 

nvm을 깔면서 npm이라는 놈이 같이 깔리는 것을 보셨을까요?

npm은 또 무슨 놈일까요? 정말 간단하게 알아보겠습니다.

 

npm은 위의 설명과 같이 Node Package Manager로, 패키지 관리인이라고 볼 수 있습니다.

전 세계의 수많은 개발자들이 만든 다양한 기능들(Packages, Modules)을 관리하는 거죠.

현재 수 백만개의 패키지들이 npm 생태계를 이루고 있습니다.

이런 유용한 패키지들을 단순한 명령어

$ npm install [패키지명]

을 통해 내 pc에서 사용할 수 있습니다. (html에서 쓰던 <link>, <script> 안녕~)

 

 

 

사용법


1. 먼저 terminal을 열어줍니다.

 

2. 아래 명령어를 입력해줍니다.

$ npm init -y

 

3. 그러면 빨간 박스와 같은 내용이 뜨면서, 해당 폴더에 package.json 파일이 생성됩니다.

4. 이 package.json파일은 내 프로젝트에 관한 내용으로, 내가 직접 프로젝트 내용에 대해 관리할 수 있습니다.

* json 파일 : 경량화된 단순 DATA Format. {"String key" : "String Value"} 의 형태를 가진다.

 

5. 내가 필요한 패키지를 다음 명령어로 가져온다.

$ npm install [패키지명] -D

패키지를 가져오면, node_modules가 생성되고, package.json에 내가 필요해서 가져온 "parcel-bundler"가 생성된다.

이제 나는 parcel-bundler가 뭔 패키지인줄은 몰라도 쨌든 사용할 수 있다!

node_modules : parcel-bundler가 포함된 모듈 전체. ("너가 뭘 좋아할지 몰라서 다 가져왔어"의 느낌)
나중에 지워지더라도 $ npm install 로 다시 불러올 수 있다.
-D : 개발용 의존성 패키지 설치 -> 내가 개발용으로만 쓰고, 나중에 브라우저에는 필요없는 경우 사용
-d : 일반 의존성 패키지 설치 -> 개발용으로도, 나중에 브라우저에도 필요한 패키지인 경우 사용
package-lock.json : 내가 부른 패키지를 잘 사용할 수 있도록 자동으로 관리해주는 파일. package.json과 함께 지워지지 않도록 유의해야 함!

Chrome V8 JavaScript 엔진으로 빌드된 [JavaScript 런타임]

* 런타임 : 특정언어(JavaScript 등)가 동작할 수 있는 환경입니다. *

 

자바스크립트는 독립적 언어가 아닌 ‘스크립트 언어’입니다. 스크립트 언어는 필수적으로 동작가능하게 하는 프로그램이 요구됩니다. 웹 브라우저에서는 HTML/CSS/JS는 자유롭게 사용할 수 있습니다만 ... stylus, BABEL, EJS 등 여러가지 유용한 모듈(도구)를 사용하기에는 제약이 있습니다.

 

그래서 Node.js가 개발되었습니다. JavaScript가 웹브라우저로부터 독립할 수 있도록 말이죠!

Node.js는 한 가지 언어로 전체 Web page를 만들 수 있게 했습니다.

GitHub에서 JavaScript를 언어순위 1위로 만든 일등공신이라고도 할 수 있겠습니다.

 

Node.js의 특징

 

 1) 내장 HTTP 서버 라이브러리

 2) Non Blocking I/O

 3) 싱글 스레드(Single Thread)

 4) 이벤트 기반(Event-driven)

 

 

Node.js 설치방법


1. 직접 설치

 

2) 좌측 짝수버젼을 다운로드해서 실행시키면 끝

짝수버젼(LTS) : 안정적이고 신뢰도가 높습니다. (권장)

홀수버젼(최신) : 최신기술을 사용할 수 있지만 안정적이지 못하고 업데이트가 잦을 수 있습니다.

 

 

2. nvm을 사용하여 설치

 

 

nvm을 설치해 Node.js의 지속적인 버젼관리를 편리하게 할 수 있습니다.

1) Google에 nvm을 검색해 github.com 사이트에 접속합니다.
2) 해당 사이트 아래를 내려가다보면 보이는 Installing and Updating 를 클릭합니다.
3) 빨간 표시된 부분을 복사해줍니다.
4) VScode나 mac terminal에서 붙여넣고 Enter 누릅니다.

 

5) 해당 버젼이 뜨면 nvm 설치 끝
6) nvm install로 최신 버젼을 깔고, nvm ls로 현재 상태를 확인할 수 있습니다.

(nvm 사용 명령어)

$ nvm install 18.12.0
// 18.12.0 버젼 설치

$ nvm ls
// nvm 현재 상태 확인

$ nvm --version
// nvm 현재 버젼 확인

$ nvm use 12.14.0
// 12.14.0 버젼 사용 (협업 등을 위해 버젼 맞추기)

 

종류 장점 단점
벡터 (Vector) 확대/축소에서 자유로움, 용량 변화 없음 정교한 이미지(인물,풍경)는 표현하기 어려움
비트맵 (Bitmap) 정교하고 다양한 색상을 자연스럽게 표현함 확대/축소 시 계단현상 발생 (품질 저하)

벡터 이미지 종류

svg : 해상도의 영향에서 자유로움. 마크업 언어(html, XML)기반의 벡터 그래픽 표현(CSS/JS 제어 가능, 파일/코드 삽입 가능)

 

비트맵 이미지 종류

jpg     : 손실 압축 (24bit, 1600 색상), 품질/용량을 쉽게 조절

png    : 비손실 압축(8bit, 256색상 or 24bit, 1600 색상), Alpha Channel 지원(투명도)

gif      : 비손실 압축(8bit only), 여러 장의 이미지를 개의 파일로 담음(움짤, 애니)

webp : 손실 or 비손실. gif같은 애니메이션 지원, 구글이 개발 (지원하는 브라우저 확인!)

 

 

코딩 컨벤션(Coding Conventions) : 코드를 어떻게 표기할 것인지에 대한 규약 (a.k.a. 스타일 가이드)

 

 

 프로그래머마다 코드를 짜는 스타일은 다양합니다만, 나 혼자만의 프로젝트가 아닌 실무에서는 협업이 필수적입니다. 

여러 사람이 수천 줄의 코드를 짜고, 리뷰하고 보수합니다. 그런데 수백, 수천만의 사람이 어떠한 규칙도 없이 코드를 짜게 되면 어떻게 될까요? 

 

 사람들은 점차 유지보수와 코드리뷰에 어려움을 겪었습니다. 그래서 '코드를 이렇게 작성하자' 라는 취지로 질서를 만들기 시작했습니다. 현재는  변수 이름을 어떻게 작성해야 할 지부터 하다못해 중괄호의 위치 등 세세한 부분까지 합의된 가이드를 정립했고, 이를 코딩(코드) 컨벤션이라고 부르기로 했습니다. 물론 70억명이 되는 인구를 통합할 수 없기에 기업별로 조금씩 다른 부분은 있습니다. (그래서 좋은 기업의 가이드를 찾는 것이 좋습니다. 그리고 규칙을 무조건적으로 따를 것이 아니라 좋은 제안이라고 생각하는 자세가 필요합니다.)

 


 

 NAVER JS Convention
https://github.com/naver/eslint-config-naver/blob/master/STYLE_GUIDE.md
 

GitHub - naver/eslint-config-naver: Naver JavaScript Coding Conventions rules for eslint

Naver JavaScript Coding Conventions rules for eslint - GitHub - naver/eslint-config-naver: Naver JavaScript Coding Conventions rules for eslint

github.com

 NAVER는 한국 최고의 IT회사 중 하나이며, 코딩 컨벤션을 github에 공개하고 있습니다. 실제로 Airbnb의 가이드를 거의 따르고 있다고 명시해 놓았는데, Airbnb는 영어로 컨벤션을 제공하다보니 익히는 데 어려움이 있었습니다. 한국에서 자바스크립트를 공부한다면 NAVER 컨벤션을 공부해보는 것도 좋을 것 같다는 생각이 들었습니다.

 

 

앞으로 JS 컨벤션에 대해 해부해보겠습니다.

+ Recent posts