Siner's Blog

about me


44개의 게시글이 있습니다.

https://user-images.githubusercontent.com/34048253/156888390-6c95f6c4-dd5c-49b1-b6bc-b6ec5ca5c624.png
쿠버네티스 정리 3. 로컬에서 서비스 띄워보고 수정해보기
minikube, kubectl 첫 경험

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…

https://user-images.githubusercontent.com/34048253/155732647-7a550481-e417-4173-8250-d4701222018c.png
쿠버네티스 정리 2. 아키텍처
마스터 노드, 워커 노드의 역할

이전 글에 이어서 작성합니다. 쿠버네티스의 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…

https://user-images.githubusercontent.com/34048253/154848123-1601c82d-85ee-486e-aa7d-082aa0ce7935.png
쿠버네티스 정리 1. 컴포넌트 종류
쿠버네티스가 각 문제들을 해결하는 방법

쿠버네티스 관련 괜찮은 영상이 있어서 시청 하면서 메모한 내용을 정리해두고자 합니다. k8s란? 쿠버네티스(kubernetes, 또는 k8s)는 구글이 만든 오픈소스 컨테이너 오케스트레이션 툴로, 컨테이너 애플리케이션의 관리를 돕습니다. 물리서버, 클라우드서버 등의 다양한 환경에서 사용이 가능합니다. 아래의 케이스에 해당되는 경우, 고려해볼 수 있습니다. 트렌드에 따라 모노리틱 아키텍처(Monilithic Architecture)에서 마이크로 서비스 아키텍처(Microservice Architecture, 또는 MSA)로의 전환을 하고 싶은 경우. 컨테이너의 사용이 증가하는 경우. 수백개의 컨테이너를 잘 관리하고 싶은 경우. k8s는 다음의 기능들을 제공합니다. downtime이 없는 High Availability(HA) 스케일링 높은 퍼포먼스 장애 회복 (disaster recovery) k8s…

https://user-images.githubusercontent.com/34048253/154791313-ee720cb4-16a0-4482-aa8a-f78815a84916.png
node와 ts-node의 CPU,RAM 사용량 비교
ts-node를 production에서 사용하면 안되는 이유

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…

https://user-images.githubusercontent.com/34048253/155850239-6ef69903-210c-4775-ad75-be86e45669bf.png
JAVA 자료구조 정리
java data structure cheat sheet

String String은 리터럴로 표기가 가능하지만 primitive 자료형은 아니다. String은 리터럴 표현식을 사용할 수 있도록 자바에서 특별 대우 해 주는 자료형이다. 와 는 같은 값을 갖게 되지만 완전히 동일하지는 않다. 첫번째 방식을 리터럴(literal) 표기라고 하는데 객체 생성없이 고정된 값을 그대로 대입하는 방법을 말한다. 위 예에서 리터럴 표기법은 "happy java" 라는 문자열을 intern pool 이라는 곳에 저장하고 다음에 다시 동일한 문자열이 선언될때는 cache 된 문자열을 리턴한다. 두번째 방식은 항상 새로운 String 객체를 만든다. 문자열의 값을 비교할때는 반드시 equals 를 사용해야 한다. == 연산자를 사용할 경우 다음과 같은 경우가 발생할 수 있다. StringBuffer insert 메소드는 특정 위치에 원하는 문자열을 삽입할 수 있다. StringBuffer.append vs String + String…

https://user-images.githubusercontent.com/34048253/147408809-ae9a3134-8b5b-4305-a30f-99fce81509bd.gif
가비지컬렉션(Garbage Collection)의 종류와 특징
동적 언어의 메모리 관리 기법

Garbage란? Garbage는 컴퓨터의 메모리에 있지만 앞으로 사용되지 않을 데이터나 객체 또는 메모리 영역을 가리킵니다. 모든 컴퓨터 시스템은 제한적인 메모리를 가지고 있고, 대부분의 소프트웨어 garbage를 만들어내기 때문에, 이를 메모리에서 해제하여 다시 사용할 수 있게 해야 합니다. 아래의 Item과 Stack 두 클래스를 활용한 코드가 다음과 같을때, 두번째로 push해준 Item은 pop 이후 어디에서도 접근할 수 없는 객체, 즉 garbage가 되었습니다. Garbage Collection이란? 가비지컬렉션(garbage collection, GC)은 자동으로 메모리를 관리해주는 기법입니다. 프로세스에 의해 할당되었지만, 더이상 참조되지 않는 메모리를 garbage라고 하고, 이러한 garbage를 수거하는 작업은 garbage collector가 진행합니다. java, python, javascript 등의 언어들은 이러한 GC…

https://user-images.githubusercontent.com/34048253/147363191-49b62b21-ef59-422d-a58a-341dbe124190.png
JAVA의 컴파일 과정
JIT의 동작원리와 코틀린에서의 컴파일 차이점

JIT(Just-In-Time)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 자바의 경우 자바 컴파일러가 자바 프로그램 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에서 자바 가상 머신이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다. 작동 방식 JAVA 소스코드(.java)를 바이트코드(.class)로 변환하는 작업은 javac 컴파일러의 도움으로 진행된다. 이후 .class 파일은 런타임에 JVM에 의해 로드되고, 인터프리터의 도움으로 기계가 이해할 수 있는 코드로 변환된다. JIT 컴파일러는 JVM의 일부이다. JIT 컴파일러가 활성화되면, JVM은 .class…

