AWS EC2 – From Launch New Instance To Install Everything We Need

Simple Explanation Of Setting up AWS EC2(Ubuntu18.04)

1. Launch New Instance In AWS

On a EC2 Management Console page, launch instances and choose Ubuntu Server 18.04 LTS with adequate instance type.

I chose t2 micro Type and launched.

On the next page, click Edit security groups and open port 22, 80, 443 for the next step.

Before launch the instance, you should select an existing key pair or create a new one.

If you don’t have any, create a new one and download key pair.

You should keep that key pair safe and don’t let be exposed to anyone.

We need an elastic IP address(Non-change address) for our accessibility.

Elastic IP lasts forever even if you stop the instance unless you release the IP address.

EC2 -> Network & Security -> Elastic IPs -> Allocate Elastic IP address.

Associate Elastic IP address and Choose an instance to stick them together.

Half way there.

Now you have your own instance and elastic IP address.

Keep going.

2. Connect To The Server Using SSH Client

You can use any SSH Client whatever you want.

This time I chose XShell7 that is free for Home/School.

Put the IP address in Host textbox.

Go to Authentication, write User Name ‘ubuntu’ and check Method Public Key.

Click Connect.

Browse and select the key pair that we downloaded.

If you get this message, now you are in.

3. Install Nodejs On Ubuntu Server

$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -

$ sudo apt-get install -y nodejs

Execute line by line and when it’s done, we can check by ‘node -v’ command.

If node version(v14.18.2 or something) is printed, installation is done.

4. Install MongoDB On Ubuntu Server

$ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

If you see ‘OK‘ return with above command, you are ready for the next step.

$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

If you see ‘echo “deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse” | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list‘, move forward.

$ sudo apt-get update
$ sudo apt-get install -y mongodb-org

If you feel like something goes on a busy process, just wait.

When it’s done, check an installation with this command.

‘mongo -version’

Start mongodb service with this command.

$ sudo service mongod start

When successfully started, no message output.

$ mongo

> use admin

> db.createUser({ user:'id', pwd:'pwd', roles:[{"role":"userAdminAnyDatabase","db":"admin"},{"role":"readWriteAnyDatabase","db":"admin"}]})

exit

Have to change some codes for accessibility and security.

$ sudo vi /etc/mongod.conf

binIp : 127.0.0.1 -> bindIp: ::, 0.0.0.0

#security -> refer to above capture. no space before ‘enabled’ makes error.

save it!(‘wq’ command)

If you want to give a access try, use Compass with 27017 port opened.

5. Deploy(git clone)

Use Git, clone your project to your instance and install dependencies.

$ git clone https://github.com/id/repo

$ cd repo
$ npm install

6. Run Server With PM2

Install pm2 and run your own server.

pm2 makes your server keep running if you close the shell.

$ sudo npm install pm2 -g

$ sudo pm2 start index.js //in my case with arguement -> sudo pm2 start src/index.js --node-args="-r esm"

Now, your server won’t stop unless you stop the PM2.

You can check the PM2 status with below command.

$ sudo pm2 list

7. Install Nginx On Ubuntu Server

Nginx has additional functions that Nodejs do not have.

Simply in two ways, security and load balancing.

$ sudo apt-get install nginx

We opened port 80 for Nginx access.

When Nginx works, clients come in through Nginx door and Nginx leads them to internal port.

$ sudo service nginx start

When Nginx started, access it with your ip address.

Like http://3.34.65.190

Nginx welcomes you if you are on right process.

Now, Change some codes as below with vi editor to complete Nginx work.

$ cd /etc/nginx/sites-enabled

sudo vi default

Comment out try_files $uri $uri/ =404; and add

    proxy_pass http://yourIP:port/;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass takes clients to internal port that you set on Nodejs.

In my case, http://3.34.65.190:4000/;

Save it.

Next step is set a size limitation.

Nginx’s default file size setting is 1MB.

But if your page handles bigger than 1 MB files upload or download, this setting is necessary.

$ sudo vi /etc/nginx/nginx.conf
client_max_body_size 10M(limit size that you want);

Now, restart Nginx.

sudo service nginx restart

Now you can access you page that you made.

8. SSL certificate with Let’s Encrypt(http ->https)

Using Route53 service, get a own domain and manage DNS.

Redirect to your IP address and when you have your own domain, you can get a SSL certification with Let’s Encrypt for free.

$ sudo add-apt-repository ppa:certbot/certbot

$ sudo apt install python-certbot-nginx

$ sudo certbot --nginx -d yourdomain.com

Follow the direction, and then your web can get a SSL certification and https protocol is available.

The direction is simple.

1. enter your email address

2. Agree

3. Yes(or No)

4. choose No.2 (redirect http to https option)

And that’s it.

Important thing for the last step is opening the port 443.

Port 443 is a port for https.

Restart Nginx and access with your domain address.

Automatically https will welcome you.

Every 90 days, certification renewal is required and below is the command.

$ sudo certbot renew --dry-run

AWS : aws.amazon.com

Nodejs에서 배치(Batch) 기능 사용하기(node-schedule)

예정된 시간에 작업을 수행하는 node-schedule

별도의 SQL문을 사용해 배치(Batch) 기능을 사용하던 것과 비교하면 정말 편하게 프로그래밍이 가능하도록 도와주는 라이브러리입니다.

배치 기능을 사용할 수 있는 대표 라이브러리는 크게 3가지(Agenda, node-cron, node-schedule)이며, 인기는 다음과 같습니다.

  1. Agenda (2021/12/22 기준 주간 다운로드 수 56,319)
  2. node-cron(2021/12/22 기준 주간 다운로드 수 219,168)
  3. node-schedule(2021/12/22 기준 주간 다운로드 수 507,675)

필요한 기능이 동일하다면 사용자가 많은 쪽이 관련 정보도 얻기 쉬우므로 node-schedule을 사용해보겠습니다.

npm install node-schedule

설치 후 해당 라이브러리를 import합니다.

import schedule from 'node-schedule';

그리고 서버를 가동하면 바로 실행될 수 있도록 index.js에 실행 함수를 넣어주면 됩니다.

실행될 조건(시간 또는 반복 주기)을 넣어주면 해당 조건에 맞춰 함수를 실행합니다.

const regularExec = schedule.scheduleJob('0 0 12 * * *', ()=>{ // 매일 낮 12시 정각마다 실행

    sendCheckDataEmail();

})

위 함수는 매일 낮 12시마다 실행됩니다.

scheduleJob의 첫 번째 파라미터의 값은 다음과 같습니다.

