Search

반응형

'Software/JavaScript'에 해당되는 글 38건

  1. 2023.05.07 [자바스크립트]Promise 쉽게 이해하기 편. 프라미스, then(), async
  2. 2023.01.08 [자바스크립트]정규표현식 Quantifiers, 수량자 정규식
반응형

안녕하세요. 신기한 연구소입니다.

최근 Vue.js 프로젝트를 진행하면서 자바스크립트 Promise 객체의 then()을 봤습니다.

무엇일까요?

비동기를 지원하는 객체를 알게 되었습니다.  바로 JavaScript의 Promise 객체입니다.

 

비동기(async)란?

혼자 요리를 할 때 당근, 양파, 감자 등 재료를 도마 위에 순서대로 손질을 합니다. 동시에 모든 재료를 손질할 수 없기 때문입니다. 이렇게 하나씩 재료를 손질하면 다른 일을 동시에 할 수 없습니다. 이것을 동기라고 합니다.

재료 손질하기 전 가스레인지에 물을 담은 냄비를 올리고 끓입니다. 물이 끓을 동안 일하면서 간단하게 먹을 간식을 전자레인지에 넣고 1분을 설정하고 시작버튼을 누릅니다.  전자레인지가 작동하는 동안 도마 위의 재료를 손질합니다. 1분 뒤 전자레인지에서 완료되었다는 소리가 납니다. 간식을 꺼내옵니다. 그리고 다시 도마 위의 재료를 손질합니다. 10분 뒤 물이 끓어서 가스레인지 불을 끕니다. 이렇게 가스레인지나 전자레인지를 작동시키고 완료될 때까지 도마 위의 재료를 손질할 수 있는데 이를 비동기라고 합니다. 즉, 다른 작업을 시켜놓고 완료될 때까지 다른 일을 할 수 있는 것을 의미합니다.

 

Promise 란?

const myPromise = new Promise((resolve, reject) => {

   // 업무 프로세스

});

방금 javascript의 promise 객체 (myPromise)를 생성했습니다. 객체는 new 키워드와 생성자 Promise()를 통해서 만들어집니다. 생성자는 실행(executor) 함수를 인자로 받습니다. 실행 함수는 resolve 함수 및 reject 함수 인수를 전달하는 함수입니다. 실행 함수는 비동기 (async) 작업을 가지고 있습니다. 비동기 작업의 결과는 언제 올지 모릅니다. 그래서 promise 객체를 사용해서 해당 이벤트를 처리할 수 있습니다.

실행 함수내 비동기 (async) 작업을 실행하면 두 가지 결과를 기대할 수 있습니다. 바로 성공 또는 실패입니다. 작업이 성공적으로 실행되었다면 executor(실행 함수)의 첫 번째 인자인 resolve 함수를 호출해서 결과를 받을 수 있습니다. 오류가 발생하면 두 번째 인자인 reject 함수를 호출합니다.

호출한다는 의미가 사실 좀 이해하기 힘들었습니다. 어떻게 호출을 하는것일까요?

위 예제는 아주 간단한 Promise 예제입니다. 비동기(async) 실행 함수는 setTimeout()으로 대체했습니다. 여기서 Promise() 생성자의 인수 실행함수는 다음과 같습니다.

실행 함수는 2개의 함수형 인자를 갖고 있습니다. 위 예제는 정상 처리된 경우엔 첫 번째 함수형 인자인 resolve를 호출하는 예를 보여주고 있습니다. setTimeout()이 시작하고 정상 처리가 된다면 '로그1'을 출력합니다. 그리고 resolve('해결') 함수를 호출했습니다. 호출하면 어떤 이벤트가 일어날까요? 사실, 실행 함수에서 resolve()를 호출해도 눈에 보이는 결과는 없습니다. 그렇다면 어떻게 사용하는 것일까요?

위 13번째 라인을 보면 확인할 수 있습니다. 첫 번째 예제를 실행하면 다음과 같은 결과가 출력됩니다.

