aws
cheat sheet
computer science
container
crawling
dart
database
django
docker
git
golang
graphql
hr
http
iac
java
kubernetes
map
monitoring
nestjs
network
node
oop
python
security
serverless
storage
terraform
ttbkk
typescript,javascript
ux
validation
이번 글에서는 API 하위호환 지원에 대한 내용은 다루지 않습니다. 서론 구글과 같이 무중단 마이그레이션을 잘 수행하는 능력을 가진 개발자가 되고싶다. 항상 위와 같은 생각을 하고있었고, 이번기회에 데이터베이스 마이그레이션에 대해 조금 더 깊게 공부하고자 글을 작성하게 되었습니다. 단순 마이그레이션의 한계 기존에는 사용하던 데이터베이스에 마이그레이션 쿼리를 적용했고, 아래의 순서를 따릅니다. 서버가 시작되면서 마이그레이션 파일들을 스캔하고, 어디까지 db에 반영되었는지 migration history 테이블을 조회하여 체크한다. 아직 db에 반영되지 않은 마이그레이션 쿼리를 반영한다. 마이그레이션이 제대로 반영되었다면, migration history…
ISMS-P = ISMS + PIMS 「정보보호 및 개인정보보호 관리체계 인증 등에 관한 고시」 (2018년 11월) 시행으로 정보보호 관리체계(ISMS)와 개인 정보보호 관리체계(PIMS) 인증제도가 통합되었다. ISMS (Information Security Managemenet System) 정보보호관리체계 인증으로, 기업이 주요 정보자산을 보호하기 위해 수립, 관리, 운영하는 정보보호 관리체계가 인증기준에 적합한지 심사하여 인증을 부여하는 제도이다. PIMS (Personal Information Management System) 개인정보보호 관리체계 인증으로, 공공기관 및 민간기업 등 조직이 수립하여 운영하고 있는 개인정보보호 관리체계가 인증기준에 적합한지 여부를 인증기관이 평가하여 인증을 부여하는 제도이다. ISMS-P (ISMS + PIMS…
minikube 소개 k8s를 사용하기 위해서는 master 노드 2개와 worker 노드 3개가 필요하고 이들을 연결해야하는데, 로컬에서 테스트하는 환경에서는 이러한 작업이 매우 힘들기 때문에, minikube라는 친구를 사용해서 로컬에서 작업을 합니다. minikube는 master process와 worker process 모두를 가지고 있는 one node cluster입니다. 아래의 두 링크중 하나를 선택하고, 아래의 과정을 이어서 진행하면 됩니다. minikube start | minikube minikube 설치 Hello Minikube | Kubernetes 웹 터미널에서 가볍게 해보기 kubectl 소개 k8s의 api server와 인터렉션 할수 있는 방법은 UI대시보드, CLI툴, API 직접호출 이렇게 세가지가 있는데, 이중 CLI를 맡고있는 것이 kubectl입니다. kubectl은 minikube뿐만 아니라, 모든 k8s…
이전 글에 이어서 작성합니다. 쿠버네티스의 Node에는 master, slave 이렇게 두가지 타입이 있습니다. 클러스터 내부에서 master와 slave Node가 각각 어떤 역할을 하는지 알아봅시다. 그리고 이를 통해 쿠버네티스가 어떻게 수동적인 관리 없이 셀프 매니징, 셀프 힐링을 하는지 알아보겠습니다. Worker Node 각 Node에는 여러개의 Pod들이 존재합니다. Pod을 관리하는 모든 노드에는 필수로 설치되어야 하는 3개의 프로세스가 있습니다. 1. container runtime 컨테이너를 동작시키기 위한 프로그램입니다. 예를 들어, docker와 같은 프로세스를 컨테이너 런타임이라고 합니다. 2. kubelet Kubelet은 Pod에서 컨테이너가 확실하게 동작하도록 관리합니다. 3. kubeproxy Service에서 Pod으로 요청을 넘겨주기 위한 process입니다. kubeproxy는 overhead를 줄이기 위한 처리들을 해줍니다. 예를 들어, A와 B…
쿠버네티스 관련 괜찮은 영상이 있어서 시청 하면서 메모한 내용을 정리해두고자 합니다. k8s란? 쿠버네티스(kubernetes, 또는 k8s)는 구글이 만든 오픈소스 컨테이너 오케스트레이션 툴로, 컨테이너 애플리케이션의 관리를 돕습니다. 물리서버, 클라우드서버 등의 다양한 환경에서 사용이 가능합니다. 아래의 케이스에 해당되는 경우, 고려해볼 수 있습니다. 트렌드에 따라 모노리틱 아키텍처(Monilithic Architecture)에서 마이크로 서비스 아키텍처(Microservice Architecture, 또는 MSA)로의 전환을 하고 싶은 경우. 컨테이너의 사용이 증가하는 경우. 수백개의 컨테이너를 잘 관리하고 싶은 경우. k8s는 다음의 기능들을 제공합니다. downtime이 없는 High Availability(HA) 스케일링 높은 퍼포먼스 장애 회복 (disaster recovery) k8s…
node와 ts-node의 차이가 어디에서 오는지 알아보기 위해 조사한 과정을 기록으로 남기고자 합니다. 특정 코드의 동작시간과 메모리 사용량을 각각 비교해보았습니다. 테스트 코드 테스트하고자 하는 코드는 소수의 개수를 반환하는 간단한 코드입니다. 결과 좌측(또는 위)이 node, 우측(또는 아래)이 ts-node입니다. 시간 node와 ts-node 모두 출력된 결과에선 별 차이가 없었고, 반복문을 10만에서 100만회로 늘려서 다시 시도해보아도 0.3%정도의 오차율만 보였습니다. ts-node의 경우 ts-node 패키지를 실행하는 시간으로 인해 실제로는 수 초 이상의 시간이 더 소요되었습니다. 하지만 이러한 컴파일 타임은 서버와 같이 장시간 동작하는 프로세스에서는 의미없는 차이라고 느껴집니다. Resident Set Size (RSS) RSS의 경우 7~8배 정도의 차이가 있었습니다. 또한 node의 rss는 코드가 진행됨에따라 변화했지만, ts-node…
String String은 리터럴로 표기가 가능하지만 primitive 자료형은 아니다. String은 리터럴 표현식을 사용할 수 있도록 자바에서 특별 대우 해 주는 자료형이다. String a = "happy java" 와 String a = new String("happy java") 는 같은 값을 갖게 되지만 완전히 동일하지는 않다. 첫번째 방식을 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말한다. 위 예에서 리터럴 표기법은 "happy java" 라는 문자열을 intern pool 이라는 곳에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 리턴한다. 두번째 방식은 항상 새로운 String 객체를 만든다. 문자열의 값을 비교할때는 반드시 equals 를 사용해야 한다. == 연산자를 사용할 경우 다음과 같은 경우가 발생할 수 있다. StringBuffer insert…
Garbage란? Garbage는 컴퓨터의 메모리에 있지만 앞으로 사용되지 않을 데이터나 객체 또는 메모리 영역을 가리킵니다. 모든 컴퓨터 시스템은 제한적인 메모리를 가지고 있고, 대부분의 소프트웨어 garbage를 만들어내기 때문에, 이를 메모리에서 해제하여 다시 사용할 수 있게 해야 합니다. 아래의 Item과 Stack 두 클래스를 활용한 코드가 다음과 같을때, 두번째로 push해준 Item은 pop 이후 어디에서도 접근할 수 없는 객체, 즉 garbage가 되었습니다. Garbage Collection이란? 가비지컬렉션(garbage collection, GC)은 자동으로 메모리를 관리해주는 기법입니다. 프로세스에 의해 할당되었지만, 더이상 참조되지 않는 메모리를 garbage라고 하고, 이러한 garbage를 수거하는 작업은 garbage collector가 진행합니다. java, python, javascript 등의 언어들은 이러한 GC…
JIT(Just-In-Time)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 자바의 경우 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다. 작동 방식 JAVA 소스코드(.java)를 바이트코드(.class)로 변환하는 작업은 javac 컴파일러의 도움으로 진행된다. 이후 .class 파일은 런타임에 JVM에 의해 로드되고, 인터프리터의 도움으로 기계가 이해할 수 있는 코드로 변환된다. JIT 컴파일러는 JVM의 일부이다. JIT 컴파일러가 활성화되면, JVM은 .class…
TCP/IP는 현재 인터넷 프로토콜 중 가장 많이 쓰이고있다. TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP(internet protocol)와 전송 조절 프로토콜인 TCP (transmission control protocol) IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다. TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 수많은 애플리케이션 프로토콜들이 IP 위에서 동작한다. internet protocol 송신 호스트와 수신 호스트가 패킷 교환 네트워크(패킷 스위칭 네트워크)에서 정보를 주고받는 데 사용하는 정보 위주 규약이며, OSI 네트워크 계층에서 호스트의 주소지정과 패킷 분할 및 조립 기능을 담당한다. IP의 정보는 패킷 혹은 데이터그램이라고 하는 덩어리로 나뉘어 전송된다. IP…
패킷은 제어정보와 사용자 데이터로 이루어지며 이를 페이로드라고도 한다. 패킷은 정보기술에서 컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록이다. 패킷을 지원하지 않는 컴퓨터통신 연결은 단순히 바이트 문자열 비트를 독립적으로 연속하여 데이터를 전송한다. 데이터가 패킷으로 형식이 바뀔때 네트워크는 장문메시지를 더 효과적이고 신뢰성있게 보낼수 있다. version (4 bits): 현재로는 버전 4를 사용 Header Length (4 bits): 헤더의 길이 Type of Service (Tos) Flag (8 bits): 요구되는 서비스 품질을 나타냄 우선순위 설정용 (0~2 bit): Precedence (우선순위 8단계) TOS 설정용 Bit 3: Delay (0: 보통의 지연, 1: 높은 지연) Bit 4: Throughput (0: 보통 처리율, 1: 높은 처리율) Bit 5: Reliability (0: 보통 신뢰성, 1: 높은 신뢰성) Bit 6: Minimum Cost…
이 포스팅의 예제 코드는 typescript + nestjs를 기반으로 작성되었지만, 다른 언어에도 마찬가지로 적용이 가능합니다. 이 포스팅은 아래의 스키마를 기반으로 작성되었습니다. Dataloader 적용 전 위의 쿼리 요청을 위해 서버에서 Resolver를 아래와 같이 작성했다고 가정해봅시다. 아직 Dataloader를 적용하지 않은 상태입니다. 만약 orders 쿼리의 결과로 5개의 주문이 반환된다면, Dataloader 작업을 하지 않은 경우 아래처럼 쿼리가 발생합니다. (5개의 주문 id는 1,2,3,4,5이며 주문한 유저의 id 또한 각각 1,2,3,4,5라고 가정해봅시다.) user와 order_item 데이터를 가져오기 위해 반환된 order 수 만큼의 쿼리가 추가적으로 발생했습니다. 이를 N+1 Problem 이라고 부릅니다. REST API의 경우 모든 데이터를 한번에 가공하여 클라이언트에 전달하지만, GraphQL의 각각의 type은 해당 값을 resolve…