*는 all과 값은 의미이며, 각 파라미터의 사이에는 빈칸을 넣어줍니다.

초를 넣는 부분인 second 에 *를 넣으면 모든 초마다 실행하라는 의미가 됩니다.

따라서 minute에 5, second에 *을 넣으면 5분00초부터 5분59초까지 함수가 총 60번 실행됩니다.

주기를 설정하는 방법도 있는데요.

second에 */5로 표기하면 초 단위를 5초 단위로 쪼갭니다.

따라서 5초에 한 번씩 실행하라는 의미가 됩니다.

취소는 cancel 메소드를 사용하면 됩니다.

regularExec.cancel();

유의할 점은 서버가 실행 중일 때만 해당 스케쥴러가 작동하며, 멀티프로세스를 가동하는 경우 중복으로 실행되지 않도록 별도의 설정을 해주어야 합니다.

그럼 서버가 열심히 일하도록 스케쥴러 기능을 요긴하게 사용해 주세요!

Nginx와 AWS S3, 왜 큰 용량은 업로드가 안돼?(413 Request Entity Too Large, React, Koa)

Nginx 업로드 용량 제한 설정이 필요한 이유

React, Koa를 사용하고 Nginx를 거쳐 파일 업로드 진행하는 프로세스에서 프론트와 백엔드에서 각각 파일 크기를 체크한 뒤 AWS S3에 저장을 진행하도록 하였으나 다음과 같은 에러가 발생하는 경우가 있습니다.

이미 파일 크기 체크를 진행하고 업로드한 파일이 용량 문제로 에러가 발생한다니 이건 뭐지 싶지만 답은 Nginx에 있습니다.

Nginx는 큰 용량의 파일을 대량으로 업로드하는 서버 공격을 막고자 기본 전송 용량 설정이 1MB로 되어 있습니다. 따라서 1MB 이하의 파일을 한번 업로드해보면 바로 해결의 실마리를 찾을 수 있습니다.

위와 같이 1MB 이하의 파일은 아주 잘 올라갑니다.

설정을 위해 커맨드에서 아래와 입력합니다.

# sudo vi /etc/nginx/nginx.conf

nginx.conf 내부 http 부분에서 client_max_body_size로 설정을 진행합니다.

기본값은 1MB이며, client_max_body_size는 기본적으로 명시되어 있지 않으므로 별도로 입력이 필요합니다.

아래와 같이 http{ } 내부에 client_max_body_size와 원하는 용량을 함께 기입해주고 Nginx를 재시작합니다.

50MB로 설정해두고, Nginx를 리셋해 보겠습니다.

# sudo service nginx reload

다시 업로드해보면 이제는 1MB 이상의 파일도 문제 없이 업로드 되는 것을 확인할 수 있습니다.


참고자료 : https://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/

엑셀과 인코딩(UTF-8)의 싸움, 이젠 끝내기로 해(feat.몽고MongoDB와 날짜 처리)

엑셀 인코딩 문제를 해결하고, mongoDB에 깔끔하게 저장하는 방법

주로 csv 형식의 파일을 열거나 하나의 프로그램에서 다른 형식의 문서를 불러오면 아래와 같은 문자를 만나는 경우가 있습니다.

�����������Ǹ�

.<-9xH#,;}<:@O,A& 8q,;

이는 문자 인코딩에서 발생하는 문제로, 영어로 썼는데 프랑스어로 해석하는 것과 비슷하다고 보시면 될 것 같습니다.

인코딩 문제는 주로 비알파펫(非 ALPHABET) 언어를 사용하는 곳에서 자주 발생합니다.

컴퓨터에서 처음 문자가 사용될 때는 한 문자 당 1바이트를 사용하는 알파벳만 지원되었으므로 이 때는 문자 인코딩이고 뭐고 할 게 없었습니다.

그러나 차츰 컴퓨터의 사용 영역이 넓어지고 컴퓨터에서 처리할 수 있는 데이터도 늘어나자 다른 언어를 지원하기 위한 방법이 연구되었고, 그 결과 다양한 문자 인코딩이 탄생하였습니다.

한글과 관련한 인코딩만 찾아봐도 아래와 같이 다양합니다.


ASCII(American Standard Code for Information Interchange)

-7bit로 구성되며, 128개의 영문자를 표현

ANSI(American National Standard Institute)

-8bit로 구성되며, 256개의 문자를 표현

EUC-KR(Extended Unix Code – Korea)

-16bit로 구성되며, 글자 하나하나에 부여된 코드를 사용. 중국어, 일본어, 한국어 등의 표현에 사용

CP-949(Code Page 949)

– Windows의 코드 조합으로 EUC-KR의 확장

UTF-8(Universal Coded Character Transformation Format 8 bit)

– 가변 길이 문자 인코딩으로 1~4바이트까지 사용. 우리가 원하는 그것.


위와 같이 다양한 방식을 사용해 문자를 표현하고 있습니다.

하지만 우리를 화나게 하는 것은 엑셀에서 csv로 내보낸 파일을 다른 프로그램(또는 DB)에서 불러오려고 하면 ‘???????’ 라고 표현하는 그것일 것입니다.

원인을 살펴보면, 해당 문제를 겪는 대부분은 Windows + 엑셀의 조합일텐데요.

Windows는 기본적으로 CP-949로 인코딩을 하지만 읽는 프로그램은 UTF-8을 사용하다 보니 주로 발생하는 문제입니다.

따라서 인코딩 시 UTF-8로 내보내기만 하면 문제는 해결되지만 Windows는 쉽게 UTF-8로 바꿔주려고 하지 않습니다…

그래서 엑셀로 내보내는 csv 파일을 UTF-8로 변환하는 방법에 대해 알아보겠습니다.

위와 같은 데이터를 가진 엑셀 친구를 UTF-8 형식으로 만들어 보겠습니다.

먼저 저 친구를 그냥 csv로 내보내기를 하면 Windows에서 지정한 인코딩 형식으로 내보내기가 됩니다.

확인해볼까요?

엑셀 2010을 사용해 테스트를 진행해보겠습니다.

다른 설정 없이 위와 같이 CSV 형식으로 다른 이름으로 저장을 하고 mongoDB에서 가져오기를 하면 다음과 같이

‘알아듣게 얘기하라’는 식의 반응을 보입니다…

그럼 이제 엑셀에서 인코딩 형식 지정하여 내보내기를 해보겠습니다.

저장 시 위와 같이 [도구-웹 옵션]으로 들어가면

이렇게 친절하게 [인코딩] 탭에서 인코딩 형식의 지정이 가능합니다…..만