https://upload.wikimedia.org/wikipedia/commons/5/5b/InternetProtocolStack.png
TCP/IP 정리
3 way handshake의 상황별 처리방법에 대해 알아보자

TCP/IP는 현재 인터넷 프로토콜 중 가장 많이 쓰이고있다. TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP(internet protocol)와 전송 조절 프로토콜인 TCP (transmission control protocol) IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다. TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 수많은 애플리케이션 프로토콜들이 IP 위에서 동작한다. internet protocol 송신 호스트와 수신 호스트가 패킷 교환 네트워크(패킷 스위칭 네트워크)에서 정보를 주고받는 데 사용하는 정보 위주 규약이며, OSI 네트워크 계층에서 호스트의 주소지정과 패킷 분할 및 조립 기능을 담당한다. IP의 정보는 패킷 혹은 데이터그램이라고 하는 덩어리로 나뉘어 전송된다. IP…

https://user-images.githubusercontent.com/34048253/145793779-2da05d3e-8fe2-4803-b593-cd03b82453d4.jpeg
IPv4의 네트워크 패킷 구조와 각 필드의 역할
TCP/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…

https://user-images.githubusercontent.com/34048253/155850113-999fabdb-c665-431a-8baf-a8c840ace61d.png
Graphql Dataloader 적용해보기
GraphQL에서 발생하는 N+1 문제 해결방법

이 포스팅의 예제 코드는 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…

https://user-images.githubusercontent.com/34048253/155850024-c71c1bea-800c-4ae5-a4ec-6f68c5584086.png
[TIL] django contains vs icontains
TIL django query

contains icontains 의미 대소문자를 구별한다 대소문자를 구별하지 않는다 SQL 'LIKE BINARY %s' 'LIKE %s' image 출처 https://docs.djangoproject.com/en/4.0/ref/models/querysets/#std:fieldlookup-contains

https://user-images.githubusercontent.com/34048253/138466775-b360166d-c345-478a-95ce-b437de512469.png
떡볶이맵 제작기 #3 - 지도 API Pagination 적용기
4000개의 지도 데이터를 느려보이지 않게 불러와서 로딩하기

떡볶이맵의 데이터가 점점 많아지면서 marker cluster용 api를 구축해야 했지만, 어떠한 라이브러리가 좋은지 파악하지 못했고 (내가 직접 구현할 수도 있고) best practice를 공부하지 못했기 떄문에 해당 작업을 잠시 뒤로 미루게 되었다. 하지만 전국 떡볶이 데이터가 1000개를 넘어가던 시점부터 쎄한 느낌이 들었고, 응답까지 상당히 많은 시간이 소요됐기 때문에 지도에 데이터가 늦게 떠서 상당히 불편했다. 페이지네이션을 적용한 이후인 현재 데이터를 4000개정도이다. 스크린샷 2021-10-22 오후 10 59 00 나름 기발한?생각으로 장소 데이터를 가져오는 api에 페이지네이션을 적용해보기로 했다. 테이블 형태의 페이지네이션 api라면 한번의 요청에서 limit만큼의 데이터를 받으면 될 일이지만, 지도에서는 모든 데이터를 불러와야 하기 때문에 아래와 같은 api 시나리오를 구성했다. 해당 지도 bound내의 count를 가져오는 api…

https://user-images.githubusercontent.com/34048253/138473541-ca9eef72-8d1f-4a24-8115-fe96b01f1eb0.png
도커와 컨테이너 생태계의 변화과정
의식의 흐름대로 알아보는 도커와 쿠버네티스의 세부구조

container 생태계의 변화 2013년 Docker가 처음으로 세상에 나타난 이후 IT업계는 정말 크게 변했습니다. 어플리케이션의 배포단위는 이제 war, jar, zip 등이 아니라 Docker 이미지가 되었고 Docker를 사용할 수 있는 환경이기만 하면 어플리케이션은 Windows에서든, Ubuntu에서든 동일하게 동작하였습니다. Docker의 이러한 특성을 이용해 수백 수천대의 서버를 운영하는 환경에서 Docker를 도입하는 사례들이 늘어나기 시작했습니다. 하지만 포맷과 런타임에 대한 특정한 규격이 없다 보니 컨테이너의 미래는 불안했습니다. 도커가 사실상의 컨테이너 표준 역할을 했지만 코어OS(CoreOS)는 도커와는 다른 규격으로 표준화를 추진하려 했습니다. 이때 Docker Engine에는 API, CLI, 네트워크, 스토리지 등 많은 기능들이 하나의 패키지에 담겨있었고, Docker 측에서는 Monolithic한 Docker Engine…

https://user-images.githubusercontent.com/34048253/136786870-419bd656-9630-49a9-95b4-da4f4555f36f.png
주요 RDBMS의 종류
mysql vs mariadb vs postgresql vs sqlite vs oracle vs mssql

이전 게시물인 RDBMS의 특징을 보고 오면 좋습니다. RDBMS DB 엔진 중 유명한 것들을 비교해보고, 특징을 알아보자. 이 게시글을 보는 모두가 데이터베이스를 고르는 과정에 도움이 되었으면 한다. image PostgreSQL과 MariaDB의 상승세가 뚜렷하다 image DB-Engines Ranking Oracle Oracle사에서 제공하는 DBMS. 온프레미스, 클라우드, 하이브리드 클라우드 등의 환경을 제공한다. 오랜 역사와 막강한 영업력으로 데이터베이스 시장 부동의 1위. 기업시장을 위시로 한 오픈소스 데이터베이스를 쓸 수 없는 환경(문제 발생시 책임소재 등의 이유)에서는 대부분 오라클이 쓰인다. 특히 극한의 신뢰성이 요구되는 미션크리티컬 환경은 오라클이 꽉 잡고 있다. 카카오뱅크가 이례적으로 오라클과 함께 오픈소스 DB인 MySQL…

