본문 바로가기
  • 머킹이의 머신로그
AI

[용어설명] IT 테크 블로그 용어 설명집

by 머킹 2023. 12. 7.
728x90

[IT 용어 설명] IT 테크 용어 설명 모음

 

안녕하세요 머킹입니다.

오늘 읽은 블로그는!

하이퍼커넥트의 기술 블로그입니다.

모르는 단어가 많아서 위에 따로 적지 않았어요..

 

▼ 오늘 읽은 블로그 ▼

https://hyperconnect.github.io/2023/05/30/Python-Performance-Tips.html

 

고성능 ML 백엔드를 위한 10가지 Python 성능 최적화 팁

다량의 데이터를 사용하는 ML 워크로드에 특화된 최적화 기법들과, ML 백엔드에서 자주 사용되는 third-party 라이브러리를 효과적으로 사용하는 방법들을 실제 하이퍼커넥트의 사례와 함께 공유합

hyperconnect.github.io


ML 워크로드

워크로드는 작업을 완료하거나 성과를 창출하는 데 소요되는 컴퓨팅 리소스와 시간의 양을 의미합니다.

컴퓨터에서 실행되는 모든 애플리케이션 또는 프로그램은 워크로드로 간주할 수 있습니다.

 

출처 : 워크로드란? | 용어 해설 | HPE 대한민국



garbage collection(GC)

Garbage Collection : 사용하지 않는 메모리 공간의 메모리를 해제하는 행위를 말합니다.

즉 쓰레기를 청소하는 행위를 Garbage Collection이라고 합니다.

 

출처 : https://velog.io/@ddh963963/%EC% 9E%90% EB% B0%94-Garbage-Collection-Garbage-Collector

 


latency

Latency(레이턴시)는 시스템이나 네트워크에서 데이터가 전송되는 데 걸리는 시간을 나타냅니다. 이 용어는 일반적으로 특정 이벤트나 요청에 대한 응답 시간을 측정하는 데 사용됩니다. 더 간단하게 말하면, latency는 어떤 동작이 시작되었을 때부터 실제로 완료되기까지의 시간 간격을 의미합니다. 

 


reference counting

참조 횟수 계산 방식(reference counting)은 메모리를 제어하는 방법 중 하나로, 쓰레기 수집의 한 방식이다.


reference cycle

"Reference cycle(참조 순환)"은 프로그래밍에서 메모리 관리와 관련된 문제 중 하나입니다. 이는 객체들 간의 서로 참조가 순환되어 메모리가 해제되지 않고 유지되는 상황을 나타냅니다. 이로 인해 더 이상 필요하지 않은 메모리가 해제되지 않아 메모리 누수가 발생할 수 있습니다.

 

다시 말해, 두 개 이상의 객체가 서로를 참조하고 있고,

이러한 참조가 닫히지 않으면 가비지 컬렉터(또는 메모리 관리 시스템)가 해당 메모리를 회수할 수 없게 됩니다.

 

예를 들어, 객체 A가 객체 B를 참조하고, 객체 B가 객체 A를 참조한다고 가정해 봅시다. 이렇게 되면 A와 B 사이에 참조 순환이 형성되어 있습니다. 만약 이러한 상태에서 A와 B에 대한 참조가 외부에서 끊어지지 않으면, 가비지 컬렉터는 A와 B를 회수하지 않고 계속해서 메모리를 유지하게 됩니다.

 

이러한 문제를 해결하기 위해서는 순환 참조를 감지하고 해당 순환을 끊어주는 방법이 필요합니다.

많은 프로그래밍 언어 및 환경에서는 가비지 컬렉터가 이러한 역할을 수행하며, 명시적인 메모리 관리를 요구하지 않는 언어들은 개발자가 직접 메모리 관리에 신경 쓸 필요가 없습니다. 하지만 명시적인 메모리 관리가 필요한 언어에서는 이러한 문제에 대한 주의가 필요합니다.



weak generational hypothesis (young gc / old gc)

Young generation 객체, Old generation 객체

 

"Weak Generational Hypothesis(약한 세대 가설)"은 메모리 관리에서 사용되는 개념으로,

대부분의 객체가 생성 후 비교적 짧은 시간 동안만 활성 상태를 유지하며, 오래된 객체는 계속해서 사용되는 경향이 있다는 가설을 나타냅니다.

이 가설은 대부분의 프로그램이 "젊은" 객체와 "늙은" 객체 사이에서 명확한 세대(generation)의 차이를 보인다는 주장에 근거합니다.

Generational Garbage Collection은 이 가설을 기반으로 하여 메모리 관리를 수행합니다.

이것은 객체를 세대별로 분류하고, 각 세대에 대한 각기 다른 가비지 컬렉션 주기를 가지도록 합니다.

일반적으로는 두 개의 세대가 사용되는데, 첫 번째 세대는 "젊은" 객체를, 두 번째 세대는 "늙은" 객체를 포함합니다.