파일명을 test(set).csv로 저장해보았습니다.

하지만 mongoDB에서 위 파일을 불러오면

mongoDB가 왜! 뭐! 라고 하는 것 같습니다.

엑셀에서 인코딩 형식을 지정해도 제대로 반영이 되지 않는 것 같습니다.

물론 최신 엑셀에는 ‘csv 내보내기(UTF-8)’과 같은 방식의 확장자 유형의 선택이 생겼으나 현재는 엑셀 최신 버전이 없어 서 테스트가 불가하므로… 다음.

여기서는 다른 방식으로 인코딩 형식을 변경해 보도록 하겠습니다.

엑셀로 저장한 csv를 메모장으로 불러옵니다(엑셀 파일이 아닌 csv 파일입니다).

메모장에서 ‘다른이름으로 저장’을 선택하여 아래와 같이 인코딩을 UTF-8로 변경해줍니다.

csv 파일 형식은 유지해야 하므로 파일 형식은 모든 파일(*.*)로 변경해주고 파일 이름의 확장자에는 .csv를 유지합니다.

그리고 다시 한번 mongoDB에서 조우를 해보겠습니다.

더이상 반항하지 않습니다.

하여, IMPORT를 눌러보면!

문맹은 벗어났으나….

이제는 날짜를 못 알아먹네요.

날짜도 입맛에 맞게 맞춰주겠습니다.

먼저 날짜를 모두 선택하고 ‘.’으로 구분된 기호를 ‘/’로 변경해줍니다.

CTRL + H를 사용합니다.

변경 후 해당 칼럼(또는 해당 셀)을 날짜 형식으로 변경해줍니다.

DB에 저장될 타입을 Date로 변경해줍니다.

그리고 마지막으로 기회를 한번만 더 주겠습니다.

그리고 IMPORT!

더 이상 반항을 하지 않는 착한 데이터를 표현합니다.

위 날짜 데이터는 toLocaleDateString()과 같은 자바스크립트 함수로 깔끔하게 정리해주면 이쁘게 출력이 가능합니다.

그럼 더 이상 엑셀과 인코딩으로 스트레스 받지 않기를 바랍니다.

peace!

자바스크립트, 문자열 함수 마음대로 다루기(Javascript works with string)

Javascript String Methods : slice(), substring(), includes(), startsWith(), trim(), replace()…….

프론트엔드(React, Vue, Angular)와 백엔드(Node.js)가 모두 자바스크립트를 사용하는 시대에 들어서니 자바스크립트의 기초가 몇 배는 더 중요해진 것 같습니다.

자바스크립트의 문법 중 문자열(String) 관련 함수는 참 쓸 일이 많으면서도 가볍게 여겨져 쉽게 외워지지 않는 슬픈 함수 중 하나인 것 같습니다.😢

문자열 관련 함수는 한 번 외워두면 반복 학습할 일이 많으므로 첫 단추만 잘 꿰면 될 것 같습니다.

그럼 문자열 관련하여 사용 빈도가 높은 함수인 slice(), substring(), includes(), startsWith(), trim(), replace(), indexOf(), test() 함수에 대해 알아보겠습니다.


slice 함수는 위치(인덱스)를 매개변수로 전달하여 원하는 문자열을 추출합니다.

시작 위치(필수)와 종료 위치(옵션)를 전달하며, 시작 위치만 전달하는 경우 시작 위치부터 문자열 끝까지 추출합니다.

0은 순방향으로 첫 번째(앞에서 1번 째), 음수인 -1은 역방향으로 첫 번째(뒤에서 1번 째)를 나타냅니다.

const myWord = 'primavera';

myWord.slice(0,5);   // 'prima'
myWord.slice(-4);    // 'vera'
myWord.slice(3);     // 'mavera'

myWord.slice(3,1);    // '' -> slice함수는 시작인덱스가 종료인덱스보다 크면 빈 값을 반환

substring 함수도 slice와 마찬가지로 위치(인덱스)를 매개변수로 전달하여 원하는 문자열을 추출합니다.

기본적인 작동 방식은 같으나 slice와 달리 시작인덱스가 종료인덱스보다 큰 경우에는 자동으로 두 값의 위치를 변경하여 함수를 실행합니다.

또한 substring은 매개변수에 음수를 넣으면 이 값을 0으로 인식합니다.

따라서 (3, -1)을 전달하게 되면 (3, 0)으로 인식합니다. (3, 0)은 시작 인덱스가 더 크므로 위치를 변환하여 (0, 3)의 값을 계산한 결과를 반환합니다.

함수명이 비슷한 substr의 경우 ‘위치’와 ‘추출할 문자의 수’를 파라미터로 전달하는 함수입니다.

const myWord = 'invierno';

myWord.substring(3);     // 'ierno'
myWord.substring(1,3);   // 'nv'

myWord.substring(3,1);   // 'nv' -> 시작이 종료인덱스보다 크면 자동으로 위치 변경 후 함수를 실행

myWord.substring(3,-1);  // 'inv' -> 음수는 0, 시작인덱스와 종료인덱스는 위치 변경 후 계산

myWord.substring(-4);    // 'invierno' -> 음수는 0, 시작인덱스만 전달하여 0부터 끝까지 계산

myWord.substr(1,3);      // 'nvi' -> 시작인덱스 1부터 문자 3개를 추출

includes 함수는 지정한 문자열의 포함 여부를 확인합니다.

매개변수로 문자열(필수)과 위치인덱스(옵션)를 전달하며, 반환값은 true 또는 false 입니다.

문자열 내 지정 문자열 확인은 물론 배열 내 빈 값을 확인하는 용도로도 사용할 수 있습니다.

const myWord = 'alegria';

myWord.includes('le');       // true
myWord.includes('i');        // true
myWord.includes('rio');      // false

const myArray = ['dream','','king'];
myArray.includes('');       // true   -> myArray[1]이 빈 값이므로 true. 배열 내 빈 값을 찾는 용도
myArray.includes('dream');  // true   -> myArray[0]의 값과 일치
myArray.includes('drea');   // false  -> 배열 내 값과 정확하게 일치하는 경우에만 true를 반환

startsWith 함수도 문자열의 포함 여부를 확인하는 함수라고 볼 수 있습니다.

startsWith와 함께 문자열만 전달하면 0 인덱스부터 시작하여 해당 문자열의 존재 여부를 확인하여 BOOLEAN 값을 반환합니다.

마찬가지로 endsWith는 끝나는 문자열을 비교합니다.

const mySentence = 'cafe con leche';