https://user-images.githubusercontent.com/34048253/136663821-1d9ff609-f7bd-480d-b0ab-b38105aba77d.png
RDMBS의 특징
데이터베이스 면접 질문은 아니고 용어 정리

동시성 제어 - MVCC (Multi Version Concurrency Control) 하나의 레코드에 대해 여러 버전이 관리된다는 의미이다. 가장 큰 목적은 Lock을 사용하지 않는 일관된 읽기를 제공하는데 있다. PostgreSQL 9.3.5 문서 - 동시성 제어 Pessimistic Lock 처음 짐 스타키가 구현한 방식으로 MGA : Multi Generation Architecture라고 부른다. MGA는 튜플을 업데이트 할때 새로운 값으로 변경하는 것이 아니라, 즉, 같은 자리에서 Replace로 처리하는 것이 아니라 새로운 튜플을 추가하고 이전 튜플은 유효 범위를 마킹하여 처리한다. 이와 같은 방식은 PostgreSQL, SQL Server, InterBase에서 사용하는 방식이다. Undo Segment Oracle, InnoDB에서 사용하는 방식으로 Undo 라는 영역을 따로 두고 최신 데이터는 데이터 영역에 두고 올드 버전만 Undo…

https://user-images.githubusercontent.com/34048253/134799280-8708fa31-c456-48e6-b9d2-9d7ccd7845ec.png
떡볶이맵 제작기 #2 - 에러 모니터링
홈서버가 죽었을때 슬랙으로 모니터링하기

문제점 떡볶이맵의 백엔드 서버는 홈서버에서 운영되고 있기 때문에 해당 서버의 헬스체크는 홈서버 내에서 이루어질 수 없었고, 이로 인해 정전 등의 이유로 컴퓨터가 꺼지는 등의 장애 상황을 신속하게 파악하기 힘들었습니다. 해결방안 이러한 문제점을 해결하기 위해 외부에서 홈서버의 건강상태를 체크해주는 API를 만들어야 했습니다. 떡볶이맵 서버와 상관없는 홈서버 자체의 API를 만들어서 헬스체크를 할 수도 있었지만, 좀더 다양한 상황에 유연하게 대처가 가능하도록 떡볶이맵 클라이언트에서 api 요청시에 실패하는 경우에 모니터링을 받는 식으로 구축을 하고 싶었습니다. 두가지 방식이 생각이 났는데, sentry를 frontend에 연동하는 방법이 있고, 다른 하나는 api 요청 실패시 serverless api를 통해 슬랙으로 노티를 받는 방법이 있었습니다. sentry vs slack sentry를 사용하는건 간단하지만 실시간으로 noti를 받으려면 team plan…

https://user-images.githubusercontent.com/34048253/155850316-5fe00d64-13dc-48cc-8f63-0df29c77f7af.png
리눅스에 구글드라이브 연동하여 백업스토리지로 활용하기
rclone과 crontab을 활용한 데이터베이스 백업 프로세스

작년에 지인이 rclone, google drive, cloudbox를 활용하여 구글드라이브에 올린 영상을 plex라는 어플로 감상할 수 있도록 구축한 경험을 들은 적이 있었다. (구글드라이브 저장소를 친구들과 공유하고, plex계정도 친구초대가 가능해서 이부분에서 시너지가 폭발하는 듯 했다) 나는 영화도 잘 보지 않았기 때문에 그냥 그런 좋은 활용방법이 있구나 하고 넘어갔었는데, 최근에 홈서버를 새로 구축하면서 데이터베이스의 백업이 제대로 이루어지지 않아 문제가 발생한 적이 있어서 이번에 새로 서버를 구축하면서 rclone과 google drive를 연동하여 리눅스에 마운트된 디렉토리에 주기적으로 database backup을 남겨야겠다는 필요성을 느꼈고, 구축 경험을 남기고자 한다. rclone homepage / github rclone은 클라우드 저장소와 저장소를 동기화시켜주는 오픈소스 프로젝트이다. 지원하는 클라우드 저장소는 amazon s3, googld drive…

https://user-images.githubusercontent.com/34048253/155849956-6d7ceb71-b0df-4718-9977-0a9341e56d49.png
장고의 패스워드 유효성 검사 코드분석
Django Password Validator

django의 startproject로 기본적으로 생성되는 에 대해 분석해보려 합니다 1. UserAttributeSimilarityValidator 유저의 attributes(username, firstname, lastname, email)를 정규표현식으로 split한 후 각각의 valuepart에 대해 유사도를 측정하고, 유사도가 maxsimilarity(default: 0.7)이상인 경우 validation error를 발생시킵니다. 유사도 측정에는 SequenceMatcher를 사용합니다. 2. MinimumLengthValidator password의 길이가 min_length(default: 8)보다 작다면 validatoion error를 발생시킵니다. 3. CommonPasswordValidator 사람들이 가장 많이 사용하는 패스워드 20000개에 해당하는 경우 validator error를 발생시킵니다. 2000개의 패스워드는 gzip으로 압축되어 django…

