프로그래밍 29

Graceful Shutdown과 SIGINT/SIGTERM/SIGKILL

1. Graceful Shutdown이란 무엇인가? 우아한 종료라고 직역하면 뭔가 어색하지만, 그 역의 경우를 생각해보면 제법 어울리는 표현이라는 생각이 든다. 우아한 종료는 프로그램이 종료될 때 최대한 side effect가 없도록 로직들을 잘 처리하고 종료하는 것을 말한다. Gracueful Shutdown Hard Shutdown 우아한 종료의 대척점에는 Hard Shutdown이 있다. 예를 들면 이런 것이다. 회사에서 코드를 한창 짜고 있는데, 팀장님이 "땡땡씨 퇴근하세요."라고 했을 때 - 코드를 커밋하고 푸시한 뒤 컴퓨터를 끄고 퇴근하는 것: graceful shutdown - 그대로 컴퓨터를 바로 끄고 퇴근하는 것: hard shutdown 하고있던 작업을 적절히 마무리한 뒤 종료되는 것이..

프로그래밍 2020.05.17

서비스 메쉬, 데이터 플레인, 컨트롤 플레인 뜻

최근 k8s와 istio에 대해 조사하면서 새로운 용어들을 만나게 되었다. 구현체에 너무 얽매이지 않도록 주의하면서 개념을 정리해 보자. Service Mesh 서비스 메쉬란 한 애플리케이션의 다양한 부분들이 통신하는 것을 제어하는 방법이다. 한 애플리케이션 안에서 여러 서비스들이 서로 통신하며 데이터를 주고받는 것을 서비스의 소스코드와 상관없이 제어하는 것이다. MSA =! Service Mesh MSA는 그러면 서비스 메쉬인가? 아니다. MSA는 애플리케이션 구조에 대한 개념이다. 서비스 메쉬는 애플리케이션을 구성하는 여러 서비스들의 내부 통신을 어떻게 제어할 것인가에 대한 이야기다. 근데 MSA는 당연히 내부 서비스들끼리 http를 비롯하여 다양한 프로토콜로 서로 소통하니까 서비스 메쉬까지 항상 포..

프로그래밍 2020.05.07

in-memory DB는 왜 더 빠를까

in-memory DB는 disk-based DB와 달리 말 그대로 메모리에 데이터를 저장한다. 외부 저장 장치에 데이터를 저장하지 않고 메모리에서 데이터를 읽고 쓴다. 메모리 디스크 간 병목이 없기 때문에 disk-based DB보다 훨씬 속도가 빠르다. 외부 저장 장치에 데이터를 저장하여 사용할 경우에는 왜 느린가? 외부 저장 장치에 있는 데이터를 읽고자 할 경우, 해당 데이터를 곧바로 사용할 수 없다. 데이터를 읽어서 메모리에 올리고, 메모리에 올라간 데이터를 읽어서 사용할 수 있다. (약간 옆으로 새는 이야기라서 회색 처리) 만약 HDD를 외부 저장 장치로 사용한다면 액츄에이터가 액츄에이터 암을 움직이고, 액츄에이터 암의 끝에 달려 있는 헤드를 통해 데이터를 읽고 쓰게 된다. in-memory D..

프로그래밍 2020.04.26

[토막팁] global gitignore & MySQL charset default 설정

1. global gitignore git을 써본 적이 있다면 .gitignore의 존재를 알 것이다. .gitignore에 추가된(작성된) 디렉토리들은 말 그대로 무시되며, untracked files에도 내역이 보이지 않는다. http://gitignore.io/ 같은 사이트를 쓰면 편리하다. 운영체제와 프로그래밍 언어 등을 고르면 적당한 .gitignore를 손쉽게 만들 수 있다. 그런데, global gitignore도 존재한다. https://help.github.com/en/github/using-git/ignoring-files#configuring-ignored-files-for-all-repositories-on-your-computer You can also create a global..

프로그래밍 2020.04.18

[토막팁] 깃헙 빨간색 하이라이팅의 정체

sql 파일을 깃헙에 올렸는데, 다른 컬럼은 괜찮은데 timestamp라는 컬럼만 빨갛게 표시가 되었다. 예약어(reserved word)일 경우 빨간색으로 하이라이팅이 되는데, 항상 정확한 건 아니다. 예약어: 프로그래밍 언어가 이미 문법적인 의미로 사용하고 있기 때문에 식별자로 사용할 수 없는 단어 실제로 예약어가 될 수 없는 위치에 사용되어, 예약어로 동작할 수 없음에도 불구하고 하이라이터가 빨갛게 표시를 할 수도 있기 때문이다. 예를 들어 for 같은 경우 대부분의 프로그래밍 언어에서 예약어이다. 하지만 주석에 있는 for가 빨간색으로 칠해진다면? 주석은 당연히 무시되므로 하이라이팅이 되었다고 해서 for를 주석에 못 쓰는 건 아니다.