'로그3'이 출력된 위치를 잘 확인하세요. 바로 여기서 resolve()의 특징을 확인할 수 있습니다. 3초 동안 setTimeout()이 대기하지만 (비동기처럼) '로그3'은 기다리지 않고 출력됩니다. 그렇게 소스의 끝부분까지 가고 종료가 되었습니다. 3초 후 '로그1'이 출력되고 resolve('해결')이 실행됩니다. 앞에서 얘기했듯이 resolve는 실행돼도 눈에 보이는 결과가 없다고 했습니다. 그런데 13번 라인의 myPromise.then이 실행되고 .then도 실행되었습니다. 해당 console.log가 실행되면서 '해결', '해결1'이 출력되었습니다.

new Promise 생성자 내 실행 함수에서 resolve()를 호출하면 생성된 promise객체(myPromise)의 then()으로 연결되어 호출됩니다. 둘이 연결되어 있습니다.

.then .then으로 호출을 하면 계속 연결되고 그 값을 이어받을 수 있습니다. 

resolve 함수 내 인수는 어떤 타입의 값도 넣을 수 있습니다. resolve(배열), resolve(객체)... 

보통은 비동기 실행 함수를 시작하고 결괏값을 받으면 그 결과에 대한 값 또는 원하는 처리값을 resolve() 인수로 담은 후 호출하도록 구현합니다. 비동기 실행 함수가 실행 완료되면 resolve()를 호출하게 구현하고 myPromise.then(인수)가 구현되어 있으면 해당 then의 인수로 그 값을 전달받게 됩니다. 물론 비동기라서 해당 then이 지나가고 '로그3'이 찍혔지만 resolve가 호출되면 myPromise.then()을 실행하게 됩니다. 멋지네요.

17라인을 보면 .then이 보이는데 두 번째 then입니다. 위 예제에서는 두번째 .then()도 실행했습니다. 주의할 점이 있습니다. resolve()를 실행하면 myPromise.then()으로 연결되어 실행됩니다. 두번째 .then()은 myPromise.then()의 return을 통해 연결됩니다.

then()에서 다음 then()으로 연결을 하기 위해서는 반드시 return을 사용해야 합니다. 그 값도 인수로 받아서 사용할 수 있습니다. return을 잊지 마세요.

마지막으로 catch()가 있습니다. 이 내용은 실행 함수의 두번째 인자인 reject와 연결되게 되어있습니다. 

위 예제를 보면 resolve 대신 reject를 사용했습니다. 이 함수는 실행 함수가 오류 발생 시 작동하게 됩니다. 사실 위 setTimeout이 오류가 난 것은 아닙니다. 오류가 난 경우에 개발자가 reject를 호출해서 오류를 처리하라는 의미입니다. 정상이면 resolve, 오류면 reject를 개발자가 직접 상황에 맞게 호출하고 구현해야 합니다. 

이렇게 reject를 호출하면 then은 무시되고 catch를 찾게 됩니다. 다행히도 18번째 라인에 catch가 구현되어 있고 해당 메서드가 호출되면서 로그를 출력하게 됩니다.

'오류'가 출력되었습니다. 

이제 우리는 비동기 실행 함수를 제대로 처리하기 위해 promise 객체를 사용하는 방법을 알게 되었습니다. 그리고 성공하면 resolve, 실패하면 reject를 호출하도록 구현해서 then과 catch와 연결하고 처리하는 방법에 대해서도 알게 되었습니다.

참고로 하나 더!

실행 함수를 보면 resolve, reject라는 명칭을 사용했습니다. 이 이름 자체는 정해진건 아닙니다. 원하는 이름으로 정하고 그 이름대로 호출하면 됩니다.  rsl, rjt 이렇게요.

사실 자바스크립트 Promise에는 resolve()와 reject()라는 메서드가 있습니다. 같은 기능으로 다음에 사용법에 대해 포스팅을 해보겠습니다. 아마 이 메서드 이름 때문에 resolve, reject라고 인수명을 정한 거 같습니다. JavaScript Promise 객체에 대해 알아봤습니다.

 