https://user-images.githubusercontent.com/34048253/129446247-056cd731-d263-4e57-81e3-4ebd2916a5c4.png
테라폼 명령어 정리 - Terraform cheat sheet
잘 사용하지 않아서 까먹지만 필요하면 써야하는

force unlock backend force-unlock image

https://user-images.githubusercontent.com/34048253/155849835-6ff01102-41c3-4761-87a0-f75c898e0e0e.png
깃 명령어 정리 - Git cheat sheet
잘 사용하지 않아서 까먹지만 필요하면 써야하는

remove untracked files ignore already committed files remove cached credential remove all fetched branches This will prune any branches that no longer exist on the remote. remove all local branches remove all git stashes

https://user-images.githubusercontent.com/34048253/155849784-228fb73b-f86f-4848-83bd-29e954327047.png
레디스 명령어 정리 - Redis cheat sheet
잘 사용하지 않아서 까먹지만 필요하면 써야하는

remove all keys flushall get values by keys (in bash)

https://user-images.githubusercontent.com/34048253/126856277-4037be6b-ddf6-474d-9388-e030a078c987.png
[번역] 새로 입사하는 개발자분들을 위한 최고의 온보딩 가이드
온보딩 Best Practices와 첫 90일을 어떻게 계획할 것인지에 대하여.

The Ultimate Guide to Onboarding New Developers: Industry Best Practices 새로 입사하는 개발자분들을 위한 최고의 온보딩 가이드: 산업의 Best Practices와 첫 90일을 어떻게 계획할 것인지에 대하여. 온보딩은 새로 입사하시는 분들이 회사에 최대한 빨리 적응하고 기여할 수 있게 돕기위한 것입니다. 당신이 조만간 회사에 입사한다고 상상해보십시오. 입사 이전에 당신은 회사에 대해 최대한 공부하려 할 것입니다. (링크드인에서 팀원들을 검색해보고, 회사에 대한 기사들을 찾아보는 것 등등...) 그리고 주변인에게 입사 축하 메시지를 받게 될 것입니다. 당신은 이 일을 시작할 생각에 굉장히 흥분되어 있을 것이며, 이를 잘 해내고 싶어 할 것입니다. 입사 첫날, 당신은 사무실에 조금 일찍 도착했고, 차를 가지고 왔을 경우엔 어디에 주차해야할지 잘 모를 것입니다. 그리고 출입문 앞에 도착했을때, 당신은 건물의 id…

https://user-images.githubusercontent.com/34048253/126061816-16961267-3c95-4978-883c-8621ba16c29e.png
떡볶이맵 제작기 #1
문득 떡볶이가 먹고싶을때, 이곳을 방문하라

10주전 새로운 토이프로젝트가 뭐가 있을까 고민하다가 1주일에 한번은 먹어야 하는 떡볶이를 아이템으로 한 을 만들어 보기로 결심했다. 도메인을 먼저 정하는게 중요했는데, 떡볶이의 영어발음인 tteokbokki는 너무 길고, 한국인이 저 철자를 다 외우는 사람이 많지는 않다고 생각되어 ttbkk.com라는 간단한 도메인을 구입했다. (12달러로 .com치고는 매우 저렴했다) iitc라는 지도 관련 오픈소스를 알고 있었기 때문에, 여기에서 쓰이는 코드를 활용하고자 leaflet이라는 map 라이브러리를 사용해보기로 했고, 기존에 익숙하게 사용하던 react와 요즘 대세?인 recoil을 도입해보기로 했다. typescript는 지도 라이브러리를 사용하기에 매우 불편했다... 이건 js인가 ts인가... 한국은 현재 국외로 지도반출이 불가하여, 구글맵에서는 9호선 데이터 등의 최신정보가 반영되어 있지 않아서 naver맵이나 kakao맵을 사용해야 했다. 하지만 leaflet…

https://user-images.githubusercontent.com/34048253/115137416-f99c3280-a060-11eb-8998-29af27199b93.png
프로덕션 레벨의 크롤러 개발 회고
python은 과연 크롤링하기 좋은 언어인가

지난 25일동안 지인의 부탁으로 특정 게시판의 게시글들을 전부 크롤링하는 외주를 진행했었다. 이를 진행하면서 얻게 된 크롤링 관련 경험에 대해 적어보려고 한다. 지금까지 나의 크롤러 프로젝트는 python으로 개발이 되어있었는데, 이번엔 typescript로 작성해달라는 요구사항을 받아서 진행했고, 내가 느낀 python 크롤링과 javascript 기반 언어의 크롤링의 차이점에 대해서도 적어볼 수 있겠다. 회고는 크게 3가지 주제로 나눌 예정이다. python 크롤링 vs javascript(typescript) 크롤링 (크롤링 환경 구성) production(컨테이너) 레벨에서의 죽지않는 크롤러 만들기 (컨테이너의 메모리 관리 aka 브라우저 캐시데이터 관리) 크롤러를 만든다는 것 (해당 사이트의 개발 히스토리를 모두 파악하는 것) 1. python 크롤링 vs javascript(typescript) 크롤링 python…

https://user-images.githubusercontent.com/34048253/155849011-f99a1dd2-7169-4f83-9ed4-a82390777d58.png
npm vs yarn vs pnpm vs yarn2
pnpm은 정말로 탄소절감과 ssd수명에 도움을 줄까?