주로 사용되는 방식은 다음과 같습니다:

 

  1. Young Generation (젊은 세대): 대부분의 객체가 처음에 생성됩니다. 이 세대에서는 빈번하게 가비지 컬렉션이 수행되며, 대다수의 객체가 빠르게 사라지거나 살아남습니다.
  2. Old Generation (늙은 세대): 젊은 세대에서 살아남은 객체들이 이동됩니다. 이 세대는 상대적으로 적은 가비지 컬렉션 주기를 갖고 있습니다.

이 방식을 통해 대부분의 객체가 젊은 세대에서 빠르게 수거되어 메모리 공간을 확보하고, 오래된 객체는 상대적으로 적게 가비지 컬렉션을 수행하므로 효율적인 메모리 관리가 가능합니다.

Generational Garbage Collection은 많은 현대적인 프로그래밍 언어와 런타임에서 채택되어 있습니다.




`gc.get_threshold()`

 

gc.get_threshold()는 Python의 가비지 컬렉션 모듈인 gc 모듈에서 제공되는 함수 중 하나입니다.

이 함수는 자동 가비지 컬렉션의 동작을 제어하는 임계값(threshold)들을 반환합니다.

 

파이썬의 가비지 컬렉션은 세대(generation) 기반으로 동작하며, 객체들은 주로 세대별로 분류되어 가비지

컬렉션 주기가 조절됩니다. gc.get_threshold() 함수는 세대별 가비지 컬렉션의 임계값을 반환합니다.

일반적으로 반환되는 값은 튜플 형태로 (객체 수, 컬렉션 횟수)입니다. 각각의 값은 다음을 나타냅니다:

  1. 객체 수: 해당 세대에서 수집되어야 하는 객체의 임계값. 이 값보다 많은 객체가 존재하면 가비지 컬렉션이 수행됩니다.
  2. 콜렉션 횟수: 이 값은 해당 세대에서 수집된 총횟수를 나타냅니다.

예를 들어, 다음과 같이 사용할 수 있습니다:

import gc

thresholds = gc.get_threshold()
print("Thresholds:", thresholds)
 

이렇게 하면 현재의 가비지 컬렉션 임계값이 출력됩니다.

이 정보를 통해 가비지 컬렉션의 동작을 이해하고 조정할 수 있습니다. 일반적으로 이러한 설정을 변경하는 것은

성능 튜닝이나 특정 상황에서의 최적화에 사용될 수 있습니다.


Cyclic GC 오버헤드

 

"Cyclic GC 오버헤드"는 순환 참조가 있는 경우 가비지 컬렉션(Cyclic Garbage Collection)이 추가적인 시스템 리소스 및 시간을 소비하여 메모리를 관리하는 상황을 나타냅니다.

이러한 오버헤드는 가비지 컬렉션 작업이 일반적인 상황보다 더 많은 자원을 요구하고,

프로그램 실행에 영향을 미칠 수 있다는 것을 의미합니다.

순환 참조는 메모리 관리에서 문제를 일으킬 수 있는데, 이는 객체 간에 서로 참조가 순환되어 있어,

가비지 컬렉터가 이를 감지하고 처리하는 데 어려움을 겪게 만듭니다.

 

주로 가비지 컬렉터가 적절한 방법으로 순환 참조를 해결하기 위해 복잡한 알고리즘과 추가적인 작업을 수행해야 하는데, 이로 인해 오버헤드가 발생합니다.

순환 참조의 오버헤드는 다음과 같은 측면에서 나타날 수 있습니다:

  1. 자원 소비: 가비지 컬렉션은 순환 참조를 해결하기 위해 추가적인 연산을 수행해야 하므로, 이로 인해 CPU 자원과 메모리 자원이 더 많이 소비될 수 있습니다.
  2. 지연: 순환 참조를 해결하는 과정이 일반적인 가비지 컬렉션보다 더 많은 시간을 소요할 수 있습니다. 이로 인해 프로그램의 실행이 지연될 수 있습니다.
  3. 성능 감소: 순환 참조를 처리하기 위한 추가 작업은 프로그램의 성능에 영향을 미칠 수 있습니다. 특히 대규모 시스템에서는 이러한 성능 감소가 더 두드러질 수 있습니다.

따라서 순환 참조가 발생할 가능성이 있는 경우에는 이를 최소화하고 적절히 관리하여 오버헤드를 줄이는 것이 중요합니다. 이는 프로그래밍 언어나 환경에 따라 다르며, 메모리 관리에 대한 최적의 방법을 찾는 것이 중요합니다.



cache locality

캐시(Cache)의 지역성(Locality) 캐시에 저장할 데이터가 지역성(Locality)을 가져야 한다.

지역성이란, 데이터 접근이 시간적, 혹은 공간적으로 가깝게 일어나는 것을 의미한다.

 

캐시란?

캐시(cache, 문화어: 캐쉬, 고속완충기, 고속완충기억기)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 캐시의 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다. 캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다.

