๋ฐ˜์‘ํ˜•

 

RESTful, ๋น„ํšจ์œจ์  ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์„ธ์ง€ ํ”„๋กœํ† ์ฝœ

RESTful ์„œ๋น„์Šค๋Š” HTTP 1.x ์™€ ๊ฐ™์€ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ „์†ก ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์ถ•๋˜๊ณ , JSON ์ฒ˜๋Ÿผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ ํฌ๋งท์„ ํ™œ์šฉํ•จ.
๊ทธ๋Ÿฐ๋ฐ, ์„œ๋น„์Šค๊ฐ„ ํ†ต์‹ ์„ ํ•  ๊ฒฝ์šฐ(common server - user server ์ด๋Ÿฐ์‹?) ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํฌ๋งท์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ!
→ ๋น„ํšจ์œจ์ ์ด๋ผ ํŒ๋‹จํ•จ. 

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ˜ํ…์ธ ๋ฅผ ๋งŒ๋“  ํ›„, ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ตฌ์กฐ์ฒด๋ฅผ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•จ.
๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ…์ŠคํŠธ๋กœ ์ „์†กํ•˜๊ณ  ์„œ๋น„์Šค์ธก์—์„œ ๋‹ค์‹œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•จ.
→ ์ด๋Ÿด๋ฐ”์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ ๋ฐ”๋กœ ๋งคํ•‘๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์œผ๋กœ ์‰ฝ๊ฒŒ ์ „์†กํ•˜๋Š”๊ฒƒ์ด ๋‚ซ๋‹ค๊ณ  ํŒ๋‹จ!

 

 

RPC
์„ค๋ช…

ํด๋ผ์ด์–ธํŠธ - ์„œ๋น„์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ 
RPC์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ๋กœ์ปฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์›๊ฒฉ์œผ๋กœ ๋ฉ”์„œ๋“œ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

gRPC
์„ค๋ช…

๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ์‹œ์Šคํ…œ.

โ€ป ์›๊ฒฉ ํ”„๋กœ์‹œ์ €
๋ณ„๋„์˜ ์›๊ฒฉ ์ œ์–ด๋ฅผ ์œ„ํ•œ ์ฝ”๋”ฉ ์—†์ด ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ ์ด๋‹ค.
๋‹ค์‹œ ๋งํ•ด, ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์„ ์ด์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์— ๋กœ์ปฌ ์œ„์น˜์— ์žˆ๋“  ์›๊ฒฉ ์œ„์น˜์— ์žˆ๋“  ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋กœ์ปฌํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ ๋งŒํผ ์‰ฝ๊ฒŒ ๋ถ„์‚ฐ๋œ ์ด๊ธฐ์ข… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฐ๊ฒฐ/ํ˜ธ์ถœ/์šด์˜/๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ .
์ฃผ๋กœ ํ†ต์‹ ์— ๋™๊ธฐ์‹ ์š”์ฒญ-์‘๋‹ต ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋‚˜, ์ดˆ๊ธฐ ํ†ต์‹ ์ด ์„ค์ •๋˜๋ฉด ์™„์ „ ๋น„๋™๊ธฐ์‹์ด๊ฑฐ๋‚˜ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ์™€ HTTP/2 ํ”„๋กœํ† ์ฝœ ์œ„์— ๊ตฌ์ถ•๋จ.

โ€ป ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ
๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ณ ์ž ์–ธ์–ด์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ํ”Œ๋žซํผ ์ค‘๋ฆฝ์ ์ด๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ํ”„๋กœํ† ์ฝœ.
๋ฐ์ดํ„ฐ๊ฐ€ ์ง๋ ฌํ™”๋˜๋ฉด ์ด ํ”„๋กœํ† ์ฝœ์€ ์ผ๋ฐ˜ JSON ํŽ˜์ด๋กœ๋“œ๋ณด๋‹ค ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ฐ•๋ ฅํ•œ ํ˜•์‹์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•จ.
→ HTTP/2๋ผ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ „์†ก ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์ „์†ก!

 

๊ตฌ์„ฑ ํ”„๋กœ์ ํŠธ

