반응형

가상환경 생성

기본적으로 .venv 디렉토리에 가상환경이 생성된다.

uv venv

 

특정 이름이나 경로로 가상환경을 생성하려면 다음과 같이 실행한다.

uv venv my-env

 

특정 Python 버전을 지정하여 가상환경을 생성할 수도 있다.

uv venv --python 3.11

이 명령어는 지정한 버전의 Python을 설치하고 해당 버전으로 가상환경을 생성


가상환경 활성화

생성된 가상환경을 활성화하려면 아래의 명령어를 사용

  • macOS/Linux
source .venv/bin/activate

 

  • Windows
.venv\Scripts\activate

 


가상환경 내에서 패키지 설치

가상환경이 활성화된 상태에서 패키지를 설치하려면 uv pip 명령어를 사용한다.

uv pip install requests

 

또는 uv add 명령어를 사용하여 의존성을 추가할 수 있다.

uv add requests

 

이렇게 하면 pyproject.toml 파일에 의존성이 추가되고, 가상환경에 해당 패키지가 설치된다.


uv 가상환경 관리 장점

  • 속도: uv venvpyhton -m venv보다 최대 80배, virtualenv보다 7배 빠르게 가상환경을 생성한다.
  • 통합 관리: 가상환경 생성, 패키지 설치, Python 버전 관리 등을 하나의 도구로 통합하여 관리할 수 있다.​
  • 자동 감지: uv run, uv sync 등의 명령어를 사용할 때, .venv 디렉토리가 존재하면 자동으로 해당 가상환경을 사용한다.​

추가 팁: VSCode에서 사용하기

VSCode에서 uv로 생성한 가상환경을 사용하려면 다음과 같이 설정할 수 있다.

  1. VSCode의 명령 팔레트를 열고 (Ctrl+Shift+P), Python: 인터프리터 선택
  2. 목록에서 .venv 디렉토리의 Python 인터프리터를 선택한다.​
  3. 만약 목록에 나타나지 않는다면, 인터프리터 경로 입력을 선택하고 .venv/bin/python (Windows의 경우 .venv\Scripts\python.exe) 경로를 직접 입력한다.

 

 

 

반응형
반응형

각 도구의 특징 요약

pip

  • 장점: python 기본 포함, 간단한 사용법
  • 단점: 의존성 관리 및 가상환경 설정 수동 필요

Poetry

  • 장점: Pipfile을 통한 의존성 관리, 가상환경 자동 생성
  • 단점: 속도가 느리고, 일부 기능이 불안정할 수 있음​

pyenv

  • 장점: 여러 Python 버전 관리에 특화
  • 단점: 패키지 관리 기능 없음, 다른 도구와 함께 사용 필요​

uv

  • 장점: Rust로 개발되어 매우 빠른 속도, 패키지 설치, 의존성 관리, 가상환경 및 Python 버전 관리, 패키지 배포 등 통합 기능 제공
  • 단점: 상대적으로 새로운 도구로, 커뮤니티 지원이 제한적일 수 있음​

 


도구 선택

  • 간단한 프로젝트: pip과 venv 조합이 충분
  • 복잡한 의존성 관리 및 배포 필요: Poetry 추천
  • Python 버전 관리 중심: pyenv 활용
  • 속도와 통합 관리 중시: uv 고려

*uv 관련해서는 아래의 글 참고

 

Python 개발자라면 - uv로 패키지 관리하기

uv는 Rust로 개발된 초고속 Python 패키지 및 프로젝트 관리자이다.기존의 pip, virtualenv, poetry, pyenv 등을 통합하여 하나의 도구로 대체할 수 있으며, 속도와 효율성 면에서 큰 장점을 제공한다. 주요

ryu-earth.tistory.com

 


정리 내용

*아래의 정리 내용은 GPT에서 생성했습니다.

기능 / 도구 pip Poetry Pipenv pyenv uv
패키지 설치 ✅ 기본 기능 ✅ 내장 ✅ 내장 ✅ 매우 빠름
의존성 관리 ❌ 수동 관리 ✅ 자동 관리 ✅ 자동 관리 ✅ 자동 관리
가상환경 관리 ❌ 수동 설정 ✅ 내장 ✅ 내장 ✅ 자동 생성
Python 버전 관리 ❌ 외부 도구 필요 ❌ 외부 도구 필요 ❌ 외부 도구 필요 ✅ 핵심 기능 ✅ 내장
속도 보통 느림 느림 보통 🚀 매우 빠름
구성 파일 requirements.txt pyproject.toml Pipfile .python-version pyproject.toml
잠금 파일 지원 ❌ 없음 ✅ poetry.lock ✅ Pipfile.lock ✅ 자동 생성
CLI 명령어 직관성 단순 명확 다소 복잡 단순 직관적
패키지 배포 지원 ❌ 외부 도구 필요 ✅ 내장 ❌ 외부 도구 필요 ✅ 내장
설치 방식 Python 기본 포함 별도 설치 필요 별도 설치 필요 별도 설치 필요 단일 바이너리 설치 가능

 

