๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป58

Celery๋ฅผ ์ด์šฉํ•œ ํฌ๋กค๋ง ์˜ˆ์ œ ๊ฐœ์š”Airflow์™€ Celery๋ฅผ ๋น„๊ตํ–ˆ๋‹ค. ํฌ๋กค๋ง ๊ด€๋ฆฌ Airflow vs Celery๊ฐœ์š”๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํฌ๋กค๋ง ์‹œ์Šคํ…œ์„ Airflow๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.Airflow ์šด์˜ ์ค‘์ด๋˜ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋Š” ๋ฐ, ๊ทธ ์ค‘์—์„œ ์ œ์ผ ํฐ ๋ฌธ์ œ๋Š” cpu ์ ์œ ์œจ์ด 100์œผ๋กœ ์น˜์†Ÿ์„ ๋•Œ๊ฐ€ ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.Airflow๋กœ ์šด์˜bonory.tistory.com ํฌ๋กค๋ง ์ง„ํ–‰ ์‹œ, Celery๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋” ์ ํ•ฉํ•˜๋‹ค๋Š” ํŒ๋‹จ๊ณผ ํ•จ๊ป˜ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. FastAPI + Celery + requests + BeautifulSoup ๋ฅผ ํ™œ์šฉํ•œ ํฌ๋กค๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์˜ˆ์ œํฌ๋กค๋ง์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ง„ํ–‰๊ธฐ๋ณธ ๊ตฌ์กฐFastAPI: ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ํ†ตํ•ด ํฌ๋กค๋ง ์š”์ฒญ์„ ๋ณด๋ƒ„Celery: ์š”์ฒญ์„ ํ์— ๋„ฃ๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ .. 2025. 2. 5.
ํฌ๋กค๋ง ๊ด€๋ฆฌ Airflow vs Celery ๊ฐœ์š”๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํฌ๋กค๋ง ์‹œ์Šคํ…œ์„ Airflow๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.Airflow ์šด์˜ ์ค‘์ด๋˜ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋Š” ๋ฐ, ๊ทธ ์ค‘์—์„œ ์ œ์ผ ํฐ ๋ฌธ์ œ๋Š” cpu ์ ์œ ์œจ์ด 100์œผ๋กœ ์น˜์†Ÿ์„ ๋•Œ๊ฐ€ ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.Airflow๋กœ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ด ๋งŽ์ด ๋ฌด๊ฒ๊ณ  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ์— Airflow๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์กฐ์‚ฌ ๋ฐ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.ํ™•์ธAirflow๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ์— ์ตœ์ ํ™”๋œ ๋„๊ตฌ์ด๋‹ค. ํฌ๋กค๋ง ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ์—๋Š” Celery๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค.Airflow์™€ Celery๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด ๋น„๊ต ํ•ญ๋ชฉCeleryAirflow์ฃผ์š” ๋ชฉ์ ๋น„๋™๊ธฐ ์ž‘์—… ์‹คํ–‰ (ํƒœ์Šคํฌ ํ)๋ฐ์ดํ„ฐ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ด€๋ฆฌ์ž‘์—… ์‹คํ–‰ ๋ฐฉ์‹๋น ๋ฅธ ์‹คํ–‰, ๋‹จ์ˆœํ•œ ์ž‘์—… ์ฒ˜๋ฆฌDAG ๊ธฐ๋ฐ˜,.. 2025. 2. 4.
[Proxy] ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ Reverse Proxy ์ •๋ฆฌ ๊ฐœ์š” ํŠน์ • port์˜ ์„œ๋น„์Šค์—๋งŒ HTTPS 443 SSL ์ ์šฉํ•˜๊ธฐ๊ฐœ์š”์šด์˜์ค‘์ธ ์„œ๋น„์Šค ์ค‘์—์„œ 8003 ํฌํŠธ์—๋งŒ ssl ์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.์ง„ํ–‰ ์š”์•ฝ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ์—†์ด IP๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ OpenSSL๋กœ ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.NGINX๋ฅผ HTTPS ์ฒ˜๋ฆฌ ๋‹ด๋‹น์ž๋กœ ๋‘๊ณ ,bonory.tistory.com8003 ํฌํŠธ์—๋งŒ https ์ ์šฉํ•˜๋ฉด์„œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.ํ™•์ธProxy ์„ค์ • ์ฝ”๋“œ:location / { proxy_pass http://127.0.0.1:8003; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'u.. 2025. 1. 24.
ํŠน์ • port์˜ ์„œ๋น„์Šค์—๋งŒ HTTPS 443 SSL ์ ์šฉํ•˜๊ธฐ ๊ฐœ์š”์šด์˜์ค‘์ธ ์„œ๋น„์Šค ์ค‘์—์„œ 8003 ํฌํŠธ์—๋งŒ ssl ์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.์ง„ํ–‰ ์š”์•ฝ๋„๋ฉ”์ธ ์ด๋ฆ„์ด ์—†์ด IP๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ OpenSSL๋กœ ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.NGINX๋ฅผ HTTPS ์ฒ˜๋ฆฌ ๋‹ด๋‹น์ž๋กœ ๋‘๊ณ , ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋กœ ํ”„๋ก์‹œํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค์ •openssl ์ธ์ฆ์„œ ์‚ฌ์šฉ ์‹œ “์ฃผ์˜ ์š”ํ•จ” ๊ฒฝ๊ณ  ํ™•์ธ → ๋ฌด๋ฃŒ ๊ณต์ธ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์ง„ํ–‰์ธ์ฆ์„œ ์ž๋™ ๊ฐฑ์‹  ์„ค์ •์ง„ํ–‰1. openssl๋กœ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/selfsigned.key \ -out /etc/ssl/certs/selfsigned.crt-x509: ์ž์ฒด ์„œ๋ช… ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑ-d.. 2025. 1. 22.
RPC vs gRPC RPC (Remote Procedure Call)ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC)์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋“ฏ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๋‚˜ ์„œ๋ฒ„์˜ Procedure(ํ•จ์ˆ˜)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐœ๋…ํ•ต์‹ฌ ๊ฐœ๋…: ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ์„œ๋ฒ„์˜ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š”๋‹ค.์ž‘๋™ ๋ฐฉ์‹:ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜ธ์ถœํ•˜๋ ค๋Š” ํ•จ์ˆ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•Œ์ง€๋งŒ, ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„์˜ ์œ„์น˜๋Š” ์ถ”์ƒํ™”๋˜์–ด ์žˆ๋‹ค.์š”์ฒญ์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๊ณ , ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜๋œ๋‹ค.๊ตฌํ˜„ ๋ฐฉ์‹:XML-RPCJSON-RPCSOAP ๋“ฑ …์žฅ์ :๋กœ์ปฌ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ๋‹จ์ :๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์— ์˜์กด๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”์— ์ถ”๊ฐ€ ๋น„์šฉ ๋ฐœ์ƒ์ƒํ˜ธ ์šด์šฉ์„ฑ ์ œํ•œ(๋‹ค๋ฅธ ์–ธ์–ด๋‚˜ ์‹œ์Šคํ…œ ๊ฐ„ ์—ฐ๊ฒฐ์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค)gRPCRPC์˜ ํ˜„๋Œ€์ .. 2025. 1. 14.
[MongoDB] ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์ •๋ฆฌ ๊ฐœ์š”์ด๋ฒˆ์— ํฌ๋กค๋งํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฝ๊ณ ๋””๋น„์— ์ ์žฌํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ง„ํ–‰ํ–ˆ๋‹ค.์ฒ˜์Œ์œผ๋กœ ๋ชฝ๊ณ ๋””๋น„๋ฅผ ์ ‘ํ•ด๋ณด๋Š” ๊ฒธ ๊ฐœ๋… ์ •๋ฆฌ๋ฅผ ํ•ด๋ณผ๊นŒ ํ•œ๋‹ค.๋ชฝ๊ณ ๋””๋น„ MongoDB์˜คํ”ˆ์†Œ์Šค์ด๋‹คNoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ JSON ์œ ์‚ฌํ•œ ๋ฌธ์„œ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š”๊ฒŒ ํŠน์ง•์ด๋‹ค.์ „ํ†ต์ ์ธ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDBMS)์™€๋Š” ๋‹ฌ๋ฆฌ, ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋‹ค. ํŠน์ง•(1) ๋ฌธ์„œ ๊ธฐ๋ฐ˜(Document-oriented) ์ €์žฅ- ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ”์˜ ํ–‰(row)์œผ๋กœ ์ €์žฅํ•˜๋Š” RDBMS์™€ ๋‹ฌ๋ฆฌ, MongoDB๋Š” BSON(Binary JOSN) ํฌ๋งท์˜ ๋ฌธ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.- ์˜ˆ:{ "name": "John", "age": 30, "skills": ["Python", "JavaScript"]} (2) ์Šคํ‚ค๋งˆ๋ฆฌ์Šค(Schema-less)- ๋ฐ์ด.. 2025. 1. 10.
[python] gRPC ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ gRPC์™€ websocket์„ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค [gRPC] gRPC๊ณผ websocket ๋น„๊ต ์ •๋ฆฌ๊ธฐ์กด์— ๊ฐœ๋ฐœํ–ˆ๋˜ ์„œ๋น„์Šค์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ํ†ต์‹ ์„ websocket ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.๋‹ค ๋๋‚ด๊ณ ๋‚˜์„œ ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ข€ ๋” ์„œ์น˜ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค๊ทธ๋ ‡๊ฒŒ ์•Œ๊ฒŒ๋œ gRPC. ์ •๋ฆฌํ•ด๋ณด์ž โœ… gRPCbonory.tistory.com ์ต์ˆ™ํ•˜์ง€ ์•Š์€ gRPC๋ฅผ python์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค 1. Protocol Buffers (Protobuf) ์ •์˜gRPC์˜ ํ•ต์‹ฌ์€ API ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” Protobuf ํŒŒ์ผ์ด๋‹ค!.proto ํŒŒ์ผ ์ž‘์„ฑํ•œ๋‹ค = ์„œ๋น„์Šค์™€ ๋ฉ”์‹œ์ง€์˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•œ๋‹ค greeter.protosyntax = "proto3";service Greeter { rpc Sa.. 2025. 1. 2.
[python] PySide6๋กœ ์˜ฌ๋ฆฐ gui๋กœ ์›๊ฒฉ ์„œ๋ฒ„์˜ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ๊ฐœ์š”์ด๋ฒˆ์— ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธํ•ด์„œ 2๊ฐ€์ง€๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผํ–ˆ๋‹ค. 1. ์›๊ฒฉ ์„œ๋ฒ„์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋กœ์ปฌ์— ๋‹ค์šด๋กœ๋“œํ•ด์•ผํ•œ๋‹ค. (ํŒŒ์ผ์ด ์ปค์„œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋‹ˆ, progress bar๋กœ ์ง„ํ–‰ ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ฃผ์ž)2. PySide6๋กœ gui๋ฅผ ์˜ฌ๋ฆฐ๋‹ค. 1๏ธโƒฃ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œimport paramikoimport timedef download_file(hostname, port, username, password, remote_file_path, local_file_path, progress_callback): try: start = time.perf_counter() ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(par.. 2024. 12. 31.
์ธํ„ฐ๋„ท ์—†๋Š” 2๊ฐœ์˜ PC ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ฐœ์š”๋„คํŠธ์›Œํฌ๊ฐ€ ์•ˆ๋˜๋Š” ํ™˜๊ฒฝ์—์„œ PC 2๊ฐœ๊ฐ€ ํ†ต์‹ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ง€์— ๋Œ€ํ•œ search1๋ฒˆ PC : stt, llm์ด ์ง„ํ–‰๋˜๋ฉฐ ๋กœ๋ด‡์— ์ „๋‹ฌํ•  ๋ช…๋ น์„ return2๋ฒˆ PC : ๋กœ๋ด‡ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ. 1๋ฒˆ PC๋กœ ๋ถ€ํ„ฐ ๋ช…๋ น์–ด๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.Socket ํ†ต์‹  (TCP/UDP)์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด์šฉํ•˜๋ฉด 1๋ฒˆ PC์—์„œ ๋ฐ˜ํ™˜๋ฐ›์€ ๊ฐ’์„ 2๋ฒˆ PC๋กœ ์ง์ ‘ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋กœ์ผ“ ๋„คํŠธ์›Œํฌ์—์„œ ip์™€ port๋กœ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.๋น ๋ฅด๊ณ , ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์ ํ•ฉํ•˜๋‹ค.๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค.2๋ฒˆ PC์—์„œ ์†Œ์ผ“ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŠน์ • ํฌํŠธ๋ฅผ ์—ด์–ด๋‘”๋‹ค.1๋ฒˆ PC์—์„œ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์„ ํ†ตํ•ด 2๋ฒˆ PC์˜ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.python์—์„œ socket ๋ชจ๋“ˆ ์‚ฌ์šฉํ•˜๋ฉด ๋จํŒŒ์ผ ๊ณต์œ  ๋ฐฉ์‹ (SMP/NFS).. 2024. 11. 28.