캐시는 시스템의 효율성을 위해 여러 분야에서 두루 쓰이고 있다.

 

출처 : 위키백과



직렬화(serialization)

직렬화(serialization)는 데이터 구조나 객체를 저장하거나 전송 가능한 형식으로 변환하는 과정을 말합니다.

직렬화는 데이터를 일련의 바이트로 변환하여 이를 파일에 저장하거나, 네트워크를 통해 전송하거나,

다른 프로그램과 공유하는 등의 목적으로 사용됩니다.

 

주로 프로그래밍에서는 객체를 메모리에 저장된 형태 그대로 저장하거나 전송하는 것이 아니라,

일련의 바이트로 변환하여 특정 형식에 따라 저장하고, 이후에 필요할 때 역직렬화(deserialization)를 통해

다시 원래의 객체로 변환합니다.

 

직렬화의 목적은 다음과 같습니다:

  1. 데이터 저장: 객체나 데이터를 파일이나 데이터베이스 등에 저장할 때 사용됩니다.
  2. 데이터 전송: 객체나 데이터를 네트워크를 통해 전송할 때 사용됩니다. 특히 원격 프로시저 호출(RPC)이나 웹 서비스와 같은 환경에서 중요한 역할을 합니다.
  3. 자바 직렬화, JSON, XML, Protocol Buffers 등과 같은 형식이 사용됩니다. 각 형식은 특정 용도나 성능, 가독성 등에 따라 선택될 수 있습니다.

예를 들어, 파이썬에서는 pickle 모듈을 사용하여 객체를 직렬화하고 역직렬화할 수 있습니다.

JSON 형식은 다양한 프로그래밍 언어 간에 데이터를 교환하는 데에 많이 사용되며,

XML도 데이터를 텍스트 형식으로 표현하여 저장하거나 전송하는 데 사용됩니다.

Protocol Buffers는 Google에서 개발한 이진 데이터 직렬화 형식으로, 효율적이고 경량화된 데이터 교환에 사용됩니다.


 

binary 데이터

이진 데이터(영어: Binary Data)는 기본 단위가 2개의 상태만 가지는 데이터이다.

일반적으로 이진법과 불 대수에서는 2개의 상태를 0과 +1로 나타낸다.

 

출처 : 위키백과

 


marshal(직렬화), unmarshal(역직렬화)

marshal와 unmarshal은 데이터를 직렬화하고 역직렬화하는 과정을 나타내는 용어입니다.

  1. marshal (직렬화): 데이터나 객체를 일련의 바이트 스트림으로 변환하는 과정을 말합니다. 직렬화는 주로 데이터를 저장하거나 네트워크를 통해 전송하기 위해 사용됩니다. 파이썬에서는 marshal 모듈이 있으며, pickle 모듈도 직렬화를 제공합니다. 직렬화된 데이터는 일반적으로 원래의 데이터나 객체의 구조를 보존하면서 바이트로 표현됩니다. 
import pickle

data = {'name': 'John', 'age': 30, 'city': 'New York'}
serialized_data = pickle.dumps(data)

dumps 함수는 데이터를 직렬화하여 바이트 스트림으로 반환합니다.    

 

2. unmarshal (역직렬화): 직렬화된 바이트 스트림을 다시 원래의 데이터나 객체로 변환하는 과정을 말합니다.

역직렬화는 저장된 데이터나 전송된 데이터를 다시 읽고 프로그램에서 사용할 수 있도록 하는 과정입니다.

계속해서 위에서 직렬화한 데이터를 역직렬화하는 예제를 살펴보겠습니다:

deserialized_data = pickle.loads(serialized_data)

loads 함수는 직렬화된 데이터를 읽어 원래의 데이터나 객체로 변환합니다.

 

직렬화와 역직렬화는 주로 데이터의 영속성 유지, 데이터 교환, 원격 프로시저 호출 등과 같은 상황에서 사용되며,

이를 통해 프로그램 간에 데이터를 효율적으로 이동하고 저장할 수 있습니다.



pickle

 

pickle은 파이썬에서 객체를 직렬화(serialize)하고 역직렬화(deserialize)하는 모듈입니다.

직렬화는 객체를 바이트 스트림으로 변환하는 과정이며, 역직렬화는 바이트 스트림을 다시 객체로 변환하는 과정입니다.

pickle 모듈은 이러한 과정을 수행하는 데 사용됩니다.

 

주로 다음과 같은 상황에서 활용됩니다:

  1. 객체 저장 및 로드: 객체의 현재 상태를 파일에 저장하고 나중에 해당 파일에서 객체를 로드하여 상태를 복원할 수 있습니다.
  2. 프로세스 간 데이터 교환: 프로세스 간에 데이터를 교환할 때 사용할 수 있습니다. 예를 들어, 네트워크를 통해 객체를 전송하거나, 여러 프로세스 간에 객체를 주고받을 때 유용합니다.


marshal

