반응형

https://ko.wikipedia.org/wiki/%EC%B9%B4%EB%93%9C_%EB%B2%88%ED%98%B8%EC%9D%98_%EA%B5%AC%EC%84%B1

 

→ 여기서 카드 번호의 구성 확인 가능

 


1. 주 산업 식별번호 (MII, Master Industry Identifier)

  • 카드번호 첫 번째 자리
숫자 산업
0 ISO/TC 68 및 기타
1 항공/교통
2 멤버십
3 여행/엔터 (JCB, 아멕스, 다이너스 클럽 등)
4 VISA
5 Mastercard/마에스트로
6 디스커버, 은련
7 석유 등 기타
8 헬스케어/통신
9 해외결제 불가

 

 

2. 발급자 식별번호 (IIN/BIN, Issuer Identification Number)

 

  • 카드번호 앞 6자리
  • 카드사와 카드 종류 구분 가능
카드사 IIN 범위 전체 자릿수
아멕스 34, 37 15
VISA 4 16
마에스트로, 시러스 50, 56~59 16
마스터카드 51~55(2221~2720 2017년부터~) 16
은련 622126~622925, 624~626, 6282~6288 16
다이너스 클럽 300~305, 3095, 36, 38, 39 14
디스커버 60110, 60112~60114, 601174~601179, 601186~601199, 644~649, 65(60,61,64,65) 16
JCB 3528, 3589 16

 


 

3. 룬 알고리즘(Luhn Algorithm)으로 카드번호 유효성 검사

def luhn_check(card_number):
    card_number = [int(x) for x in str(card_number)]
    check_sum = 0

    # 역순으로 순회하며 홀짝 구분
    for i, num in enumerate(reversed(card_number)):
        if i % 2 == 1:
            num *= 2
            if num > 9:
                num -= 9
        check_sum += num

    return check_sum % 10 == 0


# 예시
print(luhn_check("4539578763621486"))  # True
print(luhn_check("4539578763621485"))  # False

 

 


룬 알고리즘 (Luhn Algorithm) 이란?

신용카드, 주민번호, IMEI 같은 숫자 코드가 유효한지 검증하는 방법
1954년에 IBM의 한 과학자 Hans Peter Luhn이 고안

쉽게 말하면, 카드번호가 실수로 틀린 번호인지 빠르게 확인하는 간단한 수학 공식

 


작동 방법

카드번호가 4539 5787 6362 1486라면

오른쪽부터 하나씩 숫자를 순서대로:

  1. 짝수 번째 자리의 숫자는 그대로 두고
  2. 홀수 번째 자리의 숫자는 2배를 곱하기
  3. 만약 2배한 값이 9보다 크면 9를 뺌 (또는 각 자리수 합)
  4. 이렇게 변환된 값들을 전부 더해서
  5. 그 합이 10으로 나누어떨어지면 유효한 번호

예시

카드번호: 4539 5787 6362 1486

오른쪽부터

자리 숫자 위치 처리
6 6 홀수 6×2=12 → 12-9=3
8 8 짝수 8
4 4 홀수 4×2=8
1 1 짝수 1
2 2 홀수 2×2=4
6 6 짝수 6
3 3 홀수 3×2=6
6 6 짝수 6
7 7 홀수 7×2=14 → 14-9=5
8 8 짝수 8
7 7 홀수 7×2=14 → 14-9=5
5 5 짝수 5
9 9 홀수 9×2=18 → 18-9=9
3 3 짝수 3
5 5 홀수 5×2=10 → 10-9=1
4 4 짝수 4

합계 = 3+8+8+1+4+6+6+6+5+8+5+5+9+3+1+4 = 82

82 % 10 == 2 → 2이므로 유효하지 않음

반응형
반응형

가상환경 생성

기본적으로 .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

 

반응형

+ Recent posts