Lets-Study
나만 읽기 아까운 글이나 문서를 모아두는 공간입니다. 어떤 주제를 공부하거나, 공부의 방향을 잡거나, 그냥 가볍게 읽기 위한 재밌는 글을 원하는 누군가가, 양질의 글에 쉽게 접근할 수 있도록 도와주는 것이 이 저장소의 목적입니다.
의식의 흐름으로 나눈 카테고리에, 링크로 이루어진 리스트 형태로 구성됩니다. 일단 링크 막 모아두고, 한번 읽고 나면 이게 어떤 글이고 왜 추천하는지를 간략하게 작성하고 있습니다.
여러분도 북마크에서 몇 개만 공유해 주세요. 레포 주인이 공부하는 분야가 넓지 않아서, 별 거 아닌 것처럼 보이는 기여더라도 큰 도움이 됩니다.
배경지식
프로그래밍
동시성 프로그래밍
- 파이썬과 비동기 프로그래밍 시리즈
- 멈추지 않고 기다리기(Non-blocking)와 비동기(Asynchronous) 그리고 동시성(Concurrency)
파일이나 네트워크 등과 같은 I/O bound 작업에 대해 처리의 완료를 기다리지 않고, 후속 작업을 처리하는 부분만 콜백이나 await 등을 통해 따로 정의해둔 채 CPU를 다른데서 계속 써먹으며 자원 낭비를 줄이는 패턴을 Non-blocking IO라고 부르고, Non-blocking IO는 Async IO라고도 부른다고 한다. + 프로그램의 주 실행 흐름(메인 루틴)을 최대한 적게 멈추면서 뭐라도 계속 처리하는 걸 Async programming이라 부르고, 이를 위한 재료로서 Non-blocking IO를 활용할 수 있으나 둘은 관점이 다르기에 비교 대상이 되기는 어렵다는 내용. 비동기 IO에 비해 비동기 프로그래밍은 좀 더 추상적인 개념인 듯 하다.
함수와 관련된 얘기, 함수형 프로그래밍
- 함수형 프로그래밍이란?
- Higher-order-function(고차함수) with Kotlin
인자로 함수를 취하거나, 결과로 함수를 반환하는 함수. HOF라고도 부른다. 이게 수학에서도 있는 개념이라고 함. Java에서 메소드에 overrided method가 포함된 익명 클래스를 만들며 그 객체를 넘겨주는 것도 HOF라고 부를 수 있을까? - Currying
f(x, y, z)를 f(x), g(y), h(z)와 같은 함수 체인으로 만드는 기법. '인자가 미리 채워진 함수'를 만들어 코드의 추상화 레벨을 높이기 위해 써볼만 하지만, 내 경우에는 currying의 주 목표인 '인자를 나누어 함수의 처리를 점차 진행시킨다'를 만족시킬만한 함수를 작성하는 경우가 거의 없었던 것 같다. 차라리 partial function을 쓰는 경우가 더 많은 듯. - 함수형 프로그래밍: partial application과 curry
partial application, currying의 소개와 둘의 차이를 설명한다. partial application은 특정 인자를 고정시킨 새로운 함수를 만드는 기법. 수학의 부분 정의 함수와 연관이 있는 것 같다. - 람다, 익명 함수, 클로저
람다, 익명 함수, 클로저를 연관지어 매우 깔끔하게 설명해 두었다. 클로저는 closer가 아니고 closure(폐쇄)이며, 함수형 트릭이 아니라 개념(함수와 그 함수가 선언된 lexical scope의 조합)이다. 클로저는 자신이 정의된 문맥에서 주변의 변수와 상수들을 캡처한다. - 자바스크립트의 호이스팅(Hoisting)
웬만한 언어에서 declaration은 호이스팅되고, assignment는 호이스팅되지 않는 것 같다. 대부분 호이스팅이 '작성한 코드의 상단으로 옮겨지는' 것으로 설명되지만, 그냥 컴파일 단계에서 평가되기 때문에 그렇게 보여지는 것이다. - 코루틴 소개
프로그램의 메인 실행 흐름을 메인루틴이라 부르고, 일반적인(call/return 형태의) 함수는 서브루틴이라 부른다. 여기서 이 함수가 suspend/resume 기능을 지원한다면 이를 코루틴이라 부른다. suspend로 제어를 양도하고, resume으로 다시 실행을 재개하는 형태. async/await도 사실상 이런 개념 기반이므로 비동기에 코루틴을 종종 써먹는 듯. 그래서 아무튼 함수는 서브루틴 형태와 코루틴 형태로 나뉘며 코루틴은 또다시 대칭/비대칭 코루틴으로 나눌 수 있다. - Function scopes and block scopes in JavaScript
JavaScript에서 var는 function scope에서 보장되고, let는 block scope가 가능하다는 이야기인데, scope는 애초에 프로그래밍 언어 자체적인 이야기라 볼만 하다. function/block scope, lexical(static)/dynamic scope 등등.. - What is a pure function?
same input-same output과 외부 상태에 변화를 주지 않는(no side-effect) 함수를 순수 함수(pure function)라고 부른다.
테스팅
- 유닛테스트에 대한 생각
'테스트를 작성하면 내가 작성한 메서드나 클래스의 사용자 입장이 되는 기분이 든다.' - 코드 커버리지 80% 넘긴 썰 - 테스팅을 잘 하기 위한 8퍼센트 개발팀의 삽질기
- Mocks Aren't Stubs
- Classical vs Mockist testing
Mocks Aren't Stubs
글의 요약본. - Testing Without Mocks: A Pattern Language
- 단위 테스트 케이스와 테스트 더블(Test Double)
- Mock Object란 무엇인가?
behavior verification과 state verification, 거기서 뻗어나오는 test double인 mock과 stub까지 잘 설명되어 있다. - What's the difference between a mock & stub?
패턴
디자인 패턴
- So Singletons are bad, then what?
- Repository Pattern
- Dependency Injection
- What is dependency injection?
- Dependency Injection Demystified
- DI 란?
DI 를 처음 만나 헤�매는 사람들에게 매우 좋은 글이다. 코드와 다이어그램으로 적절한 예시를 들어서 쉽게 이해할 수 있다. - Dependency Injection in Python
- Pinject
구글이 만든 Python DI library
"Dependency Injection" is a 25-dollar term for a 5-cent concept.
아키텍처 패턴
- 10가지 소프트웨어 아키텍처 패턴
서비스 관점에서의 패턴 이야기가 아니라, 그냥 아키텍처 자체에 대한 이야기. 역시 패턴 얘기는 재밌는 게 많다. - Circuit breaker 패턴을 이용한 장애에 강한 MSA 서비스 구현하기
언어론과 가까운 이야기
- Exression verses Statement
expression은 identifier, literal, operator만을 포함하며 value를 산출하는 식이고, statement는 동작을 수행하는 문이다.- Python의 삼항 연산자는 expression이다. -
res = 1 if True else 0
- JavaScript에서 함수는 expression으로 사용할 수 있다. -
const sum = function(a, b) { return a + b; };
- Kotlin의 when 절은 expression과 statement로 모두 사용할 수 있다.
- Python의 삼항 연산자는 expression이다. -
- Static/Dynamic vs Strong/Weak
정적/동적 타입 검사와 강타입/약타입에 대한 이야기. static/dynamic typing은 'when type information is acquired', strong/weak typing은 'how strictly types are distinguished'로 요약하고 있다. - Runtime vs Compile time
런타임과 컴파일 타임의 비교.
좋은 코드를 작성하기 위한 노력
- DRY code vs. WET code
소프트웨어 개발 원칙 중 하나지만, DRY 원칙을 지키는 건 프로그래밍의 기본이 아닐까 싶다. - Red-Green-Refactor
- 객체지향 개발 5대 원리: SOLID
정규 표현식
캐싱
- What is difference between LRU and LFU?
캐시 구현 방법 중 LRU(Last Recently Used)와 LFU(Last Frequently Used) 캐시의 차이에 대한 설명이다. 이 외로 rr cache, ttl cache가 있다. - WTF is Memoization
'Avoid doing the same work repeatedly to avoid spending unnecessary running time or resource' - What is the difference between Caching and Memoization?
Caching은 'general term', Memoization은 'specific form of caching' - 캐시가 동작하는 아주 구체적인 원리
기타
- Why is global state so evil?
전역 변수가 왜 나쁜지에 대한 이야기 - Drop-in replacement
적은 노력으로 보안/성능/기능/확장성을 향상시키는 것. 예로 Python의 빌트인 시간 라이브러리인 datetime의 drop-in replacement로 arrow, pendulum이 있다. - 점진적인 레거시 웹 어플리케이션 개선 과정
- 알아두면 좋은 이메일마케팅 지표
이메일의 반송(Bounce)와 관련된 이야기.
프로토콜, 표준
HTTP
- WebSocket과 Socket.io
결국 웹소켓의 요지는 polling을 push 방식으로 만든다는 건데, HTTP/2.0의 server push 기능이 어느정도 웹소켓을 흉내낼 수 있지 않을까 싶었다. - Websockets vs Long Polling
- 웹 기술로 구현하는 Adaptive HTTP Streaming
웹 클라이언트에서의 스트리밍 관련 표준은 MSE(Media Source Extensions). DASH가 MSE에 잘 맞춰진 표준이며 널리 사용되고 있지만 모바일 safari는 MSE를 지원하지 않기 때문에 DASH와 HLS를 같이 지원해줘야 할듯? 토이 프로젝트 해봐야겠다.
REST
- REST API 제대로 알고 사용하기
- 그런 REST API로 괜찮은가
- REST 의 Uniform Interface에 대하여
Uniform Interface 는 REST 에서 가장 기본적인 제약이다. 이는 다음 4가지로 구성되어 있다.- Resource Identifier
- Resource Representation
- Self-Descriptive message
- hypermedia as the engine of application state (HATEOAS)
- 바쁜 개발자들을 위한 REST 논문 요약
Uniform Interface 를 사용하여 클라이언트-서버간의 인터페이스를 일반화함으로써, 전체 시스템 아키텍처가 단순해지고, 상호작용의 가시성이 개선되며, 구현과 서비스가 분리되므로 독립적인 진화가 가능해진다. 이 스타일에 따르면, REST API는 기본 URI와 미디어 타입의 정의만 알면 이용할 수 있어야한다.
GraphQL
HTTP2/HTTPS
- HTTPS는 HTTP보다 빠르다
- 나만 모르고 있던 HTTP2
아니 뭐 이렇게까지 HTTP/1.1을 까고 HTTP/2를 찬양하나 싶었는데, 이유 있는 비판인 것 같다. HTTP/2가 SPDY를 기반으로 개발되었고, 구글이 HTTP/2가 SPDY를 대체할 것이라고 발표한 것은 처음 알았다. - HTTP/2 소개 - Google Developers
SPDY가 비표준 프로토콜이라는 말을 듣고 굉장히 의문적이었는데, 실험용 프로토콜이었구나. HTTP/1.1의 성능 제한을 해결해 웹페이지의 레이턴시를 줄이는 것을 목표로 SPDY가 만들어지기 시작했고, HTTP/2의 새로운 기능과 제안을 테스트하기 위해 SPDY가 계속해서 실험 수단으로 사용되었다. 이제는 SPDY가 가지고 있던 대부분의 장점이 포함된 HTTP/2가 표준으로 받아들여지면서 SPDY는 deprecated되었다고 함. high level API는 HTTP/1.x와 동일하게 유지되고, low level의 변경이 성능 문제를 해결했다. 바이너리 프레이밍 계층, 요청/응답 멀티플렉싱, 스트림과 스트림 우선순위 지정, server push, 헤더 압축 등등 + HTTP/1.x의 image sprite, 도메인 샤딩과 같은 임시 방편을 제거하고 최적화하는 기능이 들어 있다. - HTTPS는 어떻게 다를까?
API
JSON 관련
NDJSON
- Newline delemited JSON is awesome
'ndJSON is a collection of JSON objects, separated by\n
'이 핵심. 종단 간 통신 레벨에서 쓰일만한 건 아닌 것 같고, JSON으로 이루어진 data collection을 관리할 때 좋을 것 같다. MongoDB에서 특정 collection에 모여 있는 document 목록은 NDJSON으로 표현할 수 있을테니까.
JSONSchema
- JSONSchema
JSON payload를 검증하는 데에 쓸 수 있는 JSONschema. 처음 봤을땐 뭐 이런 TMI 스펙이 다있어? 싶었는데 이젠 이거 없으면 validation이 어렵다. - object - pattern properties
property name이 dynamic한 경우, pattern properties를 사용해볼 수 있다. - object - Schema dependencies
JSONSchema object에서 dependency는 '프로퍼티 A가 있으면 프로퍼티 B도 있어야 한다'와 같은 개념이다. property dependencies를 사용할 수도 있으나, schema dependencies는 그 내부에 있는 dependecy들에 대해서도 스키마를 적용할 수 있어 확장성이 더 높다.
JWT
- Introduction to JSON Web Tokens
사실 HTTP에서 authentication을 위해 JWT를 사용하는 것은 표준이 아니지만(Authorization 헤더의 value type중 JWT를 위한 것은 없다. - Bearer는 OAuth 2.0의 토큰을 사용해야 하고, JWT라는 타입은 없음) 이미 많이들 사용하고 있는 사용자 인증 프레임워크.
Protobuf
- Protobuf
.proto
라는 확장자를 가진 파일에 스키마를 명시하고, 이걸로 직렬화/역직렬화하는 데이터 직렬화 포맷. RPC에서 많이 쓰인다고 하며 타다가 Protobuf를 쓰고 있다고 한다. HTTP mimetype에선application/vnd.google.protobuf
나application/x-protobuf
같은 걸 쓴다는데, 그냥 protobuf message를 JSON으로 주기받기도 하는 것 같다. - Google Protocol Buffers and HTTP
'Just write the bytes of the protocol buffer directly into the request/response, and make sure to set content type to "application/octet-stream"', 'ProtoBuf is a binary protocol.'
Date & Time
- 협정 세계시(UTC)
- 유닉스 시간
Epoch(1970-01-01T00:00:00Z)로부터의 경과 시간을 초로 환산하여 정수로 나타낸 것. 그리고 timestamp는 '시각을 나타내는 문자열'이라는 다소 큰 범위의 정의를 가지고 있어서, 1256953732같이 생긴 건 unix time이라고 부르는 것이 가장 정확하다.Sat Jul 23 02:16:57 2018
같은 것도 타임스탬프라고 부르기 때문. - List of tz database time zones
시각을 표기하는 곳에서 KST, CST, EDT같이 timezone에 대해서는 약어만 마주치며 살다가, PrestoDB에서Asia/Seoul
같은 표현을 보고 이리저리 찾아보니 timezone의 약어는 표준이 따로 없다고 한다. 그래서 timezone 약어 목록으로 가장 유명한 Time Zone Abbreviations를 찾아봤더니CST
가 미국 중부 표준시, 중국 표준시, 쿠바 표준시를 모두 나타내는 등의 모호함이 있었다. tz database time zones라는 이름을 가진 해당 링크는 그 이름처럼 IANA TZDB에서 사용하는 타임존 목록을 그대로 가져와 정리한 것인데, 약어 대신Asia/Tokyo
,Europe/Lisbon
처럼 지역명을 사용하고 있다. 이게 타임존을 다루는 데에 사실상 가장 현실적인 방안이라고들 생각하는 것 같다. - ISO 8601
2018-11-13T22:36:38+09:00
처럼 생겨먹은, 시간에 대한 i18n 처리를 할 때 거론되는 날짜와 시간에 관련된 국제 표준. format이 한가지 종류가 아니라는 점(날짜를 YYYY-MM-DD로 표현하는 경우도 있고, YYYYMMDD로 표현하는 경우도 있으며 시간이 UTC라면 +00:00 대신 Z를 쓸 수 있다.)과 timezone에 대한 표기 없이 UTC와의 시차만 표현한다는 점이 흥미로웠다. 동일한 시간대에서 통신 시 지역 시간을 가정하는 것이 편할지라도, 서로 다른 시간대 간의 통신에서는 애매할 수 있을테니 ISO 8601 포맷을 사용하여 UTC에서 얼마를 더해 이 시각이 나왔는지를 알려주는 것이 좋을 것이다. - What's the difference between ISO 8601 and RFC 3339 Date Formats?
'RFC 3339 is listed as a profile of ISO 8601. Most notably RFC 3339 requires a complete representation of date and time (only fractional seconds are optional).'
DNS
- Demystifying DNS for web developers
DNS에 대해 훑어보기에 좋은 글. - SOA Record
- NS Record
- A Record
- AAAA Record
- MX Record
- CNAME Record
- Alias Record
기타
- How does MQTT protocol work?
일반적으로 알고 있는 pub/sub 패턴처럼, publisher는 토픽을 발행하고 subscriber는 관심 있는 토픽을 구독한다. 메시지는 broker가 관리한다. Facebook Messenger가 MQTT를 사용하는 것으로 유명하지만 지금까지도 쓰고 있는지는 잘 모르겠다. 오픈소스 MQTT 브로커로 mosquito를 사용하곤 한다. Firebase Cloud Messaging(FCM)도 MQTT 구조인가? 싶었는데 얘는 웹소켓이라고 함. - RSS 2.0 specification
웹 컨텐츠 제공 형식을 표준화한 것. XML로 이루어져 있고, 각 item들은 title, link, description, author, category 등의 속성을 가질 수 있다. 블로그 게시글들을 XML화시킨 것이라고 생각하면 된다. RSS를 읽어서 잘 파싱하고 보여주는 툴이 있다면 컨텐츠를 소비하기 위해 직접 페이지에 방문하지 않아도 됨.
웹 관련 이야기
- Understanding CORS
- Understanding CORS - spring.io
의문 1. Same Origin Policy는 도대체 무엇을 방어하기 위해 있는 것인가?
의문 2. CORS는 브라우저의 입장에서 무엇을 해결하기 위해 생겨난 것인가?
의문 3. CORS가 server side에서 특정 Origin에게만 리소스를 허용하기 위함이라면, OPTIONS에서 단지 헤더 몇개 떨궈줄 게 아니라, 그거 무시하고 그냥 API Call해버리는 것도 방어해야 하는 것 아닌가? + 그냥 요청자가 Access-Control-Allow-Origin에 들어온 값으로 Origin 헤더 변경해버리면 어떡함?
의문 4. Same Origin Policy가 브라우저에게 있어서 신뢰할 수 없는 origin에서 리소스를 가져오는 것을 방어하기 위함이라면, CORS가 browser side에서 other origin의 리소스를 가져올 수 있게 만들어버리니 무용지물이 아닌가?(서버에서 Access-Control-Allow-Origin을*
로 둔다거나 하면 브라우저가 disallow하는 게 없을테니까)
SEO
렌더링
- What are the differences between server-side and client-side programming?
서버 사이드/클라이언트 사이드 렌더링에 대한 이야기. 외국권에선 보통 rendering보단 programming이라는 단어로 통하는 것 같다.
소프트웨어 공학
Git
- git blame
git blame
명령어를 통해 소스 코드에서 특정 line을 지정한 후 그 일부에 대해서 commit history를 찾아볼 수 있다. - How to resolve merge conflict during pull request?
pull request를 날렸는데 conflict가 나면 어떻게 해결해야 되는지에 대한 질문. 'Merge origin/master into JohnMaster and push this to its remote (origin/JohnMaster).' 그냥 target branch에서 pull 땡기고 merge 해결한 후 push하면 된다. - How do I update a GitHub forked repository?
fork한 레포를 원본 저장소와 어떻게 sync하는지에 대한 질문. 'upstream'이라는 이름으로 remote를 등록하고fetch upstream
하면 된다. - What is .gitignore exactly?
'.gitignore tells git which files (or patterns) it should ignore.' 안드로이드 프로젝트 같은데서 맨날 .idea 하위 파일들 conflict났던 기억이 있는데 gitignore가 있으면 깔끔하게 해결 가능하다. - .gitignore is ignored by Git
Tracked file들은 .gitignore가 생겨도 제대로 먹히지 않는다. 'Even if you haven't tracked the files so far, Git seems to be able to "know" about them even after you add them to .gitignore.' - git rebase -i 사용하기
커밋 히스토리를 정리하기 위해, 또는 커밋의 메타데이터(커밋 날짜, author 등)를 변경하기 위해 사용하는 rebase. 여러모로 쓸만한 곳이 많다. - How can one change the timestamp of an old commit in Git?
과거의 커밋에서 commit time을 어떻게 변경하는지에 대한 질문. 이런저런 방법 많은데 나는rebase
해서commit --amend
하는게 깔끔해 보인다. - How to change the commit author for one specific commit?
과거의 커밋에서 commit author를 어떻게 변경하는지에 대한 질문. 여기서도 대부분 rebase하는 식으로 가이드한다. - Oh shit, git!
Git을 사용하다가 한 번씩은 마주치는 문제들을 어떻게 해결하는지에 대해 정리되어 있다. 어차피 결국은 구글링 하겠지만 git을 깊게 알아가는 과정에 좋은 글일 것 같다.
GitHub
Linux
- export, echo 명령어
- lsof 사용법
Address bind 관련 문제가 있을 때마다 포트 점유하고 있는 프로세스 보려고 옛날에 자주 썼던 명령어. 그냥 list 관련된 모든 것에 대한 헬퍼인 것 같다. - grep 사용법
결과를 필터링할 때 자주 사용하는 명령어. - awk 사용법
입력된 라인들의 데이터들을 특정 기준으로 분리해서, 일부 column만 가져올 수 있게 해주는 명령어. - htop Explained Visually
짱 쩌는 프로세스 모니터. devops 하시는 분들이 항상 피벗 모니터에 ElasticSearch 클러스터같은 데서 htop 켜놓고 있더라. - Crontab 사용법
특정 job을 스케줄하기 위해서 사용한다. - 리눅스 명령어 sudo, su, su -
CS
운영체제
자료구조
알고리즘
- 루프 불변성
반복 알고리즘의 무결성을 증명하기 위해 사용되는 방법이다. 루프 불변성과 반대되는 개념으로는 루프 변성이 있는데, 이는 루프를 '도는' 동안 변하는 성질을 가진 것들을 칭한다. - 시간 복잡도 빠르게 이해하기
시간 복잡도란 어떤 알고리즘의 실행 시간이 얼마나 되는가? 라는 질문에 대한 대답을 할 수 있는 개념으로, 알고리즘이 입력에 대해 얼마나 오래 실행될 것인지 예측할 수 있다. - 점근 표기법
상기한 시간 복잡도에 대해 조금 더 수학적으로 접근한 내용이다. - 분할정복
커다란 하나의 문제가 사실 '닮은꼴' 문제들로 쪼개질 수 있다면, 여러 부분문제들을 해결한 다음 해를 결합함으로서 원래 해결하고자 했던 문제를 해결할 수 있다. - 힙 정렬
최대 힙이나 최소 힙을 만들어 정렬하는 방식이다. 평균적인 시간복잡도는 퀵 정렬과 같지만(최악의 경우 퀵 정렬보다 빠르다) 트리를 만들어 정렬하는 특성 탓에 자료가 커질 수록 퀵 정렬보다 캐시 활용에 있어 모자란 면모를 보인다. - 동적 계획법
부분 해를 구하는 과정을 거듭해 최종 해를 구한다는 점은 분할정복과 비슷하지만, 분할정복과는 달리 한 번 구한 부분해가 여러 번 재활용되며 (중복되는 부분 문제가 존재하기 때문: n번째 피보나치 수는 n-1번째 피보나치 수와 n-2번째 피보나치 수를 더해서 구할 수 있다), 문제의 분할 자체가 속도 향상에 도움이 되는 분할정복과 달리 이전에 구한 해를 재활용하는 것이 속도 향상에 도움을 준다. - 파이썬으로 정리하는 Quick-Sort
네트워크
데이터 엔지니어링
Marketing
- User Acquisition - appsflyer
The method of driving new users to a mobile app business through marketing activity
- User Acquisition - Adjust
User acquisition (often shortened to UA) is the act of gaining new users, whether it be on an app, platform, or another service.
- Re-Engagement
Re-engagement is the practice of serving ads to people after who have shown interest without converting.
- What is a tracking link?
- Single-Touch vs. Multi-Touch Marketing Attribution
- Retargeting
- Reattribution
백엔드
백엔드 관련 배경지식
- Microservices with gRPC
- The Complete Guide to the ELK Stack - 2018
Splunk라는 선택지를 두고 왜 ELK를 쓰는지, 왜 유명한지, 로깅은 왜 해야 하는지, 기본적인 ELK stack부터 중간에 redis나 kafka를 써서 버퍼링하는 구조까지 설명하고 있다. 글이 좀 많이 긴데 정말 읽어볼만 하다. ELK는 웬만하면 log shipper로 Beats가 껴 있어서, Elastic에서는 이를 Elastic Stack이라는 이름으로 브랜딩하고 있다. - What are the advantages and disadvantages of using a content delivery network(CDN)?
네트워크는 물리적으로 가까운 위치에 있을수록 응답 속도가 빠르다. hop count가 줄어들기 때문이다. CDN은 정적 데이터(css, js, 이미지 등)를 다른 리전의 서버에 캐싱해 둬서, 멀리 사는 사용자에게 컨텐츠를 제공하는 퍼포먼스를 향상시키는 기술. Amazon Cloudfront같은 서비스가 CDN을 제공한다. - Time Series Database and Tick Stack
로그 collector로 Telegraf, 시계열 데이터베이스로 InfluxDB, 시각화로 Chronograf, Alerting&Anomarly Detection으로 Kapacitor를 사용하는 모니터링 스택. - Already learned DevOps? Great, now it’s time for GitOps
Everything as Code
- Failover & Disaster Recovery
- What is failover?
Failover is a backup operational mode in which the functions of a system component (such as a processor, server, network, or database, for example) are assumed by secondary system components when the primary component becomes unavailable through either failure or scheduled down time.
- What is High Availability?
In computing, the term availability is used to describe the period of time when a service is available, as well as the time required by a system to respond to a request made by a user.
- Disater Recovery Strategies
Docker
- 초보를 위한 도커 안내서 - 1. 도커란 무엇인가?
- 초보를 위한 도커 안내서 - 2. 설치하고 컨테이너 실행하기
- 초보를 위한 도커 안내서 - 3. 이미지 만들고 배포하기
- 개발자가 처음 Docker 접할때 오는 멘붕 몇가지
- 도커를 이용한 웹서비스 무중단 배포하기
배포 자동화가 대체 왜 필요한지부터, 왜 무중단 배포인지, 왜 Docker인지를 하나하나 설명하며 orchestration 얘기까지 비교적 쉽게 잘 설명한다. - 왜 굳이 도커(컨테이너)를 써야 하나요?
여기서 얘기하는 '눈송이 서버'라는 걸 겪어보지 못한 상태에서 docker를 마주쳤다 보니 궁금한 게 많았는데, 이 글이 잘 해결해 주었다.
Docker 커맨드 관련 지식들
- Docker 데이터 볼륨 사용하기
- How to mount a single file in a volume
- How to enter in a Docker container already running with a new TTY
docker exec -it [container-id] bash
- Docker run vs create
Dockerfile, docker-compose.yml 관련 지식들
- Docker VOLUME vs COPY vs ADD
- Automation of container creation and creating image with DB packed
docker-entrypoint-initdb.d에 대한 내용이다. Docker image가 run되는 시점에 사전 정의된 sql 스크립트를 돌리도록 하고 싶다면docker-entrypoint-initdb.d
를 써먹을 수 있다.
Docker 써먹기
- kitematic
'Run containers through a simple, yet powerful graphical user interface.' - 아마존 엘라스틱 컨테이너 서비스(ECS) 입문
- ECS의 매니지드 컨테이너 AWS 파게이트 시작하기
Docker Compose
- Docker (Compose) 활용법
사실상 docker-compose에 대한 이야기. production level에 영향을 주지 않고 어플리케이션을 테스트하려면, 로컬에 인프라를 모두 띄워야 하는데 이게 말처럼 쉽지가 않다. Docker 컨테이너 여러개를 훅 띄우는 데엔 docker-compose를 써먹을 수 있다. 'Compose is a tool for defining and running multi-container Docker applications.'
Ansible
- Ansible 101
'Ansible allows your whole infrastructure to be defined as code, so it can be version controlled, easily replicated and tested, truly DevOps!'. 뭐 automate software provisioning 이러는데 'infrastructure provisioning'이라는 개념 자체가 좀 어려웠다. 걍 EC2에 druid 올리면 infrastructure provisioning이라고 부를 수 있는듯. 여기에 automate 개념이 붙는 건 Ansible이 호스트 여러개에 갖다가 똑같은 커맨드 뚝딱뚝딱 실행시켜줄 수 있어서. 근데 Ansible도 Infrastructure as Code로 분류됨.
Terraform
- 테라폼(Terraform) 기초 튜토리얼 - AWS와 테라폼으로 구현하는 Infrastructure as Code
대부분 DevOps 관련 컨텐츠를 연재하는 44Bits의 Terraform 튜토리얼. 진짜 잘 정리돼있다! Terraform으로 뭔가 해보기 전에 읽어보면 엄청 좋을듯. - Terraform을 이용한 Infrastructure as Code 실전 구성하기
클라우드 인프라의 리소스들을 코드 형태로 구성할 수 있는 툴. 얘도 사실상 Ansible이랑 비슷한 맥락으로 infrastructure provisioning을 위한 것 같다. 써봐야 확실히 알 수 있을듯. - Ansible vs Terraform: Fight!
'One of those key differences involves two very common DevOps concepts: configuration management and orchestration.
서버 아키텍처 관련 블로깅/발표자료
- [야생의 땅: 듀랑고] SPOF 없는 분산 MMORPG 서버
- [야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
- DEVIEW 2016 참가 신청 기능 개발기
결론은 '신청자 수를 RDB에서 관리하지 않고 Redis 기반의 분산 메모리 저장소인 nbase-arc로 바꿨더니 잘 되더라'였다. 글만 보면 그냥 nbase 붙이고 나니까 너무나도 매끄럽고 쉽게 해결된 것만 같다. nbase-arc의 INCR 연산이 단순히 UPDATE 쿼리보다 속도가 빨라서 병목이 생기지 않았던 걸까? 이걸 조금 더 설명해줬으면 좋았을 것 같다. 무튼 캐시가 중요하긴 한가 보다. 2017, 2018 개발기도 올라왔으면 좋겠다. - 타다 시스템 아키텍처
관리 코스트 때문에 메시지 브로커에 redis를 쓰고, HTTP/2에 Protobuf를 쓴다는 게 신기했다.
Deployment
- Blue/Green Deployment: What It Is and How it Reduces Your Risk
무중단 배포 전략 중 하나로, 기존의 어플리케이션을 green version이라고 부르고, 업그레이드하고자 하는 버전의 어플리케이션을 blue version이라고 이름짓는다. production에서 green version만 존재한 채 트래픽을 처리하다가 -> blue version이 새로 생겨나 트래픽을 둘이 함께 처리하고 -> blue version이 모든 트래픽을 처리하도록 만든 후 -> green version을 제거하고 blue version을 새로운 green version으로 만드는 방식이다. 잠시동안 두 버전의 어플리케이션을 동시에 띄워야 하니 비용 문제가 발생할 수는 있으나 대부분 이런 방식을 많이 쓰는 것 같다.
웹서버 이야기
- What is the difference between application server and web server?
web server는 static content에 적합하고, app server는 dynamic content에 적합하므로 web server는 app server의 리버스 프록시 역할을 할 수 있다는 설명이 있다. - Difference between proxy server and reverse proxy server
CI
도움되는 SaaS
- runscope
API 모니터링 SaaS. 정해둔 스케줄과 step에 따라 API를 호출하고 validation을 수행한다. pagerduty같은 on-call alert 서비스와의 integration을 지원해서, API에 500이 발생했을 때 내 핸드폰으로 전화가 오게 만들 수도 있다. - statuspage.io
서비스의 상태를 공개하기 위한 status page를 호스팅해주는 서비스 - Sonarqube
버그, 취약점, 코드 스멜이라는 3가지의 카테고리로 나누어 rule을 정의해 이를 기반으로 코드를 정적 검사해 주는 도구다. - Python 프로젝트에 Codecov 연동하기
- codecov vs coveralls 커버리지 측정 도구로 유명한 codecov와 coveralls를 비교하는 글.
도움되는 툴
- Facebook Account Kit
SMS, 이메일을 통해 passwordless authentication을 할 수 있도록 도와주는 페이스북의 킷. SMS 인증이 한 달에 10만회까지 무료라길래 흠칫해서 알아보게 됨. Auth0라는 서비스도 이런 컨셉인 것 같은데, Auth0가 먼저고 Account Kit이 나중인듯. - ab - HTTP 서버 벤치마킹 툴
- wrk
Serverless
- Serverless Architecture
- 서버리스 아키텍쳐(Serverless)란?
서버리스는 직접 관리하는 인프라가 없다는 의미.
교양
- 채점 현황 속도 올리기 - 스타트링크
백준 온라인 저지(BOJ)에서 채점 현황 페이지의 속도를 올리기 위한 경험이 담겨 있다. real world에서의 쿼리 튜닝에 관한 이야기라 재밌게 본 것 같다. - ipify: 300억 요청 처리, 그 너머로
IP 주소 검색 서비스인 ipify를 Node.js로 개발하고, 성능에 문제를 겪은 뒤, Go로 API를 다시 작성해 문제를 해결한 이야기. 월간 200 달러로 300억 요청 처리. Go에 뽐뿌가 오게 만드는 글이다. 근데 Node.js가 왜 훨씬 느렸는지가 구체적으로 안 나와 있어서 아쉬웠다. ab라는 벤치마킹 툴을 새로 알게 되어 좋았음.
DB
DB 자체에 대한 지식
-
What is an ORM and where can I learn more about it?
ORM이 무엇이고, 장점과 단점은 무엇인지에 대한 설명. ORM 라이브러리는 대부분 무겁고 러닝커브가 생기긴 하지만, 상황에 따라 동적으로 SELECT 쿼리를 빌드하는 머리아픈 경험을 해 봤다면 ORM이 이만큼 유연할 수가 없다. 복잡한 쿼리가 아니라면 성능 문제도 딱히 없는 것 같다. 이래저래 논쟁을 끌고 다니는 기술이긴 한데, 단점을 감당하지 않기 위해서 ORM으로 얻을 수 있는 메리트를 모두 포기하고 raw SQL을 쓸 이유가 딱히 없지 않을까 싶다. 물론 대용량 데이터를 다룰 때는 raw SQL을 쓰는 것이 마음 편한 듯. -
DBMS는 어떻게 트랜잭션을 관리할까?
CUBRID의 개발을 이끌고 있는 엔지니어가 쓴, 트랜잭션의 관리를 DBMS 레벨에서 설명한 글. ACID 성질부터 UNDO와 REDO, 상태 로깅과 전이 로깅, 커밋을 하면 어떤 일이 일어나는지, group commit과 트랜잭션 철회 등이 정말 잘 정리되었다. 역시 기술은 해본 사람이 잘 아는 것 같다. -
A Detailed Guide to Database Denormalization with Examples
역정규화는 정규화된 데이터베이스에서 데이터를 묶거나 중복 적재하는 등 쓰기 작업을 더 많이 수행해서, 읽기 속도를 향상시키는 일이다. 많은 JOIN이나 aggregation이 이뤄지는 읽기 쿼리는 속도가 느려지기 마련인데, 데이터를 중복해서 적재하거나, pre-joined 구조의 스키마를 작성하는 등의 역정규화로 이를 해결하는 경우가 있다. 위 가이드는 역정규화의 몇가지 사례들을 쉬운 예제와 함께 잘 설명해주고 있다. -
How does database indexing work?
Index는 특정 레코드를 찾는 데에 linear search하던 걸, 레코드들을 정렬한 별도의 자료 구조를 만들어 여기에 range search하도록 만들고, 이를 통해 block access count를 줄이는 것이라고 보면 되는 것 같다. 너무 추상적인 것 같아 더 파보니 클러스터/비클러스터 인덱스 등등 더 깊게 뻗어나갈 수 있을듯. -
What do Clustered and Non clustered index actually mean?
인덱스의 아키텍처는 클러스터형/비클러스터형 인덱스로 나뉜다. 클러스터형 인덱스는 unique row를 컬럼 순서에 맞춰 물리적인 레벨에서 ordering하여 적재하는 인덱스라고 한다. PK를 기준으로 판단하며 따라서 테이블 당 하나씩 가질 수 있음. PK를 만들면 알아서 클러스터형 인덱스가 생긴다. B-Tree 인덱스나 hash table이 클러스터형 인덱스에 주로 쓰인다고 한다. 비클러스터형 인덱스는 물리적으로 데이터를 정렬하진 않고, 인덱스만 정렬한다. JOIN, WHERE, ORDER BY 절에서 사용된 비 PK 컬럼 위에 만들어진다고 함. insert와 update, point query(한두개만 select) operation에 있어서는 클러스터형 인덱스보다 빠르다고 한다.* What are the differences between a clustered and a non-clustered index?
-
Why do you create a View in a database?
두 테이블을 JOIN하는 복잡한 서브 쿼리를 제거하기 위해 처음으로 사용했었던 것 같다. 실제로 복잡성을 숨기기 위해 사용된다고도 한다. 테이블의 특정 컬럼을 보호하기 위한 메커니즘으로 사용할 수 있다는 DBA의 관점도 있다. View는 '쿼리를 캡슐화하여 aliasing한다'라고 이야기할 수 있을 것 같다. -
Are soft deletes a good idea?
데이터의 삭제에 대해 DELETE 쿼리를 날리는 것을 pysical delete, 삭제되었음을 나타내는 (is_deleted같은)컬럼을 두는 방식을 soft delete라고 부른다. 이래저래 논쟁이 많지만 'It depends on the circumstances.'와 'You can't do cascading deletions', 'it's a good idea to have a deleted_date field, instead of an is_deleted field.'가 팩트. 'a soft delete like this means you now have to include a WHERE IsDeleted = false clause in every query on this table'같은 휴먼 에러야 테스트 코드로 보완할 수 있는 부분일테고. -
What are OLTP and OLAP. What is the difference between them?
'In OLTP database there is detailed and current data, and schema used to store transactional databases is the entity model (usually 3NF).', 'OLAP applications are widely used by Data Mining techniques. In OLAP database there is aggregated, historical data, stored in multi-dimensional schemas (usually star schema).' -
What are Covering Indexes and Covered Queries in SQL Server?
'all requested columns in a query without performing a further lookup into the clustered index.', 'A covered query is a query where all the columns in the query's result set are pulled from non-clustered indexes.' -
What is a stored procedure?
'A stored procedure is a set of precompiled SQL statements that are used to perform a special task.', 'A benefit of stored procedures is that you can centralize data access logic into a single place that is then easy for DBA's to optimize.' -
What are the materialized views?
'A view is basically a "named" SQL statement.', 'A materialized view is a view where the query has been executed and the results has been stored as a physical table.'
DB Vendor
- InfluxDB
TICK stack에서 time series 데이터베이스로 사용된다. 외부 의존성 없고, SQL-like한 InfluxQL이라는 질의 인터페이스를 지원하고, 클러스터링 지원하고, Grafana랑 연계하기 좋고, Go로 개발됐고, 원래 LSM(Log Structured Merge) Tree를 지원하는 LevelDB를 스토리지 엔진으로 쓰다가 이를 개량한 TSM(Time Structured Merge) Tree를 스토리지 엔진으로 사용해서 IO도 빠르고, 압축 알고리즘도 적용해서 스토리지 효율 면에서도 뛰어나다. Graphite는 퍼포먼스 문제가 꽤 많다고 하고, Prometheus는 클러스터링 기능이 없다. 그러나 시계열 데이터베이스에도 silver bullet은 없다 ㅜㅜ. 얼마 전에 나온 TimeStream이랑 비교하는 글이 곧 올라오지 않을까? - StatsD
Node.js 런타임에서 동작하는 로그 aggregation 프록시. 단위 시간 안의 API 응답 시간 평균과 같은 것들은 일차적으로 aggregation을 해두면 로그 DB의 부하 방지에 좋을 것 같다. Mongo, Graphite, InfluxDB, Zabbix, CouchDB 등 백엔드 지원도 잘 되어 있다. - Reduce MySQL Memory Utilization with ProxySQL
'The main purpose of the multiplexing is to reduce the connections to MySQL servers. So we can send thousands of connections to only a hundred backend connections.' ProxySQL을 쓰는 걸 구경은 해봤는데 직접 써본 적은 없어서 유의미하게 뭔가 경험해본 적이 딱히 없다. ㅜㅜ 커넥션 관리에 확실히 좋다고는 들음. - druid
OLAP를 위해 디자인된, lambda architecture 기반의 data store. 검색 엔진에서 사용하곤 하는 inverted index 구조를 가진다. realtime data에 대한 aggregation query가 매우 빠르다. Hadoop에서 하기 어려운 데이터의 빠른 접근과 실시간 쿼리를 만족한다. aggregating을 매우 빠르게 처리하는 데이터 스토어라고 보면 될 듯. 비슷한 것으로 Google BigQuery, Dremel, PowerDrill 등이 있다. - FluentD
Logstash 대용으로 사용할 수 있음.
Common SQL
Common DML(INSERT, SELECT, UPDATE, DELETE)
- Insert into a MySQL table or update if exists
key duplication이 없다면 insert하고, 있으면 update를 MySQL에서는ON DUPLICATE KEY UPDATE
로 표현한다.UPSERT
나MERGE
라는 이름으로도 사용되고 있는 개념. - SELECT 결과를 INSERT 하기
JOIN
- Review of SQL JOINS
- LEFT JOIN vs. LEFT OUTER JOIN in SQL Server
두번째 답변의 내용이 매우 좋다. JOIN은 top level에서 INNER, OUTER, CROSS로 나눌 수 있고, OUTER JOIN의 앞에는 LEFT, RIGHT, FULL이 들어갈 수 있다는 것. - MySQL ON vs USING?
'USING is useful when both tables share a column of the exact same name on which they join.'
Date, Time 연산 관련 쿼리
- When is a timestamp (auto) updated?
ON UPDATE CURRENT_TIMESTAMP
에 대한 이야기. - INTERVAL
INTERVAL [expr] [unit]
| new relic에서 since 3 days ago같은 쿼리 보면서 되게 신기하다 싶었는데, SQL에도 있었다.
MySQL
- Illegal mix of collations for operation 'like'
DATETIME 필드에 대해 유니코드가 아닌 문자열로 LIKE 쿼리 수행 시 문제가 생기는데, 이를 해결하는 방법. 그냥 질의하기 전에 date format validation 돌리는 게 마음 편하다. - MySQL 쓰면서 하지 말아야 할 것 17가지
좀 오래된 글이긴 하지만 쉽사리 얻지 못할 지식들이 많이 들어 있다. - MySQL 중복 키 관리 방법
INSERT 시 unique constraint에 관해 생길 수 있는 몇가지 문제들을 해결해줄 3가지 쿼리(INSERT IGNORE, REPLACE INTO, ON DUPLICATE KEY UPDATE)
PrestoDB
- Date and Time Functions and Operators
PrestoDB의 date/time 관련 함수와 operator가 정리된 문서. athena에서 view를 만들 때 시간에 관한 계산이 종종 필요한데, 대부분 이 문서 하나면 모두 해결 가능하다. timestamp ↔ unixtime은to_unixtime
,from_unixtime
함수를 사용하면 되고, 타임존 변경은AT TIME ZONE
operator, 포매팅과 파싱은 각각date_format
과date_parse
를 쓰면 된다.
Druid
Query
- Querying - Overview
- Transforming Dimension Values
Lookup에 관한 이야기. - Querying - Aggregations
- Querying - Aggregation Granularity
ElasticSearch
Query
- Query and filter context
ElasticSearch docs에서 쿼리 부분에 들어가면 가장 처음 나오는 내용. ElasticSearch의 모든 쿼리는 context를 가지며 이는 query와 filter context로 나뉜다고 정리되어 있다. query context는 '얼마나 잘 일치하는가'같은 scoring의 느낌이고, filter context는 '이것과 일치하는가'같은 SQL의 WHERE절 같은 느낌이다. - Bool Query
bool은 must, should, filter같은 조건 쿼리들을 모아주기 위해 사용된다. 그냥 SQL에서 조건문을 정의하기 위해 WHERE 뒤에 조건식들을 나열하는 것처럼 ES에선 bool을 사용한다고 생각하면 됨. - ElasticSearch bool query combine
ElasticSearch에 쿼리할 때 조건식들을 나열하기 위해 bool query 내부에 should와 must같은 걸 쓰곤 하는데, 이들이 각각 어떤 condition으로 조건식들을 합치는지에 대한 질문. OR은 should, AND는 must와 대응된다. - What is the difference between must and filter Query DSL in ElasticSearch?
AND 쿼리를 위해 사용하는 must query와 filter query의 차이에 대한 질문. must는 스코어를 측정하고, filter는 스코어를 측정하지 않는다. score가 필요없는 쿼리의 경우 must 대신 filter를 쓰면 더 빠르다고 한다. - ElasticSearch match vs term query
bool query 내에서, 특정 필드의 값에 대한 일치 연산을 위해 term이나 match를 대부분 사용하는데, 이 둘의 차이가 무엇인지에 대한 질문. term은 filter context, match는 query context에서 실행된다고 정리하면 된다. exactly equal을 보려면 term을 쓰는 것이 맞음. - Source filter
Source filter(_source)를 통해 ElasticSearch가 결과에 특정 필드만 포함시키도록 한다. includes/excludes를 두면 포함/제외를 별도로 둘 수 있다. - Terms Aggregation
DISTINCT SELECT/COUNT에 쓰이는 terms aggregation. - Term level query - range query
SQL의 between과 대응되는 쿼리.
Others
- Elastic APM
Elastic에서 제공하는 APM 서비스. New Relic같은 거라고 보면 된다. 하드하게 써본 경험은 없어서 뭐라고 하진 못 하겠지만, 어차피 ES 쓰고 있다면 APM도 Elastic 인프라 내에서 처리해도 괜찮을 것 같다고 생각한다.
웹 프레임워크
Python
Flask
- Flask 1.0 Quickstart
- Flask 1.0 공식 튜토리얼
- Flask 1.0에서 달라진 점
- Patterns for Flask 1.0
- Pynash: Proxy objects in Flask (and elsewhere)
- What is the purpose of Flask's context stacks?
- Output Fields - Flask-RESTful documentation
view function에@marshal_with
을 정의해 두면, flask-restful은 해당 view function이 return한 객체에 접근해서, 데코레이터 인자로 전달한 스키마를 토대로 속성들을 뽑아 간다. ORM으로 가져온 객체를 그대로 리턴하고, marshal과 관련된 것들은 별도로 수행되도록 하는 구조를 구성해볼 수 있다. - Signals
Java
Spring
- 스프링부트로 웹 서비스 출시하기
- Gradle + SpringBoot + Travis CI + Coveralls + 텔레그램 연동하기
- 스프링 부트 2.0 레퍼런스 코딩
- JWT 기반 로그인 구현 예제
- 폼 기반 인증 구현 튜토리얼
- MVC 구조에서 service와 serviceImpl을 왜 만드는가
Node.js
Express.js
해킹
HTTP
프로그래밍 언어
Python
언어 자체에 대한 이야기
- 제너레이터와 코루틴
- 파이썬 언더스코어(_)에 대하여
- Python __getitem__과 slice의 이해
getitem 과 slice 에 대한 내용 뿐만아니라, "Ellipsis" 라는 개념이 등장한다. Ellipsis 는 null statement로 pass 대신 쓰이는 경우도 있다. - Python equivalent of golang's defer statement
Go에서 defer는 function call stack의 맨 위에 해당 함수를 push한다. 이걸 Python에선 어떻게 해야 할까?라는 질문. contextlib.ExitStack을 써먹으면 된다. - What is __pycache__?
collections
- Removing duplicates in lists
리스트에서 중복된 요소를 제거하는 방법에 대한 이야기다. 알아두면 요긴하게 써먹을 수 있음. - Difference between append vs. extend list methods in Python
list를 확장하는 메소드로 append와 extend가 있는데, 이 둘의 차이. 3번째 답변이 오버로딩된 연산자와 timeit을 통한 시간 복잡도까지 잘 설명하고 있다.
파이썬 공부 자료
- Glossary
iterable, iterator, awaitable, context manager, coroutine function과 같이, 파이썬을 쓰다 보면 한번쯤은 마주치게 되는 단어들이 정리된 문서. - Hidden features of Python
그다지 알려지지 않았지만 유용한 Python의 기능들. - Intermediate Python
파이썬에 이런 기능도 있는데 혹시 알아? 하는 느낌의 팁북. 바로 위의 'Hidden features of Python'과 비슷한 느낌이다. - A collection of design patterns/idioms in Python
파이썬으로 구현한 이런저런 디자인 패턴들의 모음. - wtfpython
파이썬을 사용하며 생길 수 있는 해프닝들의 모음인데, 흥미로운 주제들이 많이 정리되어 있다. - Better Python 59 Ways
한국에서는 '파이썬 코딩의 기술'이라고 이름지어진, 'Effective Python'이라는 도서에서 사용된 59가지 예제 모음 - The Hitchhiker’s Guide to Python
성능
Python 3.7
type hint
- PEP 484 -- Type Hints
Python 3.5부터 사용 가능한 type definition. typing 모듈의 overload 데코레이터로 오버로딩도 가능하다. - PEP 526 -- Syntax for Variable Annotations
- pyright
- mypy
- Type hinting in Python 2
개발 환경
- 가상 환경 및 패키지
- Black
엄청 잘 만들어진 코드 포매터. - pyenv-win
이제 Windows에서도 pyenv 쓸 수 있다!!
pipenv
- pipenv란 무엇인가
virtualenv+pyenv+pip가 합쳐진 형태의, Python계의 npm인 pipenv에 대한 소개. pyenv가 설치되어 있으면 알아서 필요한 버전을 설치하고 가상 환경을 열어준다는 게 정말 맘에 든다. pyenv 설치하고, pyenv-virtualenv 설치하고, requirements.txt를 dev와 production에 나눠 만들 필요가 없으니 정말 편한 도구. - pipenv로 Python 프로젝트 관리하기
글 자체가 깔끔하게 정리되어 있기도 하고, pipenv가 제공하는 명령어들에 대한 구체적인 설명이 들어 있어서 초심자에게 더 좋은듯. - Force pipenv to create a new virtualenv
pipenv install 시 이미 대응되는 venv가 존재하면 에러가 나는데, 무시하고 그냥 새 venv를 덮어씌우기 위한 방법. 'you can set the environment variable PIPENV_IGNORE_VIRTUALENVS to avoid reusing an already activated virtualenv' - How to get pipenv running in docker?
Docker container에선 굳이 venv를 쓸 필요가 없다. 시스템 파이썬에 pipenv 의존성을 다 설치해버려도 됨. 'You need to use --system flag, so it will install all packages into the system python, and not into the virtualenv. Since docker containers do not need to have virtualenvs'
테스팅
nose
coverage.py
- Configuration files
.coveragerc
에 대한 내용 - Coverage.py command line usage
비동기 프로그래밍
- 비동기 파이썬
Hackernoon에 작성된 Asynchronous Python을 번역한 글. 멀티스레딩에서 경쟁 상태나 데드락 등등은 어떻게든 해결할 수 있으나 context switching의 자원 낭비는 어째 해결할 수 없어서 비동기 프로그래밍이 설계되었다는 내용을 시작으로, Python을 기준으로 해서 그린 스레드부터 콜백 스타일, Python 3.3부터 제공된yield from
, asyncio의 빌트인화와 async/await 문법까지 차근차근 설명되어 있다. - asyncio : 단일 스레드 기반의 Nonblocking 비동기 코루틴 완전 정복
asyncio를 조금 더 큰 그림에서 바라본다.결국 이는 NodeJS가 밀고 있는 non-blocking 비동기 처리에 더 근접하는 개념이다.
와 같은 내용처럼. - What does the “yield from” syntax do in asyncio and how is it different from “await”
파이썬에서 비동기 IO를 위해 사용하는 두 키워드.- Python 3.3부터 generator가 다른 generator에게 연산의 일부를 위임하도록 하는 yield from이라는 expression을 사용할 수 있게 되었다. 이는 generator가 generator를 호출하고, 서로의 실행을 중지시킬 수 있는 방법이 생긴 것이기 때문에 비동기 프로그래밍이 원활히 가능하도록 만들어 주었다.
- 이러한 generator들을 실행하는 이벤트 루프를 asyncio 라이브러리가 제공해주기 시작했다.
- Python 3.5부턴 asyncio가 빌트인 라이브러리로 지원되며
async
키워드가@asyncio.coroutine
를 대체하고,await
키워드가yield from
을 대체하게 되었다.
표준 라이브러리
Data Types
- datetime
- collections.OrderedDict
내 생각엔 OrderedDict를 써볼만한 case가 그리 많진 않을 것 같은데, OrderedDict를 써야 하는 적은 case 입장에서는 정말 개이득인 컨테이너 타입인 것 같다.(메인 언어로 파이썬 쓴지 1년 넘는 동안 딱 2번 써봤지만, 그때마다 OrderedDict 덕분에 정말 편-안했음) 단지 넣은 순서대로 dictionary가 유지된다는 것 뿐이지, 자동으로 sort는 해주지 않는다는 것을 인지하고 있어야 한다. - collections.defaultdict
dict를 상속받은 dictionary-like한 객체를 반환한다. 이 객체는 함수에 전달된 optional argument인 default_factory를 인스턴스 변수로 가지고 있고,__getitem__
메소드를 오버라이딩한다. getitem 시 key가 존재하지 않으면__missing__
메소드를 호출하고, 이 메소드는default_factory
를 호출해 반환한다. default_factory가 None이면KeyError
를 raise한다. invalid key에 대해 default value를 정의해 두어 KeyError를 방어하기 위해 사용된다. - 얕은 복사(shallow copy) vs 깊은 복사(deep copy)
복사 개념을 잘 모르면 이상한 걸로 삽질하게 된다. Python에서는 복사 작업을 돕기 위해 copy 모듈이 존재한다. - enum
enum이야 뭐 클래스 변수로 쓰면 되지 않나? 싶었는데, 모듈에서 제공해주는 기능이 생각보다 엄청나게 많고 유용하다. enum 정의하려면 일단 Enum 클래스 상속받고 시작하는 게 좋을듯. ㅎ
Structured Markup Processing Tools
- xml.etree.ElementTree
svg 파싱할 때도 유용하다.
Data Persistence
- pickle
객체를 그대로 binary string으로 직렬화하는 것을 pickling이라 부른다. 큰 틀은 serialization인데, Python에서만 pickling이라 부름. 아무튼 이런 pickling을 위해 pickle이라는 모듈을 사용할 수 있다. use case는 잘 모르겠다(내 기준에선 객체 직렬화라고 해봤자 웬만하면 dictionry/list인데, 이건 그냥 JSON으로 직렬화하면 되는 이슈라서). 이 아티클에서는 머신러닝 알고리즘에서 피클링이 '매우 유용'하다고 한다.
Python Runtime Services
- abc
'Abstract Base Classes'
Generic Operating System Services
- logging
- logging.info doesn't show up on console but warn and error do
'The root logger always defaults to WARNING level.'
- logging.info doesn't show up on console but warn and error do
Functional Programming Modules
Debugging and Profiling
- timeit
짧은 Python statement에 대해 실행 시간을 측정해준다. 문제를 해결하기 위한 방법이 여러가지일 때, 시간복잡도 면에서 better way를 찾기 위해 종종 쓰게 된다. - Python Debugging with Pdb
사실 옛날엔 그냥 매 줄마다 print 찍어보면서 디버깅하곤 했었는데, 확실히 디버깅 툴을 직접 쓰는 게 러닝커브를 감안하더라도 훨씬 더 나은 것 같다.
Concurrent Execution
- Intro to Threads and Processes in Python
multi threading, multi processing과 파이썬의 GIL problem까지 잘 요약해 주었다. - 파이썬의 새로운 병렬처리 API – Concurrent.futures
Networking and Interprocess Communication
Data Compression and Archiving
- gzip
'This module provides a simple interface to compress and decompress files just like the GNU programs gzip and gunzip would.'
Internet Data Handling
- JSON - The Hitchhiker's Guide to Python
'The json library can parse JSON from strings or files. The library parses JSON into a Python dictionary or list. It can also convert Python dictionaries or lists into JSON strings.'
Internet Protocols and Support
외부 라이브러리
CLI
- zappa
WSGI 웹 어플리케이션을 AWS Lambda에 올려서 서버리스 어플리케이션을 잘 배포할 수 있게 도와주는 CLI 툴. maintainer가 완전 착하다.. - twine
Python 패키지를 PyPI(python Pacakge Index)에 쉽게 배포할 수 있도록 해주는 CLI 툴. - aws-cli
AWS 서비스를 관리하기 위한 CLI 툴. management console에서 안되고 CLI에서만 되는 것도 종종 있다. 예를 들어 CodeBuild에 hook다는 것? - click
CLI 어플리케이션을 개발하는 걸 도와주는 라이브러리. 'Python composable command line interface toolkit'
Schema Validation
- jsonschmea
JSONSchema를 통한 validation 라이브러리. - schema
schema validation 라이브러리. Pythonic하다고 하는데 이거 쓰려면 러닝커브가 좀 생길 것 같다. 아이디어는 괜찮은 것 같은데, 컨셉 자체가 너무 그들만의 세계같은 느낌. - schematics
schema validation은 이게 제일 나은듯 ㅎ StringType()처럼 데이터의 스키마를 객체로 정의하게 되면 required, default와 같은 rule들이 생성자의 인자로 전달되기 때문에 자동완성의 도움을 받을 수 있어서 IDE 바깥으로 나가는 일이 줄어들어서 좋은 것 같다. - cerberus
스키마 작성 방식이 JSONSchema와 꽤 닮아 있는 validation 라이브러리. 다만 이걸 쓴다면 자동완성의 도움을 받긴 어려울 것 같다. 나는 오타를 자주 내는 편이라, 이렇게 리터럴이 많은 것과 친해지기 쉽지 않다. - voluptuous
schema와 비슷하게 생긴 validation 라이브러리인데, 비교적 잘 정리되어 있는 편. 클래스 스타일이 싫다면 이걸 써봐도 괜찮을 것 같다. - pydantic
나는 pydantic을 쓸 수 있는 환경이라면 무조건 이거 쓸 것 같다.
DB Driver
- What's the difference between MySQLdb, mysqlclient and MySQL connector/Python?
MySQLDB1, MySQLDB2, mysqlclient, mysql-connector-python, pymysql의 차이에 대한 이야기. CPython을 쓴다면 mysqlclient만한게 없는 것 같다. - mongo-python-driver(pymongo)
- motor
'full-featured, non-blocking MongoDB driver for Python Tornado and asyncio applications.' - redis-py 'Redis Python Client'
- pymemcache
'A comprehensive, fast, pure-Python memcached client.'
DB Helper
- mongoengine
Node.js의 mongoose와 대응할 수 있는 ODM 라이브러리. 고딩 시절의 거의 반을 함께한 친구 ㅜㅜ - pypika
SQL query builder. ORM같은 쿼리 인터페이스는 아니고, 단순히 쿼리 문자열을 만들어주는 라이브러리라서 접근 방식이 좀 다르다. - SQLAlchemy 시작하기 - Part 1
짱 좋은 ORM 라이브러리 ^&^ - peewee
'Peewee is a simple and small ORM.' API 자체가 '예쁘기'는 한데, SQLAlchemy를 두고 이걸 쓸 메리트가 있을런지 싶기도 하고, 당장은 트랜잭션 생각을 안해도 돼서 괜찮은 것 같기도 하고.. - peewee-async
Peewee를 async하게 쓸 수 있게 해주는 라이브러리. Sanic같은 데서 ORM 쓸 때 많은 도움을 준다.
HTTP
- requests
HTTP request 잘 할 수 있게 도와주는 라이브러리. 내장 라이브러리인 urllib.request를 wrapping함. - yarl
'Yet another URL library'. URL 파싱 관련 작업을 도와준다. 내장 라이브러리인 urllib.parse 위주로 wrapping함. - furl
- gunicorn으로 flask에서 동시에 여러 요청 처리하기
Async
- uvloop
'Ultra fast asyncio event loop.' - aiohttp로 하는 비동기 HTTP 요청
- aiocache
async 함수에 대한 캐싱을 도와주는 라이브러리.
Excel Processing
Drop-in Replacements
- Arrow
datetime으로 타임존과 싸우는 건 사람이 할 짓이 아니다. arrow는 기본적으로 시간을 ISO 8601 format으로 다루기 때문에 타임존 conversion이 쉽고, time shifting이나 humanize 기능도 잘 준비되어 있다. - ultrajson(ujson)
'Ultra fast JSON decoder and encoder written in C with Python bindings'
SaaS Helpers
- pyfcm
'Python client for FCM - Firebase Cloud Messaging' - python-firebase
'Python interface to the Firebase's REST API'. pyfcm은 FCM에 한정되어 있고, 얘는 firebase 전체. - firebase-admin-python
Python용 firebase admin SDK. Firebase에서 가장 권고하는 방식이며 official로 관리된다. - elasticsearch-py
'Official Python low-level client for Elasticsearch.' - elastic-apm
'Official Python agent for the Elastic APM' - slacker
'Full-featured Python interface for the Slack API' - boto3
'AWS SDK for Python'
Crawling
- beautifulsoup
'Beautiful Soup is a Python library for pulling data out of HTML and XML files.'
Others
- pyjwt
'JSON Web Token implementation in Python' - cachetools
functools.lru_cache 데코레이터의 변형을 포함하여 자주 쓰이는 캐싱들을 데코레이터 형태로 지원하는 라이브러리. LFU, LRU, RR, TTL cache를 지원한다. - blinker
object-to-object signaling을 도와주는 라이브러리. 일종의 옵저버 패턴이라 event driven한 어플리케이션을 잘 만들 수 있도록 해줄 것 같은데, use case는 딱히 생각이 나지 않는다. 최근에 signal을 활용하는 걸 봤던 건, Elastic APM Python agent에서 Flask의 request_started, request_finished signal에 각각 트랜잭션 시작과 종료 함수를 할당해둔 것 정도. - apscheduler
'Task scheduling library for Python'
테스팅
SQLAlchemy
- SQLAlchemy 시작하기 - Part 1
- SQLAlchemy 시작하기 - Part 2
SQLAlchemy 공식 튜토리얼을 번역한 글. 좋은 내용 다 담겨 있고, 이것만 정독해도 SQLAlchemy 수준있게 쓸 수 있다. - Flask-SQLAlchemy docs - Multiple Databases with Binds
Flask-SQLAlchemy에선SQLALCHEMY_BINDS
설정과 모델 클래스의__bind_key__
속성으로 여러 데이터베이스에 쉽게 연결할 수 있다. 그러나 일반적인 경우 read/write db를 나누어 접근하는 식이라, bind 설정 따로 안하고 그냥 db마다 engine 만들고 따로 session을 관리하는 식의 practice가 더 많다.
ORM
- Basic Relationship Patterns
relationship에 관한 이야기. 튜토리얼에도 포함되어 있는 내용이므로 튜토리얼을 보는 게 첫 이해에는 더 좋을 수도 있다. - SQLAlchemy's "Lazy" Parameter
relationship을 어떤 방식으로 불러올지를 lazy 속성을 통해 설정할 수 있다. 이것도 튜토리얼에 포함되어 있는 내용. - Column and Data Types
데이터 타입이 Generic Types/SQL Standard and Multiple Vendor Types/Vendor-Specific Types로 나뉜다는 것을 알게 됐다. Vendor-Specific Types는 한번쯤 써볼만한 것 같음.
Query
- Literal SELECT
UNION 쿼리 등에서 자주 사용되는 literal SELECT를 SQLAlchemy에서는 어떻게 표현하는지에 대한 질문이다. - Query 객체로 WHERE절 작성하기(Common filter operators)
SQLAlchemy의 Query 객체에서는 WHERE 절을 filter 메소드로 표현하는데, 여기에 들어가는 일반적인 operator들에 대한 정리다. - How to pass a not like operator in a sqlalchemy ORM query
Bitwise not operator가 아니라,sqlalchemy.not_
함수를 사용해서도 NOT을 표현할 수 있다. - sqlalchemy.orm.query.Query.slice(start, stop)
Query 객체에서 LIMIT 쿼리를 표현하려면, slice 메소드를 사용하거나, __getitem__에 슬라이싱이 지원되므로 빌트인 슬라이싱 연산을 사용할 수 있다. 이건 all 메소드의 코드와 __getitem__ 메소드의 코드, 그 바로 밑에 있는 slice 메소드의 코드를 살펴보면 도움이 많이 된다. - How to union two subqueries in SQLAlchemy
Query 객체의 union이나 union_all 메소드를 통해 UNION, UNION ALL 쿼리를 표현할 수 있다. - How to execute raw SQL in SQLAlchemy
raw SQL을 실행하는 방법 - 'select as' in SQLAlchemy
Column.label 메소드로 aliasing(SELECT AS)를 표현하는 방법 - SQLAlchemy simple example of sum, average, min, max
sqlalchemy.sql.functions 모듈의 함수를 이용해 aggregation을 하는 방법 - Get the number of rows in table using SQLAlchemy
쿼리에 대한 row count를 어떻게 반환받는지에 대한 질문이다. 답변의 내용처럼, 그냥query.count()
는 wrapped select 꼴의 쿼리를 생성하기 때문에session.query(func.count(...)).scalar()
같은 방식을 사용하기도 한다. - What's the difference between filter and filter_by in SQLAlchemy?
'filter_by is used for simple queries on the column names using regular kwargs' - How to implement a default condition in all SQLAlchemy's queries
- SQLAlchemy Docs - ORM Events - Query Events
Engine, Connection, Session
- SQLAlchemy: engine, connection and session difference
engine, connection, session의 차이가 무엇이고 각각 언제 써먹어야 할지를 알 수 있다. - Avoiding boilerplate session handling code in SQLAlchemy functions
contextlib.contextmanager를 통해 session을 다루는 보일러플레이트를 with-as 문으로 관리하도록 만드는 패턴 - Contextual/Thread-local Sessions
context에 의존하는 어플리케이션에 적용하기 적합한 scoped_session에 대한 가이드. 하나의 스레드에서 동일한 세션을 이용해 여러 작업을 처리하는 경우, 함수에 session을 파라미터로 넘겨줘서 session을 유지하는 경우가 많은데 scoped_session을 사용하면 이러한 문제가 줄어든다. - Dealing with duplicate primary keys on insert in SQLAlchemy
질문이 굉장히 세세한데, 결론은session.add
대신session.merge
메소드를 사용하면 primary key duplicate 시 알아서 update하도록 만들 수 있다는 것이다. - SQLAlchemy Transaction 관리 Practice 공유
데이터베이스에 접근할 때마다 context를 열지 않고, 데코레이팅된 함수 단위로 세션을 발급하는 식으로 트랜잭션을 관리하는 practice다. Flask에 SQLAlchemy를 엮어서 쓸 때마다 단지 'with문 쓰는게 좀 번거롭다' 정도만 생각했지, 더 나은 방법을 생각하려고 하지 않았던 게, 내 머리에서 이런 아이디어가 나오지 않았던 이유인 것 같다. - Unbind object from session
'Expunge removes an object from the Session, sending persistent instances to the detached state, and pending instances to the transient state.' contextmanager로 세션을 쓰다 보면, with문 바깥에서 객체 접근 시 session bind 문제가 발생한다. 이를 해결하기 위해 객체를 session에서 unbind해주는 session.expunge()를 쓸 수 있다. - Session Management - Refreshing / Expiring
- How to close sqlalchemy connection in MySQL
SQLAlchemy에서 active되어 있는 connection들을 어떻게 닫는지에 대한 질문.
Peewee
- Dynamically defining a database
Peewee는 모델을 정의할 때Meta
라는 inner class를 정의하고database
속성에 데이터베이스 객체를 명시해놓아야 한다. 데이터베이스 명시를 동적으로 정의하려면 Proxy 객체를 그 자리에 넣어두고,initialize
메소드로 lazy하게 바인딩해 준다. 동일한 모델에 대해 read/write db 세션을 나누어 접근하기 위해UserReadModel
,UserWriteModel
처럼 나누는 건 너무 아닌 것 같아서 proxy 개념을 써먹어보고 있는데, 좋은 practice인지는 모르겠다. - How to custom the table name in peewee?
peewee는 모델 클래스 이름을 그대로 lowercase해서 테이블을 찾는데, Meta 클래스의db_table
속성을 통해 테이블 이름을 별도로 명시할 수 있다. - Performing simple joins
peewee로 기본적인 join 쿼리를 작성하는 방법이다. join에서ON
쿼리를 작성하려면 join 메소드에 on 인자로 criterion을 넘겨줘야 한다. - Joining multiple tables
peewee 가이드에서 여러 테이블의 join에 대한 부분이다. join type에 대한 명시 방법, join context에 대한 이야기,join_from
메소드에 대한 가이드가 들어 있다.
MongoEngine
Zappa
- Enabling CORS
웹 어플리케이션에서 CORS를 처리하기 위해 Flask-CORS같은 extension을 사용하곤 하는데, 사실 API Gateway 단에서도 CORS를 지원한다.zappa_settings.json
에서cors
속성을true
로 설정하면 반영된다. - Scheduling
CloudWatch Events 기능을 통해 lambda function을 스케줄링할 수 있는데,zappa_settings.json
에서events
속성을 정의하는 것으로 편하게 설정 가능하다. 따로 분리된 cronjob 함수를 WAS와 함께 관리하기 좋음. - X-Ray Tracing
이것도 사실 API Gateway 기능인데, 대시보드 들어가서 켜기 귀찮을까봐 zappa 단에서 지원해준다. X-ray는 어플리케이션 성능 데이터들을 트레이싱해서 서비스맵으로 시각화해주는 도구인데, APM 용도로도 써먹을 수 있어서 요긴하게 써먹기 좋다.
boto3
- When to use a boto3 client and when to use a boto3 resource?
boto3.resource는 단지 boto3.client를 wrapping한 high level API이며, boto3.resource는 boto3.client의 모든 API를 래핑하지 않으므로 어쩔수 없이 boto3.client나 boto3.resource.meta.client를 사용해야 한다는 것을 잘 요약해준 것 같다. - boto3 - credentials
boto3가 credential을 어디서 가져오는지, 우선순위는 어떤지에 대한 문서. - Upload-Download File From S3 with Boto3
boto3로 S3에 객체를 업로드하고, 다운로드하는 기본적인 인터랙션에 대한 가이드. - How do I get the file/key size in boto S3?
버킷에서 특정 객체의 size를 얻어오기 위한 방법. s3 client 객체의 head_object로 객체에 HEAD 요청을 보내면 된다.
Golang
언어 자체에 대한 이야기
AWS
- AWS 101 : Regions and Availability Zones
Region과 AZ(Availability Zones)에 대한 설명. 물리적 데이터 센터인 Availability Zone들을 지리적 위치에 따라 Region 개념으로 묶고, 각 Region은 다른 Region들과 물리적으로 격리되어 있다.
컴퓨팅
EC2
- EC2(Elastic Compute Cloud)
컴퓨팅 엔진. 말 그대로 그냥 컴퓨터 하나 대여해 주는거라 EBS(Elastic Block Storage)를 붙여서 Druid를 올리거나, ProxySQL, VPN 서버 등 AWS에서 관리형으로 제공하지 않는 것들을 올리는 데에도 쓰고, 웹 어플리케이션 서버를 통으로 올리는 경우나, ECS(Elastic Container Service)가 컨테이너를 동작시키는 컴퓨팅 엔진, 마인크래프트 서버 구축 등 여러 용도로 사용할 수 있다. - 인스턴스 수명 주기
- 인스턴스 유형
instance family라고도 부른다. 하드웨어 스펙이 어디에 최적화되도록 설계되었는지에 따라 다르게 분류함. EC2에 올리려는 컴포넌트의 특징에 따라 인스턴스 유형을 잘 선택하면 남는 리소스도 줄이고 비용 최적화에도 좋을 것 같다. ElasticSearch 올릴 때 D2나 I3 쓴다거나.. - 인스턴스 구입 옵션
온디맨드, 스팟, 예약 인스턴스만 알고 있었는데 몇가지 더 있었다. 스팟, 예약 인스턴스 잘 써먹으면 비용 최적화에 도움 많이 될듯. - Application Load Balancer 서비스 공개
AWS 블로그의 글이다. 일반적으로 로드밸런싱은 OSI 모델 기준 layer 4(transport layer)나 layer 7(application layer)에서 처리한다. ELB(Elastic Load Balancer)는 layer 4 로드 밸런싱을 제공하는데, layer 7 로드 밸런싱을 위해 ALB를 사용할 수 있다. application layer에서는 transport layer에서 할 수 없었던 패킷 접근이 가능한데, 이 덕분에 HTTP 요청의 내용(헤더, URL 등)을 가지고 rule을 만들어서 패킷 전송 위치를 지정할 수 있다. ELB를 세팅할 때 application load balancer와 classic load balancer가 선택지로 제공된다. - 배치 그룹(Placement Gorup)
placement group을 설정해 두면 group에 있는 인스턴스들이 '물리적으로 가까운 위치'에 할당된다. latency 확보에 도움을 준다고는 하는데, 유의미한 수준인지는 모르겠다.
EBS
- EBS(Elastic Block Storage)
EC2 인스턴스에 마운트해 사용할 수 있는 블록 스토리지. 데이터를 다루는 클러스터를 직접 운영(ex - ElasticSearch, Druid, ...)하는 경우 extra storage가 필요한데, EBS가 그걸 해결해 준다. - EBS 최적화 인스턴스
인스턴스에 EBS 전용 대역폭을 만들어서 EBS에 대한 처리량과 IOPS를 늘리는 것. 현재 세대 인스턴스들은 기본적으로 EBS 최적화되어 있는 상태.
ELB
- Application Load Balancer 시작하기
나같은 WAS돌이들은 ALB를 자주 쓰게 된다. target group 만들고, target group에 target 등록하고, LB에 타겟(listener) 등록해주면 된다. - Application Load Balancer를 통한 경로 기반 라우팅 사용
ALB에는 rule이라는 게 있어서, URL을 기반으로 포워딩할 listener를 설정해둘 수 있다.
ECS
- ECS(Elastic Container Service)
어플리케이션을 docker 등으로 컨테이너화 하면, 독립된 실행 환경이 보장되고 빌드 스크립트가 파일 형태로 관리되어 배포 과정이 깔끔해진다. 가장 문제는 이러한 컨테이너를 orchestration하는 일인데, 이 일을 ECS가 대신 해준다. ECS는 Kubernetes같은 Docker 컨테이너 orchestration 서비스. EC2를 기반으로 동작시키거나, EC2 인스턴스를 직접 관리하기 부담스러운 경우 Fargate를 사용할 수도 있다. - Fargate
서버리스 컨테이너 컴퓨팅 엔진. 컨테이너를 위한 인스턴스를 EC2 등으로 직접 관리할 필요 없이, 컨테이너 자체만 제공하면 알아서 잘 관리해 준다.
ECR
- ECR(Elastic Container Repository)
말 그대로 Docker 컨테이너 저장소를 제공한다. ECS와 잘 통합되므로 배포 프로세스에도 도움을 많이 준다.
Lambda
- Lambda
'이벤트에 응답하여 코드를 실행'하는 서버리스 컴퓨팅 서비스. Event Driven한 거라면 뭐든 붙여볼 수 있다. API Gateway랑 엮어서 API 서버 용도로도 사용할 수 있고, 뭔가 스케줄링하는 용도로 사용할 수도 있고 등등. - Lambda Function Versioning and Aliases
Lambda function에는 버전과 alias(별칭) 개념이 있다. 세상에. Lambda function을 업데이트할 때마다 버전이 하나씩 올라가고, 최초 생성된 lambda function의 기본 별칭인Unqualified
는$LATEST
라는 와일드카드 표현식으로 항상 가장 최신 버전을 가리킨다. 버전과 별칭으로 나뉜 lambda function들은 각기 다른 unique한 ARN(Amazon Resource Name)을 가진다. 함수 이름이test
라면, 버전 7의 함수는arn:aws:lambda:<region>:<acct-id>:function:test:7
, 별칭이 PROD인 함수는...:test:PROD
같은 식. serverless나 zappa 등의 툴킷으로 lambda에 서버리스 웹 어플리케이션을 배포하면, 함수가 업데이트될 때마다 알아서 새 버전을 가르키도록 Unqualified alias에 API Gateway를 매핑해 둔다.
스토리지
S3
- S3 Storage Classes
S3에도 종류가 있다. 웹페이지 리소스나 콘텐츠 저장 용도로는 대부분 검색 요금이 따로 발생하지 않는 S3 Standard를 사용하고, 오래된 로그 데이터같이 액세스 빈도가 낮은 데이터는 비용 최적화를 위해 S3-IA(Infrequent Access)나 RRS(Reduced Redundancy Storage)를 고려해볼 수 있다. Intelligent Tiering과 Glacier Deep Archive는 처음 알았다. - 버킷 정책 예제 - 특정 IP 주소 액세스 제한
- 버킷 정책 예제 - Amazon CloudFront 오리진 자격 증명에 권한 부여
보안 주체(principal)를 cloudfront canonical user id에 한정해서 CloudFront에게만 권한을 부여하는 방식.
EFS
- EFS(Elastic File System)
EBS와의 차이는, 여러 EC2 인스턴스에 동시 마운트할 수 있다는 점이다. 엄청 비쌈. 클러스터 환경에서 데이터 처리할 때 써먹을 수도 있지 않을까 싶다.
데이터베이스
RDS
Aurora
- Aurora Serverless - Features, Limitations, Glitches
Serverless 형태의 완전 관리형 Aurora 인스턴스. 정확히는 RDS에서 Aurora를 띄울 때 serverless 타입을 선택할 수 있다. Auto Scaling이 제공되고, Aurora가 자체적으로 multi-AZ에 데이터를 복제한다. VPC 내에서만 동작하고 별도로 VPC peering도 불가능하지만 Direct Connect로 해결 가능한데, 비용이 RDS 프로비저닝과 얼마나 차이날 지 궁금하다. - Aurora 로컬 스토리지 성능 테스트
DynamoDB
ElastiCache
DocumentDB
- Amazon DocumentDB 신규 출시
MySQL 호환 데이터베이스인 Aurora를 알았을 때, 뭔가 Document-Oriented NoSQL DB도 하나쯤 만들지 않을까 싶었는데 진짜 만들었다. MongoDB 호환 가능하고, AWS답게 replication 짱짱하고 스토리지 auto scaling 잘 되고, 역시나 완전 관리형이다. 나중에 한 번 써봐야지.
TimeStream
- TimeStream
2018 AWS re:invent때 공개된 완전 관리형 time series 데이터베이스. 완전 좋아 보이는데 일단 써봐야 알 것 같다. 1000X faster at 1/10th the cost 뭐 이러는데 일단 SQL-like 쿼리 인터페이스가 있다는 거랑 서버리스로 구성돼 있어서 관리 포인트가 줄어든다는 게 좋은 것 같다. ELK는 비싸고 대안이 딱히 없는 것 같아서 InfluxDB 쓰는데 이제 이거 EC2에 프로비저닝 안해도 되겠당. 물론 써봐야 알겠지만. grafana같은 time series visualize 툴들이 timestream 대응하느라 바빠질듯.
마이그레이션, 전송
DMS
- DMS(Database Migration Service)
데이터베이스 마이그레이션 서비스. 동종 데이터베이스 마이그레이션 뿐만이 아니라, 이기종 데이터베이스 플랫폼 간 마이그레이션(예를 들면, Oracle Database -> AWS Schema Conversion Tool -> Aurora Database)도 가능하다. 물론 소스 데이터베이스가 RDS 또는 EC2에 있어야 한다.
Snowball
- Snowball
데이터를 네트워크로 전송하는 것은, 대용량 데이터 관점에서 매우 느리다. Snowball은 대용량 데이터를 물리적으로 마이그레이션하는 것을 돕는다. AWS Management Console에서 작업을 생성하면 AWS가 물리적인 스토리지 디바이스(Snowball)를 본인에게 배송하고 -> Snowball 클라이언트를 통해 이 디바이스에 연결해 데이터를 업로드한 후 -> AWS에게 Snowball 디바이스를 반송 -> AWS가 이를 S3에 업로드하는 방식이다.
네트워킹
VPC
CloudFront
Route 53
API Gateway
Direct Connect
PaaS
CodeStar
CodeCommit
- AWS CodeCommit
private git repository 호스팅 서비스! 외부 이슈 트래커랑 연동도 되는 듯.
CodeBuild
- AWS CodeBuild
완전 관리형 빌드 서비스! VPC 내에 속하고, security group을 가질 수 있다는 게 정말 큰 메리트. - CodeBuild의 build spec reference
CodeBuild가 레포를 clone해서 빌드를 위해 buildspec.yml을 찾는데, 여기에 들어갈 수 있는 것들을 정리한 문서. 여타 CI들과 다르지 않게 phase 기반으로 동작한다. - Environment variables not being set on AWS CodeBuild
CodeBuild에서 buildspec.yml에 명시한 export 명령어가 제대로 먹히지 않는 현상에 대한 트러블슈팅. 버전을 0.2로 올리면 된다고 한다.
CodeDeploy
- AWS CodeDeploy를 통한 배포 자동화
EC2, ECS 등의 인스턴스에 대한 배포 자동화에 도움을 주는 착실한 친구. 그런데 뭔가 '배포 자체'에 대해 많이 챙겨줘서, Canary Test/Blue-Green Deploy, 롤백 등의 지원이 필요 없으면 안 쓰게 될 것 같기도 하다.
관리
CloudWatch
- 일정에서 트리거되는 CloudWatch 이벤트 규칙 생성
모니터링 도구인 CloudWatch에는 Events라는 하위 기능이 있다. 이벤트 패턴이나 일정을 이벤트 소스로 선택하고, 이벤트가 발생했을 때 lambda, step function, EC2 인스턴스 재부팅 등 타 AWS 서비스를 호출할 수 있다. 이 문서는 일정을 이벤트 소스로 트리거하는 CloudWatch 이벤트 규칙을 생성하는 방법을 다룬다. Linux의 cron과 비슷한 용도로 사용할 수 있다.
Auto Scaling
분석
Athena
Redshift
EMR
ElasticSearch Service
Kinesis
보안, 자격 증명
IAM
- AWS IAM
IAM 알못이 읽으면 엄청 많은 것을 습득할 수 있는 설명서. 영어 버전으로 보는 게 더 나을 것 같다. - Difference between IAM role and IAM user in AWS
'IAM controls: Who (authentication) can do What (authorization) in your AWS account.', 'Roles - are used to grant specific permission to specific actors for a set of duration of time. These actors can be authenticated by AWS or some trusted external system.'
KMS
WAF
- AWS WAF
이걸로 CloudFront에 특정 IP만 접근할 수 있도록 할 수 있다.
어플리케이션 통합
Step Functions
Amazon MQ
SNS
SQS
고객 참여
SES
- Amazon SES에서 이메일 전송 테스트
이메일 전송과 관련된 테스트를 수행하는 것을 돕기 위해, AWS SES에서 자체적으로 지원하는 시뮬레이션용 메일.
모바일
Android
- Android 공식 가이드
- Android의 HTTP 클라이언트 라이브러리
- Using Retrofit 2.x as REST client
- Retrofit 2와 함께하는 정말 쉬운 HTTP
Realm academy같은 게 백엔드에는 없는게 너무 아쉽다. 내가 못 찾는건가.. - Firebase를 실제 모바일 백엔드로 사용하면 일어날 수 있는 일들
- Android의 ORM
- Android의 이미지로딩 라이브러리
- Android 앱 메모리 최적화
- 안드로이드 BadTokenException의 원인과 해결방법
context알못에게 큰 시련과도 같은 BadTokenException. 내 경우 retrofit의 onResponse에서 다이얼로그를 띄울 때 ContextWrapper.getApplicationContext()의 반환을 전달했더니 났던 오류다. - Android와 개발 패턴
- 안드로이드의 MVC, MVP, MVVM 종합 안내서
- AWS codebuild + codecov 로 저렴하게 android CI 구축하기
- 클린 아키텍처와 함께하는 배민앱 (Android)
- epoxy
- Use Android Jetpack to Accelerate Your App Development
Google의 Single Activity Architecture 권고의 시작을 알리는 Jetpack
iOS
웹 프론트엔드
웹 프로그래밍 자체
CSS
PostCSS
Sass
FlexBox
React
- Learning React 예제 한국어 번역
- 한국어로 배우는 리엑트
- React Bit
- Awesome React Components
- 네이버 메일 모바일웹 리엑트 적용기
- React 인가 Vue 인가?
- [번역] React를 본격적으로 하기 전 알면 좋은 6가지
- React 프로젝트의 디렉토리 구조
- 카카오페이지 웹 React 포팅 후기