everydayminder
개요 글로벌 서비스를 하면서 Time Zone 설정은 신경써야 할 부분이 된다. 본 포스트에서는 MySQL의 Time Zone을 설정하는 방법에 대해 정리한다. 테스트의 편의상 Docker를 기반으로 테스트하였다. 현재 설정 확인 mysql> select @@global.time_zone, @session.time_zone; +--------------------+----------------------------------------+ | @@global.time_zone | @session.time_zone | +--------------------+----------------------------------------+ | SYSTEM | 0x | +--------------------+-----..
개요 프로그래밍 언어에서 어떨 때 set을 사용할까? 주로 중복을 제거하거나, 말 그대로 집합 연산(포함여부 및 합집합/교집합 등)을 해야할 경우에 사용할 것이다. Redis에서도 이러한 연산을 지원한다. 명령어 Redis가 지원하는 집합 연산 기능은 아래와 같다. SADD 127.0.0.1:6379> help sadd SADD key member [member ...] summary: Add one or more members to a set since: 1.0.0 group: set set에 아이템을 추가한다. // 여러 아이템을 set에 추가 127.0.0.1:6379> sadd s1 e1 e2 e3 (integer) 3 127.0.0.1:6379> smembers s1 1) "e2" 2) "e3"..
개요 Redis에서 List는 여러 개의 데이터를 저장하기 위한 자료구조이다. 쉽게 생각해서 Linked List를 생각하게 될텐데, 지원하는 기능을 바탕으로 보면, 오히려 Dequee(Double Ended Queue)에 가깝다. Qeueue의 인터페페이스와 Stack의 인터페이스를 동시에 지원하기 때문이다. Stack 혹은 Queue의 말단 연산은 비용이 닞지만, 중간 데이터를 처리하는 연산은 비용이 상대적으로 높다. 따라서, 내가 수행해야 하는 오퍼레이션의 종류 및 데이터 성격이 어떤지 알고 쓰면 좋을 것이다. 명령어 List가 제공하는 전체 명령어 중 주요 기능은 아래와 같다. LRANGE 127.0.0.1:6379> help lrange LRANGE key start stop summary: G..
개요 Redis에서 기본적으로 문자열, 숫자를 저장할 때 사용하는 자료구조이다. Key와 Value 모두 최대 길이가 512MB이다. 그렇다고, Key를 표기할 때 과다하게 길이가 길면 메모리 낭비가 발생한다. 프로그램내에서만 사용하는 로컬변수가 아니라, 여러 서비스에서 공통으로 사용하는 공간인 만큼, Key를 부여할 때, 적절한 가시성과 구분자를 섞어서 쓰는 편이 좋을 것이다. (예: "user_service:member:status") 명령어 주로 어떤 값을 설정하고, 조회하는 용도가 대부분이다. 특히 숫자형 데이터라면 증/감의 오퍼레이션도 지원된다. set 127.0.0.1:6379> help set SET key value [EX seconds|PX milliseconds|EXAT timestam..
개요 In-Memory Data Store 관점에서 Memcached냐 Redis냐를 두고 저울질 하는 광경을 종종 보곤한다. 이에 두 솔루션을 비교 정리해 놓는다. 주요 특징 비교 두 솔루션 모두 NoSQL로 분리되고, 크게는 In-Memory 솔루션, 캐시 솔루션으로 인식되고 있다. 그러나, 아래 표에서 보는 바와 같이 지원하는 기능에 차이가 있다. 항목 Memcached Redis 데이터 분할 O O 다양한 데이터구조 지원 X O Mutli Thread/ Single Thread Multi Thread Single Thread 데이터 저장 (persistence/ snapshot) X O 데이터 복제 (replication) X O 트랜잭션 지원 X O Publisher/Subscriber X O ..
캐시(Cache) 적용 패턴 및 관리 전략 Cache-Aside: Cache 분리 (별도 관리) 캐시는 데이터베이스와 직접 연결되지 않고, 애플리케이션이 주체가 된다. 애플리케이션이 요청을 받으면, 데이터가 캐시에 있는지 먼저 검사를 하며, 그 결과(캐시에 데이터가 로딩되어 있는지 여부)에 따라 다음 액션이 결정된다. 캐시에 데이터가 없다면, 애플리케이션이 캐시에 데이터를 업데이트 한다. 캐시에 대한 의존성이 낮으므로, 캐시가 다운되더라도 원천 데이터베이스로 서비스를 계속할 수 있다. 읽기 요청이 많은 경우에 적합하다. Read-Through: Cache를 통해서 읽기 애플리케이션이 직접 바라보는 것은 데이터베이스가 아니라 캐시가 된다. through 라는 단어가 나타내듯이 캐시가 메인이다. 따라서, 캐..
개요 Redis는 Remote Dictionary Server를 뜻한다. Redis는 대표적인 In-Memory data store 솔루션 중 하나로 꼽히는데, 특히 Memcached와 종종 비교되곤 한다. 그러나, Redis는 Memcached와는 달리 다양한 데이터 타입을 지원하여 보다 다양한 분야의 요구사항을 충족시키고 있다. Redis는 분산 Key-Value Store, 캐시서버, 메시지 브로커 등으로도 활용되기도 한다. Redis 지원 Data Type들 Redis에서 주로 쓰이는 데이터 형은 String, List, Set, ZSet(Sorted Set), Hash가 있다. String 문자열, 정수, 소수를 저장한다. 문자열 전체 혹은 부분을 다룬다. 정수와 소수를 증감한다. List St..
용어비교 OLTP와 OLAP는 종종 세트로 인용되곤 한다. 본 포스트에서는 이 두 단어의 각각의 개념과 차이점을 정리한다. 두 단어는 각각 아래와 같은 의미를 지닌다. OLTP: Online Transaction Processing OLAP: Online Analytical Processing OLTP: Online Transaction Processing 운영계 데이터 및 데이터를 처리하는 방법을 뜻한다. 보통 OTLP는 원천 데이터를 뜻하기에, 예전에는 주로 RDBMS 기반의 시스템을 근간으로 했으나, 요새는 굳이 RDBMS여야 한다는 강제성을 넘어, 데이터를 어떻게 처리하느냐의 관점에 보다 주안점을 두기 때문에 NoSQL을 바탕으로 하더라도 데이터의 성격이 운영계의 성격을 지닌다면 OLTP로 분류할..
Avro란? Avro는 데이터 직렬화와 관련된 시스템이다. 한국 개발자들은 /에이브로/라고 발음하곤 하지만, 외국 개발자 커뮤니티에서는 주로 /아브로/라고 발음하고 있다. Avro는 JSON 형태로 기록한다. 따라서, Avro는 스키마를 표현하는 JSON이라 생각할 수 있다. Avro의 장단점 장점 데이터의 타입을 알 수 있다. 데이터가 압축되어 효율성이 높다. 스키마에 설명을 포함하여 구조를 이해하는데 도움을 줄 수 있다. 데이터를 여러 언어로 액세스할 수 있다. 향후 스키마 변경에 유연하게 대응할 수 있다. (schema evolution) Hadoop 계열과 궁합이 좋다. Confluent Schema Registry에 쓸 수 있다. (유일) 단점 바이너리 형태로 직렬화(serialize) 되므로 ..
Redis 설치 방법 세 가지 본 글에서는, Redis를 설치하는 여러 방법을 다룬다. 운영환경용이라기 보다 로컬 개발환경에 설치하는 목적이다. Redis 공식 사이트 https://redis.io/download Redis *Download Stable releases liberally follow the usual major.minor.patch semantic versioning schema. *Other versions Old (6.0) Redis 6.0 introduces SSL, the new RESP3 protocol, ACLs, client side caching, diskless replicas, I/O threads, faster RDB loading, ne redis.io Redis ..
교살자 무화과나무 패턴 - Strangler Fig Application Pattern 이름이 참 신기한 패턴이다. 무릇 패턴은, 사람들에게 구구절절하게 설명하지 않고, 그 이름만으로도 어떤 개념인지 알기 쉽도록 해줄 수 있어야 한다. 그런데, Strangler Fig Application Pattern 혹은 Strangler Pattern은 무엇이며, 그것을 그대로 번역해 놓은 교살자 무화과나무 패턴은 또 무슨 의도인가? 이름부터 다시 살펴보자 영어권 사람들은 strangler라고 하면 이미 쉽게 알아들었을 수도 있다. 교살자라는 한자도 마찬가지다. 일단 영어 이름과 번역본 이름을 매치해 본다. strangler = 교살자 fig = 무화과나무 보통 fig라는 글자는 figure의 줄임말로 '그림'을 ..
PostgreSQL로 트랜잭션 격리 수준 동작 테스트를 하고, 결과를 정리해 놓는다. 트랜잭션 범위 PostgreSQL에서 트랜잭션은 BEGIN으로 시작하고, COMMIT 또는 ROLLBACK으로 끝난다. BEGIN; ... (트랜잭션) ... COMMIT; (또는 ROLLBACK;) 트랜잭션 격리 수준 확인/ 변경 PostgreSQL에서 트랜잭션 격리수준 확인 및 변경은 아래 포스트를 참고한다. PostgreSQL 트랜잭션 격리수준 확인/변경 본 포스트에서는 PostgreSQL 트랜잭션 격리수준을 확인하는 방법과 변경하는 방법에 대해 정리한다. 트랜잭션 격리수준 확인하기 SELECT current_setting('transaction_isolation'); 또는, show transaction isol..
MySQL에서 자동으로 증가하는 ID를 PK로 사용하기 위해 auto_increment를 사용한다. 그러면, PostgreSQL에서는 이와 동일한 기능을 어떻게 사용할까? MySQL에서의 auto_increment를 PostgreSQL에서는 어떻게 쓸까? 몇 가지 방식으로 해당 요구사항을 만족시킬 수 있다. MySQL에서 어떤 id를 자동 증가하게 하고, 그 값을 PK로 지정하기 위해 다음과 같은 방식으로 표현한다. CREATE TABLE IF NOT EXISTS `students` ( id int(6) AUTO_INCREMENT, ... PRIMARY KEY (id) ); 이와 동일하게 하려면, PostgreSQL에서는 다음과 같은 방법이 사용가능하다. Sequence 사용 오라클에서 Sequence와..
stub, mock, spy의 차이는? 테스트 코드를 작성하다 보면, 한동안 Stub과 Mock의 차이를 생각하지 않고 써왔던 것 같다. Martin Fowler의 원본 글을 읽어보면서 내용을 정리해둬야 나중에 방향성을 잡을 때 도움이 될 것 같다. Mocks Aren't Stubs by Martin Fowler 아래 링크가 원문이다. https://martinfowler.com/articles/mocksArentStubs.html 용어 정리 + 개인 의견 원문 글에도 자세히 나오지만, 원문에 소개된 개념을 정리한다. Meszaros uses the term Test Double as the generic term for any kind of pretend object used in place of a ..
PostgreSQL 트랜잭션 격리수준 확인/ 변경 본 포스트에서는 PostgreSQL 트랜잭션 격리수준을 확인하는 방법과 변경하는 방법에 대해 정리한다. 트랜잭션 격리수준 확인하기 SELECT current_setting('transaction_isolation'); 또는, show transaction isolation level; 이 명령어를 실행한 결과는 다음과 같이 노출된다. current_setting ----------------- read committed (1 row) 트랜잭션 격리수준 변경하기 트랜잭션 격리수준을 필요에 따라 아래와 같은 방법으로 변경할 수 있다. 설정으로 변경하기 postgresql.conf내 설정을 변경한다. #default_transaction_isolation = ..