marshal은 파이썬에서 바이트코드를 생성하고 파싱 하는 데 사용되는 내장 모듈입니다. 이 모듈은 주로 파이썬 코드나 객체를 직렬화하거나 반직렬화하는 데 사용됩니다.

marshal 모듈의 주요 함수는 다음과 같습니다:

  • marshal.dump(object, file, version): 객체를 직렬화하고 바이트코드로 변환하여 파일에 저장합니다.
import marshal

code_object = compile('print("Hello, World!")', '<string>', 'exec')

with open('code_object.mar', 'wb') as file:
    marshal.dump(code_object, file)

 

  • marshal.load(file): 파일에서 직렬화된 객체를 읽어와 역직렬화합니다.
with open('code_object.mar', 'rb') as file:
    loaded_code_object = marshal.load(file)

exec(loaded_code_object)

marshal은 pickle과 유사한 목적으로 사용되지만, 몇 가지 차이점이 있습니다.

주요 차이점 중 하나는 marshal이 파이썬의 특정 데이터 타입에 특화된 바이트코드를 생성한다는 것입니다.

 

또한, pickle은 파이썬 객체의 상태를 완전히 보존하는 반면, marshal은 코드 객체를 저장하므로 전역 변수,

함수 정의 등의 상태는 보존되지 않습니다.

 

일반적으로 marshal은 파이썬 코드나 함수 등의 직렬화에 사용되며,

보다 일반적인 데이터 구조의 직렬화에는 pickle이 더 많이 사용됩니다.



Global Interpreter Lock (GIL) 

Global Interpreter Lock(GIL)은 CPython(파이썬의 기본 구현체)에서 사용되는 메커니즘으로,

파이썬 인터프리터의 스레드 간 동기화를 담당하는 잠금(lock)입니다.

 

GIL은 한 번에 하나의 스레드만 파이썬 바이트코드를 실행할 수 있도록 하는 것이 목적입니다.

GIL이 존재하는 이유는 CPython이 스레드 간 동기화를 관리하기 위해 설계되었기 때문입니다.

파이썬은 멀티스레딩 환경에서 동작하지만, GIL 때문에 여러 스레드가 동시에 파이썬 코드를 실행할 수 없습니다.

이로 인해 파이썬은 CPU-bound 작업에서 병렬 처리 성능 향상이 어려울 수 있습니다.

 

GIL의 주요 특징은 다음과 같습니다:

  1. 단일 스레드 실행: GIL은 파이썬 인터프리터 수준에서 적용되므로, 여러 스레드가 동시에 파이썬 코드를 실행하는 것을 막습니다. 이는 CPU-bound 작업에서는 단일 코어만 사용됨을 의미합니다.
  2. I/O 바운드 작업에서는 영향이 적음: GIL의 영향이 주로 CPU-bound 작업에서 나타나며, I/O 바운드 작업에서는 상대적으로 덜 중요합니다. I/O 작업 중에는 GIL이 해제되어 다른 스레드가 실행될 수 있기 때문입니다.
  3. 다른 구현체에서는 없을 수 있음: Jython, IronPython 등과 같은 다른 파이썬 구현체들은 GIL을 사용하지 않을 수 있습니다. 이러한 구현체들은 자체적인 멀티스레딩 모델을 가지고 있을 수 있습니다.

GIL은 멀티코어 환경에서 파이썬의 성능을 제한할 수 있기 때문에,

CPU-bound 작업을 병렬로 실행하려면 여러 프로세스를 사용하거나,

다른 언어의 확장 모듈을 이용하는 등의 방법을 고려할 수 있습니다.



Multi-threading이나 multi-processing

멀티스레딩(Multi-threading)과 멀티프로세싱(Multi-processing)은 동시에 여러 작업을 수행하는 기술을 나타냅니다. 그러나 두 가지 기술은 다르게 동작하고, 사용되는 상황에 따라 적합한 방법이 다를 수 있습니다.

  1. 멀티스레딩(Multi-threading):
    • 정의: 멀티스레딩은 하나의 프로세스 내에서 여러 스레드를 생성하여 각 스레드가 병렬로 실행되도록 하는 기술입니다. 스레드는 프로세스 내의 리소스를 공유하며, 이로 인해 데이터 공유 및 통신이 비교적 간단하게 이루어집니다.
    • 장점: 자원 공유가 용이하므로 메모리 소비가 적고, 스레드 간의 통신이 간단하다.
    • 주의사항: 공유 자원에 대한 동시 접근이나 동기화 문제에 대한 주의가 필요하며, GIL(Global Interpreter Lock)과 같은 문제가 발생할 수 있다.
  2. 멀티프로세싱(Multi-processing):
    • 정의: 멀티프로세싱은 각각 독립된 프로세스를 생성하여 각 프로세스가 독립적으로 실행되도록 하는 기술입니다. 프로세스는 각자의 메모리 공간을 가지고 있어 데이터 공유가 어렵지만, 별도의 메모리 공간으로 인해 서로간의 영향을 받지 않는다.
    • 장점: 독립된 메모리 공간을 사용하므로 스레드 간의 동기화 문제가 발생하지 않으며, 병렬로 동작하기 때문에 CPU 코어를 효율적으로 활용할 수 있다.
    • 주의사항: 프로세스간 통신(IPC)이 필요하며, 프로세스 생성 및 관리에 대한 오버헤드가 존재한다.