โ— ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
โ€ฃ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, ์›๊ฒฉ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ์ข…๋ฅ˜, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฉ”์„ธ์ง€ ํ˜•์‹๋“ฑ์„ ํฌํ•จ.
โ€ฃ *.proto ํŒŒ์ผ๋กœ ์ •์˜(=์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ ์–ธ์–ด), ์ด๋Š” ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๋ฉ”์„ธ์ง€๋กœ RPC ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ํ•จ๊ป˜ gRPC ์„œ๋น„์Šค๋ฅผ ์ผ๋ฐ˜ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ํ˜•์‹์œผ๋กœ ์ •์˜ํ•จ.
โ€ฃ ํ”„๋กœํ†  ํŒŒ์ผ์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž gRPC ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์‚ฌ์šฉ๋œ๋‹ค.

โ€ป gRPC ํ”Œ๋Ÿฌ๊ทธ์ธ
gRPC ์„œ๋ฒ„์ธก, ํด๋ผ์ด์–ธํŠธ์ธก ์ฝ”๋“œ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ
์ •์˜๋œ ๋ฉ”์„ธ์ง€ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ์ง€์ •, ์ง๋ ฌํ™”, ๋ฐ์ดํ„ฐ ์ทจ๋“์˜ ์ผ๋ฐ˜ ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ์ฝ”๋“œ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

โ— ์„œ๋ฒ„
โ€ฃ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, protoc์„ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์ธก์ด๋‚˜ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ฃ ์Šค์ผˆ๋ ˆํ†ค(server skeleton) ์ด๋ผ๋Š” ์„œ๋ฒ„์ธก ์ฝ”๋“œ ์ƒ์„ฑ๊ฐ€๋Šฅ. ์ €์ˆ˜์ค€์˜ ํ†ต์‹  ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ์ธก ๋กœ์ง ๋‹จ์ˆœํ™” ๊ฐ€๋Šฅ.
  (gRPC ๊ด€๋ จ ์ƒ์œ„ ์„œ๋น„์Šค ํด๋ž˜์Šค๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์—ฌ ์Šค์ผˆ๋ ˆํ†ค(server skeleton) ์ด๋ผ๋Š” ์„œ๋ฒ„์ธก ์ฝ”๋“œ ๊ตฌํ˜„!)
โ€ฃ ๋กœ์ง ๊ตฌํ˜„ ํ›„, ์„œ๋ฒ„ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ˆ˜์‹  ๋ฐ ์‘๋‹ต!

โ— ํด๋ผ์ด์–ธํŠธ
โ€ฃ ์Šคํ…(client stub) ์ด๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ. ๋ฉ”์†Œ๋“œ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ์›๊ฒฉ ํ˜ธ์ถœ ๊ฐ€๋Šฅ.
โ€ฃ ์Šคํ…(client stub)์€ ์„œ๋ฒ„์™€ ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๋ฉ”์„œ๋“œ๋“ค์˜ ํ˜ธ์ถœ์„ ๋„คํŠธ์›Œํฌ์ƒ ์›๊ฒฉ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ํ•จ.

์œผ๋กœ ๊ตฌ์„ฑ.

 

ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ๋ฆ„

ProductInfo Service ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋ถ€, Consumer๊ฐ€ ํด๋ผ์ด์–ธํŠธ, Product Info ๊ฐ€ ์„œ๋ฒ„


โ–ถ๏ธŽ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์€ HTTP/2๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง
โ–ถ๏ธŽ (java ๊ธฐ์ค€) *.proto ํŒŒ์ผ ์ƒ์„ฑ ํ›„, ๋นŒ๋“œํ•˜๋ฉด(๋ฌผ๋ก  ๊ด€๋ จ ํŒจํ‚ค์ง€ importํ•˜๊ณ ,,) grpc ์‚ฌ์šฉ๊ด€๋ จ ํด๋ž˜์Šค๋“ค์ด ์ƒ์„ฑ๋˜๊ณ , ์ด๋ฅผ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์œผ๋กœ ํ™•์ธ

 

gRPC ์žฅ์ 

• ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ†ต์‹  ํšจ์œจ์„ฑ์ด ์ฆ๋Œ€
ํ…์ŠคํŠธ ํ˜•์‹ ๋Œ€์‹  ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๊ธฐ๋ฐ˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ gRPC ์„œ๋น„์Šค ๋ฐ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•˜๋ฉฐ,
HTTP/2 ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋กœ ๊ตฌํ˜„๋˜๊ธฐ์— ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ์†๋„๊ฐ€ ๋งค์šฐ ๋นจ๋ผ์ง„๋‹ค.

 ๊ฐ„๋‹จ ๋ช…ํ™•ํ•œ ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค ์Šคํ‚ค๋งˆ