반응형
반응형

uv는 Rust로 개발된 초고속 Python 패키지 및 프로젝트 관리자이다.

기존의 pip, virtualenv, poetry, pyenv 등을 통합하여 하나의 도구로 대체할 수 있으며, 속도와 효율성 면에서 큰 장점을 제공한다.

 

 

주요 특징 및 장점

  • 속도: uv는 pip 대비 10~100배 빠른 성능을 자랑함.
  • 통합 도구: 패키지 설치, 의존성 관리, 가상환경 생성, Python 버전 관리 등을 하나의 도구로 처리할 수 있다.
  • Rust 기반: Rust로 작성되어 안정성과 성능이 뛰어난다.
  • 간편한 설치: 단일 바이너리로 제공되어 설치가 간편하다.

종속성을 해결(왼쪽)하고 설치(오른쪽)

 


설치 방법

# macOS 및 Linux에서 설치
curl -LsSf https://astral.sh/uv/install.sh | sh

# Homebrew를 이용한 설치 (macOS)
brew install uv

# pip를 이용한 설치
pip install uv

 

설치 후, 터미널에서 설치가 완료되었는지 확인

uv --version

 

 


기본 사용법

프로젝트 초기화

uv init my-project

 

--app 또는 --lib 옵션을 사용하여 애플리케이션 또는 라이브러리 프로젝트로 초기화 할 수 있다.

 

uv에서 "프로젝트 초기화"는 새로운 Python 프로젝트의 기본 구조를 자동으로 생성하는 과정이다.
이는 개발자가 코드를 작성하기 전에 필요한 설정과 파일을 미리 구성하여, 개발을 빠르고 효율적으로 시작할 수 있도록 도와준다.

 

uv init 명령어로 생성되는 프로젝트 구성

  • pyproject.toml: 프로젝트의 메타데이터와 의존성 정보를 담은 설정 파일
  • main.py: 간단한 "Hello, World!" 예제가 포함된 Python 스크립트
  • README.md: 프로젝트에 대한 설명을 작성할 수 있는 문서
  • .python-version: 사용할 Python 버전을 명시하는 파일

패키지 추가 및 동기화

 
uv add requests
uv sync

 

uv add로 패키지를 추가하고, uv sync로 의존성을 동기화

 


가상환경 실행

uv python list
uv python install 3.12

 

uv run을 사용하여 가상환경에서 스크립트를 실행할 수 있다.

 


Python 버전 관리

uv python list
uv python install 3.12

 

uv python 명령어로 다양한 Python 버전을 관리 가능

 


참고자료

 

 

uv

An extremely fast Python package and project manager, written in Rust. Installing Trio's dependencies with a warm cache. 🚀 A single tool to replace pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, and more. ⚡️ 10-100x faster than pip. 🗂️

docs.astral.sh

 

uv: Python packaging in Rust

uv is an extremely fast Python package installer and resolver, designed as a drop-in alternative to pip and pip-tools.

astral.sh

 

 

 

반응형
반응형

https://ryu-earth.tistory.com/entry/Python-JS-WebRTC-%EC%98%88%EC%A0%9C-%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4-%EC%98%88%EC%8B%9C

 

[Python & JS] WebRTC 예제 & 시나리오 예시

WebRTC가 궁금하면 여기에 참고 https://ryu-earth.tistory.com/entry/WebRTC-vs-WebSocket WebRTC vs WebSocketWebRTC와 WebSocket은 둘 다 브라우저 간 실시간 데이터 전송을 가능하게 해주지만, 목적과 동작 방식이 다르다

ryu-earth.tistory.com

  • 브라우저 또는 앱 간 P2P 실시간 통신 기술
  • 영상, 음성, 데이터 스트림 전송 가능
  • Python에서는 aiortc 라이브러리로 구현 가능

 


Python WebRTC 개발 구조

  1. PeerConnection 생성
  2. DataChannel or MediaTrack 설정
  3. off/answer 교환 (시그널링 필요)
  4. P2P 통신 실행


설치

pip install aiortc websockets

 

https://github.com/aiortc/aiortc

 

GitHub - aiortc/aiortc: WebRTC and ORTC implementation for Python using asyncio

WebRTC and ORTC implementation for Python using asyncio - aiortc/aiortc

github.com

 


Python WebRTC DataChannel P2P 예제

peer_a.py (initiator)

import asyncio
from aiortc import RTCPeerConnection, RTCSessionDescription

async def run_offer():
    pc = RTCPeerConnection()
    channel = pc.createDataChannel("chat")

    @channel.on("open")
    def on_open():
        print("DataChannel open!")
        channel.send("Hello from A!")

    @channel.on("message")
    def on_message(message):
        print(f"Received: {message}")

    offer = await pc.createOffer()
    await pc.setLocalDescription(offer)
    print("=== Offer ===")
    print(pc.localDescription.sdp)

    sdp = input("Paste answer SDP:\n")
    await pc.setRemoteDescription(RTCSessionDescription(sdp, type="answer"))

    await asyncio.sleep(10)