반응형
반응형

안녕하세요. 신기한 연구소입니다.

이번 포스팅은 역시 자바스크립트 정규표현식 중 수량자(quantifiers)에 대해 같이 코딩하면서 

기능을 살펴보겠습니다.

 

자주 사용하지는 않지만 알아두면 좋은 자바스크립트 정규 표현식 중 수량자(Quantifiers)는

패턴 문자의 반복에 관해 관여하고 매칭시킵니다.

 

Quantifiers(수량자) 란?

매칭할 문자 또는 표현식의 수를 나타냅니다.

 

문자*

* 앞에 문자가 0개 또는 그 이상 있으면 매칭됩니다.

0개라는 의미는 매칭되는 문자가 없어도 매칭이 됩니다.

예를 통해 살펴봅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var reg1 = /go*/;
var text1 = 'good morning';
console.log(text1.match(reg1));
//[ 'goo', index: 0, input: 'good morning', groups: undefined ]
 
text1 = 'oh my ghoat';
console.log(text1.match(reg1));
//[ 'g', index: 6, input: 'oh my ghoat', groups: undefined ]
 
text1 = 'my favorite things';
console.log(text1.match(reg1));
//[ 'g', index: 16, input: 'my favorite things', groups: undefined ]
 
text1 = 'hello my friend';
console.log(text1.match(reg1));
//null
cs

패턴은 /go*/로 영문자 g로 시작하고 o가 없거나 1개 이상 매칭되면 됩니다.

4번 라인 결과를 보면 good의 go*패턴으로 o가 2번 나와서 goo가 출력됨을 확인합니다.

7번 라인 결과를 보면 ghoat의 go*패턴으로 g는 있고 o는 0번 매칭되기에 g가 출력됨을 확인합니다. 

11번 라인 결과를 보면 things의 go*패턴으로 g는 있고 o는 0번 매칭되기에 g가 출력됨을 확인합니다.

16번 라인 결과를 보면 문장에 g가 아예 없기에 매칭되는 부분이 없어 null이 출력됨을 확인합니다.

 

문자+

+는 무조건 문자가 1개 이상 매칭되어야 합니다.

뒤에서 배우는 {1, }와 같은 의미입니다.

예제를 같이 코딩하면서 살펴봅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var reg2 = /go+/;
var text2 = 'goooooood morning';
console.log(text2.match(reg2));
//[ 'gooooooo', index: 0, input: 'goooooood morning', groups: undefined ]
 
text2 = 'oh my ghooooat';
console.log(text2.match(reg2));
//null
 
text2 =  'my favorite things';
console.log(text2.match(reg2));
//null
 
text2 = 'hello my friend';
console.log(text2.match(reg2));
//null
cs

 

4번라인 결과를 보면 goooooood의 go+패턴으로 gooooooo가 출력됨을 확인합니다.

8번 라인 결과는 gh가 보이지만 최소한 o가 1개 이상이어야 하기에 매칭이 없어 null이 출력됩니다.

12번 라인 결과도 things에서 g는 있지만 o가 없기에 null이 출력됩니다.

16번 라인 결과는 g가 아예 없기에 hello의 o와도 매칭이 안되기에 null을 출력합니다.

 

문자?

?는 앞 문자가 0번 또는 1번만 매칭되는 경우를 의미합니다.

역시 예제를 같이 코딩하면서 알아봅니다.

 

1
2
3
4
5
6
7
8
var reg3 = /e?de?/;
var text3 = 'helped';
console.log(text3.match(reg3));
//[ 'ed', index: 4, input: 'helped', groups: undefined ]
 
text3 = 'coffee grande';
console.log(text3.match(reg3));
//[ 'de', index: 11, input: 'coffee grande', groups: undefined ]
cs

 

4번 라인 결과를 보면 helped에서 패턴 /e?de?/ 중 e?d와 ed가 매칭되어 결과를 보여줍니다.

