728x90
반응형

Javascript Async (비동기 처리)

2023.12.06에 작성됨

 

Javascript에서 비동기처리를 하기 위해서는 Promise 객체를 이용한다.

Promise는 3가지 중 하나의 Status를 갖는다.

  • pending (작업이 진행중인 상태)
  • fulfilled (작업이 성공적으로 완료된 상태)
  • rejected (작업이 실패한 상태)

Javascript의 비동기는 두 부분으로 나누어 생각할 수 있는데 Promise를 생성하는 Producer 와 사용하는 Consumer 이다.

  1. Producer:

Promise 객체는 executor(resolve, reject) 라는 콜백 함수를 인자로 받아서 생성하며,

Promise 객체가 생성되는 순간 executor는 실행된다.


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

// ... 어떤 작업 처리 ...

// 성공했을 경우

resolve();

// 실패했을 경우 

reject();

});
  1. Consumer:

Promise로부터 나온 결과를 처리하는 부분이다.


promise

.then((value) => {})      // promise가 resolve()를 호출할 경우 실행됨.

.catch((error) => {})     // promise가 reject()를 호출할 경우 실행됨.

.finally(() => {});       // promise의 성공여부와 상관 없이 완료된 경우 최종적으로 실행됨.

Async/Await

Async/Await은 Promise를 조금 더 편리하게 사용할 수 있도록 고안된 문법 이다. (Syntactic Sugar)

Promise를 직접 사용한 비동기 함수와 Async/Await을 사용하여 만든 함수를 아래 예제를 통해 비교해보자.


// Promise 를 사용한 경우 

function readFileAsync() {

return new Promise((resolve, reject) => {

// ...어떤 작업 처리...

resolve(value);

});

}



function logFile() {

const file = readFileAsync();

file.then((value) => console.log(value));

}



logFile();

// Async-Await을 사용한 경우

async function readFileAsync() {

// ...어떤 작업 처리...

return value;

}

// 설명: 

// 함수 앞에 async를 붙이면 내부적으로 Promise를 반환하는 함수로 변환해준다. 

// 함수에서 value를 바로 리턴하는 것 처럼 보이지만 실제로는 Promise 객체를 반환한다. 



async function logFile() {

const file = await readFileAsync();

console.log(file);

}

// await 은 async 함수 안에서만 사용이 가능하며, 

// .then으로 처리했던 것과 같이 비동기함수의 수행 완료를 기다렸다가 

// resolve() 함수에 의해 처리된 값을 반환해준다. 

// reject() 함수에 의해 처리된 값을 처리할 때는 try-catch문을 통해서 처리할 수 있다. 



logFile();



참고:

https://youtu.be/JB_yU6Oe2eE?si=9z4D5QRuaqy4XRkO

https://youtu.be/aoQSOZfz3vQ?si=RVdbsuqfNgtwG_wp

728x90
반응형
728x90
반응형

Typescript 세팅하기


 

2023.12.06에 작성됨 (node: v18.17.0, npm: 10.2.1)

시작하기

# 글로벌로 설치할 경우
npm i -g typescript   
tsc --init            # tsconfig.json 생성됨

# 개별 프로젝트에 설치 할 경우
npm i -D typescript   
npx tsc --init        # 프로젝트에 설치된 경우 앞에 npx를 붙여줘야한다.

NOTE: 많은 사람들이 ts-node를 같이 같이 설치 해주는 것 같은데 Typesciprt도 VS Code에서 디버깅 모드를 바로 사용할 수 있기 때문에 굳이 필요한지는 잘 모르겠다.

// tsconfig.json
{
    "compilerOptions": {
        // 일반적으로 사용하는 option
        "target": "ES2016",
        "module": "commonjs",
        "rootDir": "./src",
        "outDir": "./dist",
        "removeComments": true,
        "noEmitOnError": true,
        // 유용한 Type Checking Options
        "noUnusedParameters": true,
        "noImplicitReturns": true,
        "noUnusedLocals": true,
        // 디버깅 사용할 때
        "sourceMap": true,
    }
}

