본문 바로가기

Object-Oriented Design (개체 지향 디자인을 위한 체크리스트) ood 설명에 앞서서 내 생각을 말하자면.. 이 내용 역시 번역에 가까운 포스팅이고 당장 실제로 내가 겪은 개발 케이스는 아니다. 그럼에도 불구하고, 이런 글을 포스팅 하는 것은 끊임없이 시스템을 어떻게 잘 구축할 것인지에 대해 훈련이 되어 있어야 한다고 믿기 때문에 계속 포스팅을 하는 것이다. 전쟁에서 대규모 전투가 없더라도 그것을 가정하고 훈련을 하는 것처럼 시스템 디자인에 대한 생각들도 '훈련'을 스스로 해야 한다고 본다. 물론 운이 좋아서 내가 일하는 직장에서 시스템 디자인을 실험하기 좋은 트래픽과 환경, 그리고 프로젝트를 맡게 되면 가장 베트스겠지만, 돈을 받고 일하는 직장에선 그렇지 않을 확률이 꽤 크므로, 모의로 연습을 해나가자. 여러 시스템 디자인 관련 문제가 있을 때 다음과 같은 것들을 ..
Instagram system design(generating news feed) 드디어 인스타그램을 시스템적으로 디자인해보는 케이스를 다뤄보게 되었다. 참고로 시스템 디자인 아이디어는 내 아이디어는 아니고, 기존의 레퍼런스를 잘 정리(?) 하면서 나의 학습을 위한 것이다. 우선 내가 아는 부분이 별로 없으니, 좋은 사례들을 학습하는 것이다. 인스타그램?(what is Instagram?) 다들 잘 아시리라 생각한다. 2번 아래 항목을 참고해서 풀자. 요구사항과 시스템의 목표(Requirements and Goals of the System) Functional Requirements Photo 업로드, 다운로드, 뷰 Photo/video title로 검색을 할 수 있게 유저들이 다른 유저들을 팔로우할 수 있게 시스템은 해당 유저가 팔로우하고 있는 모든 사람들의 top photo로 구..
Flutter 개발 환경 세팅 먼저, 자세한 건 https://flutter-ko.dev/docs/get-started/install 를 참고 하자. 내 세팅은 공식 레퍼런스를 보며 막혔던 부분 위주로 정리한 것이다. flutter SDK 환경 변수 경로 설정 환경 변수 경로의 설정 이유? 클라는 SDK 를 앱 구현을 위해 필요로 하므로 이 SDK 의 디렉토리를 환경변수에 담아 빌드 시 이를 참조하여 실행하게끔 해야 함 환경 변수 경로 설정 들어가기 '''bash $ vi ~/.bash_profile ## 환경 변수 설정 들어가기 PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}":$HOME/SDKs/flutter/bin export PATH ## 기존에 pyth..
Tiny URL 설계 레퍼런스 Tiny url 로 기존 url을 짧게 디자인하는 시스템을 만든다고 생각해보자. 주로, 카카오톡의 오픈 채팅 링크 생성 등이 tiny url로 shortening 되는 시스템이라고 볼 수 있다. 각설하고, 아래와 같은 flow로 시스템 디자인에 대한 생각을 해보자. 왜 우리가 URL Shortening 이 필요할까? (Why do we need it?) URL shortening은 long URLs 의 alias 를 만들기 위해 사용된다. Short link라고도 불리움.. short link를 타고 가면, original link로 redirect 된다. URL Shortening 을 쓰는 이유는, 우선 짧으니까 display, print, message 등에서 공간을 아낄 수 있음. 그리고 또한, 디..
트라이 자료구조(Trie Data Structure) https://leetcode.com/problems/implement-trie-prefix-tree/ Implement Trie (Prefix Tree) - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 리트코드를 풀다 만난 트라이 자료구조의 구현 문제다. Abstract Data Type을 직접 구현해보는 좋은 문제다. 몇 시간만에 겨우 문제를 풀었는데, Accepted는 떴지만, 퍼포먼스가 저조해서 이걸 좀 개선해보고자 한다. 100%에 근접할수록 좋은 퍼..
Basic Steps to System Design for Real Service 시스템 디자인은 실제 서비스를 개발로 옮길 때 있어서 매우 중요함. 왜냐하면, 같은 기능을 구현하더라도, 이게 얼마나 많은 유저가 사용하고, 어떻게 확장을 해나가야하는 것 등등 까지 고려를 한다면, 같은 코드라도 고려할 것들이 많아진다. 이를 해결하기 위한 것이 시스템 디자인이고, 특히 백엔드 개발이라면 시스템 디자인에 대해 생각하고 공부해야 되는 것이다. 아래는 시스템 디자인을 하기 위한 기본 스텝들이다. Requirement Clarifications(요구 사항을 명확히 하기) 시스템 디자인에 대해 생각하기 앞서, 최대한 효과적인 질문을 통해 우리가 풀고자 하는 문제의 exact scope 을 명확히 잡는 것은 매우 중요함 가령 트위터 같은 서비스를 시스템 디자인한다고 떠올려 보자. 그럼 아래와 같은..
Data Partitioning Basics Data Partitioning 은 db를 많은 작은 파트로 쪼개는 기술이다. 이로써 manageability, 퍼포먼스, 가용성, 그리고, 어플리케이션의 로드밸런싱을 개선시켜준다. Partitioning Method 의 종류 Horizontal Partitioning: put diff rows into diff tables. 다른 row 들을 다른 테이블로 놓는다. 즉, 테이블에 row가 적재되는 매트릭스를 생각할 때, 이를 가로로 자른다고 생각하면 된다. 이러한 파티셔닝은 또한 Data Sharding이라고도 얘기함 단점으로는 이러한 파티셔닝을 하기 위한 범위를 신중하게 설정하지 않으면, 파티셔닝 스키마는 언밸런스한 서버가 될 것이다.(즉, 균일하게 쪼개지지 않았다는 얘기다.) Vertical Par..
Cache ? / Cache Invalidation 앞전에 얘기한 LB는 계속적으로 증가하는 서버 수가 있을 때, scale Horizontally 을 잘 할 수 있도록 도와주는 역할을 한다. 그런데, Caching은 너가 이미 갖고 있는 자원 뿐 아니라 달성할 수 없는 요구사항도 달성하게 만들어주는 역할을 할 것이다.. (달성할 수 없는 요구사항도 달성하게 만들어주는건 좀 더 설명하겠다.) Caching은 자주 접근하는 데이터를 미리 엑세스가 빠른곳에 배치하여, 빠르게 로드하는 스킬이다. 즉, 캐싱은 Locality of reference principle 의 이점을 가진다. 이렇게 되면, 아랫단까지 내려갈 거 없이 앞단에서 데이터를 빠르게 가져와 처리할 수 있다. Application Server Cache Request layer 노드 위에 직접 캐..