서론 타입스크립트를 사용하면서 백엔드를 개발하면서 를 사용하던 도중, 의존성으로 함께 설치되는 의 타입을 가져오는데 의문을 가지게 되었다. 스크린샷 2020-12-19 오후 6 34 21 의존성으로 가져오는 버전 말고 다른 버전을 별도로 설치하고 있었다면 어떻게 되는거지? 싶어서 의 최신버전을(6.1.3) 추가로 설치해보았고, 역시나 아래와 같이 잘못된 버전의 타입을 가져오면서 TS2739 에러가 났다. node_modules 위의 에러를 해결하기 위해서는 어쩔 수 없이 를 통해 접근해야 했다. (이게 맞는건가? 싶었다) 그러던 어느날 reason-seoul 레포에 다음과 같은 흥미로운 문구가 있어서 javascript의 패키지 매니징 도구들에 대해 알아보는 시간을 가지기로 했다. 비교 쉬운 비교를 위해 위에서 설명한 패키지를 다음과 같이 이름 지어서 설명하겠다. : : (googleapis의 의존성) : npm 1. foo@39 설치 node_modules…

https://user-images.githubusercontent.com/34048253/155849171-72a8ff67-0d80-42dc-a83c-6db233a04a3a.png
[Dart Programming] final과 const의 차이점
상수를 표현하는 두가지 방법

final과 const는 모두 상수(constant)를 선언할 때 사용되는 키워드입니다. Dart에서는 final과 const를 통해 선언된 변수는 수정이 불가능하도록 막아줍니다. const는 compile 단계에서 값이 정해지는 상수입니다. 그렇기 때문에 매번 값이 바뀌는 이나 와 같이 멱등이 보장되지 않는 값들은 const로 선언할 수 없습니다. const를 사용한 방식 const 사용시 나타나는 에러 final를 사용한 방식 결과 출처 https://flutter.dev/docs/get-started/codelab#step-2-use-an-external-package https://www.tutorialspoint.com/dartprogramming/dartprogramming_variables.htm https://medium.com/dartlang-korea/dart-final-%EA%B3%BC-const-bc8c6c024ef4

https://user-images.githubusercontent.com/34048253/102365825-52988300-3ffb-11eb-96b5-1300b6f290c8.png
[번역] 그림으로 보는 SOLID 원칙
객체지향 프로그래밍 5대 원칙

SOLID 원칙과 관련된 좋은 그림예시가 있어서 이를 번역하면서 예제코드를 추가하였습니다. 만약 당신이 과 친숙하다면, 당신은 에 대해 들어보았을 것 입니다. 이러한 다섯가지 개발 원칙은 소프트웨어 개발과 유지보수를 쉽게 할수 있도록 하는 가이드라인이라고 볼 수 있습니다. 이러한 원칙은 Robert C. Martin이라고 하는 소프트웨어 엔지니어에 의해 유명해졌습니다. SOLID 원칙과 관련된 좋은 자료들이 온라인에 많이 존재하지만, 이것을 그림으로 설명하는 글을 찾아보기는 힘듭니다. 이 때문에 을 선호하는 이들에게는 어려움이 따르고 있습니다. 그렇기 떄문에, 이 포스팅의 목적은 그림을 통해 각각의 SOLID…

https://user-images.githubusercontent.com/34048253/155849229-de13c0fb-a354-4129-96f7-96f346bcb56d.png
[번역] Dockerfile 레퍼런스 (2) - Buildkit
동시성을 가지며, 캐시 효율적이며 Dockerfile에 독립적인 빌더 툴킷

공식 레퍼런스를 토대로 작성되었습니다. BuildKit 도커 버전 18.09부터, moby/buildkit를 통한 빌드를 지원합니다. Buildkit 백엔드는 기존 빌드방식과 비교해 많은 이점이 있습니다. 사용하지 않는 빌드 단계를 탐지하여 실행하지 않음 독립적인 빌드 스테이지의 병렬화 변경된 context만 전송 context안의 사용하지 않는 파일을 탐지하여 전송하지 않음 새로운 기능들과 함께 외부 도커파일 사용 중간 이미지 및 컨테이너 관련 API 사용함에 있어서 생기는 부작용 방지 자동 정리를 위한 캐시 우선순위 지정 Buildkit 백엔드를 사용하려면 명령어를 사용하게 전에 CLI를 통해 이라는 환경변수를 지정해야합니다. Buildkit 기반의 빌드를 가능하게 하는 실험적인 도커파일 문법은 BuildKit 저장소의 문서를 참조해주세요.

https://user-images.githubusercontent.com/34048253/155849229-de13c0fb-a354-4129-96f7-96f346bcb56d.png
[번역] Dockerfile 레퍼런스 (3) - Format
가독성을 높이는 명령어 포맷

공식 레퍼런스를 토대로 작성되었습니다. Format Dockerfile의 포맷은 다음과 같습니다. Instruction은 대문자 소문자를 가리지는 않습니다, 하지만 이러한 컨벤션을 지킴으로써, arguments를 좀더 쉽게 파악할 수 있습니다. 도커는 에 있는 instruction을 순서대로 실행시킵니다. 은 반드시 `FROM`명령어로 시작해야합니다. FROM 명령어 이전에 parser directives, comments, ARG를 사용할 수도 있습니다. parser directives, comments, ARG에 대한 번역은 추후 작성될 예정입니다.