mySentence.startsWith('cafe');     // true
mySentence.startsWith('fe');       // false
mySentence.startsWith('fe',2);     // true

mySentence.endsWith('eche');      // true

trim 함수는 문자열 양 끝의 공백을 제거하는 함수입니다.

문자열 변환 과정이나 실수로 보이지 않는 공백을 삽입하게 되면 문자열 비교 시 겉으로는 동일하지만 결과는

false를 반환하므로 이 trim 함수를 사용하면 문제를 해결할 수 있습니다.

문자열 양 끝의 공백, 탭, 줄바꿈 문자(/n)를 제거하며, 문자열 양 끝이 아닌 부분에는 효과가 없습니다.

const mySentence = '  la casa de papel   ';

mySentence.trim();        // 'la casa de papel'

const mySentence = ' el amor \n';

mySentence.trim();       // 'el amor'

replace 함수는 문자열에서 변경할 기존문자를 찾아 변경문자로 변경합니다.

문자열에서 매개변수로 전달한 기존문자가 여러 개 존재하는 경우 첫 번째로 탐색한 문자열만 변경합니다.

예를 들어, ‘my_name_is_Ron’에서 ‘_’문자를 모두 공백으로 변경하기 위해 replace(‘_’,’ ‘) 함수를 사용해도 결과는 ‘my name_is_Ron’이 반환됩니다.

따라서 문자열에서 해당하는 문자를 모두 변경하고 싶은 경우에는 정규표현식을 사용하면 됩니다.

정규표현식 관련 포스트

const mySentence = 'my name is:Ron';

mySentence.replace(':',' ');        //'my name is Ron'

const mySentence = 'my_name_is_Ron';

mySentence.replace('_',' ');      // 'my name_is_Ron'

//정규표현식 사용해서 모든 문자 변경하기
mySentence.replace(/_/g, ' ');    // 'my name is Ron'

indexOf 함수는 전달하는 문자의 위치를 반환합니다.

이 기능은 원하는 문자열의 앞 또는 뒤에서 문자열을 자를 때 유용하게 사용할 수 있습니다.

예를 들어, ‘Z001-03’이라는 문자열에서 뒤의 ’03’만 추출하고 싶은 경우 indexOf로 ‘-‘ 문자열의 위치를 찾고 해당 위치의 +1 위치부터 끝까지 문자열을 잘라내면 원하는 값을 가져올 수 있습니다.

만약 같은 문자가 여러 개 존재하는 경우 첫 번째 문자의 위치를 반환하며, 두 번째 매개변수에 시작 위치를 전달하면 시작 위치부터 검색을 시작합니다(시작 위치를 전달하더라도 반환 값은 전체 문자열에서 몇 번째인지를 전달합니다).

뒤에서부터 검색을 시작하는 함수는 lastIndexOf이며, 뒤에서부터 첫 번째로 나오는 문자의 위치를 반환합니다(반환 값은 해당 문자가 앞에서부터 몇 번째인지를 반환합니다).

전달하는 문자가 존재하지 않으면 -1을 반환합니다.

const mySentence = 'Z001-03';

mySentence.indexOf('-');     // 4

mySentence.substring(mySentence.indexOf('-')+1);    // '03'

mySentence.indexOf('D');    // -1

const mySentence = 'Z001-03-02';

mySentence.indexOf('-');    // 4
mySentence.indexOf('-', 5);   // 7

mySentence.lastIndexOf('-')   // 7

test 함수는 정규표현식과 함께 사용하여 매개변수로 전달하는 문자열의 유효성을 확인합니다.

비밀번호에 알파벳, 특수문자 등 포함여부 확인이나 생년월일 형식에 알파벳 등 불필요한 문자의 포함 여부를 효과적으로 확인할 수 있습니다.

const mySentence = /a/;
const myWord = 'baby';

mySentence.test(myWord);   // true

/\d/.test('cookie');       // false \d는 숫자(0~9)를 나타내는 정규표현식
/\d/.test('cookie1');      // true

const typedError = /[ㄱ-ㅎㅏ-ㅣ]/gi;
const inputData = '김ㅊ치와 나물';

typedError.test(inputData);    // true 

이 외에도 다양한 함수들이 많고 또 여러 요구에 맞춰 새롭고 편리한 함수가 계속 나오기 때문에 끊임없는 관심과 업데이트 관련하여 모니터링이 필요할 것 같습니다.

깃허브(Github) PUSH와 Personal Access Token 문제 해결하기

Support for password authentication was removed on August 13, 2021. 에러

깃허브의 정책 변경으로 인해 8월 13일부터는 개인 액세스 토큰을 사용해야 푸시(PUSH)가 가능하도록 변경이 되어

설정하는 방법을 간략하게 알아보겠습니다.


1. 토큰 발급

vscode에서 푸시를 진행하면 8월 13일 이후로는 위와 같은 에러 메시지와 함께 토큰을 사용하라는 에러가 발생합니다.

토큰 발급은 다음 페이지에서 진행합니다.

https://github.com/settings/tokens

접속하여 Generate new token 클릭

위 페이지에서 Note, Expiration, Select scopes 항목을 선택하면 됩니다.

Note는 토큰 설명, Expiration은 만료 기간, Select scopes는 범위를 지정합니다.

기본적인 범위만 지정하고 싶은 경우 Select scopes는 repo만 체크하면 됩니다.

위 세 항목 작성 및 체크 후 Generate token을 클릭합니다.

토큰이 생성되면 위와 같이 확인할 수 있으며, 생성된 토큰은 홈페이지에서 재확인할 수 없으므로 복사해두고 사용하시면 됩니다.


2. 자격 증명 설정하기

발급 받은 토큰을 윈도우의 자격 증명에 설정하면 작업이 완료됩니다.

윈도우에서 자격 증명 관리자를 실행합니다.

Windows 자격 증명을 선택하면 아래와 같이 github 자격 증명을 확인할 수 있습니다.

위와 같은 형식으로 된 부분을 선택하여 편집을 클릭합니다.

위에서 발급 받은 토큰을 복사하여 암호 부분에 붙여넣기 및 저장하면 작업이 완료됩니다.


CSS Combinators, make your CSS works easier (+,~, ,>)

Four combinators [Adjacent Sibling(+), General Sibling(~), Child(>), Descendant( )]

When set CSS Styles, below syntax is a basic.

h1 {
  color:#FFFF11;
  background: #000000;
}

.subTitle {
  font-size:13px;
  color:#FFFFFF;
  font-family:inherit;
}

#timeLine {
  background:gray;
}

