Lets-Study
나만 읽기 아까운 글이나 문서를 모아두는 공간입니다. 어떤 주제를 공부하거나, 공부의 방향을 잡거나, 그냥 가볍게 읽기 위한 재밌는 글을 원하는 누군가가, 양질의 글에 쉽게 접근할 수 있도록 도와주는 것이 이 저장소의 목적입니다.
대충 나눈 카테고리에, 링크로 이루어진 unordered list 형태로 구성됩니다. 링크 하나마다 커밋 하나씩, commit description으로 해당 링크에 대한 간단한 요약을 적기도 합니다. 조금 길게 공부할만한 것이 생기면 시간 여유가 있을 때 살펴보고 TIL에도 커밋합니다.
여러분도 북마크에서 몇 개만 공유해 주세요. 레포 주인이 공부하는 분야가 넓지 않아서, 별 거 아닌 것처럼 보이는 기여더라도 큰 도움이 됩니다.
배경지식
프로그래밍
함수 관련
- 함수형 프로그래밍이란?
- Higher-order-function(고차함수) with Kotlin
- Currying
- 함수형 프로그래밍: partial application과 curry
- 람다, 익명 함수, 클로저
- 자바스크립트의 호이스팅(Hoisting)
- 코루틴 소개
- What is a pure function?
테스팅
- 유닛테스트에 대한 생각
- 테스트 주도 개발이란
- 코드 커버리지 80% 넘긴 썰 - 테스팅을 잘 하기 위한 8퍼센트 개발팀의 삽질기
- Realizing quality improvement through test driven development: results and experiences of four industrial teams
Test Double
- 단위 테스트 케이스와 테스트 더블(Test Double)
- Mock Object란 무엇인가?
- Testing Without Mocks: A Pattern Language
- What's the difference between a mock & stub?
- Mocks Aren't Stubs
테스트에 관한 SaaS
패턴
디자인 패턴
- 디자인 패턴 종류
- So Singletons are bad, then what?
- Repository Pattern
- Dependency Injection
아키텍처 패턴
- 10가지 소프트웨어 아키텍처 패턴
- Circuit breaker 패턴을 이용한 장애에 강한 MSA 서비스 구현하기
- Clean architectures in Python: a step-by-step example
캐싱
- What is difference between LRU and LFU?
- WTF is Memoization
- What is the difference between Caching and Memoization?
- 캐시가 동작하는 아주 구체적인 원리
언어론에 가까운 이야기
- Exression verses Statement
- Static/Dynamic vs Strong/Weak
- Runtime vs Compile time
- A Python Tutorial To Understanding Scopes and Closures.
- Difference between Definition and Declaration
- What is the difference between statically typed and dynamically typed languages?
컴파일러에 가까운 이야기
검색엔진 이야기
좋은 코드를 작성하기 위한 노력
- 개발자에게 유용한 법칙, 이론, 원칙, 그리고 패턴들 #hackerlaws
- The Little Manual of API Design
- Red-Green-Refactor
- Why is global state so evil?
- 점진적인 레거시 웹 어플리케이션 개선 과정
- Clean Code: 5 Essential Takeaways
- Why Premature Optimization Is the Root of All Evil
객체지향 프로그래밍
코드 퀄리티에 관한 SaaS
CI
CI를 위한 SaaS
정규 표현식
- 정규표현식의 개념과 기초 문법
- regexr - 정규표현식을 연습할 수 있는 playground
- 불규칙 속에서 규칙을 찾아내는 정규 표현식
- HTML을 정규 표현식만으로 파싱할 수 있을까?
- ignore case sensitivity
Glossary
유틸리티
Makefile
IAM
RBAC
웹
프로토콜, 표준, 가이드라인
스펙(RFC, ISO standards)
HTTP
- WebSocket과 Socket.io
- Websockets vs Long Polling
- 웹 기술로 구현하는 Adaptive HTTP Streaming
- What are the advantages and disadvantages of using a content delivery network(CDN)?
- GET이냐 POST냐 그것이 문제로다
CORS
HTTP API
- API Security Checklist-ko
- API development tools
- HTTP 응답코드 결정 다이어그램
- Web API Pagination with the 'Timestamp_ID' Continuation Token
- JSON:API Standard
REST
- REST API 제대로 알고 사용하기
- 그런 REST API로 괜찮은가
- REST 의 Uniform Interface에 대하여
- Architectural Styles and the Design of Network-based Software Architectures - Roy Fielding
- 바쁜 개발자들을 위한 REST 논문 요약
- REST API의 이상향, HATEOAS
- Richardson Maturity Model
- REST API Design
- REST API Design Tips
GraphQL
HTTP2/HTTPS
JSON 관련
NDJSON
JSONSchema
- JSONSchema
- object - pattern properties
- object - Schema dependencies
- JSON Schema: verifying object's values, without keys
인증 관련
JWT
OAuth
Protobuf
Date & Time
- 협정 세계시(UTC)
- 유닉스 시간
- List of tz database time zones
- ISO 8601
- What's the difference between ISO 8601 and RFC 3339 Date Formats?
- DateTimeFormat(Joda-Time)
국제화 관련
DNS
MQTT
RSS
SEO
- 검색엔진최적화(SEO) 쉬운 가이드
- Zero-Click Search 논란, 65%의 검색이 클릭없이 끝난다?
- Black Hat - White Hat SEO
- ‘쉽게 설명한’ 구글의 페이지 랭크 알고리즘
가이드라인
Git
Git 구성 요소
Commands
이럴 땐 이렇게
- Oh shit, git!
- How to resolve merge conflict during pull request?
- How do I update a GitHub forked repository?
- .gitignore is ignored by Git
- How can one change the timestamp of an old commit in Git?
- How to change the commit author for one specific commit?
- 좋은 git commit 메시지를 위한 영어 사전
Troubleshooting
GitHub
- Pull Request를 이용한 개발 흐름을 적용해 보고 나서
- GitHub의 Pull Request를 로컬로 가져오기
- Reviewing proposed changes in a pull request
운영체제별 기반지식
Linux
- export, echo 명령어
- lsof 사용법
- grep 사용법
- awk 사용법
- htop Explained Visually
- Crontab 사용법
- 리눅스 명령어 sudo, su, su -
- 리눅스 서버의 TCP 네트워크 성능을 결정짓는 커널 파라미터 이야기
Mac
Computer Science
컴퓨터 이론
운영체제
자료구조
알고리즘
- 루프 불변성
- 시간 복잡도 빠르게 이해하기
- 점근 표기법
- 분할정복
- 힙 정렬
- 동적 계획법
- 파이썬으로 정리하는 Quick-Sort
- Dijkstra’s Shortest Path Algorithm in Python
- Levenshtein Distance
네트워크
보안
암호화
데이터 엔지니어링, 수학
- Markov Chains - The University of Auckland
- From “What is a Markov Model” to “Here is how Markov Models Work”
Marketing
- User Acquisition - appsflyer
- User Acquisition - Adjust
- Re-Engagement
- What is a tracking link?
- Single-Touch vs. Multi-Touch Marketing Attribution
- Retargeting
- Reattribution
- ARPU / ARPPU
- DAU/MAU Reatio
- 고객(Customer)이 아닌 관객(Audience)을 모으는 것이 진짜 마케팅
Business
Insight
협업
조직 관리
Product
Project
PM
커뮤니케이션
벤치마킹
배울 점 많은 코드
Android
백엔드
서비스 전체
Websites to follow
교양 컨텐츠
소프트웨어 마인드/철학
- 소프트웨어 환멸감(Software disenchantment)
- 소프트웨어 개발자 되기는 왜 어려운가?
- [번역] 개발 배우기가 정말 어려운 이유
- Cognitive Biases in Programming
- 당신의 개발자들은 결코 느리지 않다.
- 스타트업에서 성장한다는 주니어의 착각
- 나는 어떻게 더 나은 프로그래머가 되었는가
- Avoiding burnout as an ambitious developer
조직 문화
UI/UX
자기계발
마인드/마음가짐
개발자가 알아야 할 경제
학습
교육 사이트
글 쓰기
글 쓰는 데 도움이 되는 것
백엔드
백엔드 관련 배경지식
- Microservices with gRPC
- The Complete Guide to the ELK Stack - 2018
- How To Install The ELK Stack - 2021
- Time Series Database and Tick Stack
Ops
recovery/failover
- Failover & Disaster Recovery
- What is failover?
- What is High Availability?
- Disater Recovery Strategies
Deployment
Docker
- 초보를 위한 도커 안내서 - 1. 도커란 무엇인가?
- 초보를 위한 도커 안내서 - 2. 설치하고 컨테이너 실행하기
- 초보를 위한 도커 안내서 - 3. 이미지 만들고 배포하기
- 개발자가 처음 Docker 접할때 오는 멘붕 몇가지
- 도커를 이용한 웹서비스 무중단 배포하기
- 왜 굳이 도커(컨테이너)를 써야 하나요?
- Intro Guide to Dockerfile Best Practices
- Docker images - types. Slim vs slim-stretch vs stretch vs alpine
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 run vs create
Dockerfile, docker-compose.yml 관련 지식들
Docker 써먹기
Docker Compose
Ansible
Terraform
- 테라폼(Terraform) 기초 튜토리얼 - AWS와 테라폼으로 구현하는 Infrastructure as Code
- Terraform을 이용한 Infrastructure as Code 실전 구성하기
- Ansible vs Terraform: Fight!
서버 아키텍처 관련 블로깅/발표자료
- [야생의 땅: 듀랑고] SPOF 없는 분산 MMORPG 서버
- [야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
- DEVIEW 2016 참가 신청 기능 개발기
- 타다 시스템 아키텍처
- 전 세계 팬들이 모일 수 있는 플랫폼 만들기
- The Architecture Behind A One-Person Tech Startup
웹서버 이야기
- What is the difference between application server and web server?
- Difference between proxy server and reverse proxy server
도움되는 SaaS
도움되는 툴
Serverless
교양
DB
DB 배경지식
- What is an ORM and where can I learn more about it?
- DBMS는 어떻게 트랜잭션을 관리할까?
- A Detailed Guide to Database Denormalization with Examples
- How does database indexing work?
- What do Clustered and Non clustered index actually mean?
- Why do you create a View in a database?
- Are soft deletes a good idea?
- What are OLTP and OLAP. What is the difference between them?
- What are Covering Indexes and Covered Queries in SQL Server?
- What is a stored procedure?
- 데이터베이스 분포도(Database Selectivity)
- What are the materialized views?
- Are junction tables a good practice?
- Lock으로 이해하는 Transaction의 Isolation Level
- CAP and PACELC : the basic theorem of distributed database system
DB Vendor
SQL
Common DML(INSERT, SELECT, UPDATE, DELETE)
- Insert into a MySQL table or update if exists
- SELECT 결과를 INSERT 하기
- Multiple select statements in Single query
- MySQL Orderby a number, Nulls last
- How to check for Is not Null And Is not Empty string in SQL server?
- MySQL UNIQUE key not working
JOIN
Date, Time 연산 관련 쿼리
MySQL
- Illegal mix of collations for operation 'like'
- MySQL 쓰면서 하지 말아야 할 것 17가지
- MySQL 중복 키 관리 방법
- Understanding MySQL Storage Engines
- How to declare a variable in MySQL?
- Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
- How to show the last queries executed on MySQL?
- MySQL cannot create foreign key constraint
- When to use SELECT … FOR UPDATE?
- 갭락(Gap Lock)과 넥스트 키 락(Next-Key Lock)
- varchar Fields - Is a Power of Two More Efficient?
- MySQL 5.7 FullText Search 이용하기 with ngram
PrestoDB
- Date and Time Functions and Operators
- Presto equivalent of MySQL group_concat
- How can I stop a running MySQL query?
- MySQL 성능최적화
Druid
Query
- Querying - Overview
- Transforming Dimension Values
- Querying - Aggregations
- Querying - Aggregation Granularity
ElasticSearch
Query
- Query and filter context
- ElasticSearch bool query combine
- What is the difference between must and filter Query DSL in ElasticSearch?
- ElasticSearch match vs term query
- Source filter
- Terms Aggregation
- Term level query - range query
- Exclude empty-string, null and non-existant
- Best way to check if a field exist in an Elasticsearch document
Others
웹 프레임워크
Python
Flask
- flask-base
- fbone
- cookiecutter-flask
- flask-foundation
- flask-rest-template
- flask-appbuilder
- flask-realworld-example-app
- flask-large-application-example
- 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?
- Signals
FastAPI
Java
Spring
- 스프링부트로 웹 서비스 출시하기
- Gradle + SpringBoot + Travis CI + Coveralls + 텔레그램 연동하기
- 스프링 부트 2.0 레퍼런스 코딩
- JWT 기반 로그인 구현 예제
- 폼 기반 인증 구현 튜토리얼
- MVC 구조에서 service와 serviceImpl을 왜 만드는가
Node.js
Express.js
해킹
HTTP
프로그래밍 언어
Python
파이썬 더 잘 알기
- Glossary
- 제너레이터와 코루틴
- 파이썬 언더스코어(_)에 대하여
- Python __getitem__과 slice의 이해
- 파이썬의 변수
- 시간 복잡도로 살펴보는 파이썬 내장 자료형의 효율적인 활용
- 리얼월드 메타클래스
- Why is Python 3.7 fastest
- Better Python 59 Ways
- The Hitchhiker’s Guide to Python
- Hidden features of Python
- Intermediate Python
- A collection of design patterns/idioms in Python
What is
verses
- Is there a difference between “raise exception()” and “raise exception” without parenthesis?
- What is the difference between range and xrange functions in Python 2.X?
- Difference between <type 'generator'> and <type 'xrange'>
memo : you should understand that an iterator and an generator are not the same thing. - List comprehension vs map
How to
- Is PYTHONUNBUFFERED=TRUE a good idea?
- Python equivalent of golang's defer statement
- Python - Disable output buffering
- ignoring backslash character in python
- Nicest way to pad zeroes to a string
- How to re-raise an exception in nested try/except blocks?
- Sort a list by multiple attributes?
- How can the built-in range function take a single argument or three?
Why
- Why True/False is capitalized in Python?
- Why is bool a subclass of int?
- In python, why use logging instead of print?
- Why is the order in dictionaries and sets arbitrary?
Unexpected Behaviors
- wtfpython
- Python 3.x rounding behavior
- How to round float 0.5 up to 1.0, while still rounding 0.45 to 0.0, as the usual school rounding?
- Behaviour of increment and decrement operators in Python
collections
성능
- Python GIL
- Python GC가 작동하는 원리
- __slots__ magic
- Exponentials in python x ** y vs math.pow(x, y)
- How did Python implement the built-in function pow()?
- Dismissing Python Garbage Collection at Instagram
Python 3.7
Python 3.8
개발 환경
virtualenv
pipenv
- pipenv란 무엇인가
- pipenv로 Python 프로젝트 관리하기
- Force pipenv to create a new virtualenv
- How to get pipenv running in docker?
poetry
코드 스타일
Style Checker
Formatter
테스팅
- 코드 테스트하기 - The Hitchhiker's Guide to Python
- 테스트에 걸리는 시간을 92% 줄이기
- Advanced Python testing techniques
- How should I verify a log message when testing Python code under nose?
- Assert that logging has been called with specific string
nose
coverage
비동기 프로그래밍
- 비동기 파이썬
- asyncio : 단일 스레드 기반의 Nonblocking 비동기 코루틴 완전 정복
- What does the “yield from” syntax do in asyncio and how is it different from “await”
- Blocking-NonBlocking-Synchronous-Asynchronous
- 비동기 프로그래밍 동작 원리 (asyncio)
- 비동기적으로 Python 다루기
라이브러리 패키징
표준 라이브러리
Data Types
- datetime
- collections.OrderedDict
- collections.defaultdict
- 얕은 복사(shallow copy) vs 깊은 복사(deep copy)
- enum
Structured Markup Processing Tools
Data Persistence
Python Runtime Services
Generic Operating System Services
File and Directory Access
Functional Programming Modules
Debugging and Profiling
Development Tools
Concurrent Execution
Networking and Interprocess Communication
Data Compression and Archiving
Internet Data Handling
Internet Protocols and Support
외부 라이브러리
CLI
Dataclass Helper
Data Types
Schema
DB Driver
- What's the difference between MySQLdb, mysqlclient and MySQL connector/Python?
- mongo-python-driver(pymongo)
- motor
- redis-py
- pymemcache
DB Helper
HTTP
Async
Excel Processing
Drop-in Replacements
SaaS Helpers
Crawling
Testing
Others
SQLAlchemy
- SQLAlchemy 시작하기 - Part 1
- SQLAlchemy 시작하기 - Part 2
- Flask-SQLAlchemy docs - Multiple Databases with Binds
- SQLAlchemy에서 모든 테이블의 모든 자료 지우기
memo : truncate하는 raw query는 FK 문제로 인해 잘 안 될 수 있으므로 SQLAlchemy를 통해 극복하는 내용 - SQLAlchemy에서 쿼리할 때 조인을 직접 명시해야 하는 경우는 별로 없다
ORM
Query
- Literal SELECT
- Query 객체로 WHERE절 작성하기(Common filter operators)
- How to pass a not like operator in a sqlalchemy ORM query
- sqlalchemy.orm.query.Query.slice(start, stop)
- How to union two subqueries in SQLAlchemy
- How to execute raw SQL in SQLAlchemy
- 'select as' in SQLAlchemy
- SQLAlchemy simple example of sum, average, min, max
- Get the number of rows in table using SQLAlchemy
- What's the difference between filter and filter_by in SQLAlchemy?
- 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
- Avoiding boilerplate session handling code in SQLAlchemy functions
- Contextual/Thread-local Sessions
- Dealing with duplicate primary keys on insert in SQLAlchemy
- SQLAlchemy Transaction 관리 Practice 공유
- Unbind object from session
- Session Management - Refreshing / Expiring
- How to close sqlalchemy connection in MySQL
Peewee
- Dynamically defining a database
- How to custom the table name in peewee?
- Performing simple joins
- Joining multiple tables
MongoEngine
Zappa
boto3
- When to use a boto3 client and when to use a boto3 resource?
- boto3 - credentials
- Upload-Download File From S3 with Boto3
- How do I get the file/key size in boto S3?
Golang
언어 자체에 대한 이야기
Java
언어 자체에 대한 이야기
AWS
AWS Docker
컴퓨팅
EC2
- EC2(Elastic Compute Cloud)
- 인스턴스 수명 주기
- 인스턴스 유형
- 인스턴스 구입 옵션
- Application Load Balancer 서비스 공개
- 배치 그룹(Placement Gorup)
EBS
ELB
ECS
ECR
Lambda
EKS
스토리지
S3
EFS
데이터베이스
RDS
Aurora
DynamoDB
ElastiCache
DocumentDB
TimeStream
마이그레이션, 전송
DMS
Snowball
네트워킹
VPC
CloudFront
Route 53
API Gateway
Direct Connect
PaaS
CodeStar
CodeCommit
CodeBuild
CodeDeploy
관리
CloudWatch
Auto Scaling
분석
Athena
Redshift
EMR
ElasticSearch Service
Kinesis
보안, 자격 증명
IAM
KMS
WAF
어플리케이션 통합
Step Functions
Amazon MQ
SNS
SQS
고객 참여
SES
모바일
Android
- Android 공식 가이드
- Android의 HTTP 클라이언트 라이브러리
- Using Retrofit 2.x as REST client
- Retrofit 2와 함께하는 정말 쉬운 HTTP
- Firebase를 실제 모바일 백엔드로 사용하면 일어날 수 있는 일들
- Android의 ORM
- Android의 이미지로딩 라이브러리
- Android 앱 메모리 최적화
- 안드로이드 BadTokenException의 원인과 해결방법
- Android와 개발 패턴
- 안드로이드의 MVC, MVP, MVVM 종합 안내서
- AWS codebuild + codecov 로 저렴하게 android CI 구축하기
- 클린 아키텍처와 함께하는 배민앱 (Android)
- epoxy
- Use Android Jetpack to Accelerate Your App Development
iOS
웹 프론트엔드
코딩 없이 웹페이지 개발
웹 프로그래밍 자체
Deploy
CSS
PostCSS
Sass
FlexBox
React
- Learning React 예제 한국어 번역
- 한국어로 배우는 리엑트
- React Bit
- Awesome React Components
- 네이버 메일 모바일웹 리엑트 적용기
- React 인가 Vue 인가?
- [번역] React를 본격적으로 하기 전 알면 좋은 6가지
- React 프로젝트의 디렉토리 구조
- 카카오페이지 웹 React 포팅 후기
- When a rewrite isn’t: rebuilding Slack on the desktop