NOTE: “tsconfig.json” 이 생성되면 뒤에 파일이름을 붙이지 않아도 tsc만 입력해서 컴파일을 실행시킬 수 있음.

VS Code에서 디버깅하기

  1. tsconfig.json
    • compile 할 때 [filename].js.map 이라는 파일이 생성되고 디버거가 읽는 파일이라고 생각하면됨.
  2. “sourceMap”: true
  3. create launch.json
    • “preLaunchTask”: “tsc: build - typeconfig.json” 추가
    // launch.json
    // 기본적으로 생성되는 파일 안에 
    // “preLaunchTask”: “tsc: build - typeconfig.json” 추가
    {
      // Use IntelliSense to learn about possible attributes.
      // Hover to view descriptions of existing attributes.
      // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
      "version": "0.2.0",
      "configurations": [
        {
          "type": "node",
          "request": "launch",
          "name": "Launch Program",
          "skipFiles": [
            "<node_internals>/**"
          ],
          "program": "${file}",
          "preLaunchTask": "tsc: build - tsconfig.json",
          "outFiles": [
            "${workspaceFolder}/**/*.js"
          ]
        }
      ]
    }

Typescript CLI (Command Line Interface)

tsc --build (혹은 tsc -b)를 실행하면 다음의 작업을 합니다:

  • 참조된 모든 프로젝트를 찾습니다
  • 최신 상태인지 감지합니다
  • 올바른 순서로 최신 상태가 아닌 프로젝트를 빌드 합니다

만약 config 파일 이름이 tsconfig.json이라면 이름을 지정하지 않고 tsc --project(혹은 tsc -p)를 사용할 수 있다.

일반적으로는 package.json 파일에 스크립트로 저장하고 사용한다.

//package.json
"scripts": {
    "build": "tsc -p"
}
// terminal> npm run build

Common Errors

  1. Cannot find module 'xxx' or its corresponding type declarations.ts(2307)
import path from "path"; 
// Cannot find module 'path' or its corresponding type declarations.ts(2307)

NOTE: Typescript는 Typescript가 아닌 기본 Node 패키지를 바로 사용할 수 없다. (타입을 추론할 수 없기 때문에). 아래와 같이 Typescript 전용 패키지를 설치 해주어야 한다.

# npm i @types/<패키지>
npm i -D @types/node
# 일반적으로 -D 옵션을 붙여 Development Dependency 로 설치해준다.

참고:

https://youtu.be/d56mG7DezGs?si=UvvP1NosR6QV23mZ

 

728x90
반응형
728x90
반응형

PlantUML은 프로그램언어처럼 코드로 다이어그램을 작성할 수 있도록 도와주는 오픈소스 툴이다. 코드로 작성하기 때문에 빠르게 작성할 수 있다는 장점도 있지만 중요한 키워드들은 외워놓던지 찾아가면서 작성해야한다는 단점도 있다.

VSCode 에도 plantUML을 지원하는 Extension이 있어 설치 및 사용 방법을 정리하고자 한다.

  1. 일반적인 Extension 설치와 마찬가지로 PlantUML을 검색하고 설치한다.
  2. VSCode 안에 새로운 파일을 생성한다. 확장자 명은 다음 중 하나로 해야함. (*.wsd, *.pu, *.puml, *.plantuml, *.iuml)
  3. 예제 코드를 작성해보고 Alt + D 를 눌러서 preview 가 잘 나오는지 확인한다.
example.pu preview (Alt + D)

  • 만약 preview가 보이지 않는다면 Java 또는 Graphviz가 설치되지 않았기 때문일 가능성이 크다. Documnet에는 PlantUML설치시 Graphviz가 같이 설치된다고 써있긴 하지만 이상하게 설치가 안되는 경우가 있는 것 같다. 공식 홈페이지에 가서 직접 설치해주자.
  1. 완성된 다이어그램을 Export 하려면 F1 키를 누르고 plantuml export를 검색하면 세 가지 옵션으로 Export 할 수 있다.

