Tech Note 8

Haskell 책 한 권 읽었다

함수형 프로그래밍을 좀 더 깊게 이해하고 싶어서 Haskell 책을 한 권 끝내보자 하는 결심을 세웠다. Haskell 은 순수 함수형 언어로 유명하니 함수형 프로그래밍을 제대로 이해하려면 한 번쯤은 해보고 싶다는 생각도 들던 참이었다. Haskell 책으로 유명한 책은 LYHGG 라고도 불리는 이라 이 책을 골랐다. 번역서 퀄리티가 좋지 않다는 이야기는 들었는데, 확실히 만족스러운 퀄리티는 아니었다. 원서는 온라인으로도 읽을 수 있으니 관심이 있으면 http://learnyouahaskell.com/chapters 에서 읽어보자. 책 한 권을 읽으면서 Haskell(이하, 하스켈)에 아주 능숙해지지는 않았지만, 코드를 읽을 수 있는 수준까지는 올라온 것 같다. 더불어 함수형 프로그래밍에 대해서도 좀 더..

Tech Note 2021.05.16

테스트 코드는 어떻게 만들까

신입으로 입사하신 분들이 테스트 코드를 어떻게 만들어야 하는지를 종종 물어보셔서, 공유도 하고 내 머리 속에 정리도 할 겸 이 글을 써본다. 이 글은 유닛 테스트 코드를 많이 만들어보신 분들이 읽을 만한 글은 아니다. 신입으로 입사하신 분들이 테스트 코드를 처음 접할 때 당황스러움을 느낄 수 있는데, 그 때 도움이 될 수 있을 것이다. 나 역시 TDD를 처음 접했을 때는 그랬고, 어떻게 해야 테스트 코드를 잘 짜는 건지는 다른 사람의 코드를 보지 않으면 모를 수도 있다고 생각한다. 테스트 코드가 필요하다는 것만 잘 알고 있으면, 테스트 코드를 잘 짜는 방법은 배워나가면 된다. 다른 사람이 짜 놓은 테스트 코드를 보면 금방 깨달을 수 있는 문제이기도 하니 너무 겁먹지 않았으면 한다. 다만, 어떻게 해야 '..

Tech Note 2021.03.18

글로벌 비디오 서비스가 가능하게 한 넷플릭스의 Microservice 아키텍쳐 구조 분석

Cao Duc Nguyen 원문 링크 A Design Analysis of Cloud-based Microservices Architecture at Netflix | by Cao Duc Nguyen | The Startup | Medium 역주 그림을 따라서 보아야하는 단어들의 경우는 굳이 한국어로 바꾸지 않고 그림과 똑같은 단어를 사용하였습니다. 1. 시작 넷플릭스는 매년 전세계 인터넷 트래픽의 15% 이상([ 12 ])을 차지하고 있습니다. 2019년에는 이미 1억 6700만명의 구독자가 생겼고, 매 4분기 마다 5백만명이 200개 이상의 국가에서 구독하기 시작했습니다. 구독자들은 매일 47000 개의 에피소드와 영화 4000개를 보며 약 1억 6500만 시간 이상을 쓰고 있습니다. 이 놀라운 통계..

Tech Note 2021.01.24

Consistent Hashing 일관된 해싱

배경 분산 처리 기법 중의 하나이다. 파티셔닝이나 로드 밸런싱 등 분산 처리에서 사용하는 방법 중 하나라고 할 수 있다. Karger 등이 소개한 기법이고, 해당 논문은 여기서 볼 수 있다. 파티셔닝이나 로드 밸런싱을 할 때 Key를 기반으로 하면 문제가 생겨서 나온 방법이다. 예를 들어, 이름을 A~Z 로 정렬한 데이터를 파티셔닝 한다고 해보자. 이때 key를 ‘A’, ‘B’ … ‘Z’로 잡아서 파티셔닝을 하면 다음과 같은 문제가 생긴다. 파티셔닝의 목적은 데이터를 각 DB 노드들이 균등하게 들고 있을 때가 Best Case이다. 하지만 key를 특정 알파벳으로 하면, ’S’, T’ 등 특정 알파벳으로 데이터가 쏠리고(skewed), ‘X’, ‘Y’ 등 잘 쓰이지 않는 알파벳을 가진 DB 노드에는 데이..

