git 명령어 줄이기

1
2
3
git config --global alias.r '! r() { git reset --soft HEAD~"$1" ; } ; r'

git config --global alias.r1 '! r1() { git reset --soft HEAD~1 ; } ; r1'
  • git reset --soft HEAD~1 마지막 커밋 하나를 취소하는 명령어이다
  • 나는 보통 여러 컴퓨터에서 작업할 때, 일단 작업 중을 내용을 임시적으로 커밋 푸쉬해서 깃허브에 업로드한다
  • 다른 컴퓨터에서 풀로 받아오고, 이 임시적인 커밋을 취소할 때 명령어를 길게 쓰는 게 귀찮아서 alias로 짧게 줄여보았다
  • git r 2 ; 숫자만큼 커밋 취소하기
  • git r1 ; 마지막 커밋 취소하기

참고

setTimeout Promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const delay = (ms) => {
return new Promise((resolve) =>
setTimeout(() => {
resolve(ms);
}, ms)
);
};
const main = async () => {
console.log(`main start`);

const result = delay(1000);
result.then(console.log);
console.log(`main end`);
};

const main2 = async () => {
console.log(`main start`);

const result = await delay(1000);
console.log(result);
console.log(`main end`);
};

main();
// main2();
  • promise를 알려주는 여러 글, 영상에서 setTimeout으로 예제로 진행한다
  • setTimeout을 promise로 감싸면 딜레이를 만들 수 있다
  • promise가 처음에 엄청 헷갈리는데, 막힐 때마다 이 예제를 먼저 작성해보고 적용해보았던 것 같다

참고

git commit push 명령 합치기

  • git commit 이랑 git push 명령을 합치고 싶은 욕구가 생겼다
1
git config --global alias.acp '! acp() { git commit -a -m "$1" && git push ; } ; acp'
  • git bash를 열고 위 명령을 수행한다
  • acp란 이름으로 git alias를 추가한다
  • --global옵션을 줘서 어디서든 실행될 수 있도록 한다
  • --global옵션을 주지 않으면 현재 깃 디렉터리에만 적용이 된다
1
git acp "커밋 메시지"
  • 이런 식으로 사용한다

참고

aws sam, lambda 정리

  • nodejs 람다 기준

sam

  • sam cli로 로컬에서 람다를 작성하고 배포할 수 있다

실행환경

  • /var/task 에서 람다 함수가 실행된다
  • /opt/nodejs 에 레이어가 적재된다
  • /tmp 디렉터리는 유일한 쓰기 디렉터리이다
  • /tmp 디렉터리의 용량은 512MB이다
  • /tmp 디렉터리는 일회성이다

로컬에서 테스트

  • sam local start-api로 로컬에서 람다를 테스트해볼 수 있다
  • --skip-pull-image 옵션을 주어 실행 시간을 단축시킬 수 있다
  • 로컬에서 실행할 때 도커가 필요하다
  • 참고로 람다는 아마존 리눅스 2 환경에서 돌아간다

빌드

  • sam build 명령으로 설치되는 패키지에는 devDependencies가 포함되지 않는다

레이어

  • 레이어는 종속성을 따로 관리할 수 있게 해 준다
  • 노드 모듈은 웬만하면 레이어로 빼는 게 맞는 것 같다
  • 람다 노드 모듈 폴더를 포함하여 배포되면 용량이 커져서 브라우저에서 코드 조회를 할 수 없다
  • 공통적으로 자주 사용되는 패키지들을 묶어서 재사용할 수 있다
  • 레이어로 사용할
  • devDependencies가 포함되건 말건 상관없다면 심볼릭 링크를 사용하는 것도 나쁘지 않은 것 같다 참고

레이어 (내가 만든 모듈)

  • 내가 제작한 모듈도 레이어로 뺄 수 있다
  • sam project 루트 디렉터리를 기준으로 /opt/nodejs 에 내 모듈을 작성한다 (ex. /opt/nodejs/myModule.js)
  • sam project 루트 디렉터리에서 jsconfig.json를 다음과 같이 한다 (없으면 생성)
jsconfig.json
1
2
3
4
5
6
7
8
9
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"*": ["./opt/nodejs/*"]
}
},
"exclude": ["node_modules", "build"]
}
  • 이를 임포트 해서 사용하는 파일에서는
app.js
1
const myModule = require('myModule');
  • 이런 식으로 불러와 사용할 수 있다
  • 자동 완성도 잘 작동한다

레이어 yaml 설정

tmplate.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: functions/hello-world/
Handler: app.lambdaHandler
Runtime: nodejs12.x
Layers:
- !Ref MyModuleLayer
- !Ref HelloWorldFunctionLayer
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
Path: /hello
Method: get
# ...
HelloWorldFunctionLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: HelloWorldFunctionLayer
Description: Dependencies for SAM
ContentUri: layer/HelloWorldFunction
CompatibleRuntimes:
- nodejs12.x
LicenseInfo: 'MIT'
RetentionPolicy: Retain

MyModuleLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: my-layer
Description: Dependencies for SAM
ContentUri: opt
CompatibleRuntimes:
- nodejs12.x
LicenseInfo: 'MIT'
RetentionPolicy: Retain
  • 이런 식으로 리소스에 레이어를 작성한다

참고

Moment.js utc 사용하기

1
2
const date1 = moment().utc().format('YYYY-MM-DD HH:mm:ss');
console.log(date1);
  • utc() 메서드를 이용한다

활용한 곳

  • rds는 기본적으로 utc를 사용한다
  • 그래서 현재 지역 시간으로 포맷팅 된 값을 그대로 db에 넣으면 안 된다
  • rds의 시간대를 변경하거나, insert, update 할 때 잘 가공해서 쿼리를 해야 한다

참고

forEach await 안되는 문제

상황

  • 배열로 저장되어 있는 데이터를 forEach로 순회하면서 db에 INSERT하는 쿼리를 만들려고 했다
  • 근데 비동기적으로 동작했다
1
2
3
await data.forEach(async (element: ArticlePreview, idx: number) => {
// insert query
});

해결

1
2
3
4
5
6
7
8
9
for (const element of data) {
// ...
try {
const a = await databaseConnection.query(queryString, [
// ...
]);
}
// ...
}
  • for of에서는 await을 통해서 순차적으로 처리가 가능했다

시도해보지 않은 다른 방향

참고