본문 바로가기

Tech

(581)
[CS] 나만의 인터프리터를 만들어보자! (2): Parser 만들기 - 첫번째 🔊 해당 포스팅은 밑바닥부터 만드는 인터프리터 in go 책을 읽고 개인적인 정리 목적 하에 작성된 글입니다. 본 포스팅에 사용된 자료는 모두 본인이 직접 재구성하여 작성하였음을 알립니다. 직전 포스팅에서 우리는 입력된 소스코드 문자열을 토큰화시키는 렉서를 직접 만들고 테스트를 해보았다. 이번 포스팅에서는 이 렉서가 만들어낸 토큰들을 가지고 AST(추상 구문 트리)와 같은 자료구조로 변환을 수행하는 파서(Parser)를 만들어보도록 하자. 해당 챕터는 내용이 길어지기 때문에 몇 개의 포스팅으로 나누어서 게시할 예정이다. 이제 파서를 만들어보는 첫 걸음을 내딛어보자.1. Parser란 무엇일까?파서를 만들어보기 전, 우리는 파서라는 것이 무엇이고 어떤 역할을 하는지 알아야 만들어가면서 그 의미를 제대로 ..
[CS] 나만의 인터프리터를 만들어보자!(1): Lexer 만들기 🔊 해당 포스팅은 밑바닥부터 만드는 인터프리터 in go 책을 읽고 개인적인 정리 목적 하에 작성된 글입니다. 본 포스팅에 사용된 자료는 모두 본인이 직접 재구성하여 작성하였음을 알립니다. 최근에 C언어를 조금씩 접하기 시작하면서 로우 레벨 프로그래밍 언어 공부에 대한 갈증이 많아졌다. 하지만 C언어에 대한 기초를 배우고 난 뒤, 가장 당혹스러웠던 부분은 현재 실무에서 C언어를 자주 접할 일이 없어서 프로젝트 할만한 게 없다는 것이었다. 물론 Python의 구현체 중 하나인 CPython 소스코드를 살펴볼 수 있겠지만, 이것도 단지 '보기만 할 뿐'이지, 뭔가 결과물이 있거나 내 지식으로 체득되는 느낌이 아니었다. 그러던 중, 요즘 실무에서 쿠버네티스 기술과 Go로 작성된 벡터 데이터베이스인 Milvu..
[CS] 여러 가지 문자열 인코딩 방법과 base64 인코딩 🔊 해당 포스팅은 개인적으로 구독하고 있는 널널한 개발자님의 무료 유투브 강의인 문자열 인코딩과 base64 인코딩 영상을 보고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다.최근에 C 언어와 Go 언어를 조금씩 접하기 시작하면서 원툴로 사용해오던 Python 언어에 비해 다르게 느껴지는 점이 무수히 많았다. 그 중에 하나로서 컴퓨터가 문자 또는 문자열을 표현하는 방법인 문자열 인코딩에 대해서 확실히 알아두어야 겠다는 생각이 들었다. 그리고 또 다른 자매품(?)으로 base64 인코딩이 어떻게 동작하는지, 그리고 왜 사용되는지에 대해서도 같이 공부하면 좋겠다 싶었다. 1. 문자 인코딩의 시작: ASCII(아스키) 코드프로그래밍을 해보거나 코딩 테..
[Kubernetes] 쿠버네티스에서의 모니터링(feat. Prometheus) 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 쿠버네티스에서의 모니터링에 대해서 다루어보려고 한다. 직전 포스팅까지는 쿠버네티스에서 어떠한 리소스 오브젝트를 생성하고 적용하는 방법에 대해 주로 배워왔다면 이제는 지금까지 생성해온 리소스들의 상태가 현재 어떤지, 장애가 난 건 아닌지를 모니터링 하는 시스템을 쿠버네티스에서 어떻게 구축할 수 있는지에 대해 배워본다. 사실 쿠버네티스에서 자체적으로 제공하는 모니터링 기능은 없다. 보통은 프로메테우스와 같은 오픈소스 도구들을 조합하거나 Datadog과 같은 유료 솔루션을 도입해서 쿠버네티스에서의 모니터링 시스템을 구축하게 된다..
[Kubernetes] k8s에서의 접근 권한 제어하기: SA와 RBAC 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 일반적으로 쿠버네티스를 사용하는 환경은 한 명의 개발자가 운영하고 사용하는 경우는 거의 없다. 대부분 여러 명의 DevOps 개발자 또는 여러 명의 백엔드 개발자, MLOps 개발자 등 인프라를 들여다보는 개발자들이 함께 사용한다. 하지만 이 모든 개발자들이 동일한 범위의 권한으로 k8s 클러스터를 제어하지는 않는다. 운영체제가 유저 별로 디렉토리 또는 파일에 접근 권한을 다르게 부여하여 관리하는 것처럼 쿠버네티스에서도 유저 또는 애플리케이션 별로 쿠버네티스에 접근 권한을 제어할 수가 있다. 이번 포스팅에서는 쿠버네티스에서 RBAC(Role..
[CS] SSL/TLS 인증서는 어떻게 등장했을까? 🔊 해당 포스팅은 인프런 강의 널널한개발자님의 외워서 끝내는 SSL과 최소한의 암호기술 내용을 공부하면서 배운 내용을 저만의 방식으로 재정리하고자 하는 목적 하에 작성되는 포스팅입니다. 아래 포스팅에서 사용되는 모든 자료는 제가 직접 재구성했음을 알립니다. 이번 포스팅에서는 컴퓨터 공학에서 주로 사용되는 기초적인 암호기술과 관련해서 소개하려고 한다. 현재 웹 통신에서 가장 자주 사용되는 SSL/TLS 인증서가 등장하기 이전의 전통적인 암호기술은 어떤 방식을 채택했는지, 그리고 어떤 문제점이 있어 지금의 SSL/TLS 인증서까지 오게 되었는지 시간의 흐름 순으로 살펴보도록 하자. 그에 앞서서 기초적인 암호기술 관련된 몇 가지 개념들에 대해서 배워보도록 하자.1. Checksum과 Hash체크섬(Check..
[Kubernetes] 파드를 사용하는 또 다른 오브젝트들: Jobs, DaemonSets, StatefulSets 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 파드를 사용하는 또 다른 상위 리소스 오브젝트들로 Jobs, DaemonSet, StatefulSet에 대해서 알아보도록 하자. 지금까지 살펴본 ReplicaSet, Deployment 와 같은 리소스 오브젝트들도 배웠었는데, 이것들도 파드를 사용하는 상위 리소스 오브젝트들이라고 할 수 있다. 하지만 파드를 사용하는 리소스 오브젝트들로서 Jobs, DaemonSet, StatefulSet은 Replicaset, Deployment 와는 약간 다른 목적으로 사용하곤 한다. 하나씩 살펴보도록 하자.1. 특정 동작을 수행하고 종..
[Kubernetes] CRD, 커스텀 리소스, 그리고 컨트롤러 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 쿠버네티스에서 커스텀 리소스, CRD, 그리고 컨트롤러에 대해 알아본다. 직전 포스팅까지 우리는 모두 쿠버네티스에서 자체적으로 제공하는 리소스 오브젝트를 생성해왔다. 파드, 레플리카셋, 디플로이먼트, HPA, 스토리지 클래스, PV, PVC 등등 이런 리소스 오브젝트들은 쿠버네티스를 설치하기만 하면 기본적으로 내장되어 있어 사용할 수 있는 오브젝트들이다.  하지만 이렇게 기본적으로 쿠버네티스에서 제공하는 리소스 오브젝트 말고도 우리가 직접 새로운 리소스의 종류를 만들어서 쿠버네티스에서도 사용할 수 있다. 이렇게 직접 만든 ..
[Kubernetes] 파드의 생애주기(Lifecycle)와 배포 전략 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 쿠버네티스에서는 파드를 관리할 때, 파드의 상태값에 따라 관리하게 된다. 그리고 이 파드의 상태는 파드의 생애주기(Lifecycle)라는 것 안에 다양한 상태 종류로 존재한다. 이번 포스팅에서는 파드의 생애주기를 알아보면서 파드의 상태에 어떤 종류들이 있고, 그 의미가 무엇인지, 더 나아가 이 생애주기를 발생시키는 배포 전략(a.k.a 블루 그린, 롤링 업데이트)에 대해서 알아보도록 하자. 지금까지는 파드, 디플로이먼트, 레플리카셋 등 모든 쿠버네티스 리소스 오브젝트를 단순히 kubectl apply -f 라는 명령어를 이용해서 배포해왔다. ..
[Kubernetes] 쿠버네티스의 파드 스케쥴링 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 저번 포스팅에서는 쿠버네티스에서 파드나 컨테이너와 같은 리소스 자체를 얼마나 알차게 활용할 수 있는지에 대해서 배웠다. 이번 포스팅에서는 파드나 컨테이너와 같은 인스턴스를 생성할 때, 그 인스턴스를 어떤 서버 즉, 쿠버네티스 클러스터의 어떤 노드에 생성할 것인지를 결정하는 쿠버네티스의 스케쥴링에 대해서 배워보려고 한다. 간단한 예시로, 어떤 애플리케이션을 쿠버네티스 클러스터에 배포하려고 하는데, 해당 애플리케이션의 기반이 되는 (도커)이미지가 amd64 OS 플랫폼만 지원이 된다면 해당 애플리케이션은 amd64 OS 플랫폼으로 구성되어 있는..
[Kubernetes] 파드의 리소스 자원 사용량을 제한시켜보자 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 쿠버네티스 클러스터를 멀티 노드 환경으로 구축하는 데 있어서 얻을 수 있는 또 다른 강점은 여러 대의 노드(서버)를 묶어서 리소스(CPU, 메모리) 풀로 사용할 수 있다는 점이다. 이러한 점을 활용한다면 특정 파드에서 더 많은 CPU 와 메모리를 필요로 한다면 리소스 풀을 사용해 동일한 리소스 스펙을 갖는 파드를 또 하나 추가시켜 수평 확장(Scale-Out)을 수행할 수도 있다. 하지만 이러한 Scale-Out 기능 만큼 또 다른 중요하게 신경써야 할 점이 있는데, 그것은 바로 컴퓨팅 자원 활용률(Utilization)이다. 이 '컴퓨팅..
[C] C로 구현하는 선형적인 자료구조 : 싱글 연결 리스트 (1) 🔊 해당 포스팅은인프런의 널널한 개발자님의 독하게 C를 배운 사람을 위한 선형 자료구조 강의를 듣고 개인적인 복습 목적 하에 작성된 글입니다. 해당 포스팅에 사용된 모든 자료는 필자가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 가장 기본적인 선형 자료구조 중 하나인 연결 리스트(Linked List) 자료구조를 C 언어로 구현해 보도록 하자. 이번 포스팅에서 구현할 것은 성능 개선과 같은 것들을 고려하지 않고 정말 구현에 초점을 맞추어 본다. 1. 연결 리스트 자료구조구현에 앞서서 연결 리스트가 어떤 자료구조인지 알아보아야 한다. 흔히 연결 리스트라는 자료구조를 구글링 해보면 아래와 같은 그림이 등장한다.  위 그림 속 하나의 data 와 next 가 같이 들어있는 것을 하나의 '노드(Node)'..
[Kubernetes] 파드 내부의 데이터를 영속적으로 저장하자: PV, PVC 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 1. 데이터를 보존해야만 하는 파드 : stateful 파드쿠버네티스와 관련된 직전 포스팅까지는 모두 파드가 상태가 없는 즉, stateless한 애플리케이션이었다. 상태가 없는 파드라는 것은 그 파드의 내부에는 별도의 데이터를 갖고 있지 않으며, 단순히 파드 외부에서 해당 파드로 요청을 보냈을 때, 어떤 처리만을 수행하고 응답을 반환하기만 했음을 의미한다. 하지만 경우에 따라 파드 내부에서 별도의 데이터를 가지고 있어야 할 수도 있다. 곧 파드가 상태가 있는 즉, stateful한 경우가 있을 수 있다. 이렇게 되면 stateful 한 파..
[Kubernetes] 인바운드 트래픽을 처리하는 방법 : 인그레스(Ingress) 🔊 해당 포스팅은 시작하세요! 도커/쿠버네티스 서적을 읽고 개인적인 목적 하에 작성되는 글입니다. 포스팅에 사용되는 모든 자료는 제가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 쿠버네티스 클러스터의 외부에서 내부로 요청(인바운드 트래픽)이 들어왔을 때, 어떻게 처리할지를 결정하는 인그레스(Ingress) 라는 리소스 오브젝트에 대해서 배워보도록 하자.1. 서비스 vs 인그레스먼저 인그레스라는 용어의 정의에 대해서 짚고 넘어가보자. 인그레스란, 외부에서 내부로 향하는 것을 일컫는다. 그래서 인그레스 트래픽이라 함은 외부에서 내부로 향하는 트래픽을 말하고, 인그레스 네트워크라고 한다면 외부에서 내부로 향하는 트래픽(인그레스 트래픽)을 처리하기 위한 네트워크를 의미한다. 인그레스라는 리소스 오브젝트를 ..
[C] 함수 포인터와 역호출(Callback) 구조 🔊 해당 포스팅은 인프런의 널널한 개발자님의 독하게 시작하는 C 프로그래밍 강의를 듣고 개인적인 복습 목적 하에 작성된 글입니다. 해당 포스팅에 사용된 모든 자료는 필자가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 함수의 고급이론 중 하나로 함수 포인터에 대한 개념에 대해 배워보고 이 함수 포인터를 자주 사용하는 유즈 케이스 중 하나로 역호출(Callback) 구조에 대해서도 배워보자.1. 함수 포인터이제 포인터라는 것에 대해서는 매우 익숙할 것이다. 그동안 정수, 실수, 문자, 문자열, 배열에 대한 포인터도 배웠지만 함수에 대한 포인터에 대해서도 배워볼 차례다. 함수도 문자열, 배열과 마찬가지로 정의한 함수 이름에 메모리 주소가 담긴다. 그래서 함수 포인터를 정의하면 함수의 이름을 메모리 주소로..
[C] 컴파일 전처리기 🔊 해당 포스팅은 인프런의 널널한 개발자님의 독하게 시작하는 C 프로그래밍 강의를 듣고 개인적인 복습 목적 하에 작성된 글입니다. 해당 포스팅에 사용된 모든 자료는 필자가 직접 재구성하였음을 알립니다.  이번 포스팅에서는 # 이라는 문자를 사용해서 정의하는 전처리기에 대해서 알아보자. 전처리기에 대한 처음 소개는 이전에 한 적이 있었다. 그 때 당시에는 간단하게만 짚고 넘어갔는데 이번엔 좀 더 의미를 자세히 알아보자. 컴파일 전처리기는 이름 자체에서도 알 수 있듯이, 컴파일 타임이 시작하기 이전(before)에 어떠한 처리를 해주는 것을 의미한다. 대표적인 전처리기로는 stdio.h 와 같은 헤더 파일을 포함하도록 하는 것, 조건부 컴파일, 심볼릭 상수를 정의, 매크로 정의 이렇게 총 4가지가 있다.1..
[C] 변수와 상수 고급 이론 🔊 해당 포스팅은 인프런의 널널한 개발자님의 독하게 시작하는 C 프로그래밍 강의를 듣고 개인적인 복습 목적 하에 작성된 글입니다. 해당 포스팅에 사용된 모든 자료는 필자가 직접 재구성하였음을 알립니다. 저번 포스팅까지 강의에서 소개하는 C언어의 기초적인 내용은 모두 끝이 났다. 이제 앞으로 해당 포스팅을 포함해 3개의 포스팅에서는 C언어에서 고급 이론에 해당하는 내용들을 배워보려고 한다. 그 첫번째 내용으로는 변수와 상수에서의 고급 이론에 대한 내용이다.1. 컴파일러 최적화에 기여하는 요소 : 형한정어(Type Qualifier)컴파일러 최적화란 무엇일까? C언어를 배우는 첫 포스팅에서 우리는 C언어가 총 3가지 시점을 갖는다고 했다. 잠시 그 때의 자료를 가져와보자.  컴파일러는 위 단계 중 컴파일 ..
[C] 파일 입/출력 🔊 해당 포스팅은 인프런의 널널한 개발자님의 독하게 시작하는 C 프로그래밍 강의를 듣고 개인적인 복습 목적 하에 작성된 글입니다. 해당 포스팅에 사용된 모든 자료는 필자가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 C언어에서의 파일 입/출력에 대해 배워보도록 하자. C언어 포스팅 시리즈에서 초반에 문자열 입/출력을 다룬 적이 있었다. 하지만 그 이후로 학습을 진행하면서는 모두 주기억장치인 RAM, 엄밀히 말하면 각 프로세스 당 부여되는 가상 메모리를 다루는 것이었다. 이제는 주기억장치와는 다르게 컴퓨터 전원을 꺼도 휘발되지 않는 보조기억장치인 SSD, HDD에서 데이터를 읽고 쓰는 파일 입/출력에 대해서 배워보도록 하자.  참고로 RAM을 이용할 때의 데이터는 우리가 메모리를 동적할당할 때나 소스..
[C] 서로 다른 유형의 자료형을 모을 수 있는 구조체와 공용체 🔊 해당 포스팅은 인프런의 널널한 개발자님의 독하게 시작하는 C 프로그래밍 강의를 듣고 개인적인 복습 목적 하에 작성된 글입니다. 해당 포스팅에 사용된 모든 자료는 필자가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 구조체와 공용체에 대해서 알아보고 사용하는 방법에 대해 알아보자.1. 구조체를 만들어보자!우선 구조체랑 비교한다고 하면 이전에 배웠던 배열이 비교군이 될 수 있겠다. 구조체와 배열의 공통점이라고 한다면 여러 자료형을 모아 새로운 하나의 형식으로 기술할 수 있다는 것이다. 하지만 배열은 그 여러 자료형들이 반드시 같은 유형(ex. 정수, 실수, 문자)이어야 하는 반면 구조체는 서로 다른 유형의 자료형들이 모이는 것이 가능하다. 물론 구조체에서 배열처럼 같은 유형의 자료형이여도 상관은 없다..
[C] 함수 응용 🔊 해당 포스팅은 인프런의 널널한 개발자님의 독하게 시작하는 C 프로그래밍 강의를 듣고 개인적인 복습 목적 하에 작성된 글입니다. 해당 포스팅에 사용된 모든 자료는 필자가 직접 재구성하였음을 알립니다. 이번 포스팅에서는 이전에 배웠던 C언어에서 함수를 정의하는 방법에서 더 나아가 좀 더 응용하는 내용에 대해서 알아보도록 하자.1. 함수에 매개변수를 전달하는 2가지 기법함수에 매개변수를 전달하는 방법으로는 크게 2가지가 존재한다. 첫 번째로는 우리가 흔히 사용해왔던 call by value 방식이다. 예시코드는 아래와 같다. #include int Multiply(int a, int b) { return a * b;}int main(void) { int res = 0; res = Mult..