프로그래밍 2020.04.16

HTTP란 무엇인가

HTTP란 무엇인가? HTTP는 HyperText Transfer Protocol의 약자이다. 프로토콜은 컴퓨터와 컴퓨터가 통신을 할 때 지켜야 할 절차나 규약이다. HTTP는 월드 와이드 웹에서 정보를 주고받을 수 있는 규약이다. 클라이언트 PC의 웹 브라우저, 그리고 웹 서버는 HTTP 프로토콜을 사용하여 정보를 주고 받는다. 이때 이 주고받는 정보들을 HTTP 메시지라고 부른다. HTTP 메시지는 요청(Request)과 응답(Response) 두 가지 형태가 있다. HTTP 메시지의 구성 요소 - 요청 정보 행(request line) / 응답 정보 행(status line) : 메세지의 종류 또는 상태를 표시한다. Ex) GET /example/something.html HTTP/1.1 Ex2) ..

프로그래밍 2020.03.24

body-parser가 필요한 이유

body-parser가 필요한 이유 작년에 토이 프로젝트로 express를 활용한 웹 앱을 만들면서, "프로그래밍을 배운지도 반 년은 되었으니 예전보다 역시 작업 속도가 빨라졌네" 하며 조금 기분 좋아했었는데, body-parser 때문에 거하게 삽질을 하고 나서 반성하는 시간을 가진 적이 있다. 분명히 클라이언트 쪽에서 서버 쪽으로 json을 잘 보내주는데, 정작 서버 쪽에서는 undefined가 들어오는 상황이었다. app.get('/something', (req, res) => { console.log(req.body) // undefined }) 어느 부분의 로직이 잘못된 건지 몇 번을 코드를 뒤적거렸다. 뭔가 이상해서 예전에 만들었던 토이 프로젝트의 코드를 열어서 어떤 차이점이 있는지 살펴보았다..

프로그래밍 2020.03.19

Big-O 표기법

칸아카데미에서 점근적 표기법 강의를 보고 정리했다. Big-O 표기법 알고리즘이 얼마나 오래 걸리는지를 표현하는 대표적인 방법 중 하나이다. 알고리즘의 실행 시간은 컴퓨터가 코드를 실행하는 속도에 의존한다. 그리고 이 속도는 컴퓨터 자체의 성능, 사용된 언어, 컴파일러 등에 의존적이다. 따라서 단순히 "이 알고리즘은 30분 쯤 걸려요" 같은 말은 할 수가 없는 것이다. 입력값의 크기를 n이라고 할 때, 알고리즘을 실행하기 위한 연산의 횟수를 n에 대한 식, 즉 일종의 함수로 표현할 수 있다. 알고리즘의 실행 시간을 입력값의 크기에 대한 함숫값으로 생각할 수 있는 것이다. 이 때 입력값의 크기에 따라 함숫값이 얼마나 빨리 커지는지를 실행시간의 성장률이라고 부른다. 성장률을 파악할 때, 계수와 상수는 불필요..

프로그래밍 2020.03.19

sequelize 마이그레이션 버그를 고쳐 보자.

이 글은 2019년 9월 11일에 작성했던 글입니다. 토이 프로젝트를 진행하다가 조금 쉬고 싶어서 sequelize 이슈에서 처리할만한 것이 있는지 뒤적거렸다. 그러다 이 버그를 발견했다. 마이그레이션을 할 때 이름에 온점(.)이 들어가있는 테이블에 인덱스를 추가하려고 하면 에러가 난다는 것이었다. $ npx sequelize-cli db:migrate 같은 형태로 마이그레이션을 실행하기 때문에, 비쥬얼 스튜디오 코드의 기본 디버거 기능은 부적합했다. node --inspect의 힘을 빌려서 크롬 디버거를 활용하기로 했다. 디버깅 준비하기 먼저 sequelize-cli가 어떻게 실행되는지 확인하기 위해 node_modules/.bin/sequelize-cli.cmd 파일을 확인했다. @IF EXIST "..

프로그래밍 2020.03.18

primary key, natural key, surrogate key

- 아래 글은 2019년 11월부터 2개월간 칸아카데미 서포터즈로 활동하면서 작성한 글입니다. 1. primary key primary key는 어떤 고유한 한 행(row)을 가리키는 key다. primary key는 반드시 고유한 값을 가져야 하며, null 값을 가질 수 없다. primary key가 있으면 query 실행 속도가 상대적으로 더 빠르다. 또한 복수의 table 사이의 연결고리 역할도 할 수 있다. 그런데 왜 빠를까? 다들 빠르다고만 하지 왜 빠른지는 설명해주는 글이 잘 없어서, 구글의 힘을 빌렸다. 개인적으로는 아래 글이 쉽게 설명해줘서 좋았다. https://dba.stackexchange.com/questions/100749/how-does-unique-key-help-to-imp..

프로그래밍 2020.03.18
반응형