멀티스레딩은 주로 I/O 바운드 작업에서 유용하며, 멀티프로세싱은 CPU 바운드 작업에서 유용합니다. 선택은 작업의 특성과 환경에 따라 달라집니다.

 


pre-forked unvicorn process (Web Worker)

"Pre-forked Unicorn process" 또는 "Web Worker"는 웹 서버에서 사용되는 용어입니다.

여기서 "Unicorn"은 Python 기반의 웹 서버인 Gunicorn의 약어로 사용되며, "pre-forked"는 프로세스 모델을 나타냅니다.

기본적으로, 웹 서버는 여러 클라이언트 요청에 대한 응답을 처리하기 위해 여러 프로세스 또는 스레드를 사용할 수 있습니다.

 

"Pre-forked"는 이 중에서 프로세스를 사용하는 방식을 의미합니다.

 

구체적으로 설명하자면:

  • Pre-forked: 서버가 미리 여러 개의 프로세스를 생성하고 기다리는 방식입니다. 각각의 프로세스는 독립적으로 클라이언트 요청을 처리할 수 있습니다. 이로 인해 여러 요청이 동시에 처리될 수 있어서 병렬 처리를 지원하고, 각 프로세스는 서로에게 영향을 미치지 않으므로 안정성이 높습니다.
  • Unicorn: Gunicorn은 WSGI(Web Server Gateway Interface)를 지원하는 Python 웹 서버 중 하나입니다. WSGI는 Python 웹 애플리케이션이 웹 서버와 통신하는 표준 인터페이스를 정의합니다.

따라서 "Pre-forked Unicorn process"는 Gunicorn이 미리 여러 개의 프로세스를 생성하고, 각각의 프로세스가 독립적으로 클라이언트 요청을 처리하는 웹 서버 환경을 의미합니다.

이러한 구조는 안정성과 병렬 처리를 극대화하며, Gunicorn은 Python 웹 애플리케이션을 실행하고 관리하는 데에 많이 사용됩니다.



vCPU

vCPU는 가상 중앙 처리 장치(Virtual Central Processing Unit)의 약어로, 가상화 환경에서 가상 머신(VM)이나 컨테이너 등에서 사용되는 가상의 CPU를 나타냅니다.

vCPU는 호스트 시스템의 물리적인 CPU 자원을 가상 환경에서 분리하여 가상머신이나

컨테이너가 독립적으로 CPU 자원을 할당받을 수 있도록 합니다. 이를 통해 여러 가상 시스템이 동시에 실행될 때

각각의 가상 시스템이 자신만의 가상 CPU를 갖고 있는 것처럼 동작합니다.

 

가상화 플랫폼(예: VMware, Hyper-V, KVM 등)이나 컨테이너 오케스트레이션 시스템(예: Kubernetes, Docker 등)에서는 vCPU의 개념을 사용하여 가상 환경에 할당되는 CPU 자원을 관리하고 스케줄링합니다.

하나의 물리적인 CPU 코어가 여러 vCPU에 할당될 수 있으며,

이렇게 할당된 vCPU는 각각 독립적인 작업을 수행할 수 있습니다.

 

vCPU의 수는 가상 머신이나 컨테이너가 얼마나 많은 CPU 자원을 사용할 수 있는지를 결정하는 중요한 지표 중 하나이며, 성능 및 확장성 측면에서 고려되어야 합니다.


Throughput

 

Throughput(처리량):

처리량은 시스템이나 네트워크에서 단위 시간당 처리할 수 있는 양을 나타냅니다. 일반적으로는 데이터 전송이나 처리의 양을 측정하는 데 사용됩니다. 높은 처리량은 시스템이나 네트워크에서 많은 양의 작업을 효과적으로 수행할 수 있음을 나타냅니다.

 



Pydantic

 

 

Pydantic은 Python에서 데이터 검증 및 구조화를 위한 라이브러리입니다. 주로 데이터 모델의 유효성을 검사하고, 데이터를 파싱하고 생성하는 데 사용됩니다. Pydantic은 간결하면서도 강력한 유효성 검사를 제공하며, 주로 데이터 모델의 정의와 검증을 위해 사용됩니다.

Pydantic이 제공하는 주요 기능과 개념:

  1. 데이터 모델 정의:
    • Pydantic을 사용하면 Python의 타입 힌팅을 이용하여 데이터 모델을 정의할 수 있습니다. 이를 통해 모델의 필드와 타입을 명시적으로 지정할 수 있습니다.
from pydantic import BaseModel

class Person(BaseModel):
    name: str
    age: int

 