But when you want to set Styles to a specific tag, using combinators is a smart selection.

combinators are mixed Styles. like ‘div + h1’ or ‘div > span’.

Any tags are mixable and there are four combinator types.

  • Adjacent Sibling (+)
  • General Sibling (~)
  • Child (>)
  • Descendant ( space )

1. Adjacent Sibling (+)

Adjacent Sibling uses + mark when specifies one element right after designated element.

h1 + p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm h1 tag</h1>
  <p>I'm orange</p>
  <h2>I'm h2 tag</h2>
  <p>I'm a second p tag</p>
  <h1>I'm h1 tag again</h1>
  <p>I'm orange too</p>
<div>

There are two conditions for adjacent sibling.

Element should share the same parent and second element has to come only if right after first element.

In the above HTML result, there are three <p> tag lines but only two lines are matched to the condition.

Therefore only two matched elements are working as mentioned.

2. General Sibling (~)

General Sibling uses ~ mark when specifies elements come after designated element.

h1 ~ p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm h1 tag</h1>
  <p>I'm orange</p>
  <h2>I'm h2 tag</h2>
  <p>I'm orange too</p>
<div>

There are two conditions for general sibling.

Element should share the same parent and second element has to come after first element.

In the above HTML result, every <p> tag after <h1>tag is working.

3. Child (>)

Use > marks when express child elements.

div > p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm just h1 tag</h1>
  <p> I'm colored orange</p>
  <span>
    <p>I'm not the one</p>
  </span>
  <p> I also am colored orange</p>
</div>

Second element has to be a direct child of first element.

In the above HTML result, only two direct child lines are working.

Fifth line is not working because its position is parent-child-child.

4. Descendant

Use space when express descendant elements.

div p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm just h1 tag</h1>
  <p> I'm colored orange</p>
  <span>
    <p>Count me in</p>
  </span>
  <p> I also am colored orange</p>
</div>

As long as second element is a descendant of the first element, every matched line is working.


Combinators are easy and simple for efficient CSS work.

I hope this post is helpful to your CSS design.

쉽고 빠른 정규표현식(Easy Regular Expression, regex)

정규표현식(Regular Expression)의 구성과 의미, 자바스크립트에서 사용하기

정규표현식(Regex)은 검색 패턴을 지정하여 기호로 표시한 것입니다.

이 개념은 미국의 수학자인 Stephen Cole Kleene가 1950년대에 정의한 정규 언어(Regular Language)와 관련이 있으며, 정규표현식 문법은 1980년대 Perl에서부터 사용되기 시작했습니다.

주로 검색 또는 치환 작업에 사용되며, 현재 대부분의 프로그래밍 언어에서 정규표현식을 지원하거나 라이브러리를 통해 사용할 수 있습니다.

예를 들어 다음 문장에서 특정 조건에 따른 검색을 진행하고자 할 때, 정규표현식을 사용할 수 있습니다.

The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.

  • too를 찾고자 할 때 -> /too/
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
  • 대소문자 구분 없이 t를 모두 찾고자 할 때 -> /t/-gi
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
  • d로 시작하는 단어 및 문자를 모두 찾고자 할 때 -> /[d]\w+/-gi
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.
  • ea가 들어가는 단어를 찾고자 할 때 -> /[a-z]*ea[a-z]*/-i
    The greatest danger for most of us is not that our aim is too high and we miss it, but that it is too low and we reach it.

다음 사이트를 이용하면 의도한 대로 정규표현식이 작성되었는지 확인할 수 있어 매우 유용합니다.

regexr.com

Expression 아래에 식을 삽입하고, 그 아래 상자에는 검색 대상이 될 텍스트를 입력하면 됩니다.

그럼 먼저 표현식이 나타내는 의미에 대해 알아본 뒤, 자바스크립트에서 편리하게 사용하는 방법을 확인해 보겠습니다.


1. 정규표현식 기호의 종류

  • / . / → 모든 문자
  • / + / → 하나 이상의 문자
  • / ? / → 0 개 또는 1개의 문자
  • / ^ / → 해당 문자를 제외
  • / / → 범위 지정
  • / * / → 0 개 또는 1개 이상의 문자
  • / [ ] / → 집합 구성
  • / { } / → 반복 횟수 지정
  • / \ / → 이스케이프 문자
  • / \d / → 모든 숫자
  • / \D / → 숫자가 아닌 문자
  • / \w / → 알파벳, 숫자, 밑줄_ 문자
  • / \W / → 알파벳, 숫자, 밑줄_이 아닌 문자
  • / \s / → 공백 문자
  • / \S / → 공백이 아닌 문자
  • / \n / → 줄 바꿈 문자

정규표현식의 가장 기본이 되는 기호와 의미는 위와 같으며, 위 기호의 사용법만 익힌다면 정규표현식의 기본적인 이해는 가능할 것입니다.

그럼 각 기호의 사용 예제를 통해 사용법을 익혀보도록 하겠습니다.


2. 기호의 의미

정규 표현식에서 가장 기초가 되는 부분이므로 외워두면 유용하게 사용할 수 있습니다. d는 숫자, w는 영문자, 숫자, _, s는 공백, n은 줄바꿈을 의미하며, 각 단어의 대문자는 NOT(반대)을 의미합니다.

  • 숫자가 한 번 이상 반복되는 문자 검색 👉 / [\d]+ /
  • 숫자가 아닌 문자 검색(공백 포함) 👉 / [\D] /
  • 괄호가 포함된 문자, 숫자 검색 👉 / \([\w]+\) /
  • 영문자, 숫자, _ 가 아닌 문자 검색 👉 / [\W]+ /
  • 공백을 검색 👉 / \s /

regexr.com에 검색할 대상이 되는 문장을 붙여 넣거나 직접 작성한 뒤 원하는 패턴으로 표현식을 직접 만들어보면 정규 표현식에 금방 익숙해질 수 있습니다.


이스케이프란 무엇일까요? 키보드 왼쪽 상단에 있는 ESC 버튼이 이스케이프의 약자입니다. 바로 벗어나다는 뜻인데요.

여기서는 기존에 지정된 약속에서 벗어난다는 뜻으로 보면 됩니다.

예를 들어서 .(마침표, dot)의 경우 모든 문자를 의미하는 뜻으로 사용됩니다.

하지만 때로는 글자 그대로 마침표 기호를 의미하고 싶은 경우도 있는데요. 이 때 이스케이프 문자를 사용하면 ‘우리 약속했던 것에서 벗어나자’는 뜻으로 사용할 수 있습니다.

  • 모든 문자를 의미. a, b, c, d, ?, !, @, , 등 모든 문자 중 하나를 의미 👉 / . /
  • 오직 .(마침표)만을 의미 👉 / \. /
  • 하나 이상의 문자를 의미 👉 / + /
  • 오직 +(플러스)만을 의미 👉 / \+ /

