목록분류 전체보기 (67)
The Boxer
함수를 wrapping하여 함수에 추가 구문 적용을 재사용 가능하게 만드는 기능 쉽게 말하자면 함수의 호출 시점에 추가적인 작업을 적용 할 때 이를 재사용 가능하게 하는 기능이다 decorator가 없는 경우 def get_data_from_database(): print("start db connect") ... print("finish db connect") 위와 같이 함수 실행과 끝을 관제하는 로그를 추가한다고 하면 함수의 실행 앞뒤로 로그를 추가해야 한다. 다만, 위와 같은 관제 기능이 모든 함수에 추가되어야 한다고 하면, 모든 부분에 동일한 소스코드를 추가해야 한다. decorator를 통해 위 기능을 재사용 가능하게 만들어 모든 코드에 공통적으로 적용한다. decorator 사용 def fun..
정의: 규모에 상관없이 빠르고 유연한 완전관리형 NoSQL 데이터베이스 서비스 NoSQL DB 서비스이긴 한데 완전관리형이다. 완전관리형이란 AWS가 리소스 관리를 대신해준다는 의미이며, 서버 관리 auto scaling등에 대한 인프라 적인 관리는 AWS가 대신하게 된다. 구성 요소 table, item, attribute table: RDB와 마찬가지로 데이터가 테이블 item: table에는 0개 이상의 item이 속함. attribute의 집합체로 볼 수 있으며, 각 item들은 서로 구별되는 고유한 값이다. attribute: 각 item은 1개 이상의 attribute로 구성되어 있음. dynamodb 데이터의 가장 작은 단위 구성 예시 위 예시에서 table: People item: Peop..
druid의 구조는 process(service)로 구성된다. 각 server는 process가 배포되는 단위이며 process는 운영상의 유연함을 위해 3개 type의 서버로 나눠 배포된다. process(service) Coodinator Overlord Broker Historical Middleware manager and Peon Indexer Router server Master Query Data 전체 구조 ref: https://druid.apache.org/docs/latest/design/processes.html Druid process and server Master server Master server는 데이터 적재와 가용성을 책임진다. 실질적으로 새로운 적재 작업을 실행시키며 D..
# 이 글은 druid segment 를 참고하여 정리한 글입니다. druid는 index 정보를 시간에 따라 파티셔닝된 segment 파일에 저장한다. 여기서 파티셔닝이 되는 시간 단위는 segmentGranularity 값을 통해 설정 가능한다. 보통 druid가 무거운 쿼리를 적절한 성능으로 처리하기 위해서 segment 파일은 300 MB ~ 700 MB 사이를 유지할 것을 권장한다. 만약 해당 segment의 용량이 해당 값 범위 밖에 있다면 segmentGranularity 값을 조정해야 한다. segment 파일의 구조 컬럼 지향(columnar): druid의 특징으로 각 column의 데이터가 분리되어 저장되었음을 것을 의미한다. column 데이터를 분리하여 저장함으로써, 필요한 col..
# 이 글은 druid 공식문서의 design 파트를 정리한 글입니다. druid는 클라우드 서비스에 적용하기 쉬운 분산 구조로 이루어져 있다. 이러한 구조 덕분에 몇가지 설정만으로 쉽고 유연하게 스케일 조절도 가능하며, 장애 복구 기능도 제공한다. 전체 구조 출처: https://druid.apache.org/docs/latest/design/architecture.html 드루이드 서비스 드루이드는 다음의 서비스로 구성되어 있다. coodinator service: 데이터 가용성을 책임지는 서비스 overlord service: 데이터 적재 작업을 제어 broker: 외부 클라이언트에서 들어온 쿼리문 제어 router service: request를 broker, coodinator, overlord..
python에서 모든 자료형은 객체로 저장한다. a = 1 이라 함은 java나 c 처럼 1이라는 값이 들어가는게 아니라 1이라는 값을 가진 integer 객체가 들어가는 것 mutable 실행 단계에서 객체 내부의 값을 수정할 수 있는 객체 list, set, dictionary 등이 mutable 객체에 속함 foo = [ 1,2 ] print(id(foo)) foo.append(3) print(id(foo)) > 4337981376 4337981376 위 경우에서 foo라는 list에 하나의 아이템을 추가해면 객체 내부의 값이 변하지만, foo가 참조하는 객체는 동일하다 copy foo = [ 1,2 ] bar = foo foo.append(3) print(foo) print(bar) >..
python에서는 메모리 효율을 높이기 위해 object interning이란 기법을 사용한다 object interning: python에서 immutable한 객체에 한해 동일한 값을 하나만을 메모리공간에 저장하여 효율적으로 메모리를 관리하는 방식 string의 경우 >>> a = "hello" >>> b = "hello" >>> a is b True a와 b는 같은 값이지만 다른 변수에 할당되었으므로 다른 reference를 참조하고 있는 것으로 봐야한다. 하지만, object interning에 의해 "hello"라는 값은 하나의 메모리 공간에 저장되고 a와 b는 해당 메모리 공간을 참조한다. >>> id(a) 4300925552 >>> id(b) 4300925552 다만 다음과 같이 특수 문자나..
python 3.7 부터 추가된 모듈 python에서 class를 통해 데이터를 저장하면 type 안전하게 데이터를 저장할 수 있음 data를 class로 저장하거나 비교, 출력하는 기능을 편하게 해주는 모듈 dataclass를 사용하지 않은 경우 데이터 저장 class Foo: def __init__(self, id: int, name: str, admin: bool): self.id = id self.name = name self.admin = admin 각 데이터를 저장하는데만 변수가 3번이 사용되어 데이터를 저장하기 위해서 너무 많은 코드가 필요하다 변수 갯수가 많아지면 더욱 많은 작업이 필요하며, 휴먼에러가 발생하기도 쉽다. 동등 비교 일반적인 class에서 동등 비교를 위해선 __eq__()를..
instance 변수 각 instance 마다 갖고 있는 독립된 변수 클래스로 부터 몇 개의 인스턴스를 만들어도 각 인스턴스의 값은 독립적이다. python에서 self 예약어를 사용하여 접근 클래스 인스턴스가 생성되는 순간 메모리에 적재되며, 인스턴스가 생성되기 이전에 접근 불가 class Foo: def __init__(self): self.a = 1 접근 범위 인스턴스의 메서드, 클래스의 생성자, 소멸자 등에서 접근 가능 class Foo: def __init__(self): self.foo = "foo" def __del__(self): del self.foo def print(self): print(self.foo) > "foo" class 변수 class 자체에서 갖고 있으며, ..
fastapi는 어플리케이션을 실행하는 시점에 swagger 페이지를 기본으로 생성해준다. controller를 등록하면 해당 endpoint에 대한 spec을 fastapi에서 자동으로 swagger 페이지에 등록해주며, 다양한 설정 또한 가능하다. 다만, swagger 페이지 자체를 fastapi에서 관리하여 커스터마이징이 어렵다. swagger 페이지에 http 기본 인증을 추가하는 방법을 알아본다. 1. 기본 인증을 적용한 endpoint 생성 fastapi에서 http basic auth를 위한 HTTPBasic, HTTPBasicCredentials 라이브러리가 있다. 두 라이브러리를 사용하여 기본 인증 구현 from fastapi.security import HTTPBasic, HTTPBas..