2. 유효성 검사:

  • Pydantic 모델을 사용하면 데이터가 모델의 정의와 일치하는지 자동으로 확인할 수 있습니다.
  • 모델을 생성할 때 입력 데이터가 모델에 맞지 않으면 ValidationError이 발생합니다.
data = {'name': 'John', 'age': '30'}
person = Person(**data)  # ValidationError: 1 validation error for Person
                        # age
                        #   value is not a valid integer (type=type_error.integer)

 

3. 디폴트 및 선택적 값:

  • 필드에 기본값을 설정하거나 선택적으로 값을 받을 수 있습니다.
from typing import Optional

class Person(BaseModel):
    name: str
    age: Optional[int] = None

 

4. 중첩된 모델 및 리스트, 딕셔너리:

  • Pydantic 모델은 중첩된 모델, 리스트, 딕셔너리 등을 포함할 수 있습니다.
from typing import List

class Family(BaseModel):
    father: Person
    mother: Person
    children: List[Person]

 

5. JSON 직렬화 및 역직렬화:

  • Pydantic 모델은 JSON 데이터와 쉽게 상호 변환될 수 있습니다.
person_dict = {'name': 'John', 'age': 30}
person_model = Person(**person_dict)

# Serialize to JSON
json_data = person_model.json()

# Deserialize from JSON
new_person_model = Person.parse_raw(json_data)

Pydantic은 주로 웹 개발, API 개발, 데이터 검증 등 다양한 상황에서 사용되며,

특히 FastAPI와 같은 웹 프레임워크와 잘 통합되어 있습니다.


FastAPI

FastAPI는 Python 기반의 빠르고 현대적인 웹 프레임워크입니다. 주로 API(Application Programming Interface)를 개발하는 데 사용되며, 타입 힌팅(type hints)을 기반으로 하는 강력한 기능과 자동 API 문서 생성 기능을 특징으로 합니다. FastAPI는 고성능 및 코드 생성을 위한 빌트인 지원, 효율적인 비동기(Asynchronous) 처리와 함께 간결하면서도 강력한 문법을 제공하여 개발자들에게 효율적인 웹 개발 경험을 제공합니다.

FastAPI의 주요 특징:

  1. 빠르고 효율적인 비동기 처리:
    • FastAPI는 비동기 코드를 지원하며, async 및 await 구문을 사용하여 빠른 I/O 작업을 처리할 수 있습니다. 이를 통해 높은 성능과 동시성 처리를 구현할 수 있습니다.
  2. 자동 문서 생성:
    • FastAPI는 타입 힌팅을 기반으로 자동으로 API 문서를 생성합니다. Swagger UI와 ReDoc과 같은 도구를 사용하여 시각적이고 상호작용하는 API 문서를 생성할 수 있습니다.
  3. 타입 힌팅을 활용한 강력한 유효성 검사:
    • FastAPI는 타입 힌팅을 사용하여 입력 데이터의 유효성을 검사하고 자동으로 문서화합니다. 이를 통해 명확하고 안전한 API를 쉽게 구축할 수 있습니다.
  4. 의존성 주입:
    • FastAPI는 의존성 주입을 지원하여 응용 프로그램의 구성요소를 쉽게 관리할 수 있습니다. 각 API 경로에 필요한 의존성을 명시하면 FastAPI가 자동으로 의존성을 주입합니다.
  5. 형식 간 명시적 변환:
    • FastAPI는 입력 및 출력 데이터를 명시적으로 변환할 수 있습니다. 이는 사용자가 원하는 형식으로 데이터를 쉽게 처리하고 반환할 수 있도록 도와줍니다.
  6. WebSocket 지원:
    • WebSocket을 사용하여 실시간 양방향 통신을 쉽게 구현할 수 있습니다.

FastAPI는 간단한 코드 작성 및 유지보수, 뛰어난 성능, 강력한 타입 힌팅을 통한 자동 문서화 등으로 인해 많은 개발자들에게 선호되는 Python 웹 프레임워크 중 하나로 자리매김하고 있습니다.



API endpoint

 

API Endpoint(엔드포인트):

API 엔드포인트는 웹 API에서 특정한 엔드 유저나 시스템이 다른 시스템과 상호작용할 수 있는 지점을 나타냅니다. 각 엔드포인트는 특정한 URI(Uniform Resource Identifier)에 매핑되어 있으며, 일반적으로 특정 리소스에 대한 특정 작업을 수행하도록 설계되어 있습니다.

일반적으로 RESTful API에서는 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 엔드포인트에 요청을 수행하며, 엔드포인트의 URI는 요청이 수행되는 리소스를 명시합니다. 예를 들어, 다음은 간단한 블로그 게시물을 다루는 RESTful API의 엔드포인트들일 수 있습니다:

  1. 게시물 목록 조회:
    • GET /posts: 모든 게시물 목록을 조회하는 엔드포인트.
  2. 특정 게시물 조회:
    • GET /posts/{post_id}: 특정 ID의 게시물을 조회하는 엔드포인트.
  3. 새로운 게시물 생성:
    • POST /posts: 새로운 게시물을 생성하는 엔드포인트.
  4. 게시물 수정:
    • PUT /posts/{post_id}: 특정 ID의 게시물을 수정하는 엔드포인트.
  5. 게시물 삭제:
    • DELETE /posts/{post_id}: 특정 ID의 게시물을 삭제하는 엔드포인트.