https://user-images.githubusercontent.com/34048253/155849229-de13c0fb-a354-4129-96f7-96f346bcb56d.png
[번역] Dockerfile 레퍼런스 (1) - Usage
도커 데몬의 작동방법, 이미지 빌드 & 태깅, 캐시이미지 가져오기

공식 레퍼런스를 토대로 작성되었습니다. 도커는 을 읽어서 자동으로 이미지를 빌드할 수 있습니다. 은 이미지를 만들기 위해 사용되는 모든 명령어를 담고있는 문서입니다. 이러한 명령어들은 실제로 유저가 CLI환경에서 한줄씩 입력하여 사용할 수 있는 명령어들입니다. 를 사용하여 여러 줄의 명령어로 이루어진 빌드 과정을 자동으로 진행할 수 있습니다. 이 페이지를 다 읽은 후에, Dockerfile Best Practices를 읽어보는 것을 추천드립니다. Usage docker build 명령어는 과 context로부터 정보를 가져와서 이미지를 빌드합니다. context는 파일들이 위치한 위치를 가리키며, 또는 의 형태를 지닙니다. 는 로컬 파일시스템 내의 폴더이고, 은 Git 저장소 경로가 됩니다. context 내용을 불러오는 방식은 재귀적으로 진행됩니다. 그러므로, 는 모든 하위 폴더를 포함하고, 은 해당 저장소의 모든 하위 모듈를 포함합니다. 현재 폴더를 context…

https://user-images.githubusercontent.com/34048253/155849229-de13c0fb-a354-4129-96f7-96f346bcb56d.png
[번역] Dockerfile 레퍼런스 (4) - Parser Directives
FROM 명령어 이전에 사용할 수 있는 지시문

공식 레퍼런스를 토대로 작성되었습니다. Parser directives…

https://user-images.githubusercontent.com/34048253/155849292-661c839f-e3c7-46e4-b41d-4410c5cc27c4.png
싱글톤 패턴 (Singleton Pattern)
반복되는 인스턴스 낭비를 줄이자

참고자료 Singleton pattern 타입스크립트 디자인 패턴 1. Intro 특정 클래스의 인스턴스가 단 하나만 존재해야 하는 경우에 싱글톤 패턴을 사용합니다. 싱글톤 패턴은, 반복적인 디자인 문제를 해결하는 방법을 설명하는 책인 Design Patterns의 23가지 디자인 패턴 중 하나입니다. 이 책에서는 반복되는 디자인 문제를 어떻게 유연하고 재사용 가능하도록 디자인하는지 서술하고 있습니다. 싱글톤 패턴은, 클래스의 인스턴스를 시스템 내에 단 한개만 존재하도록 제한시키는 소프트웨어 디자인 패턴입니다. 시스템 전체에서 작업을 조정하는 데 정확히 하나의 개체가 필요한 경우에 유용합니다. 2. Problem…

https://user-images.githubusercontent.com/34048253/155849329-c8caaa49-54cc-481b-8532-ad10e1e5948c.png
REST에 대하여
REST API는 대체 무엇이고, Restful 하다는 건 대체 무엇인가

참고자료 Representational state transfer HTTP Status Codes REST API의 이해와 설계 - 조대협의 블로그 1. Intro 2000년 Roy Fielding의 논문에서 처음 정의된 는 소프트웨어 아키텍쳐 스타일로, 아래와 같이 간단하게 설명할 수 있습니다. 자원(Method)을 정의하고 자원에 대한 주소(URI)를 지정하여 전송(Request)하면, 다음 자원에 대한 표현이 최종 사용자에게 전송(Response)된다. REST 규칙을 따르는 API는 Method와 URI만으로 이 요청의 의도와, 결과를 어느정도 예상할 수 있게 합니다. REST 아키텍쳐를 적용한 웹서비스를 라고 부르고, 이러한 아키텍쳐는 클라이언트와 서버간에 상호운용성 있는 데이터 통신을 가능케 합니다. Stateless 프로토콜을 사용하기 때문에, Restful 시스템은 , , 을 목표로 합니다. 2. Methods…

https://user-images.githubusercontent.com/34048253/155849505-13269ce9-84ba-4541-994d-1ece20a746fa.png
Express.js의 미들웨어(Middleware)
Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다