asyncio.run(run_offer())

 

peer_b.py (receiver)

import asyncio
from aiortc import RTCPeerConnection, RTCSessionDescription

async def run_answer():
    pc = RTCPeerConnection()

    @pc.on("datachannel")
    def on_datachannel(channel):
        @channel.on("message")
        def on_message(message):
            print(f"Received: {message}")
            channel.send("Hello from B!")

    sdp = input("Paste offer SDP:\n")
    await pc.setRemoteDescription(RTCSessionDescription(sdp, type="offer"))

    answer = await pc.createAnswer()
    await pc.setLocalDescription(answer)
    print("=== Answer ===")
    print(pc.localDescription.sdp)

    await asyncio.sleep(10)

asyncio.run(run_answer())

 

  • pc = RTCPeerConnection()개발구조 1번
  • createDataChannel() 또는 @pc.on("datachannel") 개발구조 2번
  • createOffer(), setLocalDescription(), setRemoteDescription()개발구조 3번
  • DataChannel의 open/메시지 주고받기 → 개발구조 4번
개발구조 단계 코드 위치
1. PeerConnection 생성 pc = RTCPeerConnection()
2. DataChannel 설정 createDataChannel() & @pc.on("datachannel")
3. offer/answer 교환 createOffer(), setLocalDescription(), setRemoteDescription()
4. 통신 실행 DataChannel on_open, on_message 핸들러

 


Python WebSocket 시그널링 서버 예제

import asyncio
import websockets

clients = set()

async def signaling_handler(websocket, path):
    clients.add(websocket)
    try:
        async for message in websocket:
            await asyncio.wait([ws.send(message) for ws in clients if ws != websocket])
    finally:
        clients.remove(websocket)

start_server = websockets.serve(signaling_handler, "localhost", 9999)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

 

 


개발 시 주의사항

이슈 원인 해결
P2P 연결 안 됨 STUN 서버 미설정, NAT 환경 STUN 서버 추가 설정
시그널링 기능 없음 aiortc에는 기본 시그널링 서버 없음 WebSocket 서버 직접 구현
DataChannel 연결 안 됨 offer/answer 교환 전 DataChannel 생성 문제 생성 순서 및 이벤트 핸들러 확인
영상 전송 시 지연/버벅임 프레임 크기, 캡처 성능 이슈 비동기 처리 최적화, 프레임 크기 조절

STUN 서버 등록 예시

*STUN 서버: NAT 환경에서 클라이언트가 공인 IP 주소와 포트를 확인하여 다른 피어와 직접 통신하도록 돕는 서버
 
pc = RTCPeerConnection(configuration={"iceServers": [{"urls": "stun:stun.l.google.com:19302"}]})

 


WebRTC 특징 정리

  • WebRTC API가 브라우저처럼 내장되어 있지 않음
  • aiortc 라이브러리로 P2P 실시간 통신 가능
  • 시그널링 서버, STUN/TURN 서버 직접 구성 필요
  • 영상, 음성, 데이터 전송 모두 구현 가능
  • 데스크탑, 서버, IoT 환경에 적합

 

용도 구현 방식
데이터 전송 DataChannel 사용
영상/음성 스트림 MediaStreamTrack 상속 & 커스텀 구현
시그널링 서버 Python WebSocket 직접 구현
NAT 통과 STUN/TURN 서버 설정
반응형
반응형

WebRTC가 궁금하면 여기에 참고

 

https://ryu-earth.tistory.com/entry/WebRTC-vs-WebSocket

 

WebRTC vs WebSocket

WebRTC와 WebSocket은 둘 다 브라우저 간 실시간 데이터 전송을 가능하게 해주지만, 목적과 동작 방식이 다르다. WebRTC란?Web Real-Time Communication의 약자브라우저 간 P2P(Peer-to-Peer) 실시간 오디오, 비디오,

ryu-earth.tistory.com

 

 

  • 브라우저 간 P2P 실시간 통신 가능
  • 영상, 음성, 데이터 스트림 전송 가능
  • WebSocket 같은 서버를 통해 시그널링(초기 연결 설정 정보 교환) 필요

 


WebRTC 시나리오 & 코드

실시간 영상/음성 통화

  • 브라우저끼리 실시간 비디오/오디오 스트림 주고받기

Peer A

// 브라우저 JavaScript 

const peerA = new RTCPeerConnection();
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
  .then(stream => {
    stream.getTracks().forEach(track => peerA.addTrack(track, stream));
  });

peerA.createOffer().then(offer => {
  peerA.setLocalDescription(offer);
  // 시그널링 서버로 offer 전송
});

 

 

Peer B