๋จผ์ € ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ ํ•˜๊ณ ๋‚˜์„œ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ž‘์—…ํ•œ๋‹ค. (๊ตฌํ˜„์ด ๊ฐ„๋‹จ)

 ์—„๊ฒฉํ•œ ํƒ€์ž… ์ ๊ฒ€ ํ˜•์‹
ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— gRPC ์„œ๋น„์Šค ๊ณ„์•ฝ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•œ๋‹ค.

• ํด๋ฆฌ๊ธ€๋ž
์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋จ. ํŠน์ •์–ธ์–ด์— ๊ตฌ์•  ์•ˆ๋ฐ›์Œ!

• ์ด์ค‘ ์ŠคํŠธ๋ฆฌ๋ฐ

• ์œ ์šฉํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ ์ง€์›

• ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์ƒํƒœ๊ณ„์™€ ํ†ตํ•ฉ
๋„ทํ”Œ๋ฆญ์Šค ๋„์ปค ์‹œ์Šค์ฝ” ๋“ฑ์—์„œ ์ฑ„ํƒ

 

gRPC ๋‹จ์ 

 ์™ธ๋ถ€ ์„œ๋น„์Šค ๋ถ€์ ํ•ฉ
์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.
๊ณ„์•ฝ ๊ธฐ๋ฐ˜์ด๊ณ , ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์†์„ฑ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ
๊ทธ๋ž˜์„œ gRPC ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์„ค๊ณ„๋จ.

• ์„œ๋น„์Šค ์ •์˜์˜ ๊ธ‰๊ฒฉํ•œ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ๋ณต์žก์„ฑ
gRPC ์„œ๋น„์Šค๊ฐ€ ์žฌ์ •์˜๋˜๋ฉด, ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ์ฝ”๋“œ ๋ชจ๋‘ ๋ณ€๊ฒฝ์„ ํ•ด์•ผํ•จ;

• ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ์ƒํƒœ๊ณ„
๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ gRPC ์ง€์›์€ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ผ๊ณ ํ•จ.

 

 

..

 

 


์ฐธ๊ณ 

์ฑ…: http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791161754635
๋งํฌ: https://thenewstack.io/grpc-remote-procedure-calls-in-a-nutshell/

 

gRPC Remote Procedure Calls in a Nutshell

gRPC (gRPC Remote Procedure Calls) is one of the most popular inter-process communication protocols in the modern microservices and cloud native era.

thenewstack.io

 

gRPC ์‹œ์ž‘์—์„œ ์šด์˜๊นŒ์ง€ - ๊ต๋ณด๋ฌธ๊ณ 

๋„์ปค์™€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์œ„ํ•œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ• | โ˜… ์ด ์ฑ…์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ โ˜…โ–  gRPC์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๊ณ  ์œ ์‚ฌํ•œ ๊ธฐ์ˆ ๊ณผ ๋น„๊ตํ•˜๊ธฐโ–  ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•œ gRPC ํ†ต์‹  ํŒจํ„ด ํ™•์ธ

www.kyobobook.co.kr

๋งํฌ: https://grpc.io/

 

gRPC

A high-performance, open source universal RPC framework

grpc.io

๋งํฌ: https://ko.wikipedia.org/wiki/%EC%9B%90%EA%B2%A9_%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80_%ED%98%B8%EC%B6%9C

 

์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ(์˜์–ด: remote procedure call, ๋ฆฌ๋ชจํŠธ ํ”„๋กœ์‹œ์ € ์ฝœ, RPC)์€ ๋ณ„๋„์˜ ์›๊ฒฉ ์ œ์–ด๋ฅผ ์œ„ํ•œ ์ฝ”๋”ฉ ์—†์ด ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ ํ•จ์ˆ˜๋‚˜ ํ”„๋กœ์‹œ์ €๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๊ธฐ์ˆ ์ด

ko.wikipedia.org

 

๋ฐ˜์‘ํ˜•

+ Recent posts