분류 전체보기
-
[Clean Code] 클린 코드 요약 및 리뷰Software Development/기타 2021. 12. 4. 16:30
이 책을 여러번 읽어라고 추천해서, 여러번 읽으면서 그때 마다 인상깊었던 내용을 정리하려고 합니다. 들어가면서 코드 품질을 측정하는 유일한 척도 = 분당 내지르는 WTF(What The F...) 횟수 1. 깨끗한 코드 나쁜 코드로 치르는 대가 프로젝트 초반에는 번개처럼 나가다가 1-2년만에 굼뱅이처럼 기어가는 팀도 많다. 나쁜 코드가 쌓일수록 팀 생산성은 떨어진다. 새인력을 투입해도 시스템 설계에 대한 조예가 깊지 않다. 새인력은 생산성을 높여야 한다는 압박감에 나쁜 코드를 더 많이 양산한다. 인력을 투입해도 생산성은 전혀 상승하지 않는다. 원대한 재설계의 꿈 더 이상 혐오스러운 코드로 일 못하겠다고 팀이 반기를 든다. 새로운 팀이 구성되고 실력있는 사람이 합류한다. 레거시팀과 새로운팀이 경쟁한다. 또..
-
[Design Pattern] SOLIDSoftware Development/Design Pattern 2021. 11. 20. 23:44
이 원칙들을 지키면 유지보수가 쉬운 코드를 작성할 수 있다. Single responsibility(SRP) 모든 함수나 클래스는 하나의 기능을 가져야 한다. Open-closed principle(OCP) 확장에 대해서는 열려있고 수정에 대해서는 닫혀 있어야 한다. interface, abstract class를 사용하면 된다. 즉 새로운 기능을 추가할 때는 interface를 써서 필요한 기능을 구현하면 된다. 그리고 새로운 기능이 추가될 때 마다 클라이언트 코드에서는 수정이 필요없이 interface의 기능에 대해 알고 있으면 된다. Liskov Substitution(LSP) Type A가 있고 Sub Type B, C, D가 있다면 A를 B, C로 바꿔도 상관없다는 것이다. Interface s..
-
[데이터 중심 애플리케이션] 분산 시스템의 골칫거리Software Development/Database 2021. 11. 20. 23:43
분산 시스템을 다루는 것은 한 컴퓨터에서 실행되는 소프트웨어를 작성하는 일과는 근본적으로 다르다. 핵심적인 차이는 뭔가 잘못될 수 있는 방법이 많다는 것이다. 결함과 부분 장애 단일 머신의 프로그램은 돌아가거나 안 돌아가거나 둘 중 하나다. 분산 시스템에서는 예측할 수 없는 방식으로 고장난다. 이를 부분 장애라 한다. 클라우드 컴퓨팅과 슈퍼컴퓨팅 고성능 컴퓨팅: 일기예보, 분자 동력학과 같은 계산 비용이 매우 높은 과학 계산 작업. 단일 노드 컴퓨터에 가깝다. 공유 메모리와 원격 직접 메모리 접근(RDMA)을 사용해 통신. 클라우트 컴퓨팅: 온라인, 상용장비, 낮은 비용으로 동일한 성능을 제공하나 실패율이 높음. 고장난 상태를 가정. 신뢰성 없는 네트워크 분산 시스템은 비공유 시스템, 즉 네트워크로 연결..
-
MongoDB 읽기 성능에 관하여.Software Development/Database 2021. 11. 8. 21:40
몽고디비에 많은 데이터가 들어가 있는 경우에 전체 데이터를 애플리케이션의 메모리에 올리는데 꽤나 많은 시간이 걸린다. 꽤나 많다는 것은 상대적이지만 어쨋든 여러가지를 시도하면서 느낀 점을 적어보려고 한다. 파이썬의 pymongo 라이브러리를 이용해서. 전체 콜렉션에서 모든 도큐먼트를 가져올 수 있다. 대략 300초의 시간이 걸린다고 할 때, 시간을 더 줄이기 위해서 multi-threading을 쓸 수 있다. 그러나 파이썬의 GIL 때문에 multi-threading으로는 모든 도큐먼트를 읽는데 더 빨라지진 않았다. 왜냐하면 DB에서 읽은 데이터를 파이썬 오브젝트로 저장해야 하는데 GIL 때문에 single-thread로 결국 데이터를 저장한다고 보면 된다. multi-threading이 CPU Boun..
-
[데이터 중심 애플리케이션] 트랜잭션Software Development/Database 2021. 11. 7. 19:39
트랜잭션은 데이터베이스에 접속하는 애플리케이션에서 프로그래밍 모델을 단순화하려는 목적으로 만든 것이다. 애매모호한 트랜잭션의 개념 트랜잭션은 이점과 한계가 있다. ACID의 의미 ACID를 준수한다? 모호할 수 있다. 그저 마케팅 용어로 사용된다. ACID를 따르지 않는 시스템을 BASE라고 한다. 가용성, 유연한 상태, 최종적 일관성을 가진다. 원자성 오류가 생겼을 때 트랜잭션을 어보트하고 해당 트랜잭션에서 기록한 모든 내용을 취소하는 능력. 일관성 항상 진실이어야 하는, 데이터에 관한 어떤 선언이 있다는 것. 일관성은 애플리케이션의 불변식 개념에 의존, 일관성은 애플리케이션이 정의하는 것이지 데이터베이스가 보장하는 것이 아니다. 일관성은 애플리케이션의 속성이다. 격리성 동시에 실행되는 트랜잭션은 서로..
-
[데이터 중심 애플리케이션] 파티셔닝(분산 데이터)Software Development/Database 2021. 10. 31. 16:12
파티션이라는 용어는 몽고DB, 엘라스틱서치, 솔라의 샤드(Shard), HBase에서는 리전(Region), 빅테이블에서는 태블릿(tablet), 카산드라와 리악에서는 브이노드(vnode), 카우치베이스에서는 브이버켓(vbucket)이라고 부른다. 데이터 파티셔닝을 원하는 주된 이유는 확장성이다. 대용량 데이터셋이 여러 디스크에 분산될 수 있고 질의 부하는 여러 프로세서에 분산될 수 있다. 파티셔닝과 복제 보통 복제와 파티셔닝을 함께 적용하여 각 파티션의 복사본을 여러 노드에 저장한다. 각 레코드는 정확히 한 파티션에 속하더라도 이를 여러 다른 노드에 저장해서 내결함성을 보장할 수 있다. 한 노드에 여러 파티션을 저장할 수도 있다. 키-값 데이터 파티셔닝 대량의 데이터를 파티셔닝할 경우, 어떤 레코드를 ..
-
[데이터 중심 애플리케이션] 복제(분산 데이터)Software Development/Database 2021. 10. 16. 19:19
여러 장비 간 분산된 데이터베이스를 필요로 하는 이유 확장성: 데이터 볼륨, 읽기 부하. 쓰기 부하가 단일 장비에서 다룰 수 있는 양보다 커지면 부하를 여러 장비로 분배할 수 있다. 내결함성/고가용성: 장비 하나가 죽더라도 애플리케이션이 계속 동작해야 한다면 여러 장비를 사용해 중복성을 제공할 수 있다. 장비 하나가 실패하면 다른 하나가 이어받는다. 지연 시간: 사용자와 지리적으로 가까운 곳의 데이터센터에서 서비스를 제공하기 위해 전 세계 다양한 곳에 서버를 두고 싶을 것이다. 고부하로 확장 더 강력한 장비를 구매하는 것이 가장 간단한 방법. 많은 CPU, 많은 메모리 팁, 많은 디스크를 하나의 운영체제로 함께 결합할 수 있다. 빠른 상호 연결로 모든 CPU가 메모리나 디스크의 모든 부분에 접근할 수 있..
-
[데이터 중심 애플리케이션] 저장소와 검색Software Development/Database 2021. 9. 5. 21:05
해시 색인 프로그래밍 언어에서 볼 수 있는 사전 타입과 유사. 파일에 추가만 한다면 디스크 공간이 부족. 해결: 세그먼트로 로그를 나누는 방식. 세그먼트 파일들에 대해 컴팩션을 수행 컴팩션은 로그에서 중복된 키를 버리고 각 키의 최신 갱신 값만 유지. 추가와 세그먼트 병합은 순차적인 작업이기 때무에 무작위 쓰기보다 훨씬 빠르다. 세그먼트 파일이 추가 전용이나 불변이면 동시성과 고장 복구는 훨씬 간단하다. 오래된 세그먼트 병합은 시간이 지남에 따라 조각화되는 데이터 파일 문제를 피할 수 있다. 해시 테이블은 메모리에 저장해야 하므로 키가 너무 많으면 문제가 된다. 디스크에 해시 맵을 유지할 수 있지만 불행하게도 디스크 상의 해시 맵에 좋은 성능을 기대할 수 없다. 해시 충돌 해결을 위한 복잡한 로직도 필요..