const peerB = new RTCPeerConnection();
peerB.ontrack = event => {
  const video = document.querySelector("#remoteVideo");
  video.srcObject = event.streams[0];
};
// 시그널링 서버로부터 offer 받고 answer 생성

 


P2P 데이터 전송 (DataChannel)

  • 브라우저 간 텍스트/파일 전송

Peer A

const peerA = new RTCPeerConnection();
const dataChannel = peerA.createDataChannel("chat");

dataChannel.onopen = () => {
  dataChannel.send("Hello from A!");
};

peerA.createOffer().then(offer => peerA.setLocalDescription(offer));

 

Peer B

const peerB = new RTCPeerConnection();
peerB.ondatachannel = event => {
  const receiveChannel = event.channel;
  receiveChannel.onmessage = e => console.log("Received:", e.data);
};

 

 


시그널링 서버 구축 (Python WebSocket)

  • WebRTC 연결을 위해 Off/answer/ICE candidate 정보를 중개하는 서버

python WebSocket 시그너링 서버

 

import asyncio
import websockets

clients = set()

async def signaling_handler(websocket, path):
    clients.add(websocket)
    try:
        async for message in websocket:
            await asyncio.wait([ws.send(message) for ws in clients if ws != websocket])
    finally:
        clients.remove(websocket)

start_server = websockets.serve(signaling_handler, "localhost", 9999)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

 

→ WebRTC offer/answer/ICE 정보를 이 서버로 전달하고 상대 peer에게 중계

 

 


+ python에서도 aiotc 라이브러리를 통해 WebRTC peer를 구현할 수 있다.

(다음 글에)

반응형
반응형

WebSocket가 궁금하면 여기에 참고

 

https://ryu-earth.tistory.com/entry/WebRTC-vs-WebSocket

 

WebRTC vs WebSocket

WebRTC와 WebSocket은 둘 다 브라우저 간 실시간 데이터 전송을 가능하게 해주지만, 목적과 동작 방식이 다르다. WebRTC란?Web Real-Time Communication의 약자브라우저 간 P2P(Peer-to-Peer) 실시간 오디오, 비디오,

ryu-earth.tistory.com

 


 

시나리오

실시간 채팅 앱, 실시간 알림, 게임 서버

서버와 클라이언트가 실시간으로 텍스트/데이터를 빠르게 주고받아야 하는 경우

 

Python WebSocket 예제

실시간 채팅 앱

  • 사용자가 보낸 메세지를 서버가 받아서 모든 클라이언트에 실시간으로 브로드캐스트
# python server

import asyncio
import websockets

clients = set()

async def handler(websocket, path):
    clients.add(websocket)
    try:
        async for message in websocket:
            await asyncio.wait([ws.send(message) for ws in clients if ws != websocket])
    finally:
        clients.remove(websocket)