Tech Note 2020.12.27

HTTP/2 HTTP/3 의 차이점

HTTP/3 이 나온지도 좀 되었겠다 간단히 정리 해보았다. QUIC이 HTTP/3 스펙으로 확정된 것도 오래되지 않아서, 사실 아직 실서비스에 도입하기에는 무리가 있지만 언젠가 도입할 때가 되면 뭐라도 알아야 할 것 같아서 살펴보았다. [TCP / UDP] HTTP/2 와 HTTP/3 의 가장 큰 차이점은 기존 HTTP/2가 TCP 위에서 동작한 것과 달리 HTTP/3 은 UDP 에서 동작한다는 것이다. 구글에서 TCP로 인해 생긴 병목을 해결하기 위해 만든 UDP 기반의 QUIC 이 HTTP/3 으로 들어오면서 생긴 변화이다. 세부적으로는 QUIC과 많은 차이가 있지만, UDP 위에서 돌아가게 된 것은 QUIC의 영향력이 크다. 구글에서 크롬 등으로 서비스하며 QUIC 의 시장성을 검증해 낸 것에 힘..

Tech Note 2019.09.10

Group by 에 대해서

예전부터 "group by 연산은 어떻게 하는 걸까" 하는 의문이 있었다. 일반 탐색의 경우와는 달리 aggregation 함수는 각 element 별로 모아주는 작업이 필요할테니까, 일반 탐색과는 다른 방법을 쓰지 않을까 하는 막연한 생각을 했었다. 먼저, 내가 생각했던 group by 연산은 당연하게도 SQL 이었다. DBMS에서의 연산은 당연히 교과서를 직접 찾아보는 것이 가장 나은 것 같아서 Database System Concept 6th. Silberscharz 외 2명 이 책을 아는 개발자에게 빌려서 찾아보았다. RDB 의 경우 B-tree(B+, B* 뭐든) 로 저장하는 것이 일반적이기 때문에 group by 연산은 일반적인 sort와 같은 방식으로 진행된다고 한다. 정렬된 데이터를 읽을 ..

Tech Note 2019.05.05

Spring 4.x 에서 HttpServletRequest 의 params 를 변경하고 싶을 때

Spring을 참 싫어하는 나로서는, Spring 으로 개발한다는 것이 좀 싫고 그렇다. 어떻게 보면 가장 익숙하게 쓸 수 있는데도, 한창 배울 시기에... 그 때의 트라우마가 남아서 꺼림칙할 때가 있다. 뭐, 개인적인 감상이고. 지금은 밥벌어 먹고 살려고 하는 중. 간단한 Tip 이지만, 위와 같은 Spring Controller가 있다고 하자. 아마 평범하게(?) 이렇게 쓸 것 같다. paging 이 없거나 하면 더 간단하겠지. 그런데 이 코드에 보면 저 request 에서 JPA 의 specification 을 사용하기 위해 getSpecificationFromRequest() 안에 request를 집어 넣는 것을 볼 수 있다. getSpecificationFromRequest() 는 다음과 같이 ..

Tech Note 2017.08.03

git 커밋 시간 변경하기

사실 자주 쓰면 안되는 건데, 쓰고 싶을 때가 있다(...) 출처는 http://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git git filter-branch -f --env-filter \ 'if [ $GIT_COMMIT = 해쉬값 ] then export GIT_AUTHOR_DATE="Mon May 1 08:45 2017 +0900" export GIT_COMMITTER_DATE="Mon May 1 08:45 2017 +0900" fi' 이렇게 변경하면 되는데, filter-branch 가 해당 브랜치의 모든 history를 뒤지기 때문에, 브랜치의 history가 길 경우에는 굉장히..

Tech Note 2017.05.08