API 엔드포인트는 일종의 계약이며, 클라이언트와 서버 간의 통신을 가능하게 합니다. 엔드포인트는 리소스의 상태를 읽거나 수정하고, 서비스에 특정한 작업을 요청하는 데 사용됩니다. 엔드포인트는 API의 중요한 설계 요소 중 하나이며, 명확하고 일관된 엔드포인트 설계는 API의 사용성과 유지보수성을 향상합니다.


data validation(type check)과 parsing

 

Data Validation (데이터 유효성 검사):

데이터 유효성 검사는 데이터가 특정한 규칙이나 조건을 만족하는지 확인하는 과정을 말합니다. 이는 주로 프로그래밍에서 사용자로부터 입력된 데이터나 외부에서 수신한 데이터를 검사하는 데에 적용됩니다. 데이터 유효성 검사의 목적은 데이터의 일관성과 정확성을 보장하며, 잘못된 데이터가 시스템으로 들어오는 것을 방지하여 안정성을 유지하는 데 도움을 줍니다.

예를 들어, 데이터 유효성 검사는 다음과 같은 사항을 확인할 수 있습니다:

  • 데이터의 형식이 적절한가? (예: 문자열, 숫자, 날짜 등)
  • 데이터의 범위가 유효한가? (예: 숫자의 범위, 날짜의 범위 등)
  • 필수 필드가 누락되지 않았는가?

Parsing (파싱):

파싱은 특정 형식으로 표현된 데이터를 해석하고 필요한 정보를 추출하는 과정을 말합니다. 일반적으로는 문자열을 다루는 과정에서 많이 사용되며, 주로 특정 형식의 데이터를 다른 형식이나 구조로 변환하는 데에 활용됩니다.

예를 들어, JSON 형식의 문자열을 파싱 하여 Python 객체로 변환하거나, CSV 파일의 데이터를 읽어서 테이블 형태로 변환하는 것이 파싱의 예시입니다. 파싱은 데이터의 이해와 해석을 위한 중요한 단계이며, 데이터를 다루는 다양한 응용 프로그램에서 사용됩니다.

요약하면, 데이터 유효성 검사는 데이터가 주어진 규칙에 부합하는지 확인하는 과정이고, 파싱은 주어진 데이터를 이해하고 필요한 정보를 추출하는 과정입니다.



column-oriented

 

"Column-oriented"은 데이터베이스나 데이터 저장 시스템에서 사용되는 데이터 저장 및 처리 방식 중 하나를 나타냅니다. "Column-oriented" 데이터 저장 방식은 행 지향 방식과 대조적으로 열 단위로 데이터를 저장하는 것을 의미합니다.

일반적으로 "Row-oriented"과 "Column-oriented"은 다음과 같은 특성을 갖습니다:

  1. Row-oriented (행 지향):
    • 데이터를 행 단위로 저장합니다. 즉, 한 행의 모든 열 데이터가 연속적으로 저장됩니다.
    • 전통적인 관계형 데이터베이스 시스템(예: MySQL, PostgreSQL)은 주로 이 방식을 사용합니다.
    • 특정 행의 데이터를 읽거나 갱신할 때 유리합니다.
  2. Column-oriented (열 지향):
    • 데이터를 열 단위로 저장합니다. 즉, 한 열의 모든 행 데이터가 연속적으로 저장됩니다.
    • 데이터 웨어하우스(Data Warehouse)나 OLAP(Online Analytical Processing) 시스템에서 주로 사용됩니다.
    • 특정 열의 데이터를 읽거나 집계할 때 유리합니다.

"Column-oriented" 저장 방식의 장점은 다음과 같습니다:

  • 데이터 압축 효율: 같은 데이터 형식의 값들이 연속적으로 저장되기 때문에 압축이 효과적으로 이루어질 수 있습니다.
  • 쿼리 성능 향상: 특정 열의 값을 필터링하거나 집계할 때 성능이 향상될 수 있습니다. 특히, OLAP 쿼리와 같은 분석적인 작업에 유리합니다.
  • 데이터 읽기 성능: 특정 열을 읽어오는 작업이 효율적으로 이루어집니다.

"Column-oriented" 방식은 OLAP 환경에서 발생하는 분석적인 작업에 적합하며, 대용량의 데이터를 효과적으로 처리할 수 있도록 최적화되어 있습니다. 반면에 "Row-oriented" 방식은 OLTP(Online Transaction Processing) 환경에서 트랜잭션 처리에 적합한 경우가 많습니다.



orjson, ujson