728x90
반응형
728x90
반응형

나는 프로그래밍을 처음 배울 때 컴파일(Compile) 또는 빌드(Build)라는 용어의 개념을 구분해본적이 없었다.
간혹(또는 자주) 주변 사람들도 두 용어를 같은 의미로 함께 사용하기도 하는 것 같았다.

하지만 굳이 따지자면 두 용어는 다른 의미를 지니고 있다.
C언어는 사실 컴퓨터가 이해할 수 있는 언어는 아니고 사람이 읽고 쓸 수 있는 언어이다. 이런 C 언어를 컴퓨터가 이해할 수 있는 언어(기계어)로 번역하는 것이 컴파일(Compile) 이고, 컴파일을 해주는 놈을 (Compiler) 라고 부른다.

그리고 이렇게 컴파일되어 기계어로 작성된 파일을 오브젝트(Object) 파일 이라고 부르는데, 이 오브젝트 파일들과 라이브러리 파일들을 연결시켜 최종적으로 실행파일을 만들게 된다.
이렇게 연결시키는 작업을 링크(Link), 연결시키는 작업을 해주는 놈을 링커(Linker) 라고 부른다. 이렇게 링크를 거치고 나면 최종적으로 실행파일이 생성되게 된다.

마지막으로 빌드(Build)는 이런 일련의 과정을 통칭하는 표현이다.
다시 말해 "빌드 해라" 라는 말을 풀어쓰면 "작성한 코드를 기계어로 번역하고 필요한 파일들을 연결시켜 실행파일을 만들어라" 라는 말이 되는 것이다.

이해를 돕기위해 Visual Studio를 사용하지 않고 간단한 프로그램을 하나 만들어 보았다.
보통 Mac에서는 Xcode를 설치할때 gcc라는 컴파일러가 함께 설치되는데 이것을 이용해 터미널에서 컴파일을 해보자.
터미널에 'gcc -v' 를 입력했을 때 아래와 같이 정보가 나오면 gcc가 설치되어있는 것이다.

$ gcc -v

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.11)
Target: x86_64-apple-darwin20.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

아무 텍스트 에디터나 열어 아래와 같이 코드를 작성하고 'CompileTest.c'라고 저장해보자.

#include <stdio.h>

int main()
{
  printf("Hello world!\n");
  return 0;
}

그리고 터미널에 아래와 같이 gcc 를 이용해서 작성한 파일을 컴파일하면
[fileName]에 입력한 이름으로 실행파일이 생성된다.

$ gcc -o [fileName] CompileTest.c

생성된 실행파일을 실행시키면 'Hello world!'가 잘 출력되는 것을 확인할 수 있다.
Visual Studio를 이용하면 마술처럼 완성되는 실행파일이 사실 이런 과정을 거쳐 만들어지게 되는 것이다.

728x90
반응형
728x90
반응형

정규식(Regular Expression)은 긴 문자열 안에서 특정한 패턴을 가진 문자열을 찾아내기 위해 사용된다.

예를 들어 웹페이지 안에서 이메일 주소를 추출한다거나 로그파일에서 특정 에러 메시지를 추출할때 매우 편리하게 사용할 수 있다.

우선 regex를 테스트하기 위한 여러 웹 어플리케이션들이 있지만 Regex101이라는 사이트가 가장 사용하기 편리했다. https://regex101.com/

사용 방법은 위에 캡쳐한 이미지처럼 'TEST STRING' 입력창 에 실험 대상이 들어갈 문자열들을 입력해놓고, 'REGULAR EXPRESSTION' 입력창에 찾고자하는 패턴을 입력하면 된다.