8번 라인 결과를 보면 grande에서 패턴 /e?de?/ 중 de?와 de가 매칭되어 결과를 보여줍니다.

e가 없어도 되기에 d만 있다면 매칭됩니다.

 

문자{n}

양의 정수 n만큼 정확히 문자수가 일치해야 합니다.

역시 예제 코딩을 통해 같이 알아봅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
var reg4 = /o{3}/;
var text4 = 'google';
console.log(text4.match(reg4));
//null
 
text4 = 'gooogle';
console.log(text4.match(reg4));
//[ 'ooo', index: 1, input: 'gooogle', groups: undefined ]
 
text4 = 'goooooogle';
console.log(text4.match(reg4));
//[ 'ooo', index: 1, input: 'goooooogle', groups: undefined ]]
cs

 

4번라인 결과는 google에서 패턴 /o{3}/인 o가 정확히 3개 있는 패턴과 매칭되지 않아서 null이 됩니다.

8번라인 결과는 gooogle에서 패턴 o가 정확히 3개 있기에 매칭되어 ooo가 출력됩니다.

12번라인 결과도 goooooogle에서 패턴o가 정확히 3개 있기에 ooo가 출력되고 뒤의 나머지 o는 무시됩니다.

 

문자{n, }

양의 정수 n만큼 문자가 최소한 일치해야 합니다.

/a{2,}/는 a가 최소 2개 이상은 있어야 한다는 의미입니다.

예제 코딩으로 결과를 알아봅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
var reg5 = /o{1,}/;
var text5 = 'zoo park';
console.log(text5.match(reg5));
//[ 'oo', index: 1, input: 'zoo park', groups: undefined ]
 
text5 = 'zo';
console.log(text5.match(reg5));
//[ 'o', index: 1, input: 'zo', groups: undefined ]
 
reg5 = /o{3,}/;
text5 = 'zooooo';
console.log(text5.match(reg5));
//[ 'ooooo', index: 1, input: 'zooooo', groups: undefined ]
cs

 

4번 라인 결과는 zoo에서 패턴/o{1,}/ 최소 o가 한 개 이상이어야 하기에 oo가 출력됩니다.

8번 라인 결과는 zo에서 최소 o가 한 개이기에 o가 출력됩니다.

13번 라인 결과는 zooooo에서 패턴이 최소 o가 3개 이상이어야 해서 ooooo이 출력되었습니다.

 

문자{n,m}

문자가 최소 n개 이상부터 m개까지 매칭됩니다.

m은 항상 n보다 커야 합니다. (n < m)

매칭되는 문자수가 m보다 많아도 m만큼만 일치해서 출력합니다.

예제 코딩으로 같이 살펴봅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var reg6 = /o{1,3}/;
var text6 = 'zo';
console.log(text6.match(reg6));
//[ 'o', index: 1, input: 'zo', groups: undefined ]
 
text6 = 'zoo';
console.log(text6.match(reg6));
//[ 'oo', index: 1, input: 'zoo', groups: undefined ]
 
text6 = 'zooo';
console.log(text6.match(reg6));
//[ 'ooo', index: 1, input: 'zooo', groups: undefined ]
 
text6 = 'zoooooo';
console.log(text6.match(reg6));
//[ 'ooo', index: 1, input: 'zoooooo', groups: undefined ]
cs

 

4번 라인 결과를 보면 zo에서 /o{1,3}/인 o가 최소 1개부터 3개까지의 패턴에 o가 1개 있어 매칭됩니다.

8번 라인 결과를 보면 zoo에서는 oo가 2개이기에 패턴에 매칭됩니다.

12번 라인 결과를 보면 zooo에서 ooo 가 최대 3개로 매칭됩니다.

16번 라인 결과를 보면 zoooooo에서 o가 최대 3개까지로 ooo만 매칭됩니다.

 

지금까지 자바스크립트 정규 표현식 중 수량자(Quantifiers)에 대해 이해하고

같이 코딩해 봤습니다.

 

반응형