orjson과 ujson은 모두 JSON(JavaScript Object Notation) 형식의 데이터를 파이썬에서 다룰 때 사용되는 라이브러리입니다.

  1. orjson (Optimized Rust JSON):
    • orjson은 Rust 언어로 구현된 빠르고 최적화된 JSON 인코딩 및 디코딩 라이브러리입니다.
    • 파이썬에서 JSON 데이터를 직렬화(인코딩)하거나 역직렬화(디코딩)할 때 매우 빠른 성능을 제공합니다.
    • CPython 및 PyPy 환경에서 모두 사용 가능하며, 속도 측면에서 파이썬 내장 모듈인 json보다 빠른 결과를 보일 수 있습니다.
  2. ujson (UltraJSON):
    • ujson은 파이썬에서 사용되는 또 다른 빠르고 경량의 JSON 라이브러리입니다.
    • C 언어로 작성되었으며, 파이썬 2와 3에서 모두 사용할 수 있습니다.
    • 높은 성능을 제공하면서도 json 모듈과 비슷한 사용법을 제공합니다.


line profiler

 

Line Profiler (라인 프로파일러):

라인 프로파일러는 프로그램의 각 라인에서 소요되는 실행 시간을 측정하여 코드의 성능 프로파일링을 수행하는 도구입니다. 이는 코드의 어떤 부분이 시간을 많이 소모하는지, 어떤 함수 또는 루프가 더 많은 계산 자원을 필요로 하는지 등을 파악하는 데 사용됩니다.

라인 프로파일링은 코드의 최적화 및 성능 향상을 위해 유용한 정보를 제공할 수 있습니다. 일반적으로 다음과 같은 과정으로 동작합니다:

  1. 라인별 실행 시간 측정: 라인 프로파일러는 각 라인에서 소요되는 시간을 측정합니다. 이를 통해 각 라인이 실행될 때마다 소요되는 시간의 분포를 확인할 수 있습니다.
  2. 통계 및 보고서 생성: 측정된 데이터를 기반으로 통계 및 보고서를 생성합니다. 이를 통해 어떤 함수나 라인이 가장 많은 시간을 소모하고 있는지, 어떤 부분이 최적화의 대상이 될 수 있는지 등을 시각적으로 확인할 수 있습니다.


kernprof 

 

kernprof는 Python 코드의 라인 프로파일링을 제공하는 Kernprofiler의 명령행 인터페이스입니다. kernprof를 사용하면 Python 스크립트나 함수를 실행하면서 각 라인에서 소요되는 시간을 측정할 수 있습니다.

Kernprofiler는 line_profiler 라이브러리를 기반으로 하며, 코드의 각 라인에서의 실행 시간을 프로파일링 합니다. 이를 통해 코드의 성능 병목 현상을 파악하고 최적화할 수 있는 정보를 얻을 수 있습니다.

 



스테이징 환경

"스테이징 환경"은 소프트웨어 개발 또는 웹 개발에서 사용되는 용어로, 실제 프로덕션 환경으로 전환하기 전에 애플리케이션을 테스트하고 검증하는 환경을 나타냅니다. 스테이징 환경은 개발자 및 QA(Quality Assurance) 팀이 애플리케이션의 안정성, 성능, 기능 등을 테스트하고 문제를 식별하기 위해 사용됩니다.

스테이징 환경의 특징 및 목적은 다음과 같습니다:

  1. 테스트 및 검증:
    • 스테이징 환경에서는 실제 운영 환경과 유사한 환경을 구축하여 애플리케이션을 테스트하고 검증합니다. 이를 통해 프로덕션 환경에서 발생할 수 있는 문제를 사전에 파악하고 수정할 수 있습니다.
  2. 유사한 환경 구성:
    • 스테이징 환경은 프로덕션 환경과 가능한 한 유사하게 구성됩니다. 이는 데드라인, 환경 변수, 데이터베이스 설정, 서버 구성 등을 포함합니다.
  3. 코드 품질 검증:
    • 개발된 코드의 품질 및 안정성을 검증하기 위해 스테이징 환경에서 다양한 테스트를 수행합니다. 이는 유닛 테스트, 통합 테스트, 성능 테스트 등을 포함합니다.
  4. 사용자 승인 획득:
    • 스테이징 환경에서 사용자 혹은 이해관계자들에게 애플리케이션을 시연하고 사용자 승인을 받습니다. 이를 통해 최종 사용자들의 요구사항이 충족되고 있는지 확인합니다.
  5. 문제 식별 및 수정:
    • 스테이징 환경에서 발생한 문제들을 식별하고 이를 수정한 뒤 안정적인 상태로 프로덕션 환경으로 배포합니다.

스테이징 환경은 개발 주기의 중요한 부분이며, 안정성을 보장하고 최종 사용자에게 우수한 경험을 제공하기 위해 필수적입니다.


정말 길었죠..?ㅎㅎ

정리하는데 시간이 오래 걸렸습니다!

다음에는 조금 더 가벼운 내용으로 올게요.