이스케이프는 매우 유용한 필수 기능이므로 이스케이프가 필요한 문자를 확인해 둘 필요가 있습니다.


정규 표현식에서 특정 기호는 특별한 의미를 갖습니다. 대표적인 기호의 사용법은 다음과 같습니다.

  • 소문자 a~z 또는 대문자 A~Z 내 일치하는 영문자 검색 👉 / [a-zA-Z] /
  • color 또는 colour를 검색(u가 있어도 되고 없어도 됨) 👉 / colou?r /
  • a를 포함하는 단어 검색 👉 / [\S]*a[a-zA-Z]* /
  • a-z 또는 공백(space)이 아닌 문자 검색 👉 / [^a-z ] /
  • 영문자로 시작하여 반드시 숫자 또는 특수 기호를 포함하는 문자열 검색 👉 / [a-zA-Z]+[\d!@#\$%\^*]+[\w]* /

중괄호는 반복 횟수를 지정하며, 이를 사용하면 검색 패턴의 상세한 지정이 가능합니다.

중괄호에 하나의 숫자를 넣으면 전체 반복 횟수를 의미하며, 두 개의 숫자는 시작과 끝의 범위를 의미합니다.

예를 들어 {3}이면 패턴을 3번 반복하라는 의미를 가지며, {1, 3}은 범위 구간이 1에서 3까지임을 의미합니다.

{1, }과 같은 표현도 가능하며, 이는 + 기호와 같은 의미, 즉 하나 이상이라는 의미를 갖습니다.

  • A가 3번 반복되는 문자를 검색 👉 / [A]{3} /
  • 3자리 이상인 숫자를 검색(3번 이상 반복) 👉 / [\d]{3,} /
  • A가 2번에서 3번 반복되는 문자를 검색(반복 범위 지정) 👉 / [A]{2,3} /

반복 횟수만 지정하면 의도하지 않은 결과도 함께 검색되는 경우가 많아 하위표현식 및 전후방 탐색과 함께 사용하면 더욱 효과적인 패턴의 사용이 가능합니다.


대괄호 내 기재된 기호로 검색할 패턴을 지정합니다. 기호를 직접 기입하거나 범위 지정 기호인 -를 사용해 검색 패턴을 지정할 수 있습니다.

  • 지정한 문자(a 또는 A 또는 b 또는 B 또는 c 문자)를 하나 검색 👉 [aAbBc]
  • a에서 e까지(a,b,c,d,e)의 범위 내 문자하나 검색 👉 [a-e]
  • 제외 문자인 ^가 있으므로 a-z 범위에 들어가지 않는 문자 또는 기호를 하나 검색 👉 [^a-z]
  • 지정 기호 중 하나를 검색 👉 [?!@#$%^&*()_]
  • c 또는 C로 시작하여, a-z 중 하나로 끝나는 단어 검색 👉 [cC][a-z]

[ ] 내 기재된 기호는 하나의 문자 또는 하나의 기호를 대상으로 검색하므로 한 글자 이상을 검색하고 싶은 경우에는 +(하나 이상의 문자) 또는 *(0개 또는 1개 이상의 문자)를 붙여줘야 합니다.

  • 한 개 이상의 a-z 문자를 검색(반드시 1 개 이상 존재하는 조건) 👉 [a-z]+
  • 0 개 이상의 A-Z 문자를 검색(있을 수도 있고 없을 수도 있는 조건) 👉 [A-Z]*

위 조건은 특정 구성을 갖는 문자열 검색에 효과적이며, 예를 들어 이메일 주소가 있습니다.

이메일 주소 형식인 abcd@xyz.com을 검색하기 위해서는 다음과 같은 검색 패턴을 사용할 수 있습니다.

/[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+/

패턴을 분석해 보겠습니다.

먼저 이메일의 아이디에 해당하는 부분은 영문자 및 숫자로 이루어질 수 있으므로 [a-zA-Z0-9]로 시작하고, 하나 이상의 문자이므로 +기호를 붙여줍니다.

아이디가 끝나는 부분에 @가 따라오므로 @를 기입하고, 뒤의 호스트 주소 역시 하나 이상의 영문자와 숫자로 지정합니다.

.com 형식의 주소이므로 .(마침표, dot)문자와 일치시키기 위해 이스케이프로 .(마침표, dot)을 지정해주고, 다시 하나 이상의 영문자를 지정하여 이메일 검색 패턴을 생성합니다.

아이디에 .(마침표, dot)이 들어가거나 호스트 주소가 .co.kr의 형식이 되는 경우에는 위 패턴에서 약간의 응용이 필요합니다.



3. 종합 정리

정규 표현식은 처음 보면 마치 외계어처럼 기존의 프로그래밍 언어와는 다른 모습을 하고 있습니다.

선뜻 다가가기 어렵거나 거부감이 들기도 하는데요. 알고나면 생각보다 간단하고 규칙적인 구조를 가지고 있어 마음이 놓이기도 하고 검색에 응용할 수 있는 부분이 많은 것을 깨닫습니다.

위에서 소개한 부분은 아주 기초적인 부분이며 대표적인 기능을 소개하기 위한 간략한 샘플 패턴이므로 정말 원하는 검색 패턴을 구현하기 위해서는 더 많은 기능을 익혀야 하고 검색 패턴도 보완되어야 할 부분이 많습니다.

추가 문의 사항이나 문제가 있는 부분은 댓글 남겨주세요.

감사합니다.

자바스크립트 비구조화 할당 사용하기(Beautiful Destructuring in JS)

자바스크립트에서 객체 비구조화(Object Destructuring)를 사용하는 아름다운 방법
from. How to Use Object Destructuring in Javascript(Dmitri Pavlutin)

비구조화 할당(Destructuring Assignment)이란 배열 또는 객체 안의 속성값를 풀어 편리하게 변수에 넣는 것을 말합니다.
한 번 선언으로 여러 속성값 추출, 하부 객체에서 접근, 값이 존재하지 않는 경우 기본값 설정 등이 가능합니다.

백 번의 설명보다 하나의 샘플 코드가 더 유용하므로 하나씩 알아보도록 하겠습니다.

1. 비구조화 할당의 필요성

자바스크립트 ES2015 환경에서 객체의 속성값을 가져오려면 다음과 같은 코드를 사용합니다.

const flower = {
  name: 'Rose',
  color: 'Red'
};

const name = flower.name;
const color = flower.color;

console.log(name);    // 'Rose'
console.log(color);    //  'Red'

flower.name 값을 name 변수에 넣고, flower.color 값을 color 변수에 넣습니다.

하지만 위와 같이 값을 대입하면 반복되는 부분이 발생합니다. 바로 ‘name’과 ‘color’입니다.

대입 과정에서 name이 변수 선언에 한 번, 그리고 flower 객체의 속성 접근에 한 번, 총 두 번이 사용됩니다.

color도 마찬가지입니다.

비구조화 할당은 이런 번거로움을 없애고자 할 때 사용합니다.

비구조화 할당을 사용하면 객체에서 속성을 가져와 같은 이름의 변수에 대입할 때 속성명을 한번 더 명시할 필요가 없습니다.

게다가 속성이 여러 개일지라도 한번의 선언으로 해결이 가능합니다.

아래 코드에서는 위 코드를 리팩토링하여 비구조화 할당을 사용합니다.

const flower = {
 name: 'Rose',
 color: 'Red'
};

const { name, color } = flower;

console.log(name);   // 'Rose'
console.log(color);  // 'Red'

‘const { name, color } = flower’가 바로 객체 비구조화입니다.
이 구문으로 name과 color 변수를 선언하고, flower.name과 flower.color 속성의 값을 같은 이름 변수에 할당합니다.

다음은 객체의 속성값에 접근하는 두 가지 방법입니다.

const name = flower.name;
const color = flower.color;

// 위와 아래는 같은 결과

const { name, color } = flower;

속성명과 변수명이 중복되지 않으므로 비구조화가 훨씬 깔끔하고 편리한 것을 알 수 있습니다.

2. 속성값 가져오기

객체 비구조화의 기본 문법은 간단합니다.

const { identifier } = expression;

여기서 identifier는 속성에 접근할 이름이고, expression은 identifier가 접근하는 객체입니다.

비구조화를 하면 identifier 변수는 접근한 속성값을 갖게 됩니다.

위와 같은 코드이지만 속성 접근자를 사용하게 되면 다음과 같습니다.

const identifier = expression.identifier;

위 내용을 토대로 비구조화 할당을 연습해 보겠습니다.

const flower = {
  name: 'Rose',
  color: 'Red'
};

const { name } = flower;

console.log(name);  // 'Rose'

‘const { name } = flower;’는 name 변수를 선언하고, flower.name의 속성값을 대입하는 비구조화 할당입니다.

3. 여러 속성값 한번에 가져오기

여러 속성값을 가진 객체의 비구조화는 쉼표를 사용하면 됩니다.

const { identifier1, identifier2, ..., identifierN } = expression;

여기서 identifier1, identifier2, …, identifierN은 속성에 접근할 이름이고, expression은 identifier가 접근하는 객체입니다. 비구조화를 하면 각 identifier 변수는 접근한 속성값을 갖게 됩니다.

속성 접근자를 사용하는 코드는 다음과 같습니다.

const identifier1 = expression.identifier1;
const identifier2 = expression.identifier2;
// ......
const identifierN = expression.identifierN;

그럼 두 개의 속성값을 할당하는 첫 번째 샘플 코드를 다시 확인해 보겠습니다.

const flower = {
 name: 'Rose',
 color: 'Red'
};

const { name, color } = flower;

console.log(name);   // 'Rose'
console.log(color);  // 'Red'

‘const { name, color } = flower;’는 name, color 두 변수를 생성하고, 각각 flower.name과 flower.color의 속성값을 할당합니다.

4. 기본값 설정하기

비구조화를 하더라도 객체에 동일한 속성명이 존재하지 않는 경우 undefined가 할당됩니다.

const flower = {
  name: 'Rose',
  color: 'Red'
};

const { meaning } = flower;

console.log(meaning);  // undefined 

위와 같이 속성이 존재하지 않는 경우 기본값 설정이 가능하며, 문법은 다음과 같습니다.

const { identifier = defaultValue } = expression;

identifier가 expression 객체의 속성에 접근하는 이름이 됩니다. expression 객체 내 identifier 속성이 존재하지 않으면 지정한 기본값인 defaultValue가 대입됩니다.

다음 코드와 같은 기능을 합니다.

const identifier = expression.identifier === undefined ? defaultValue : expression.identifier;

기본값 설정 옵션을 더해 코드를 수정해 보겠습니다.

const flower = {
  name: 'Rose',
  color: 'Red'
}

const { meaning = 'love' } = flower;

console.log(meaning)  // 'love'

undefined 대신 ‘love’가 대입됩니다.

5. 별명(alias) 정하기

객체의 속성명과 다른 이름으로 변수를 선언하고 싶을 때는 별명을 지정하면 됩니다.

const { identifier: aliasIdentifier } = expression;

여기서 identifier는 속성에 접근하는 이름이며, aliasIdentifier는 변수로 사용할 이름입니다. 비구조화를 하면 aliasIdentifier가 속성값을 갖습니다.

다음 코드와 같은 의미입니다.

const aliasIdentifier = expression.identifier;

실제 별명을 적용한 코드는 다음과 같습니다.

const flower = {
  name: 'Rose',
  color: 'Red'
};

const { color: realColor } = flower;

console.log(realColor); // 'Red'
console.log(color); // 에러 발생(color is not defined)

위 코드는 realColor로 변수를 선언하고, flower.color값을 할당하여 비구조화를 진행합니다.

6. 내부 객체의 속성값 가져오기

앞에서 확인한 샘플은 원시형 데이터 타입(String, Number 등)의 속성을 갖는 일반 객체입니다.

그러나 일부는 객체 안에 또 다른 객체를 갖습니다. 물론 이러한 형태를 가진 객체도 비구조화 할당이 가능합니다.

const { nestedObject: { identifier } } = expression;

nestedObject는 내부 객체명이고, identifier는 내부 객체의 속성명입니다.

비구조화 할당을 통해 identifier가 내부 객체의 속성값을 가지며, 다음 코드와 같은 의미입니다.

const identifier = expression.nestedObject.identifier;

내부 객체의 깊이는 제한이 없으며, 중괄호{ }만 추가해주면 됩니다.

const { propA: { propB: { propC: {......} } } } = object;

다음 샘플을 통해 내부 객체에 접근하여 비구조화 할당을 진행하는 코드를 확인해 보겠습니다.

const flower = {
  name: 'Rose',
  color: 'Red',
  blooming: {
   season: 'spring'
  }
};

//Object destructuring
const { blooming: { season } } = flower;

console.log(season) // 'spring'

‘const { blooming: { season } } = flower;’는 내부 객체 blooming의 season 속성값을 할당합니다.

7. 동적 이름으로 속성값 가져오기

동적 이름(Dynamic Name)의 사용도 가능합니다.

const { [propName]: identifier } = expression;

propName은 속성명(주로 string 타입)이며, identifier는 값이 할당될 변수의 이름입니다.

다음 코드와 같은 의미를 갖습니다.

const identifier = expression[propName];

다음 샘플을 통해 속성명으로 사용되는 prop을 확인하겠습니다.

const flower = {
  name: 'Rose',
  color: 'Red'
};

const prop = 'name';
const { [prop]: flowerName } = expression;

console.log(flowerName); // 'Rose'

‘const { [prop]: flowerName } = expression’에서 flowerName 변수에 flower[prop] 속성값을 할당하며, prop은 접근할 속성명을 가진 변수입니다.

8. 비구조화 할당 후 남겨진 객체

나머지 데이터를 관리하는 문법은 비구조화 할당에서 유용하게 사용할 수 있습니다.

const { identifier, ...rest } = expression;

위 코드에서 identifier를 제외한 나머지 속성은 rest 변수에 할당됩니다.

아래 코드에서 name 속성을 제외한 나머지 속성을 정리하는 샘플을 확인해 보겠습니다.

const flower = {
  name: 'Rose',
  color: 'Red'
};

const { name, ...realColor } = flower;

console.log(realColor) // { realColor: 'Red' }

name 속성값을 할당한 뒤 나머지 속성들은 realColor 변수에 할당합니다.

9. 자주 사용되는 구문

앞에서 확인한대로 비구조화는 속성값을 변수에 할당합니다.

변수 타입은 const, let, var 모두 사용이 가능하며, 이미 선언된 변수에도 할당이 가능합니다.

let을 사용한 방법은 다음과 같습니다.

//let
const flower = {
  name: 'Rose',
};

let { name } = flower;

console.log(name); // 'Rose'

var를 사용한 방법은 다음과 같습니다.

//var
const flower = {
  name: 'Rose',
};

var { name } = flower;

console.log(name); // 'Rose'

이미 선언된 변수에 할당하는 방법은 다음과 같습니다.

//existing variable

let name;

const flower = {
  name: 'Rose',
};

({ name } = flower);

console.log(name); // 'Rose'

for…of 반복문을 사용한 비구조화 할당은 다음과 같습니다.

const flowers = [
  { name: 'Rose' },
  { name: 'Lily' }
];

for (const { name } of flowers) {
  console.log(name) //'Rose', 'Lily'
}

사실 비구조화는 할당이 가능한 곳이면 어디든지 사용이 가능하다고 볼 수 있습니다.

예를 들면 다음과 같이 함수 파라미터의 비구조화도 가능합니다.

const flowers = [
  { name: 'Rose' },
  { name: 'Lily' }
];

const names = flowers.map(
  function({ name }) {
    return name;
  }
)

console.log(names); // ['Rose', 'Lily']

‘function({ name })’은 함수의 파라미터를 비구조화하여, name 변수에 name 속성을 할당합니다.

10. 변수 값 서로 교환(swap)

비구조화 할당을 사용하면 두 변수의 값을 편리하게 교환할 수도 있으며, 기존처럼 데이터를 임시로 보관할 변수가 필요하지 않습니다.

let a = 1;
let b = 2;

//기존 교환 방법
const temp = a;
a = b;
b = temp;

//비구조화를 통한 교환
[a, b] = [b, a];

11. 정리

비구조화 할당은 객체의 속성값을 빠르고 쉽게 변수에 할당할 수 있는 아주 강력한 기능을 제공합니다.
특히 간결한 문법과 여러 변수를 한 번에 선언할 수 있는 점이 매력적입니다.


비구조화 할당에 대해 간결하면서도 누구나 이해하기 쉽도록 작성된 좋은 글을 접하게 되어 좋은 정보를 나누고자 양해를 구하여 국내에 맞게 번역하고 일부 내용을 추가하여 글을 올리게 되었습니다. 궁금하신 사항은 댓글 남겨주세요.

출처: https://dmitripavlutin.com/javascript-object-destructuring/

Useful Shortcut Keys For Visual Studio Code(VS code단축키 모음)

효율적인 작업을 위한 비쥬얼 스튜디오 코드(VS Code) 단축키 모음

Sometimes we need some shortcut keys for improving efficiency and avoiding irritable repeating works.

But occasionally, we use it because just seems cool!

VS code shortcut keys will help you and your work faster.

You can also check or edit shortcuts keys at File – Preferences – Keyboard Shortcuts.

Or follow default set version as below.

단축키는 효율성을 높이거나 반복되는 작업에 자주 사용하곤 합니다.

그 작업이 게임이건 사무용 프로그램이건 말이죠.

단축키를 쓰면 실력자로 보이기도 하고, 약간은 숙련자로 보이기도 하는 것 같습니다.

익숙한 단축키부터 유용한 단축키까지 VS Code에서 사용할 수 있는 단축키를 정리해보았습니다.

물론 File – Preferences – Keyboard Shortcuts에서 단축키의 수정도 가능합니다.


SHORTCUT KEYS FOR VS CODE

EDIT
CopyCtrl + C복사
CutCtrl + X잘라내기
PasteCtrl + V붙여넣기
Select AllCtrl + A전체 선택
Undo(↔Redo)Ctrl + Z실행취소(↔다시실행)
Redo(↔Undo)Ctrl + Y다시실행(↔실행취소)
Copy LineAlt + Shift + ↑/↓행 복사하기
Move LineAlt + ↑/↓행 옮기기
Insert Line AboveCtrl + Shift + Enter한 줄 삽입하기(위쪽)
Indent LineCtrl + ]들여쓰기
Line CommentCtrl + /코멘트 (라인)
Block CommentAlt + Shift + A코멘트 (블록)
FindCtrl + F찾기
ReplaceCtrl + H바꾸기
Trigger SuggestionCtrl + Space완성 제안
Close EditorCtrl + W에디터 닫기
SaveCtrl + S저장하기
Reopen closed EditorCtrl + Shift + T닫은 에디터 열기
Full Screen ModeF11풀스크린
Sidebar visibilityCtrl + B사이드바 열기
Show TerminalCtrl + `터미널 열기
Debug
Start/ContinueF5시작/계속
StopShift + F5정지
BreakpointF9브레이크 포인트