참고자료 Express In Action Express.js Express의 에 대해 다룹니다. 1. Intro image Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 입니다. 미들웨어 함수는 요청 오브젝트(req), 응답 오브젝트(res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수입니다. 그 다음의 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시됩니다. (next는 생략이 가능합니다.) 미들웨어의 는 중요하며, 먼저 로드되는 미들웨어 함수가 먼저 실행됩니다. 위 코드는 Express의 가장 간단한 Hello World의 예시이며, 아래에서 이에 대한 를 다룰 예정입니다. 2-1. 예시 (Logger) 앱이 요청을 수신할 때마다, LOGGED라는 메시지를 터미널에 출력하는 미들웨어를 만들어봅시다. myLogger…

https://user-images.githubusercontent.com/34048253/155849369-ccfc91d8-071d-4094-bfa0-479b364dfb54.png
Express.js란 무엇인가 (Javascript 백엔드 프레임워크)
Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크

참고자료 Express In Action Express.js Node.js, Express가 등장한 과 에 대해 설명합니다. 1. JS 엔진과 Node.js Express에 관해 얘기하기 전에, Node.js에 대한 얘기를 먼저 해야 합니다. 이를 위해 Express 인액션의 일부 내용을 발췌하였습니다. : JS는 주로 웹 브라우저 내에서 사용된다. 웹 페이지의 일부를 수정하기 위한 간단한 스크립트 언어로 시작했지만 애플리케이션과 라이브러리가 가득 찬 복잡한 언어로 성장했다. 모질라와 구글 같은 많은 브라우저 공급자는 자원을 빠른 JS 런타임에 쏟아붓기 시작했고, 그 결과로 브라우저는 더 빠른 JS 엔진을 갖게 되었다. : 2009년에 등장한 Node.js는, 구글 크롬의 강력한 JS 엔진인 V8을 채용했고 서버에서 이를 실행할 수 있도록 했다. 개발자들은 이제 서버 사이드 애플리케이션을 개발할 때 JS…

https://user-images.githubusercontent.com/34048253/71055071-a4fc5500-2197-11ea-89e3-b0b4dad1a0db.png
class-validator를 사용한 타입스크립트(Typescript) Validation
Typescript Data Validation

참고자료 : typestack/class-validator 를 사용하는 환경에서 를 사용하여 를 하는 과정을 다루고 있습니다. 1. Data Validation Data Validation(데이터 유효성 검사)이란, 다루는 데이터가 올바른 을 가지는지 확인하는 과정입니다. 2. class-validator typestack/class-validator 데코레이터 및 비 데코레이터 기반 검증을 사용할 수 있습니다. 내부적으로 validator.js를 사용하여 유효성 검사를 수행합니다. class-validator는 브라우저 및 node.js 플랫폼 모두에서 작동합니다. 3. Format 정상적인 데이터는 아래의 을 충족해야 한다고 설정해봅시다. 4. Sample Data 정상적인 Request Data 은 아래와 같습니다. 5. Validator Class 이제 class-validator에서 사용할 를 작성합니다. 도입 초기에 Typeorm의 Entity…

https://user-images.githubusercontent.com/34048253/61307238-ef645900-a828-11e9-860c-21eb3bf9f7ab.png
장고(Django)에서 S3 연동하기
Amazon Web Service S3

출처 : django 에서 S3에 Static, media 파일 저장하고 사용하기 소셜미디어 프로젝트를 준비하면서, 을 줄이기 위해 를 도입하고자 하였다. Django에서 S3를 연동하기 위해서는 라는 라이브러리를 사용해야 한다는 것은 이미 알고 있었으나, 정확한 사용 방법을 몰라서 찾아보았고, 나중에도 사용할 때 까먹지 않기 위해 포스팅으로 작성하려 한다. 1. 버킷 생성 image 버킷 이름을 작성하고 image 넘어가고 image 모든 유저가 읽을 수 있게 Block 설정을 해제해주자 image 최종 확인 후 생성한다 image 버킷이 생성되었다 2. Policy 설정 image Bucket 선택후 - 에서, 아래처럼 내용을 작성한다 은 Bucket Policy 설정페이지에서 확인이 가능하고, 은 https://console.aws.amazon.com/iam/home#/users에서 유저를 선택하여 확인이 가능하다. (아래 예시) image 3. Access Key…

https://user-images.githubusercontent.com/34048253/155849473-edecbad3-31af-4b30-8895-cb0883b7bd96.png
파이썬(Python3)으로 왓쓰리워즈(what3words, W3W)를 이용해보자.
세상의 모든 주소를 세 단어에 담다

what3words란? what3words (W3W)는 전 세계 지도 상의 스팟을 3개의 단어로 표현한 좌표체계입니다. 이 기능을 사용하면 마이크로 단위의 장소 공유와 주소가 없는 지점도 세 단어 주소로 공유/검색이 가능합니다. 현재 로 W3W 세단어 주소가 제공 중이며, 에서도 what3words와의 제휴를 통해 W3W 주소체계를 서비스 하기 시작했습니다. image API KEY 발급 what3words를 사용하기 위해서는 https://accounts.what3words.com/ko/register에서 API KEY를 발급 받아야 합니다. image pip 패키지 설치 공식 문서는 https://docs.what3words.com/wrapper/python/에 있습니다. what3words에서는 pip 패키지를 지원하여 python에서 매우 편리하게 이 기능을 사용할 수 있습니다. 위경도 <-> W3W 변환 파이썬 코드로 what3words…

https://user-images.githubusercontent.com/34048253/155849543-18ab95ed-5c65-4020-9d31-c7071450e2df.png
포스트그레스(PostgreSQL)로 설명하는 도커 컴포즈(Docker Compose) 초간단 사용법

이번 장에서는 의 일반적인 사용방법과, 이를 사용하여 PostgreSQL을 배포하는 방법에 대해서 설명하겠습니다. 0) Compose란? Overview of Docker Compose 란 여러개의 도커 컨테이너들을 한꺼번에 관리(빌드, 배포 등) 할 수 있는 Tool입니다. Compose를 사용하면 을 사용하여 응용 프로그램의 서비스를 구성 할 수 있습니다. YAML 파일을 작성하면 만으로 을 시작할 수 있습니다. 을 작성하세요. (없어도 무방합니다.) 파일을 작성하여 모든 서비스가 한번에 배포되도록 하세요. 명령어를 사용하여 모든 서비스를 한번에 배포하세요. 추가 설명을 붙이자면, 에 들어가는 수많은 옵션들을 하나의 파일로 관리할 수 있다는 장점도 있습니다. (저는 이 때문에 사용하는게 더 큽니다.) 1) 설치 docker없이, docker-compose만 설치하게 되면 동작하지 않습니다. 2) docker-compose.yml 3) docker-compose up…