나는 이 실험 대상에 임의의 6개 단어를 참가시켰고, 찾고자 하는 패턴 'bo' 를 입력했더니 'MATCH INFORMATION'에 3군데 일치하는 곳이 있음을 알려주고 있다.

'bo'라는 패턴을 조금 더 정확히 해석하면
"b 다음에 o가 나오는 문자열이 있나요?" 라고 질문을 던진 것이다. 이처럼 정규식은 앞에서부터 한글자씩 일치하는지 여부를 확인한다.

문자집합 (Charecter Set)

대괄호('[ ]')를 이용하면 문자집합을 나타낼 수 있다. 문자집합은 대괄호 안에 오는 어떤 문자든 오면 일치시킨다.
같은 예제에 패턴 'bl[ao]'를 입력해보았다. 이를 해석하면 "b 다음에 l이 있고, 그 다음에 a 또는 o가 오는 문자열이 있나요?" 라고 풀이할 수 있다.

수량자 (Quantifier)

중괄호('{ }')를 이용하면 수량을 나타낼 수 있다.
같은 문자가 여러번 나올 때는 그 중괄호 안에 문자가 반복되는 횟수를 입력하여 더 간단하게 표현할 수 있다.
이번엔 기존 예제에 두개의 실험 대상을 더 추가하고 'bo{4}' 라고 패턴을 입력해보았다.
해석하자면 "b 다음에 o가 네번 반복되는 문자열이 있나요?" 라는 질문이다.

그룹화 (Group)

소괄호('( )')를 이용하면 그룹을 나타낸다. 지금까지 본 것 처럼 정규식은 기본적으로 한 단어씩 일치 여부를 확인하지만, 소괄호 안에 여러개의 문자를 넣으면 괄호안에 포함된 단어를 하나의 그룹으로 묶어서 판단한다. 예를 들어 '(bo){2}'라는 패턴을 입력해보자. 소괄호가 없었다면 o 가 두번 반복되는지 여부를 판단하겠지만 bo를 소괄호로 묶어주어 bo 가 두번 반복되는지 여부를 판단한다.

그룹화를 하게되면 기본적으로 캡쳐도 동시에 되는데,
캡쳐된 그룹은 'MATCH INFORMATION' 창을 보면 캡쳐된 그룹을 볼 수 있다. 아래 예제는 날짜 중에 특히 몇월인지 캡쳐하는 방법이다.
(참고로 '\d' 는 '아무 숫자'를 의미하고, '\w' 는 '특수문자를 제외한 아무문자'를 의미한다)

여기까지 잘 이해했다면, 그 다음부터는 특별한 설명 없이 아래 표만 참고해도 충분히 이해 할 수 있을 것 같다. 이 표는 Regex 에서 가장 많이 사용되는 패턴들을 정리한 표이다.

 

패턴 설명 예제
[abc] a,b,c 중에 아무거나
[^abc] a,b,c 를 제외하고 아무거나
[a-z] a 부터 z까지 문자중에 아무거나
[^a-z] a 부터 z까지 문자를 제외하고 아무거나
. 아무 문자 하나
a|b a 또는 b
\s 공백문자 중에 아무거나
\S 공백문자를 제외한 아무거나
\d 숫자 중에 아무거나
\D 숫자를 제외하고 아무거나
\w 알파벳이나 숫자 중에 아무거나
\W 알파벳이나 숫자를 제외하고 아무거나(특수문자)
(?:...) 그룹화하지만 캡쳐는 하지 않음
(...) 그룹화하고 캡쳐
a? a 가 없거나 한개 있거나
a* a 가 없거나 여러개 있거나
a{3} a가 3개
a{3,} a가 3개이거나 그 이상이거나
a{3,6} a가 3개 이상 6개 이하
^ 문자열 시작
$ 문자열 끝
\b 단어의 경계
\B 단어의 경계 아닌 아무거나
728x90
반응형

+ Recent posts