start_server = websockets.serve(handler, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

 

// 브라우저 클라이언트 코드

const ws = new WebSocket("ws://localhost:8765");
ws.onmessage = (event) => console.log("Received:", event.data);
ws.onopen = () => ws.send("Hello everyone!");

 

 


실시간 주식 시세 전송

  • 서버에서 실시간으로 주식 가격 정보를 클라이언트에게 푸시
# python server

async def price_push():
    while True:
        await asyncio.sleep(1)
        price = random_price_generator()
        await asyncio.wait([ws.send(str(price)) for ws in clients])

 

// javascript client

ws.onmessage = (e) => updateStockPrice(e.data);

 

 


주의점

브라우저 클라이언트 코드는 js로 구현해야하는가요?

 

브라우저 클라이언트에서는 기본적으로 WebSocket API가 JavaScript로 제공

그래서 브라우저 환경에서 WebSocket 클라이언트를 짤 때는 JavaScript (또는 TypeScript)를 써야함

 

왜냐면

  • 브라우저의 window 객체에 WebSocket이라는 전역 객체가 내장돼있고
  • HTML + JS 조합으로 동작하는 웹 프론트엔드에선 JavaScript로 제어하는 것이 기본

브라우저용 WebSocket 클라이언트

const ws = new WebSocket("ws://localhost:8765");

ws.onopen = () => {
  console.log("Connected to server");
  ws.send("Hello from browser!");
};

ws.onmessage = (event) => {
  console.log("Received:", event.data);
};

ws.onclose = () => {
  console.log("Connection closed");
};

 

 

예외적인 상황

만약 브라우저 환경이 아니라 Python같은 데스크탑 앱, CLI 앱, 서버, IoT 기기라면

websockts 같은 Python WebSocket 클라이언트 라이브러리로도 통신 가능

 

import asyncio
import websockets

async def client():
    async with websockets.connect("ws://localhost:8765") as websocket:
        await websocket.send("Hello from Python client!")
        response = await websocket.recv()
        print(response)

asyncio.run(client())

 

 

→ 브라우저 클라이언트는 JavaScript로, server나 데스크탑/CLI에서는 Python 같은 언어로 WebSocket 클라이언트를 구현할 수 있다.

반응형
반응형

 

WebRTC와 WebSocket은 둘 다 브라우저 간 실시간 데이터 전송을 가능하게 해주지만, 목적과 동작 방식이 다르다.

 

https://www.apizee.com/what-is-webrtc.php


WebRTC란?

  • Web Real-Time Communication의 약자
  • 브라우저 간 P2P(Peer-to-Peer) 실시간 오디오, 비디오, 데이터 스트리밍을 위한 프로토콜
  • 별도의 플러그인 설치 없이 브라우저에서 바로 사용 가능
  • 주로 영상 통화, 음성 통화, 실시간 화상회의 서비스 등에 활용

주요 특징

  • P2P 직접 연결 (네트워크 상황에 따라 STUN/TURN 서버 필요)
  • 오디오/비디오 스트림 전송에 최적화
  • 데이터채널 기능을 통해 텍스트/바이너리 데이터 전송 가능

WebSocket이란?

  • 브라우저와 서버 간 풀 이중(Full Duplex) 통신을 위한 프로토콜
  • 단방향인 HTTP와 달리 서버와 클라이언트가 서로 자유롭게 데이터 송수신 가능
  • 게임, 채팅, 실시간 알림, 주식 시세표 같은 서비스에 활용

주요 특징

  • TCP 기반의 지속적인 연결 유지
  • 서버에서 클라이언트로 실시간 Push 가능
  • 데이터 전송은 텍스트와 바이너리 형태

WebRTC vs WebSocket 비교

항목 WebRTC WebSocket
통신 방식 P2P (브라우저-브라우저) 클라이언트-서버
주요 용도 실시간 오디오/비디오/데이터 스트리밍 채팅, 알림, 실시간 데이터 전송
서버 의존성 최소화 가능 (P2P 연결) 필수 (항상 서버 거쳐야 함)
데이터 전송 텍스트, 바이너리, 오디오, 비디오 스트림 텍스트, 바이너리
설정 복잡도 복잡 (NAT Traversal, STUN/TURN 필요 가능) 상대적으로 간단
보안 기본적으로 DTLS-SRTP 암호화 지원 TLS(보통 wss 프로토콜)로 암호화 가능

 


언제 어떤 걸 쓸까?

  • 영상/음성 통화, 화면 공유, 실시간 영상 서비스 → WebRTC
  • 실시간 채팅, 게임 서버, 실시간 알림 서비스 → WebSocket

사실 두 기술을 조합해서 사용하는 경우도 많다. 예를 들어 WebRTC로 P2P 영상통화를 하면서, WebSocket으로 연결 초기 설정(Signaling) 메시지를 주고받는 식.

 


정리

WebRTC는 브라우저끼리 직접 오디오, 비디오, 데이터 스트림을 주고받을 때,
WebSocket은 서버와 클라이언트 간 양방향 텍스트/데이터 전송이 필요할 때 사용하는 것이 적합

서로 대체하는 기술이라기보다는, 목적에 따라 쓰임새가 달라서 상황에 맞게 적절히 선택하는 게 중요

반응형
반응형

파이썬 메모리 구조

[이미지 출처 :  https://pearlluck.tistory.com/758]

 

  • Code 영역 : 실행할 프로그램의 코드가 저장
  • Data 영역 : 전역변수/정적 변수를 저장하는 공간. 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸
  • Stack 영역 : 지역 변수/매개변수를 저장하는 공간. 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
  • Heap 영역 : 사용자의 동적 할당으로 생성되는 공간. 사용자의 공간의 크기를 직접 관리할 수 있다. 메소드 호출이 끝나도 소멸되지 않는다.

Heap 영역의 크기 : 프로그램이 실행되는 도중인 런타임에 사용자가 직접 결정 -> 동적 할당
Data 영역과 Stack 영역의 메모리 크기 : 컴파일 타임에 미리 결정 -> 정적 할당

고정적으로 메모리를 할당받는 것 보다,

런타임에 메모리를 할당받는 '동적할당'을 통해 'Heap 영역'을 사용하는 것이 더 효율적!

 

def f2(x):
    x = x + 1
    return x
    
def f1(x):
    x = x * 2
    y = f2(x)
    return y

y = 5
z = f1(y)

 


Heap vs Stack 비교

Stack영역이 클수록 Heap의 영역은 작아진다. 반면에 Heap영역이 클수록 Stack영역이 작아진다.

  • Stack
    • 이미 할당되어 있는 공간을 사용.
    • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
    • 한계가 있어 초과하게 삽입할 수 없다. -> 유연성이 낮음
  • Heap
    • 사용자가 할당해서 사용하는 공간
    • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

-> Stack의 속도가 훨씬 빠르다. (하지만, stack은 공간이 매우 적기 때문에 모든 응용에서 stack을 사용할 수는 없다.)

 


JAVA와 Python의 메모리 할당 방식 차이점

Java : static method는 Data 영역에 저장된다.
Python : static method든 class method든 자동으로 모든 객체들이 heap영역에 저장된다. -> 내부에서 효율적으로 메모리를 쓸수 있도록 자동적으로 동적할당 해주기 때문에, 사용자가 직접 메모리를 관리할 필요가 없다.

 

Reference

 

🧐 파이썬 코드를 잘 짜는 법 : 메모리 구조와 메모리 할당방식 이해

사실 지금 코틀린을 공부해야만 하는 상황인데, 갑자기 파이썬 글 쓰기..ㅎㅎ 역시 사람은 모순적인 동물이야..나는 청개구리 그전에 오래전에 내가 썼던 자바와 파이썬의 차이점을 먼저 되짚어

pearlluck.tistory.com

 

 

Python - 메모리 구조 및 메모리 할당 과정

목차 Everything is object in Python 파이썬의 메모리 구조 파이썬에서의 Heap 사용 파이썬에서의 메모리 할당 과정 Everything is object in Python x = 10 print(type(x)) >> C에서 x = 10 이렇게 변수를 할당하면, 메모리

woochan-autobiography.tistory.com

 

 
반응형
반응형

원문

 

Lakehouse reference architectures (download) | Databricks Documentation

Overview of the lakehouse architecture in terms of data source, ingestion, transformation, querying and processing, serving, analysis, and storage.

docs.databricks.com

 

 

Databricks Lakehouse는 GCP 기반의 데이터 통합 분석 플랫폼
Databricks 자체 엔진 + GCP 네이티브 서비스 + 파트너 솔루션 조합으로 구성되어 있고, Batch/Streaming/ML/BI/CDC/Federation 등 다양한 워크로드를 처리할 수 있도록 설계되어 있음.

 

 


1. Source

정형 / 반정형 / 비정형 데이터를 모두 수용

유형 예시
정형 데이터 RDBMS, Business Applications
반정형 데이터 JSON, CSV 등 (Logs, Files)
비정형 데이터 미디어, IoT, 센서
외부 데이터 타 클라우드, BigQuery (Federation)

*Federation: ETL 없이 SQL DB를 Databricks SQL에서 직접 쿼리 가능 (Unity Catalog에 매핑)

 

 

2. Ingest (데이터 수집)

유형 GCP 서비스설명
Batch Cloud Data Fusion, Storage Transfer - Cloud Storage로 데이터를 이동
- Cloud Storage로 전달된 파일 → Auto Loader로 읽음
Streaming Kafka, Pub/Sub, Datastream 실시간 이벤트 데이터 처리
Databricks Auto Loader, Structured Streaming 파일 변화 감지, Kafka/IoT 수신 등

 

3. Storage (데이터 저장)

 

Cloud Storage (Object Storage) 기반으로 저장하며, Databricks는 이를 Delta Lake 포맷으로 관리하여 Medallion Architecture (Bronze → Silver → Gold) 형태로 운영

 

 

4. Transform / Query & Process (변환/처리)

컴포넌트 설명
Apache Spark / Photon 고속 병렬 처리 엔진
DLT (Delta Live Tables) 선언형 방식의 안정적 ETL 파이프라인
Databricks SQL SQL 기반 쿼리 및 데이터 웨어하우스
ML/AI AutoML, Feature Engineering, MLflow 관리
Mosaic AI 생성형 AI 통합 (LLM 포함)

 

5. Serve (서빙)

대상 도구 / 기능
BI/DWH Databricks SQL, Serverless SQL Warehouse
ML 모델 Model Serving (MLflow 기반), Mosaic AI Gateway
외부 시스템 Operational DB (예: Cloud SQL 등)으로 결과 Export

 

6. Analysis (분석)

대상 도구
BI 시각화 Looker, Tableau, Genie (Databricks Dashboards)
Custom App Operational DB에 있는 골든 테이블을 활용
SQL Dev Databricks SQL Editor (쿼리, 대시보드 지원)

 

7. Integrate (통합)

범주 내용
인증/보안 ID Provider 통합 (SSO 등)
AI 서비스 OpenAI, HuggingFace, LangChain 연결
오케스트레이션 Airflow, Cloud Composer, REST API
Governance Unity Catalog (통합 권한, 계보 추적, 데이터/모델 거버넌스)
데이터 공유 Delta Sharing, Databricks Marketplace (공식 교환소)

 

 

공통 기능 (전 영역 공통)

Databricks Lakehouse 플랫폼 내에서 모든 워크로드에서 사용할 수 있는 기능들

기능 설명
Unity Catalog 통합 거버넌스: 테이블, 모델, 피처, 사용자 권한, 계보 추적 등
Databricks IQ 추천 기반 최적화 기능
Databricks Assistant 노트북/에디터에서 AI 코딩 보조
Observability 시스템 테이블 기반 모니터링/성능 추적
CI/CD & MLOps DLT + Databricks Jobs + MLflow 로 자동화 파이프라인 운영

 


 

사용사례

  1. Use case: Batch ETL

2. Use case: Streaming and change data capture (CDC)

3. Use case: Machine learning and AI

 

4. Use case: BI and SQL analytics

 

5. Use case: Lakehouse federation

 

6. Use case: Enterprise data sharing

 

반응형
반응형
What is a data lakehouse?
위의 글을 토대로 작성된 글입니다.

 

 

Data Lakehouse는 Data Lake + Data warehouse 각 장점을 결합한 아키텍처로, 머신러닝(ML), 비즈니스 인텔리전스 (BI), 데이터 엔지니어링을 위한 통합 플랫폼을 제공

 

 


Data Lakehouse

데이터 레이크하우스는 두 시스템의 장점을 결합한 하이브리드 아키텍처

  • 데이터 웨어하우스: 구조화된 데이터, 빠른 분석, BI에 최적화
  • 데이터 레이크: 다양한 포맷과 형태의 데이터를 저장, 머신러닝(ML)에 적합

데이터 레이크하우스는 데이터를 계층적으로 정제하고 저장하면서, 이를 다양한 워크로드 (BI, ML 등)에 동시에 사용할 수 있는 단일 데이터 소스를 제공.
이는 데이터 사일로를 줄이고, 중복 비용을 없애며, 최신 데이터를 기반으로 한 의사결정을 가능하게 함

 

 


Data Lakehouse architecture

Databricks는 데이터 레이크하우스 아키텍쳐는 다음과 같은 주요 요소로 구성

  1. 데이터 수집: 다양한 소스에서 데이터를 배치 또는 스트리밍 형식으로 수집. 수집된 데이터는 Delta Lake를 사용하여 검증된 테이블로 변환되며, 스키마 강제 규칙을 통해 데이터 품질이 유지
  2. 데이터 처리 및 큐레이션: 데이터를 전제하고 새로운 특성을 생성하여 머신러닝을 위한 준비를 함. 스키마 진화(Schema Evovlution) 기능을 통해 기존 파이프라인을 방해하지 않고 데이터를 변경할 수 있음

    *스키마 진화(Schema Evolution) 기능이란?
    데이터 저장 구조(스키마)가 변경되더라도 기존 데이터나 시스템과의 호환성을 유지하면서 새로운 데이터를 처리할 수 있게 해주는 기능
  3. 데이터 제공: 정제된 데이터를 BI, 머신러닝 및 보고서 작성 등 다양한 용도로 최종 사용자에게 제공. 각 사용 사례에 맞게 최적화된 데이터 구조로 제공

 


Databricks에서의 Data Lakehouse 핵심 기술

Databricks는 Apache Spark 기반의 플랫폼으로, 다음과 같은 핵심 기술을 통해 Lakehouse를 구현

  1. Delta Lake
  • 데이터 레이크 위에 ACID 트랜잭션, 스키마 강제, 데이터 버전 관리 등의 기능을 더하여 데이터 안정성과 신뢰성을 높이는 스토리지 계층
  1. Unity Catalog
  • 조직 내 데이터 및 AI 자산에 대한 중앙 집중식이고 세밀한 거버넌스 솔루션을 제공하여 데이터 보안과 쥬정 준수를 강화

 


Data Lakehouse 활용

  • 실시간 데이터 분석: 스트리밍 데이터를 즉시 처리하여 실시간 인사이트를 확보하고 신속한 의사 결정을 지원
  • 데이터 통합 및 단일 정보 소스 구축: 모든 데이터를 하나의 시스템으로 통합하여 데이터 사일로를 제거하고, 조직 전체의 일관된 데이터 뷰를 제공
  • 유연한 스키마 관리: 비즈니스 변화에 따라 데이터 스키마를 자유롭게 변경하여 데이터 파이프라인의 유연성과 적응성을 높임
  • 고성능 데이터 변환: Apache Spark와 Delta Lake의 강력한 성능을 활용하여 대규모 데이터 변환 작업을 빠르고 안정적으로 처리
  • 통합된 분석 및 보고: 데이터 웨어하우스 수준의 성능으로 복잡한 분석 쿼리를 실행하고, BI 및 보고 기능을 효율적으로 지원
  • AI 및 머신러닝 역량 강화: 모든 데이터에 고급 분석 기술과 머신러닝 모델을 적용하여 데이터의 가치를 극대화하고 새로운 인사이트 발굴
  • 데이터 거버넌스 및 보안 강화: 중앙 집중식 거버넌스 시스템을 통해 데이터 접근 권한을 효과적으로 관리하고 감사를 수행하여 데이터 보안 및 규제 준수를 용이하게 함
  • 데이터 협업 및 공유 증진: 큐레이션된 데이터셋과 분석 결과를 팀 간에 쉽게 공유하여 데이터 기반 협업을 활성화
  • 운영 효율성 증대: 머신러닝 기반 운영 분석을 통해 데이터 품질, 모델 성능 변화 등을 실시간으로 모니터링하고 예측하여 시스템 운영 효율성을 높임

 


 

Databricks Lakehouse의 작동 원리

수집(Ingestion)  처리, 큐레이션 및 통합(Processing, Curation, and Integration)  제공(Serving)의 3단계로 나누어 관리

  • 수집 (Ingestion): 다양한 소스의 원시 데이터를 Delta Lake 형식으로 안전하게 저장하고, 스키마 강제 및 Unity Catalog를 통한 거버넌스를 적용
  • 처리, 큐레이션 및 통합 (Processing, Curation, and Integration): 데이터 과학자 및 엔지니어가 데이터를 정제, 변환, 통합하여 분석 활용에 적합한 형태로 만듦. Delta Lake의 스키마 진화 기능을 통해 다운스트림 작업에 영향을 최소화하며 스키마 변경이 가능
  • 제공 (Serving): 최종 사용자의 다양한 요구 사항에 맞춰 최적화된 형태로 데이터를 제공. Unity Catalog를 통해 데이터 계보 추적이 가능하며, 통합된 거버넌스 모델을 통해 데이터 접근 및 사용을 통제

 


Lakehouse의 계층 구조(Medallion Architecture)

아래와 같은 계층적 데이터 설계를 따름

  • Bronze Layer - 데이터 수집
    • batch/streaming 방식으로 다양한 소스에서 원시(Raw) 데이터를 수집
    • Delta Lake로 변환하면서 스키마 유효성 검사 수행
  • Silber Layer - 데이터 정제
    • 결측값 처리, 포맷 정리, 데이터 클렌징 등 데이터 품질 개선
    • 분석/ML에 적합한 포맷으로 변환
  • Gold Layer - 데이터 서빙
    • 비즈니스 사용자를 위한 최종 분석 테이블 제공
    • BI 리포트, 대시보드, ML 모델링에 바로 활용 가능

 


주요 기능 정리

기능 설명
실시간 데이터 처리 스트리밍 데이터 실시간 분석
통합 데이터 저장 모든 데이터를 하나의 시스템에 저장
스키마 진화 데이터 구조 변경을 유연하게 반영
데이터 버전 관리 및 계보 변경 이력 및 계보 추적 가능
머신러닝 지원 ML 모델 학습/예측에 최적화된 구조
데이터 거버넌스 통합된 보안 및 접근 제어 체계
데이터 공유 팀 간 데이터 세트 및 리포트 공유
운영 데이터 분석 모델 품질, 데이터 품질 모니터링 가능

 


레이크하우스 vs 데이터 레이크 vs 데이터 웨어하우스

특징 데이터 레이크 (Data Lake) 데이터 웨어하우스 (Data Warehouse) 데이터 레이크하우스 (Data Lakehouse)
데이터 형식 모든 형식 (정형, 비정형, 반정형) 정형 데이터 모든 형식 (Delta Lake를 통해 구조화 및 관리)
스키마 스키마-온-리드 (Schema-on-Read) 스키마-온-라이트 (Schema-on-Write) 스키마-온-리드 및 스키마-온-라이트 지원 (Delta Lake의 스키마 강제)
데이터 처리 데이터 과학, 머신러닝에 주로 사용 BI, 보고, 분석에 최적화 데이터 과학, 머신러닝, BI, 보고 등 다양한 워크로드 지원
성능 대규모 데이터 저장 및 처리에는 효율적이나, 복잡한 쿼리 성능 저하 가능성 복잡한 분석 쿼리에 최적화, 빠른 응답 시간 최적화된 메타데이터 레이어 및 데이터 레이아웃으로 높은 쿼리 성능 및 안정성
거버넌스 상대적으로 낮은 거버넌스 및 보안 엄격한 거버넌스 및 보안 통합된 거버넌스 및 보안 (Unity Catalog 활용)
ACID 트랜잭션 지원하지 않음 지원 Delta Lake를 통해 지원

 

 


정리

Lakehouse는 데이터 레이크의 확장성과 유연성, 그리고 데이터 웨어하우스의 안정성과 쿼리 성능을 결합한 차세대 데이터 아키텍처
다양한 형식의 데이터를 저렴하게 저장하면서, 정제된 데이터로 고속 분석과 머신러닝 작업가지 가능하게 해줌
하나의 플랫폼에서 실시간 처리, 데이터 거버넌스, 분석 및 AI 워크로드까지 모두 다룰 수 있어, 데이터 사일로를 줄이고 조직 전체가 하나의 신뢰할 수 있는 데이터 기반으로 협업할 수 있게 도와줌

*데이터 사일로(Data Silo)
조직 내에서 데이터가 부서나 팀 단위로 고립되어 서로 공유되지 않는 상태

반응형

+ Recent posts