https://user-images.githubusercontent.com/34048253/155849594-90045484-a15e-4b3b-abf0-2ab382b9a518.png
나만의 도커(Docker) 이미지를 만들어서 장고(Django) 서비스 배포하기

저번 장에서는 를 확인해보았고, 되었음을 확인했습니다. 이번 장에서는 를 직접 만들어서 배포해보고, 에 업로드까지 해보겠습니다. 본 포스팅의 프로젝트 는 를 통해 얻을 수 있습니다. github.com/siner308/django-with-custom-image docker image from cultivatehq.com 0) Dockerfile 도커 이미지를 만들기 위해서는 이 필요합니다. Dockerfile 작성의 힌트를 얻기 위해, Django의 공식 Dockerfile을 확인해봅니다. Official Dockerfile (Deprecated) 아래는 제가 만든 Dockerfile입니다. 위의 Deprecated 버전과는 다르게 을 기반으로 하여 의 버전을 사용하도록 하였습니다. My Dockerfile 1) ENTRYPOINT 위의 Dockerfile…

https://user-images.githubusercontent.com/34048253/155849664-c7f20fd7-0925-417c-9eed-16a16530facb.png
장고(Django) 공식 이미지로 설명하는 도커(Docker)의 기본적인 사용법

이번 장에서는 를 사용하여 에 대해 설명하겠습니다. Custom 이미지를 생성하여 Django를 배포하는 방법에 대해서는 다음 장에서 다루겠습니다. 0) Docker Docker란 무엇입니까? Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다. 1) Docker Hub Docker Hub에서는 컨테이너 이미지를 받아서 사용하고, 자신만의 이미지를 만들어서 업로드 할 수도 있습니다. 프로젝트에 사용할 Django 이미지를 얻기 위해 에 접속하여 Django를 검색해보면 Docker…

https://user-images.githubusercontent.com/34048253/155849689-6988ab4c-36b7-4118-b05f-5c1211e88c8c.png
셀레니움(Selenium)과 파이썬(Python)으로 지도 크롤링 해보기

0) 계기 어느날 저희 아빠가 저에게, 아빠 : “이게 경기도 번지수를 보여주는 사이트인데, 일정 구역을 프린트해서 보고 싶어.” 아들 : “컴퓨터로 이렇게 잘 보이는데 왜 뽑아야되나요?” 아빠 : “어르신들과 같이 보는데 노트북으로 보여드리기는 그렇고, 전지로 뽑아가고 싶어.” 아들 : “네… 오늘 안에 처리해드리죠.” 해서 크롤러를 만들게 되었습니다. 1) 정보수집 보통의 지도 서비스에서는 지도 데이터를 각각의 작은 타일로 구성되어 있습니다. 따라서 그 작은 타일들을 전부 다운로드해서 하나의 이미지로 만드는 작업을 하면 됩니다. 일단 경기도부동산포털의 지도에서 타일 데이터(map tile)를 어떤 식으로 가져오는지 찾아봅시다. image 로딩과 동시에 페이지 검사를 들어가서 network 탭을 살펴보면, 아래와 같은 결과가 나옵니다. image 예상한대로 맵 타일을 여러 개 받아오는 것이 보이네요, 좀더 자세하게 확인하기 위해 하나를 클릭해봅시다. image image…

https://user-images.githubusercontent.com/34048253/155849742-0083a4d2-a19f-4806-b36c-24f707425ca4.png
Start Django with Virtualenv

This post is based on Ubuntu 16.04. Here's what you need to configure a Django project using virtualenv. pip virtualenv (Python >= 3.5) Django >= 2.0 0) Why virtualenv? There are people who say that "Django works fine, Even if you are not using virtual environments" Let's assume the situation. Without a virtual environment, you're installing and using pip modules. At that time, you installed the latest version of Django 1.11, using a new feature called A. A few years later, as Django 2.2 becomes…

https://user-images.githubusercontent.com/34048253/155849742-0083a4d2-a19f-4806-b36c-24f707425ca4.png
가상환경(Virtualenv)로 장고(Django) 시작하기

본 게시물의 내용은 Ubuntu 16.04 를 기반으로 작성되었습니다. virtualenv를 이용한 Django 프로젝트 구성에 필요한 요소는 다음과 같습니다. pip virtualenv (Python >= 3.5) Django >= 2.0 0) virtualenv를 쓰는 이유 "가상환경으로 안해도 Django 잘 돌아가던데?" 라고 하시는 분들이 있을겁니다. 만약 이렇다면 어떨까요? 가상환경 없이 pip 모듈들을 설치해서 사용하고 있었다고 가정해봅시다. 그 당시 최신버전인 Django 1.11 버전을 설치하여 프로젝트를 진행했고, 1.11 버전에 새롭게 추가된 A 라는 기능을 사용합니다. 수년뒤에 Django 2.2 버전이 등장하게 되고, 새로운 기능들이 추가됨과 동시에, 과거에 사용되던 A 라는 기능은 더이상 사용할 수 없게 됩니다. 새로운 프로젝트를 진행하려던 저는 새로운 버전인 Django 2.2 를 사용하고 싶은 마음에 가상환경 없이 설치된 Django 1.1…


Deployed by NetlifySource code on Github