๋ฐ˜์‘ํ˜•

 

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

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๋ชฉ์ 

์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ(Springboot jar file, gradle ์ด์šฉ)์„ AWS EC2์— ๋ฐ˜์˜ํ•ด๋ณด๊ธฐ
โ€ฃ jenkins ์„œ๋ฒ„์— ์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ์„ ๋นŒ๋“œ / ๋ฐฐํฌํ•˜๋Š” ์…ˆ.
โ€ฃ ์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฐœ์ธ github ์—์„œ ๊ฐ€์ ธ์˜ด! (github ์˜ webhook ๊ธฐ๋Šฅ ์ด์šฉ) 

 

์ž‘์—…์ˆœ์„œ

1๏ธโƒฃ EC2 ์ƒ์„ฑ ๋ฐ ํ„ฐ๋ฏธ๋„ ์ ‘์†
โ€ฃ EC2 ์ƒ์„ฑ๋ฐฉ๋ฒ•์€ ์ƒ๋žตํ•จ. (t2.micro ์ด์šฉ (๋ฉ”๋ชจ๋ฆฌ 1GB..jenkins ๋ฐฐํฌ๋Š” ๋˜๊ธดํ•จ!..), aws linux ์ด์šฉ)
โ€ฃ pem key ์†Œ์ค‘ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜๋„๋กํ•˜๊ธฐ (ssh ํด๋”์— ์ด๋™์‹œํ‚ค๋Š” ๋“ฑ)

1-1. EC2 ๋ณด์•ˆ๊ทธ๋ฃน ์„ค์ •ํ•˜๊ธฐ (์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ์„ค์ •)

EC2 > ์ธ์Šคํ„ด์Šค ํ™”๋ฉด
๋ณด์•ˆ๊ทธ๋ฃน > ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™
์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ์„ค์ • (ํฌํŠธํ—ˆ์šฉ ์„ค์ •)



1-2. EC2 ์ธ์Šคํ„ด์Šค ์„œ๋ฒ„ ์ ‘์† ์‹œ๋„ (2๊ฐ€์ง€)

- pem key ์„ .ssh ํด๋”๋กœ ์˜ฎ๊ฒจ์ฃผ๋Š” ์ž‘์—…์„ ์ถ”๊ฐ€ํ•จ.

$ sudo mv {pem key ์œ„์น˜๊ฒฝ๋กœ}/jenkins.pem ~/.ssh

โญ๏ธ ์ฐธ๊ณ ๋กœ ์‹ค์Šต์˜ ์ƒํ™ฉ์ด๊ธฐ์— EC2 ์„œ๋ฒ„๋ฅผ ๋‚ด๋ฆฌ๊ณ  ์˜ฌ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด
[1. ssh ์œผ๋กœ ์ ‘์†ํ•˜๋Š” ๋ฐฉ๋ฒ•] ์œผ๋กœ ํ•˜๋Š”๊ฒƒ์ด ๋งž์„๋“ฏ. (IPv4๊ฐ€ ์„œ๋ฒ„ ์žฌ์‹œ์ž‘์‹œ ๋ฐ”๋€œ)

  1-2-1. ssh ์œผ๋กœ ์ ‘์†ํ•˜๋Š” ๋ฐฉ๋ฒ•

# ssh -i {pem key ๊ฒฝ๋กœ} {ec2 ์ธ์Šคํ„ด์Šค ๊ณ„์ •ID}@{ํผ๋ธ”๋ฆญ IPv4 DNS or ํผ๋ธ”๋ฆญ IPv4 IP}
$ ssh -i ~/.ssh/jenkins.pem ec2-user@ec2-2-3-4-5.ap-northeast-2.compute.amazonaws.com

# root ๊ถŒํ•œ์ด ์•„๋‹Œ ๊ฒฝ์šฐ 
$ sudo ssh -i ~/.ssh/jenkins.pem ec2-user@ec2-2-3-4-5.ap-northeast-2.compute.amazonaws.com

 

  1-2-2. ~/.ssh/config file ์— ์ ‘์†์ •๋ณด ์ถ”๊ฐ€ ํ›„, Host ๋ช…์œผ๋กœ ์ ‘์†ํ•˜๋Š” ๋ฐฉ๋ฒ•

$ vi ~/.ssh/config 

# ์—ด์–ด์„œ ์•„๋ž˜๋‚ด์šฉ ์ถ”๊ฐ€
Host test_jenkins

 User ec2-user
 HostName ec2-2-3-4-5.ap-northeast-2.compute.amazonaws.com
 IdentityFile ~/.ssh/jenkins.pem
 
# ๊ทธ๋ฆฌ๊ณ  ์ €์žฅ (:wq!)
 
# ์ ‘์†์‹œ๋„๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ. (root ๊ถŒํ•œ ์•„๋‹Œ ๊ฒฝ์šฐ sudo ssh ~)
$ ssh test_jenkins

 

๐Ÿ’ฅ ๊ทธ๋Ÿฐ๋ฐ, Host ๋ช…์œผ๋กœ ์ ‘์† ์‹œ๋„์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ? 

> pem key ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•ด์ฃผ๋‹ˆ ์ ‘์†์ด ๊ฐ€๋Šฅํ•จ! (chmod 400 ~ ๋‚˜์—๊ฒŒ๋งŒ ์ฝ๊ธฐ ๊ถŒํ•œ ์„ค์ •) 

 

2๏ธโƒฃ EC2 ์„œ๋ฒ„ ์ ‘์† ํ›„, ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜ ๋ฐ ์„œ๋ฒ„ ์…‹ํŒ…

2-1. java ์„ค์น˜
   โ€ฃ ๋‚˜์˜ ๊ฒฝ์šฐ, aws linux์„ ์‚ฌ์šฉํ–ˆ๊ธฐ์— ํ•ด๋‹น๋ฌธ์„œ ← ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ค์น˜ํ•จ 

2-2. ํƒ€์ž„์กด ๋ณ€๊ฒฝ (ํ•œ๊ตญ ์‹œ๊ฐ„)

$ sudo rm /etc/localtime
$ sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# ๋‚ ์งœ ํ™•์ธ
$ date


2-3. ํ˜ธ์ŠคํŠธ๋„ค์ž„ ๋ณ€๊ฒฝ

$ sudo hostnamectl set-hostname mungmang-jenkins
$ sudo reboot

# ๋ช‡๋ถ„ ํ›„ ๋‹ค์‹œ์ ‘์†

# ํ™•์ธ
$ hostname


2-4. jenkins ์„ค์น˜

# jenkins repository ์— ์„ค์ •ํŒŒ์ผ ์ƒ์„ฑ 
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
$ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

# jenkins ์„ค์น˜
$ sudo yum install jenkins

# jenkins ์‹คํ–‰
$ sudo systemctl start jenkins

# ๋งŒ์•ฝ ๋ถ€ํŒ…์‹œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ๋„ ์ถ”๊ฐ€
$ sudo systemctl enable jenkins

 

 

2-5. jenkins ์ ‘์† ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

๋นจ๊ฐ„๋ฐ•์Šค ๊ฒฝ๋กœ์˜ ๊ฐ’์„ ํ™•์ธํ•˜์—ฌ ์ž…๋ ฅํ•ด์ฃผ๊ธฐ
ํ•œ๊ธ€๋กœ ๋ฒˆ์—ญํ•จ. ์ถ”์ฒœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์˜€์Œ. (๋ญ๊ฐ€ ํ•„์š”ํ•œ์ง€๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ!)


.. ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ํ›„,
jenkins ์œ ์ € ๋“ฑ๋ก ํ™”๋ฉด์—์„œ ๋กœ๊ทธ์ธํ•  ๊ณ„์ •์ •๋ณด ์ž…๋ ฅ ↓  ↓ (๊ณ„์ •๋ช… ๋ฐ ์•”ํ˜ธ๋กœ jenkins ๋กœ๊ทธ์ธ ๊ฐ€๋Šฅ!)

 


2-6. gradle ์„ค์น˜ https://docs.gradle.org/6.9.1/userguide/installation.html ์ฐธ๊ณ ํ•จ

$ mkdir /opt/gradle
$ unzip -d /opt/gradle gradle-6.9.1-bin.zip
$ ls /opt/gradle/gradle-6.9.1

$ export PATH=$PATH:/opt/gradle/gradle-6.9.1/bin
$ gradle -version

 

2-7. git ์„ค์น˜ https://gamoo12.tistory.com/205 ์ฐธ๊ณ ํ•จ

$ sudo yum update -y
$ sudo yum install git -y
$ git version

 

3๏ธโƒฃ github ์„ค์ •

3-0. ๋ฐ˜์˜ํ•  ํ”„๋กœ์ ํŠธ๋Š” ์žˆ๋‹ค๊ณ  ๊ฐ€์ • (์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ)
3-1. EC2์—์„œ ssh key ์ƒ์„ฑ

$ cd ~/.ssh
$ ssh-keygen

# id_rsa key ์ƒ์„ฑ



3-2. github project ๋‚ด XXX.pub key ๋“ฑ๋ก ํ•„์š”

    3-2-1. https://github.com/{git๊ณ„์ •}/{gitํ”„๋กœ์ ํŠธ}/settings/keys/new ์ด๋™ 

$ cat ~/.ssh/id_rsa.pub

# ssh-rsa ~ ๋‚ด์šฉ์„ ๋ณต์‚ฌ

github > ํ”„๋กœ์ ํŠธ > Settings > Deploy keys > Add deploy key


3-3. github ํ”„๋กœ์ ํŠธ ๋‚ด webhook ์„ค์ •ํ•„์š”
    3-2-1.https://github.com/{git๊ณ„์ •}/{gitํ”„๋กœ์ ํŠธ}/settings/hooks/new ์ด๋™ 
        • Payload URL : http://{ec2์— jenkins ๋„์šด ์ฃผ์†Œ (ex. ec2~~:8080}/github-webhook/ ์ž…๋ ฅ
        • Content type :  application/json

jenkins์—์„œ build ๋ฒ„ํŠผ ํด๋ฆญ์‹œ, github์˜ webhook ๊ธฐ๋Šฅ ์ด์šฉํ•˜์—ฌ ์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ ํ”„๋กœ์ ํŠธ๋ฅผ ๋•ก๊ฒจ๊ฐ€๋„๋ก ํ• ๊ฒƒ์ž„

 

4๏ธโƒฃ jenkins ์„ค์ •

1. Credentials ๋“ฑ๋ก ํ•„์š” (github ๐Ÿ”› jenkins ์—ฐ๊ฒฐ์œ ๋„)

Jenkins ๊ด€๋ฆฌ > Manage Credentials > Stores scoped Jenkins ์˜ Jenkins ํด๋ฆญ > Global credentials
 
Kind : SSH Username with private key ์„ ํƒ
Private Key: .ssh/id_rsa ์„ ์ž…๋ ฅ

 

2. ๋นŒ๋“œ ๋ฐ ์‹คํ–‰ (Dashboard > ๋Œ€์ƒ ํ”„๋กœ์ ํŠธ > ๊ตฌ์„ฑ) 

๋นŒ๋“œ์œ ๋ฐœ
GitHub hook trigger for GITScm polling ์„ ํƒ 

[ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ํ•„์š”] post build task (์•„๋ž˜์˜ ๋‚ด์šฉ ๊ธฐ์ž…, ์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ jar ํŒŒ์ผ๋กœ ๋งŒ๋“  ๊ฒƒ์„ ์‹คํ–‰)
JAR=$(ls -tr /var/lib/jenkins/workspace/{jenkins working directory ๋ช…}/build/libs | grep jar | tail -n 1)
echo $JAR
nohup java -jar /var/lib/jenkins/workspace/{jenkins working directory ๋ช…}/build/libs/$JAR &

$(ls -tr /var/lib/jenkins/workspace/{jenkins working directory ๋ช…}/build/libs | grep jar | tail -n 1) : jar ํŒŒ์ผ๋ช… ์ถ”์ถœ ์œ„ํ•จ.
nohup java -jar /var/lib/jenkins/workspace/{jenkins working directory ๋ช…}/build/libs/$JAR & : jar ์‹คํ–‰์œ„ํ•จ, nohup ์„ ๋ถ™์ž„์œผ๋กœ์จ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰! (ํ„ฐ๋ฏธ๋„ ์ข…๋ฃŒ ํ•˜๋”๋ผ๋„ ์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ์€ ๊ณ„์† ์„œ๋ฒ„์— ์‹คํ–‰๋˜์–ด ์žˆ๋„๋ก ํ•˜๊ธฐ์œ„ํ•จ)

 

 

๋А๋‚€์ 

โ€ฃ ์‚ฝ์งˆ์„ ์ค„์ผ ํ•„์š”์„ฑ์ด์žˆ๊ฒ ๋‹ค.
โ€ฃ ํŒŒ์ดํ”„๋ผ์ธ ์ž‘์„ฑ์„ ์ด์šฉํ•œ ๋ฐฐํฌ๋„ ํ•œ๋ฒˆ ํ•ด๋ณด์•„์•ผ ํ• ๊ฒƒ๊ฐ™๋‹ค. 
โ€ฃ docker..kubernetes ๋“ฑ์„ ์ด์šฉํ•œ ๋ฐฐํฌ๋ฐฉ๋ฒ•๋„ ํ•ด๋ณด์•„์•ผ ํ• ๊ฒƒ๊ฐ™๋‹ค. + ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ 

 


์ฐธ๊ณ 

์ฑ…: ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ AWS๋กœ ํ˜ผ์ž ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค

 

์Šคํ”„๋ง ๋ถ€ํŠธ์™€ AWS๋กœ ํ˜ผ์ž ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค - YES24

๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์›น ์„œ๋น„์Šค์˜ ๋ชจ๋“  ๊ณผ์ •์„ ๊ฒฝํ—˜ํ•œ๋‹ค. ๊ฒฝํ—˜์ด ์‹ค๋ ฅ์ด ๋˜๋Š” ์ˆœ๊ฐ„!์ด ์ฑ…์€ ์ œ๋ชฉ ๊ทธ๋Œ€๋กœ ์Šคํ”„๋ง ๋ถ€ํŠธ์™€ AWS๋กœ ์›น ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. JPA์™€ JUnit ํ…Œ์ŠคํŠธ, ๊ทธ๋ ˆ์ด๋“ค, ๋จธ์Šคํ…Œ์น˜, ์Šคํ”„๋ง

www.yes24.com

๋งํฌ: https://lemontia.tistory.com/656

 

[Linux] centos7 ์  ํ‚จ์Šค ์„ค์น˜

1. jenkins repository๋ฅผ ์„ค์ •ํŒŒ์ผ์„ ์ƒ์„ฑ wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 2. /etc/yum.repos.d/jenkins.repo ๊ฒฝ๋กœ์— ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธ..

lemontia.tistory.com

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ณ€ํ™”์˜ ์ „ํŒŒ์™€ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ๊ด€๋ จ๋œ ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

  • ๋ณ€ํ™”์˜ ์ „ํŒŒ์™€ ๋ฐ์ดํ„ฐ ํ๋ฆ„: ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฐ๋  ๋•Œ ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์†์ ์œผ๋กœ ์ „๋‹ฌ
  • ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์‹คํ–‰ํ•  ๋™์ž‘์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œํ•˜๋Š” ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋‹ฌ๋ฆฌ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹จ์ˆœํžˆ ๋ชฉํ‘œ๋ฅผ ์„ ์–ธ.
  • ๋ฐ์ดํ„ฐ ๋ฐœํ–‰(Observable), ๊ฐ€๊ณต(Operator), ๊ตฌ๋…(Subscribe) ํ๋ฆ„์œผ๋กœ ๊ตฌ์„ฑ
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•จ. (stream..)

 

๋ฆฌ์•กํ‹ฐ๋ธŒ์˜ ๊ฐœ๋…์ด ์ ์šฉ๋œ ์˜ˆ

  Push ๋ฐฉ์‹: ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ๊ณณ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ์‹ (๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹)

  • RTC, ์†Œ์ผ“ํ”„๋กœ๊ทธ๋ž˜๋ฐ, DB Trigger, Spring์˜ ApplicationEvent, ์•ต๊ทค๋Ÿฌ ๋ฐ”์ธ๋”ฉ, ํ‘ธ์‹œ๋ฉ”์„ธ์ง€

  Pull ๋ฐฉ์‹: ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ์š”์ฒญ์„ ๋ณด๋‚ด ์งˆ์˜ํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹

  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ & ์„œ๋ฒ„ ์‘๋‹ต ๋ฐฉ์‹์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • Java์™€ ๊ฐ™์€ ์ ˆ์ฐจํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

 

๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ์•Œ์•„์•ผ ๋  ๊ฒƒ๋“ค

  • Observable: ๋ฐ์ดํ„ฐ ์†Œ์Šค
  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ์—ฐ์‚ฐ์ž(Operators): ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
  • ์Šค์ผ€์ค„๋Ÿฌ(Scheduler): ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์ž
  • Subscriber: Observable์ด ๋ฐœํ–‰ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๊ตฌ๋…์ž
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ: RxJava์—์„œ ์ œ๊ณตํ•˜๋Š” ์—ฐ์‚ฐ์ž(Operator) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ.

 

๋ฆฌ์•กํ‹ฐ๋ธŒX 

  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์›

.....

์ฐธ๊ณ 
https://www.youtube.com/watch?v=2McwNWO8MIw&list=PLr-ObTx8qMl9APSlvIhAah1mq3tyD1AYN

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์„œ๋ฒ„๊ฐ„ ํ†ต์‹  ์ค‘ ์ง€์—ฐ ๋ฐœ์ƒ์‹œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

    โ€ฃ ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ ์„ค์ •
    โ€ฃ ๋Œ€๊ธฐ์ค‘ ์š”์ฒญ์ˆ˜ ์ œํ•œ
    โ€ฃ ์—ฌ๋Ÿฌ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ธฐ๋ฒ• ๊ตฌํ˜„
    โ€ฃ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด๊ณผ ํด๋ฐฑ ๊ตฌํ˜„ ์„ค์ •

 

๋ถ€ํ•˜ ๋ถ„์‚ฐ ๋ฃฐ(rule)

์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ๋„ทํ”Œ๋ฆญ์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ถ€ํ•˜๋ถ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ,
๋„ทํ”Œ๋ฆญ์ŠคOSS ์—์„œ๋Š” ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฃฐ์ด๋ผ๊ณ  ํ•จ

์ข…๋ฅ˜

    โ€ฃ RoundrobinRule
        → ๋ผ์šด๋“œ ๋กœ๋นˆ ์‚ฌ์šฉ, ์œ ์ž…๋˜๋Š” ์š”์ฒญ์€ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ์ˆœ์ฐจ์ ์œผ๋กœ ๋ถ„์‚ฐ. ๊ธฐ๋ณธ!

    โ€ฃ AvailabilityFilteringRule
        → ์„ธ๋ฒˆ ์—ฐ๊ฒฐ ์‹คํŒจํ•˜๋ฉด ์„œํ‚ท ์ฐจ๋‹จ๋จ.
        → ์„œํ‚ท ์ฐจ๋‹จ ๋ฐ ๋™์‹œ์—ฐ๊ฒฐ์ด ๋งŽ์€๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ์„œ๋ฒ„ ์ œ์™ธ.
        → RoundrobinRule ์„ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ.


    โ€ฃ WeightedReponseTimeRule
        → ์ธ์Šคํ„ด์Šค๋กœ ์ „๋‹ฌ๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์˜ ๊ทœ๋ชจ๋Š” ์ธ์Šคํ„ด์Šค์˜ ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„์— ๋ฐ˜๋น„๋ก€.
        → ์‘๋‹ต์‹œ๊ฐ„ ๊ธธ์ˆ˜๋ก ๋” ์ž‘์€ ๊ฐ€์ค‘์น˜ ๊ฐ€์ง.
        → ๋ถ€ํ•˜๋ถ„์‚ฐํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋“  ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์˜ ํŠธ๋ž˜ํ”ฝ๊ณผ ์‘๋‹ต์‹œ๊ฐ„ ๊ธฐ๋กํ•จ.


    โ€ฃ BestAvailableRule
        → ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ์ฐจ๋‹จ๋œ ์„œ๋ฒ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋™์‹œ ์š”์ฒญ์„ ๊ฐ€์žฅ ์ ๊ฒŒ ๋ฐ›์€ ์„œ๋ฒ„๋ฅผ ์„ ํƒ.

 

 

ํ˜ธ๋ฒ„ํ”Œ๋ผ์ด (Hoverfly)
์„ค๋ช…

HTTP ์„œ๋น„์Šค๋ฅผ ์Šคํ…ํ•˜๊ณ  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฐ€๋ฒผ์šด ์‹œ๊ฐํ™” ๋„๊ตฌ.
DSL ์ •์˜์—์„œ ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•ด ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ค‘์ธ ์„œ๋น„์Šค์˜ ๋ฉ”์„œ๋“œ์— ์ง€์—ฐ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ.
    → maven or gradle ์— hoverfly-java import ํ•„์š”, JUnit์— @ClassRule ์ •์˜ ํ•„์š”. 

 

์‹ค์Šต

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

junit test class ์ผ๋ถ€

• junit test ์‹คํ–‰์‹œ hoverflyRule ์„ ๋จผ์ € ์‹คํ–‰ํ•˜๊ณ  ๊ฐ ํ…Œ์ŠคํŠธ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (ex. test() ์‹คํ–‰)
• test() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์— ์žˆ๋‹ค. ↓ ↓ ↓ ↓ ↓

junit test ํ˜ธ์ถœ ์ถœ๋ ฅ ๊ฒฐ๊ณผ, ๋ถ€ํ•˜๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
application.yml ์„ค์ •์ •๋ณด. (ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ์„ค์ •ํŒŒ์ผ์— ์ •์˜)

โ€ป https://www.baeldung.com/hoverfly ์—๋„ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค. (์‚ฌ์‹ค ํ•ด๋‹น๊ธฐ๋Šฅ์„ ๋งŽ์ด ์“ฐ๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค;)

 

 

๋ฆฌ๋ณธ(Ribbon)
์„ค๋ช…

- Client LoadBalancer ์ด๋‹ค.
- ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค. (L4 ์‚ฌ์šฉ์—†์ด)
- ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ•œ๋‹ค! 
- ์œ ๋ ˆ์นด๋ž‘ ์‚ฌ์šฉ์‹œ ๊ฐ•๋ ฅํฌํ•˜๋‹ค ๐Ÿ‘
- ๋”์ด์ƒ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜์ง€ ์•Š์Œ.

ribbon



โ€ป ๋ณดํ†ต์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ L4 switch ์„ ์ด์šฉํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ• ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ์ด์šฉ์‹œ ์ถ”๊ฐ€ ์„œ๋ฒ„๋น„์šฉ ๋“ฑ์ด ๋ฐœ์ƒํ• ๊ฒƒ์ด๋‹ค.
์ด์—๋”ฐ๋ฅธ ์ ˆ์ฐจ๋„ ํ•„์š”ํ• ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. 

L4 switch

 

์‹ค์Šต 

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

๐Ÿ”† ์„œ๋ฒ„๊ฐ„ ํ†ต์‹ ํ•˜์—ฌ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ ํ™•์ธ: Ribbon ์ ์šฉ ์„œ๋ฒ„์—์„œ Demo1 ์„œ๋ฒ„ ํ˜ธ์ถœ (ํฌํŠธ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์ •์˜ํ•˜์—ฌ ์„œ๋ฒ„๋„์šฐ๊ธฐ)

• Ribbon ์ ์šฉ ์„œ๋ฒ„

# .. gradle ํŒŒ์ผ ๋‚ด ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•จ 

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon:2.1.4.RELEASE'

~Application.java

 

application.yml

 

controller

→ ๋นจ๊ฐ„๋ฐ•์Šค๋ฅผ ๋ณด๋ฉด, demo1 ์œผ๋กœ ๋„๋ฉ”์ธ์„ ์ •์˜ํ•ด๋†“์•˜๋‹ค.
์ด๋Š” application.yml ์˜ demo1: ribbon: listOfServers ์ •๋ณด๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค. (๋‚ด๋ถ€์ ์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๊ณ ํ•จ)


• Ribbon ์ ์šฉ ์„œ๋ฒ„์—์„œ ํ˜ธ์ถœํ•  ์„œ๋ฒ„ ์‹คํ–‰๊ตฌ์„ฑ 

์ธํ…”๋ฆฌ์ œ์ด์˜ ์‹คํ–‰/๋””๋ฒ„๊ทธ ๊ตฌ์„ฑ์—์„œ Spring Boot ์‹คํ–‰์ •๋ณด๋ฅผ ์…‹ํŒ…ํ•œ๋‹ค. (VM ์˜ต์…˜: -Dserver.port=์ •์˜ํฌํŠธ) ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰! x N


...๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ! (API ํ˜ธ์ถœ)

๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๋จ! ์™”๋‹ค๊ฐ”๋‹ค,, ์„œ๋ฒ„๋ณ„ API ํ˜ธ์ถœ ๊ฒฐ๊ณผ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํžˆ์ŠคํŠธ๋ฆญ์Šค (Hystrix)
์„ค๋ช…

- ๋ถ„์‚ฐ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์„œ๋น„์Šค ๊ฐ„์˜ ์•ก์„ธ์Šค ์ง€์ ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ์„œ๋น„์Šค ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ณ„๋‹จ์‹ ์˜ค๋ฅ˜๋ฅผ ์ค‘์ง€ํ•˜๊ณ , ํด๋ฐฑ ์˜ต์…˜์„ ์ œ๊ณตํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰
- RxJava ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง
- Failure as a First class citizen
   → ๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ๋Š” ์‹คํŒจ๋ฅผ 1๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ๊ฐ„์ฃผ.
- ๋”์ด์ƒ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•˜์ง€ ์•Š์Œ. 

 

์‹ค์Šต

โ€ฃโ€ฃโ€ฃ ์‹ค์Šต ์ฝ”๋“œ ๋งํฌ ๐Ÿ™‚

๐Ÿ’ฅ ์„œ๋ฒ„(PirServer → Demo1Server ํ˜ธ์ถœ)๊ฐ„ ํ†ต์‹  ์ค‘, ์—๋Ÿฌ๋ฐœ์ƒ ์œ ๋„

1๏ธโƒฃ Hystrix ๋ฏธ์ ์šฉ: ์—๋Ÿฌ ๋…ธ์ถœ ํ™•์ธ

fallback ์ ์šฉ์ด ์•ˆ๋œ ๋ชจ์Šต



2๏ธโƒฃ Hystrix ์ ์šฉ: @HystrixCommand ๋ฐ fallback ์ ์šฉ

RestTemplate ์œผ๋กœ ํ˜ธ์ถœ ๋ฐ fallback ์ ์šฉ๋œ ๋ชจ์Šต

@HystrixCommand
- ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์‹œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์„ฑ๊ณต/์‹คํŒจ ๊ฒฐ๊ณผ๋ฅผ ํ†ต๊ณ„๋ƒ„
- ํ†ต๊ณ„์— ๋”ฐ๋ผ ์„œํ‚ท ์˜คํ”ˆ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์กฐ์น˜ํ•จ.

โ€ป ์„œํ‚ท ์˜คํ”ˆ
์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ํ˜ธ์ถœ์ œํ•œ / ์—๋Ÿฌ๋ฐ˜ํ™˜ ํ•จ
์กฐ๊ธฐ์ฐจ๋‹จํ•˜์—ฌ ๋ณธ์ธ์„ ๋ณดํ˜ธํ•จ

- ์ •์˜ํ•ด๋†“์€ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” ์ •ํ•ด์ง„ ์‘๋‹ต์‹œ๊ฐ„ ๋‚ด์— ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•จ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Exception ๋ฐœ์ƒ & fallback ์ •์˜ ์ˆ˜ํ–‰

 

โญ๏ธ Hystrix ๋ณด๋‹จ Resilience4j ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์Œ.
- Resilience4j ๊ฐ€ Java8 ์ง€์› ๋ฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ด์ค€๋‹ค๊ณ  ํ•จ.

 

 

 


์ฐธ๊ณ 

์ฑ…: ๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ
๋งํฌ: https://www.youtube.com/watch?v=K4laj5cDYLg&list=PL9mhQYIlKEhdtYdxxZ6hZeb0va2Gm17A5&index=5 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ (Service Discovery)
์„ค๋ช…

์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœ์‹œ, ์„œ๋น„์Šค์˜ ์œ„์น˜(IP, port) ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
๊ด€๋ จ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋„ทํ”Œ๋ฆญ์Šค OSS์˜ ์œ ๋ ˆ์นด(Eureka)๊ฐ€ ์กด์žฌ!

 

์œ ๋ ˆ์นด (Eureka)
์„ค๋ช…

์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘๋˜๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ , ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ชฉ๋ก์—์„œ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ?!
์œ ๋ ˆ์นด์™€์˜ ํ†ตํ•ฉ์„ ์œ„ํ•œ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋‘๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค!

    โ€ฃ ์„œ๋ฒ„
      ๋“ฑ๋ก๋œ ์„œ๋น„์Šค์˜ ๋ชฉ๋ก์„ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•œ API & ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋„คํŠธ์›Œํฌ ์œ„์น˜ ์ฃผ์†Œ์™€ ํ•จ๊ป˜ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ API ์œผ๋กœ ๊ตฌ์„ฑ
      ๊ฐ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ๋ณต์ œํ•ด ์„ค์ •ํ•˜๊ณ  ๋ฐฐํฌํ•จ์œผ๋กœ์จ ๊ฐ€์šฉ์„ฑ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค!
      ์„œ๋น„์Šค์˜ ๊ฐ ์ธ์Šคํ„ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์กด์‹ ํ˜ธ(heartbeat) ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š”๋‹ค. ์„ค์ •๋œ ๊ธฐ๊ฐ„๋™์•ˆ ์ƒ์กด์‹ ํ˜ธ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์„œ๋น„์Šค๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.

    โ€ฃ ํด๋ผ์ด์–ธํŠธ 
      ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ํ›„ ๋“ฑ๋ก & ์ข…๋ฃŒ ์ „ ๋“ฑ๋ก ํ•ด์ œ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์œ ๋ ˆ์ปค ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ตœ์‹  ์„œ๋น„์Šค ๋ชฉ๋ก์„ ๋ฐ›์•„์˜ด!

 

์‹ค์Šต

• eureka server 1๊ฐœ (eureka server) , client server 2๊ฐœ (demo1, demo2)

์œ ๋ ˆ์นด ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ๋“ค์˜ application.yml ๋“ค

    โ€ฃ eureka.client.service-url.defaultZone ์—๋Š” ์œ ๋ ˆ์นด ์„œ๋ฒ„ ์—ฌ๋Ÿฌ๊ฐœ ์„ค์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

์œ ๋ ˆ์นด ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ๋“ค์˜ ์–ด๋…ธํ…Œ์ด์…˜ ์„ค์ •๋“ค

    โ€ฃ @EnableDiscoveryClient: spring-cloud-commons์— ์กด์žฌ
    โ€ฃ @EnableEurekaClient: spring-cloud-netflix์— ์กด์žฌํ•˜๋ฉฐ, ์œ ๋ ˆ์นด๋งŒ์„ ์œ„ํ•ด ์ž‘๋™

 

์œ ๋ ˆ์นด ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ๋“ค์˜ build.gradle ์„ค์ •๋“ค


    โ€ฃ spring-cloud-starter-eureka-server vs spring-cloud-starter-netflix-eureka-server : ์ฐจ์ด์—†์Œ. ๊ทผ๋ฐ netflix ๋ถ™์€๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š”๋“ฏ

 

 


์ฐธ๊ณ 

๋งํฌ: https://bcho.tistory.com/1252

 

MSA์—์„œ Service discovery ํŒจํ„ด

MSA์—์„œ Service discovery ํŒจํ„ด์˜ ์ดํ•ด ์กฐ๋Œ€ํ˜‘ (http://bcho.tistory.com) MSA์™€ ๊ฐ™์€ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์€ ์„œ๋น„์Šค ๊ฐ„์˜ ์›๊ฒฉ ํ˜ธ์ถœ๋กœ ๊ตฌ์„ฑ์ด ๋œ๋‹ค. ์›๊ฒฉ ์„œ๋น„์Šค ํ˜ธ์ถœ์€ IP ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋˜๋Š”๋‹ค. ํด๋ผ

bcho.tistory.com

๋งํฌ: https://stackoverflow.com/questions/49885718/difference-between-spring-cloud-starter-eureka-server-and-spring-cloud-starte

 

 

difference between `spring-cloud-starter-eureka-server` and `spring-cloud-starter-netflix-eureka-server`

I am new to the Spring Cloud, what is the exact difference between spring-cloud-starter-eureka-server and spring-cloud-starter-netflix-eureka-server ? When we should go for spring-cloud-starter-e...

stackoverflow.com

์ฑ…: ๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ (Spring Cloud)

โ€ฃ ๋ถ„์‚ฐ/๋ฒ„์ „๊ด€๋ฆฌ, ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ, ๋ผ์šฐํŒ…, ์„œ๋น„์Šค๊ฐ„ ํ˜ธ์ถœ, ๋ถ€ํ•˜๋ถ„์‚ฐ, ํšŒ๋กœ์ฐจ๋‹จ๊ธฐ, ๋ถ„์‚ฐ๋ฉ”์„ธ์ง€ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋‹ค.
โ€ฃ 
https://spring.io/projects/spring-cloud

 

Spring Cloud

Spring Cloud is an umbrella project consisting of independent projects with, in principle, different release cadences. To manage the portfolio a BOM (Bill of Materials) is published with a curated set of dependencies on the individual project. Go here to r

spring.io

โ€ฃ ์Šคํ”„๋ง๋ถ€ํŠธ ๋ฒ„์ „, ์Šคํ”„๋งํด๋ผ์šฐ๋“œ ๋ฒ„์ „ ์œ ์˜ํ•ด์„œ ์‚ฌ์šฉ ํ•„์š”!


12-ํŒฉํ„ฐ ์•ฑ(The Twelve-Factor App)

โ€ฃ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์‰ฝ๊ฒŒ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ.
โ€ฃ ์ง€์† ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋˜๋Š” Software as a Service(SaaS)๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก .
โ€ฃ ์Šคํ”„๋ง ๋ถ€ํŠธ & ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ๋Š” 12-ํŒฉํ„ฐ๋ฃฐ์— ๋ถ€ํ•ฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ & ์š”์†Œ ์ œ๊ณต
โ€ฃ https://12factor.net/ko/

 

The Twelve-Factor App (ํ•œ๊ตญ์–ด)

๋ฐฐ๊ฒฝ ์ด ๋ฌธ์„œ์— ๊ธฐ์—ฌํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ˆ˜๋ฐฑ๊ฐœ ์•ฑ์˜ ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ์— ์ง์ ‘ ์ฐธ์—ฌํ–ˆ์œผ๋ฉฐ, Heroku ํ”Œ๋žซํผ์„ ํ†ตํ•ด์„œ ๋ฐฉ๋Œ€ํ•œ ์•ฑ์˜ ๊ฐœ๋ฐœ, ์šด์˜, ํ™•์žฅ์„ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ด€์ฐฐํ–ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์‹ค์ œ๋กœ ์“ฐ์ด๋Š” ๋‹ค์–‘ํ•œ SaaS

12factor.net

โ€ป Software as a Service(SaaS)
์„œ๋น„์Šค ์‚ฌ์—…์ž๊ฐ€ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์ƒ์—์„œ ์ด์— ์›๊ฒฉ ์ ‘์†ํ•ด ํ•ด๋‹น ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ์„œ๋น„์Šค ๋ชจ๋ธ.
ERP..CRM..SLACK..

โ€ฃ https://medium.com/dtevangelist/12-factors-%EB%9E%80-b39c7ef1ed30

 

๋„ทํ”Œ๋ฆญ์Šค(Netflix) OSS

โ€ฃ ๋ชจ๋†€๋ฆฌ์‹ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋ฐ˜ ์ „ํ†ต์  ๊ฐœ๋ฐœ ๋ชจ๋ธ → ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•œ ์„ ๊ตฌ์ž
โ€ฃ ๋งŽ์€ ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์œ ๋ ˆ์นด(Eureka), ํžˆ์ŠคํŠธ๋ฆญ์Šค(Hystrix), ๋ฆฌ๋ณธ(Ribbon), ์ค„(Zuul) ๋“ฑ๊ณผ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ์™€ ํ†ตํ•ฉ๋จ.

 

์œ ๋ ˆ์นด(Eureka)

โ€ฃ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ (์ „ํ™”๋ฒˆํ˜ธ๋ถ€ ์ฑ…)
    → ์™ธ๋ถ€์˜ ์„œ๋น„์Šค๋“ค์ด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…
    → ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ or API Gateway์„ ์ „๋‹ฌํ•˜๊ฒŒ๋˜๋ฉด serviceDiscovery ์— ์ „๋‹ฌ๋˜์–ด ํ•„์š” ์ •๋ณด๋ฅผ ์ฐพ์Œ

โ€ฃ ์„œ๋น„์Šค ์ •๋ณด ๋ฐ ์œ„์น˜์ •๋ณด ํ™•์ธ ๋“ฑ (Naming server)
โ€ฃ ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘๋˜๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ , ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋ชฉ๋ก์—์„œ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•.

โ€ฃ ํด๋ผ์ด์–ธํŠธ & ์„œ๋ฒ„๋กœ ๊ตฌ๋ถ„
    • ํด๋ผ์ด์–ธํŠธ (discovery client)
          → ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€๋กœ ์›๊ฒฉ ๋””์Šค์ปค๋ฒ„๋ฆฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ์ผ์„ ๋‹ด๋‹น
          → ์—ฐ๊ฒฐ๋˜๋ฉด ์„œ๋น„์Šค ์ด๋ฆ„ & ๋„คํŠธ์›Œํฌ ์œ„์น˜๋ฅผ ๋‹ด์€ ๋“ฑ๋ก ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋ƒ„
          → ํ˜„์žฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์ข…๋‹จ์ ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋“ฑ๋ก๋œ ์„œ๋น„์Šค ๋ชฉ๋ก์„ ๋‹ด์€ ์ตœ์‹ ์˜ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜(์„ค์ •์ •๋ณด)๋ฅผ ๊ฐ€์ ธ์˜ด.
          → ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์บ์‹ฑํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ฒดํฌํ•œ๋‹ค.
           ์œ ๋ ˆ์นด ์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถ”๋”๋ผ๋„ ์„œ๋น„์Šค๋“ค๋ผ๋ฆฌ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค! ์„œ๋น„์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๋กœ์ปฌ์— ์บ์‹ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ
          → spring-cloud-starter-netflix-eureka-client ์‚ฌ์šฉ

    • ์„œ๋ฒ„ (Service registry)
          → ๊ฐ ์„œ๋น„์Šค๋“ค๋กœ๋ถ€ํ„ฐ ์ƒ์กด์‹ ํ˜ธ? ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›๊ณ , ๋ฉ”์„ธ์ง€๋ฅผ ๋ชป๋ฐ›์œผ๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์„œ๋น„์Šค ์‚ญ์ œ๋œ๋‹ค.
           ๋…๋ฆฝ์ ์ธ ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์„ค์ •๋˜๊ณ  ์‹คํ–‰๋จ. ๊ฐ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋ณต์ œํ•ด ๊ฐ€์šฉ์„ฑ(=์„œ๋น„์Šค ์ •์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์ •๋„)์ด ๋†’์Œ.
           pring-cloud-starter-netflix-eureka-server ์‚ฌ์šฉ

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/lecture/68382?tab=curriculum&volume=1.00&speed=1

 

ํžˆ์ŠคํŠธ๋ฆญ์Šค(Hystrix)

โ€ฃ ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปคํŒจํ„ด ๊ตฌํ˜„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 
โ€ฃ ํด๋ฐฑ(fallback) ๋กœ์ง ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
โ€ฃ spring-cloud-starter-hystricx ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ

โ€ป ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด (circuit breaker pattern)
์„ฑ๊ณต ๋ฐ ์‹คํŒจ ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์„ผ ๋‹ค์Œ, ์—๋Ÿฌ ๋น„์œจ์ด ๊ฐ€์ •๋œ ์ž„๊ณ„์น˜๋ฅผ ๋„˜์œผ๋ฉด ์ฐจ๋‹จ ๋ฐœ์ƒ ๋ฐ ์ดํ›„ ์‹คํŒจ์ฒ˜๋ฆฌํ•œ๋‹ค.
→ ๋ฌธ์ œ๋˜๋Š” ๋ถ€๋ถ„(๋А๋ฆฐ๋ถ€๋ถ„)์„ ํŠน์ • ํ˜ธ์ถœ์„ ๊ฐ์ง€ํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์†Œ์ง„ํ•˜์ง€ ์•Š๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํŒจ์‹œ์ผœ ๋ฒ„๋ฆผ(์›๊ฒฉ ์ž์› ์‚ฌ์šฉ ๋ถ€๋ถ„ ์ œ๊ฑฐ)
→ ๋‹ค๋ฅธ์„œ๋น„์Šค์— ์˜ํ–ฅ ์•ˆ๊ฐ€๋„๋ก!
์ง€์ •๋œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ๋‚˜๋ฉด, ์žฌ์š”์ฒญ ํ›„ ์„œํ‚ท์€ ๋‹ซํ˜€ ์ •์ƒ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋„๋ก ํ•œ๋‹ค. 

 

๋ฆฌ๋ณธ(Ribbon)

โ€ฃ ํด๋ผ์ด์–ธํŠธ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์—ญํ• ,, ๊ทผ๋ฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์Œ,, ์ž˜ ์‚ฌ์šฉ ์•ˆํ•˜๊ฒŒ๋จ
โ€ฃ IP..port..ํ˜ธ์ถœ์ด ์•„๋‹Œ ์ด๋ฆ„๋งŒ ๊ฐ€์ง€๊ณ  ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅ... 
โ€ฃ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ
โ€ฃ HTTP, UDP, TCP ๋“ฑ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ํ”„๋กœํ† ์ฝœ ์ง€์›
โ€ฃ ๋™๊ธฐ๋ฐฉ์‹์˜ RESTํ˜ธ์ถœ, ๋น„๋™๊ธฐ, ๋ฆฌ์•กํ‹ฐ๋ธŒ ๋ชจ๋ธ๋„ ์ง€์›
โ€ฃ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ, ์บ์‹ฑ, ์ผ๊ด„์ฒ˜๋ฆฌ, ์žฅ์•  ๋‚ด์„ฑ๊ณผ ํ†ตํ•ฉ ๊ฐ€๋Šฅ.
โ€ฃ spring-cloud-starter-ribbon ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ
โ€ฃ springboot 2.4 ์ดํ›„ Maintenance ์ƒํƒœ 

 

์ค„(Zuul)

โ€ฃ API ๊ฒŒ์ดํŠธ์›จ์ด or API Service, Edge Service
โ€ฃ JVM ๊ธฐ๋ฐ˜ ๋ผ์šฐํ„ฐ, ์„œ๋ฒ„ ์ธก ๋ถ€ํ•˜ ๋ถ„์‚ฐ or ์ผ๋ถ€ ํ•„ํ„ฐ๋ง ์ˆ˜ํ–‰
โ€ฃ ์ธ์ฆ, ๋ถ€ํ•˜ ํ‰๊ท  ๋ถ„๋ฐฐ, ์ •์  ์‘๋‹ต ์ฒ˜๋ฆฌ, ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋“ฑ์— ์‚ฌ์šฉ.
โ€ฃ ์„ค์ • ๊ฐ€๋Šฅ ๋ฐ ๋…๋ฆฝ์  ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์‹คํ–‰๋จ.
โ€ฃ spring-cloud-starter-zuul ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ
โ€ฃ springboot 2.4 ์ดํ›„ Maintenance ์ƒํƒœ 

 

โœป ์ตœ๊ทผ์—๋Š” Ribbon,, Zuul ๋ณด๋‹จ, Spring Cloud Gateway ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•จ.
https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now#spring-cloud-netflix-projects-entering-maintenance-mode

https://happycloud-lee.tistory.com/218โ€‹

 

[SC12] Spring Cloud Gateway ๋ž€ ?

1. Spring Cloud Gateway(SCG) ์ดํ•ด 1) WHY ? SCG๋Š” API Gateway์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ API Gateway๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€ ๋จผ์ € ์ดํ•ดํ•˜๋Š”๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Zuul serverํŽธ์—์„œ ์„ค๋ช…ํ•œ๋ฐ”์™€ ๊ฐ™์ด API Gateway๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ..

happycloud-lee.tistory.com

 

 

ํŽ˜์ธ(Feign)

โ€ฃ REST Client
โ€ฃ Interface ์„ ์–ธ์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ HttpClient ์„ ์ƒ์„ฑ 
โ€ฃ ์›น ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์คŒ.
โ€ฃ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ (๋ฆฌํ„ด๊ฐ’๋งŒ ๊ด€์‹ฌ,, ์–ด๋–ค URL ์ธ์ง€ ์–ด๋–ป๊ฒŒ ์‘๋‹ต๊ฐ’์„ ํŒŒ์‹ฑํ• ์ง€๋Š” ๊ด€์‹ฌ์—†์Œ)

โ€ฃ spring-cloud-starter-feign ์Šคํƒ€ํ„ฐ ์‚ฌ์šฉ
โ€ฃ ๋ฆฌ๋ณธ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ตํ•ฉ๋ผ ๋””์Šค์ปค๋ฒ„๋ฆฌ ์„œ๋น„์Šค์™€ ํ†ต์‹ , ๋ถ€ํ•˜๋ถ„์‚ฐ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ œ๊ณต.

 

https://erea.tistory.com/14

 

 

๋ถ„์‚ฐ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜ ๊ด€๋ฆฌ

โ€ฃ ์„ค์ •์ •๋ณด ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ, ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š”๊ฒƒ (์ค‘์•™ํ™” ๋œ ์ €์žฅ์†Œ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ๊ด€๋ฆฌ)
โ€ฃ ๊ฐ ์„œ๋น„์Šค๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€์•Š๊ณ  ๋ฐ”๋กœ ์ ์šฉ! (์ค‘์•™์— ์žˆ์œผ๋ฏ€๋กœ)
โ€ฃ ์„œ๋ฒ„๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ค‘์•™ ์žฅ์†Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ชจ๋“  ์™ธ๋ถ€ ์†์„ฑ์ด ๋ชจ๋“  ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ๋จ. (key, value.. yml file..)
โ€ฃ ์„ค์ • ํŒŒ์ผ์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋˜๋Š” ์„œ๋ฒ„ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. (vault..)

โ€ป Vault 
ํ† ํฐ ๋ฐ ํŒจ์Šค์›Œ๋“œ ์ž๊ฒฉ์ฆ๋ช…์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ
ํ•ด์‹œ์ฝ”ํ”„(HashCorp)์—์„œ ๋งŒ๋“ฌ
์ž๊ฒฉ ์ •๋ณด ๋“ฑ์„ ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋ณด์•ˆ์ด์Šˆ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
API ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ (API๋Š” ๊ธฐ๋ณธ ์ธ์ฆ์œผ๋กœ ๋ณดํ˜ธ๋จ)
ํ‚ค/๊ณต๊ฐœ ํ‚ค ์ธ์ฆ์„ ์‚ฌ์šฉํ•œ SSL ์—ฐ๊ฒฐ ์„ค์ •๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€ฃ spring-cloud-config-server ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™œ์„ฑํ™”

 

์ปจ์„ค(Consul)

โ€ฃ ๋„ทํ”Œ๋ฆญ์Šค ๋ฆฌ๋ณธ๊ณผ ๋™์  ๋ผ์šฐํ„ฐ, ๋„ทํ”Œ๋ฆญ์Šค Zuul์˜ filter๋ฅผ ์ง€์›
โ€ฃ spring-cloud-starter-consul-discovery ์˜์กด์„ฑ ์‚ฌ์šฉ

 

์•„ํŒŒ์น˜ ์ฃผํ‚คํผ(Apache Zookeeper)

โ€ฃ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜๊ณผ ์ด๋ฆ„์„ ์œ ์ง€ํ•˜๋Š” ์ค‘์•™ ์„œ๋น„์Šค๋กœ ๋ถ„์‚ฐ ๋™๊ธฐํ™”, ๊ทธ๋ฃน ์„œ๋น„์Šค๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ. 
โ€ฃ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋œ ๋ฉ”์„ธ์ง€ ํ ์ •๋ณด๋“ค ๊ด€๋ฆฌ, kafka ์„œ๋ฒ„ ๊ฐ€๋™ํ•˜๋ ค๋ฉด zookeeper๊ฐ€ ๊ตฌ๋™๋˜์–ด ์žˆ์–ด์•ผ ํ•จ.
โ€ฃ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ฃผํ‚คํผ๋ฅผ ์‚ฌ์šฉํ•œ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด spring-cloud-startet-zookeeper-discovery, ์•„ํŒŒ์น˜ ํ๋ ˆ์ดํ„ฐ๋ฅผ ์˜์กด์„ฑ์— ํฌํ•จ.
โ€ฃ ๋ถ„์‚ฐ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” spring-cloud-starter-zookeeper-config ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•„์š”.

 

 

๋ถ„์‚ฐ์ถ”์ 

์Šฌ๋ฃจ์Šค(Sleuth)

โ€ฃ ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ์ฒ˜๋ฆฌํ• ๋•Œ ์ด์–ด์ง€๋Š” ์š”์ฒญ์„ ์—ฐ๊ด€์ง€์Œ
โ€ฃ Slf4j, MDC๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.
โ€ฃ spring-cloud-starter-sleuth ์˜์กด์„ฑ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™œ์„ฑํ™”

โ€ป Slf4j
๋กœ๊ทธ๋ฐฑ log4j, logging ๋“ฑ๊ณผ ๊ฐ™์€ ํŠน์ • ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ถ”์ƒํ™” ํผ์‚ฌ๋“œ(Facade=์ปค๋‹ค๋ž€ ์ฝ”๋“œ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ฐ„๋žตํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต)๋ฅผํ•จ

โ€ป MDC (mapped diagnostic context)
๋‹ค์–‘ํ•œ ์†Œ์Šค์˜ ๋กœ๊ทธ ์ถœ๋ ฅ์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ์‹ค์ œ ๋ฒ”์œ„์— ์—†๋˜ ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์†”๋ฃจ์…˜ 

 

 

๋ฉ”์„ธ์ง•

 

๋ฒ„์Šค(bus)

โ€ฃ ๋ถ„์‚ฐ์‹œ์Šคํ…œ์˜ ๋…ธ๋“œ(๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค)๋ฅผ ๊ฒฝ๋Ÿ‰ ๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค(RabbitMQ)์™€ ์—ฐ๊ฒฐ
โ€ฃ ์ƒํƒœ ๋ฐ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์—๊ฒŒ ์ „๋‹ฌ (๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์—๊ฒŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์•Œ๋ ค์คŒ)
โ€ฃ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ์˜ ์ „๋‹ฌ ๋“ฑ ๊ณตํ†ต ์˜คํผ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ๋ถ„์‚ฐ ๋ฉ”์„ธ์ง• ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ŠคํŠธ๋ฆผ(Stream)

โ€ฃ ๋ฉ”์„ธ์ง€ ์ค‘์‹ฌ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋œ ์‹œ์„ธํ‹ˆ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ
โ€ฃ ๋‘๊ฐœ์˜ ๋ฐ”์ธ๋”๊ฐ€ ์กด์žฌ (AMQP, Apache Kafka)
โ€ฃ ์Šคํ”„๋ง ์ธํ…Œ๊ทธ๋ ˆ์ด์…˜์— ๊ธฐ๋ฐ˜. ์ข…๋‹จ์ , ์ฑ„๋„, ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํ„ฐ, ํŠธ๋žœ์Šคํฌ๋จธ์™€ ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ†ตํ•ฉ ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์ œ๊ณต
โ€ฃ ๋งˆ์ดํฌ๋กœ์‹œ์Šคํ…œ ๋‚ด์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ์ŠคํŠธ๋ฆผ ์ž…๋ ฅ & ์ถœ๋ ฅ ์ฑ„๋„์„ ํ†ตํ•ด ํ†ต์‹ ํ•จ. 
โ€ฃ ๊ตฌ๋…/๊ฒŒ์‹œ ๋“ฑ ๋ฉ”์„ธ์ง€ ๊ณต์œ  ํ† ํ”ฝ์„ ํ†ตํ•ด ์ „ํŒŒ. (์›น์†Œ์ผ“ ํ†ต์‹ ๋ฐฉ์‹ ๊ฐ™์€๊ฑด๊ฐ€,,)

โ€ป AMQP (Advanced Message Queue Protocol)
๋ฉ”์„ธ์ง• ํ”„๋กœํ† ์ฝœ (MQ(๋ฉ”์„ธ์ง€ํ) ๊ธฐ๋ฐ˜)
HTTP ํ”„๋กœํ† ์ฝœ๊ณผ ๋‹ฌ๋ฆฌ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์˜ ์ •์˜ ๋ฟ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„ ์ธก ์„œ๋น„์Šค์™€ ๋™์ž‘ ๋ฐฉ์‹๋„ ์ •์˜ํ•œ๋‹ค.
๊ด€๋ จ ๋ฏธ๋“ค์›จ์–ด : RabbitMQ, Erlang
๋ฉ”์„ธ์ง€๋ธŒ๋กœ์ปค
์˜คํ”ˆ์†Œ์Šค ๋ฉ”์„ธ์ง€ ์†Œํ”„ํŠธ์›จ์–ด
https://www.youtube.com/watch?v=80y2C54KPxg
๋ฐ›๋Š” ์†Œ๋น„์ž ์ค‘์‹ฌ
โ€ป Apache Kafka
Scala์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค ํ”„๋กœ์ ํŠธ
์ด๋ฒคํŠธ๋ธŒ๋กœ์ปค (๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค ๊ธฐ๋Šฅ ํฌํ•จ)
๋ถ„์‚ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„๋œ ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์„ธ์ง• ํ”Œ๋žซํผ
๋ฉ”์„ธ์ง€ ๋ฐœํ–‰/๊ตฌ๋… ์‹œ์Šคํ…œ (Pub/Sub)
๋ณด๋‚ด๋Š” ์ƒ์‚ฐ์ž ์ค‘์‹ฌ

 

 

ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ์ง€์›

โ€ฃ ํ”ผ๋ณดํƒˆ..SQS,,SNS,,ElasticCache,,RDS,,๋“ฑ์ด ์žˆ๋‹ค.
โ€ฃ ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ ํŽ‘์…˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค. FaaS(Function-as-a-Service),,AWS Lambda
โ€ฃ SMTP..rabbitMQ,,Redis,,

 

 

๋ณด์•ˆ๊ด€๋ฆฌ ํ™œ์„ฑํ™”

โ€ฃ spring-cloud-starter-security ์˜์กด์„ฑ ์ถ”๊ฐ€

 

 

๋ฆด๋ฆฌ์ฆˆ ํŠธ๋ ˆ์ธ

โ€ฃ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ์˜ ํ˜ผ๋ž€์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ๋ฒ„์ „์ด ์•„๋‹Œ ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„
โ€ฃ BOM(Bill of materials)์— ๊ธฐ๋ฐ˜ → ์•„ํ‹ฐํŒฉํŠธ ๋ฒ„์ „์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํ‘œ์ค€ ๋ฉ”์ด๋ธ ๊ฐœ๋….
โ€ฃ https://spring.io/projects/spring-cloud-stream

 

 


์ฐธ๊ณ 

๋งํฌ: https://m.blog.naver.com/quart21c/173614581

 

ํด๋ผ์šฐ๋“œ์ปดํ“จํŒ…์˜ SaaS, PaaS, laaS์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ๊นŒ์š”.

ํด๋ผ์šฐ๋“œ์ปดํ“จํŒ… ๋•Œ ์ž์ฃผ ๋“ฃ๋Š” SaaS, PaaS, LaaS์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ๊นŒ์š”. ํด๋ผ์šฐ๋“œ์ปดํ“จํŒ…, ํด๋ผ...

blog.naver.com

๋งํฌ: https://coe.gitbook.io/guide/gateway/zuul

 

Zuul - guide

๋™์  ๋ผ์šฐํŒ…, ๋ชจ๋‹ˆํ„ฐ๋ง, ํšŒ๋ณต ํƒ„๋ ฅ์„ฑ, ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ง€์› (Filters๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„)

coe.gitbook.io

๋งํฌ: https://sup2is.github.io/2020/04/12/spring-cloud-hystrix-circuit-breaker-with-fallback.html

 

Sup2's blog-Spring Cloud์—์„œ Hystrix๋ฅผ ์‚ฌ์šฉํ•œ Circuit Breaker ๊ตฌํ˜„ํ•˜๊ธฐ Feat.Fallback

 

sup2is.github.io

์ฑ…: http://www.yes24.com/Product/Goods/66581779

 

๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ - YES24

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ณด์•ˆ ๊ฐ•ํ™”, ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์ž!ํด๋ผ์šฐ๋“œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ปฌ ์• ํ”Œ๋ฆฌ

www.yes24.com

๋งํฌ: http://blog.skby.net/amqp-advanced-message-queue-protocol/

 

AMQP (Advanced Message Queue Protocol) > ๋„๋ฆฌ์˜ ๋””์ง€ํ„ธ๋ผ์ดํ”„

I. ์‘์šฉ ๊ณ„์ธต ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ํ‘œ์ค€, AMQP ๊ฐ€. AMQP(Advanced Message Queue Protocol)์˜ ๊ฐœ๋… ํด๋ผ์ด์–ธํŠธ ๋ฏธ๋“ค์›จ์–ด ๋ธŒ๋กœ์ปค ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ MQ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ๊ตํ™˜ ํ”„๋กœํ† ์ฝœ ๋‚˜. AMQP ํŠน์ง• ์ด๊ธฐ์ข… ๊ฐ„ ๋ฉ”์‹œ์ง€ ๊ตํ™˜

blog.skby.net

๊ฐ•์˜: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/lecture/68407?tab=curriculum&volume=1.00&speed=1

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
WebSocket
์„ค๋ช…

TCP ์ ‘์†์— ์ „์ด์ค‘ ํ†ต์‹  ์ฑ„๋„์„ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ
HTTP ํด๋ง๊ณผ ๊ฐ™์€ ๋ฐ˜์ด์ค‘ ๋ฐฉ์‹์— ๋น„ํ•ด ๋” ๋‚ฎ์€ ๋ถ€ํ•˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„๊ฐ„์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ. 
์„œ๋ฒ„๊ฐ€ ๋‚ด์šฉ์„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์„ ์ œ๊ณต
์—ฐ๊ฒฐ์ด ์œ ์ง€๋œ ์ƒํƒœ์—์„œ ๋ฉ”์„ธ์ง€๋“ค์„ ์˜ค๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ—ˆ์šฉํ•จ. (์–‘๋ฐฉํ–ฅ)

โ€ป ์ „์ด์ค‘ ํ†ต์‹  (Full Duplex)
๋‘ ์ง€์ (์‹œ์ž‘๊ณผ ๋) ์‚ฌ์ด์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์ „์ž ํ†ต์‹  ์‹œ์Šคํ…œ
โ€ป TCP (Transmission Control Protocol), ์ „์†ก์ œ์–ดํ”„๋กœํ† ์ฝœ
์„œ๋ฒ„๋ผ๋ฆฌ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์•ฝ(ํ”„๋กœํ† ์ฝœ)
์›น๋ธŒ๋ผ์šฐ์ €๋“ค์ด WWW์— ์„œ๋ฒ„ ์—ฐ๊ฒฐํ• ๋•Œ ์‚ฌ์šฉ
์ด๋ฉ”์ผ ์ „์†ก ๋ฐ ํŒŒ์ผ ์ „์†ก์‹œ ์‚ฌ์šฉ

โœฑ ์ตœ์ดˆ ์—ฐ๊ฒฐ์‹œ  
    1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์›น์†Œ์ผ“ ํ•ธ๋“œ์…ฐ์ดํฌ ์š”์ฒญ์„ ๋ณด๋ƒ„
    2. ์„œ๋ฒ„๋Š” ์›น์†Œ์ผ“ ํ•ธ๋“œ์…ฐ์ดํฌ ์‘๋‹ต์„ ๋ณด๋ƒ„
    3. ์ดํ›„๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ผ์ˆ˜ ์žˆ์Œ. (!= HTTP)


 

Websocket in Spring
๊ด€๋ จ ์˜ˆ์ œ 

https://spring.io/guides/gs/messaging-stomp-websocket/ ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์‹ค์Šต์„ ํ•ด ๋ณด์•˜๋‹ค. 
ํ•ด๋‹น ๋งํฌ๋Š” STOMP(Simple Text Messaging protocol)์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

โ€ป STOMP(Simple Text Messaging protocol)
ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์„ธ์ง• ํ”„๋กœํ† ์ฝœ
์ด๋ฅผ ์ด์šฉํ•˜์—ฌ Binary, Text๊ฐ€ ์•„๋‹Œ ๊ทœ๊ฒฉ์„ ๋งž์ถ˜ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 
๋ฐœํ–‰(pub), ๊ตฌ๋…(sub), ๋ฉ”์„ธ์ง€๋ธŒ๋กœ์ปค(=๋ฐœ์‹ ์ž๊ฐ€ ๋ฉ”์„ธ์ง€ ๋ฐ›์•„์™€ ์ˆ˜์‹ ์ž์—๊ฒŒ ์ „๋‹ฌ) ๋“ฑ์˜ ๊ฐœ๋…์ด ์žˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์„œ๋ฒ„ ๊ตฌ๋™์‹œ, ์›น์†Œ์ผ“ ๋ฉ”์„ธ์ง• ๋ธŒ๋กœ์ปค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๋“ฏ ํ•˜๋‹ค. (SimpleBrokerMessageHandler)

+ Fallback Options์œผ๋กœ SockJS์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. 

 

ํ…Œ์ŠคํŠธ ํ™”๋ฉด

์ตœ์ดˆ์—ฐ๊ฒฐ์‹œ (๋ธŒ๋ผ์šฐ์ €1(์ƒ๋‹จ), ๋ธŒ๋ผ์šฐ์ €2(ํ•˜๋‹จ))

 

๋ธŒ๋ผ์šฐ์ €1์ด TARGET1์„ ์ž…๋ ฅ ํ•˜์˜€์„๋•Œ

๋ธŒ๋ผ์šฐ์ €์—์„œ Send ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, /app/hello ์„ ํ˜ธ์ถœํ•˜๊ณ 
๋ฉ”์„ธ์ง€ ๋ธŒ๋กœ์ปค ํ•ธ๋“ค๋Ÿฌ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ ํ›„ /topic/greetings ์œผ๋กœ ๊ฒฐ๊ณผ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•จ!

 

๋ธŒ๋ผ์šฐ์ €2๊ฐ€ TARGET2์„ ์ž…๋ ฅ ํ•˜์˜€์„๋•Œ

 

 

 


์ฐธ๊ณ 

๋งํฌ: https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%A4%91%ED%86%B5%EC%8B%A0

 

์ด์ค‘ํ†ต์‹  - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์ด์ค‘ํ†ต์‹ (duplex) ๋˜๋Š” ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์€ ๋‘ ์ง€์  ์‚ฌ์ด์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์ „์ž ํ†ต์‹  ์‹œ์Šคํ…œ์„ ๋งํ•œ๋‹ค. ์ด์ค‘ ํ†ต์‹ ์„ ํ•  ๋•Œ ์ „์†ก ๋ฐฉํ–ฅ๋งˆ๋‹ค ๋‘ ๊ฐœ์˜ ํ†ต์‹  ์„ ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ˆœํ•˜์ง€๋งŒ ์ „์†ก๋กœ๋ฅผ ์•„๋ผ

ko.wikipedia.org

๋งํฌ: https://ko.wikipedia.org/wiki/%EC%9B%B9%EC%86%8C%EC%BC%93

 

์›น์†Œ์ผ“ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์›น์†Œ์ผ“(WebSocket)์€ ํ•˜๋‚˜์˜ TCP ์ ‘์†์— ์ „์ด์ค‘ ํ†ต์‹  ์ฑ„๋„์„ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ์›น์†Œ์ผ“ ํ”„๋กœํ† ์ฝœ์€ 2011๋…„ IETF์— ์˜ํ•ด RFC 6455๋กœ ํ‘œ์ค€ํ™”๋˜์—ˆ์œผ๋ฉฐ ์›น IDL์˜ ์›น์†Œ์ผ“ API๋Š” W3C์— ์˜ํ•ด ํ‘œ์ค€

ko.wikipedia.org

๋งํฌ :https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

 

์ „์†ก ์ œ์–ด ํ”„๋กœํ† ์ฝœ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์ „์†ก ์ œ์–ด ํ”„๋กœํ† ์ฝœ(Transmission Control Protocol, TCP, ๋ฌธํ™”์–ด: ์ „์†ก์กฐ์ข…๊ทœ์•ฝ)์€ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ ์Šค์œ„ํŠธ(IP)์˜ ํ•ต์‹ฌ ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๋กœ, IP์™€ ํ•จ๊ป˜ TCP/IP๋ผ๋Š” ๋ช…์นญ์œผ๋กœ๋„ ๋„๋ฆฌ ๋ถˆ๋ฆฐ๋‹ค. TCP๋Š” ๊ทผ๊ฑฐ๋ฆฌ ํ†ต์‹ 

ko.wikipedia.org

๋งํฌ: https://namu.wiki/w/TCP

๋งํฌ: https://tecoble.techcourse.co.kr/post/2021-09-05-web-socket-practice/

 

์›น ์†Œ์ผ“์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž! - ์‹ค์ „ ํŽธ

์›น ์†Œ์ผ“์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž! - ์‹ค์ „ ํŽธ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ €๋ฒˆ์— ์ž‘์„ฑํ–ˆ๋˜ ์›น ์†Œ์ผ“ ์ด๋ก  ํŽธ์— ์ด์–ด์„œ, ์Šคํ”„๋ง ํ™˜๊ฒฝ์—์„œ ์›น ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๋ ค๊ณ  ํ•œ๋‹ค. STOMP ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ, ์šฐ๋ฆฌ๋Š” ์ƒˆ

tecoble.techcourse.co.kr

๋งํฌ: https://tech.kakao.com/2020/06/22/websocket-part3/

 

์‹ค์‹œ๊ฐ„ ๋Œ“๊ธ€ ๊ฐœ๋ฐœ๊ธฐ(part.3) - Spring์˜ ๋™์‹œ์„ฑ ์ ‘๊ทผ ์ œ์–ด์— ๋ฐœ๋ชฉ ์žกํžŒ ์ด์•ผ๊ธฐ

์ „ํŽธ(์‹ค์‹œ๊ฐ„ ๋Œ“๊ธ€ ๊ฐœ๋ฐœ๊ธฐ(part.2) – ํ—˜๋‚œํ–ˆ์ง€๋งŒ ์œ ์ตํ–ˆ๋˜ ์›น์†Œ์ผ“ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ๋ฐ ์•ˆ์ •ํ™” ์ž‘์—…)์—์„œ ๊ณต์œ  ๋“œ๋ฆฐ ๋ฐ”์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋””๋ฒ„๊น… ํˆด์˜ ์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€์ธ Spring SimpleBroker ํŠœ

tech.kakao.com

๋งํฌ: https://www.youtube.com/watch?v=rvss-_t6gzg

 

๋ฐ˜์‘ํ˜•

'๊ฐœ๋ฐœ > spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[AOP] AOP ์ ์šฉ ๊ด€๋ จ ์ด์Šˆ  (0) 2024.05.14
ํŠธ๋žœ์žญ์…˜  (0) 2021.11.25
Spring - ์Šคํ”„๋ง MVC ๊ฐ„๋‹จ ์ •๋ฆฌ  (0) 2021.06.05
Spring - DI (Dependency Injection)  (0) 2021.06.01
Spring - AOP(Aspect-Oriented Programming)  (0) 2021.05.25
๋ฐ˜์‘ํ˜•
์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ
์„ค๋ช…

ํด๋ผ์šฐ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ๋“ค์„ ์ œ๊ณตํ•ด์ค€๋‹ค.


    โ–ถ๏ธŽ ๋ถ„์‚ฐ / ๋ฒ„์ „ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜
        • ๋ถ„์‚ฐ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜์€ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ์ธ๊ธฐ์žˆ๋Š” ํ‘œ์ค€์ด๋‹ค. 
        • ์Šคํ”„๋ง ์ปจํ”ผ๊ทธ๋Š” ๋ถ„์‚ฐ์‹œ์Šคํ…œ์—์„œ ์™ธ๋ถ€ ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ์„œ๋ฒ„ ์ธก๊ณผ ํด๋ผ์ด์–ธํŠธ ์ธก์„ ์ง€์›ํ•œ๋‹ค.
            → ์ค‘์•™ ๋‹จ์ผ ์ €์žฅ์†Œ ์ƒ์„ฑ๋จ. ... vault..
        • ์ฃผํ‚คํผ(Zookeeper) ๋“ฑ์ด์žˆ๋‹ค..


    โ–ถ๏ธŽ ์„œ๋น„์Šค ๋“ฑ๋ก & ๋””์Šค์ปค๋ฒ„๋ฆฌ
        • ๋””์Šค์ปค๋ฒ„๋ฆฌ๋Š” ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ์ƒ์˜ ๋””๋ฐ”์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋””๋ฐ”์ด์Šค&์„œ๋น„์Šค๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ์„œ๋น„์Šค์ด๋‹ค.
            → ๊ฐ ์„œ๋น„์Šค๋“ค ์‹คํ–‰์‹œ ์ค‘์•™ ์„œ๋ฒ„์— ์ž์‹ (์„œ๋น„์Šค)์„ ๋“ฑ๋กํ•˜๋Š”๊ฒƒ. (IP, Port ๋“ฑ)
            → ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ ์„œ๋ฒ„์ธ์Šคํ„ด์Šค๋“ค์ด ์˜คํ† ์Šค์ผ€์ผ๋ง ๋˜๊ฑฐ๋‚˜, ์ƒ์„ฑ ํ™•์žฅ๋“ฑ์ด ๋ ๋•Œ IP or Port ๋“ฑ์ด ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ •๋ณด๋“ค์„ ์บ์น˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•จ.
        • ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ ๋””์Šค์ปค๋ฒ„๋ฆฌ ํŒจํ‚ค์ง€ ์œ ๋ ˆ์นด(Eureka)๊ฐ€ ์žˆ๋‹ค.
        • ์œ ๋ ˆ์นด๋Š” ํด๋ผ์ด์–ธํŠธ & ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ์ด ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์›๊ฒฉ ๋””์Šค์ปค๋Ÿฌ๋น„์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ์ผ์„ ๋‹ด๋‹นํ•˜๊ณ 
์„œ๋ฒ„๋Š” ๋…๋ฆฝ์ ์ธ ์Šคํ”„๋ง๋ถ€ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ด๋‹นํ•œ๋‹ค.


    โ–ถ๏ธŽ ๋ผ์šฐํŒ…
        • ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ ์ค„(Zuul)์ด ์žˆ๋‹ค.
        • ์ค„์€ ๋ถ€ํ•˜๋ถ„์‚ฐ ๋ฐ ํ•„ํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฒŒ์ดํŠธ์›จ์ด๋กœ์จ์˜ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.


    โ–ถ๏ธŽ ์„œ๋น„์Šค๊ฐ„ ํ˜ธ์ถœ

        • API ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ๊ฐ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๋„๋ฉ”์ธ์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  IP๋“ฑ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ IP์— ๋Œ€ํ•ด์„œ๋Š” ๊ด€๋ จ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค˜์•ผ ํ•จ
        • ๋””์Šค์ปค๋ฒ„๋ฆฌ ์„œ๋น„์Šค๋Š” ์ธ์Šคํ„ด์Šค์˜ ID๋‚˜ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ์—, ๋ณ€๊ฒฝ๋œ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Œ. 
        • API ํ†ต์‹ ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” RestClient ์ข…๋ฅ˜๋กœ ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ํŽ˜์ธ(Feign) ์ด ์žˆ๋‹ค.


    โ–ถ๏ธŽ ๋ถ€ํ•˜๋ถ„์‚ฐ
        • ๋ผ์šด๋“œ ๋กœ๋นˆ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ๋””์Šค์ปค๋ฒ„๋ฆฌ์— ๋“ฑ๋ก๋œ ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. (๋ถ€ํ•˜๋ถ„์‚ฐ๊ธฐ)
        • ๋„ทํ”Œ๋ฆญ์Šค OSS(Open Source Software) ์˜ ๋ฆฌ๋ณธ(Ribbon) ์ด
์žˆ๋‹ค.


    โ–ถ๏ธŽ ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค
        • ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ ๋ฌธ์ œ ํ•ด๊ฒฐ 
        • ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค: ์„ฑ๊ณต & ์‹คํŒจ ํ™•๋ฅ ์„ ์ €์žฅ
        • ์ž„๊ณ„์น˜๊ฐ€ ๋„˜์œผ๋ฉด ์ฐจ๋‹จ! 
        • ํด๋ฐฑ(fallback) ๋กœ์ง ์ˆ˜ํ–‰!


    โ–ถ๏ธŽ ๋ถ„์‚ฐ ๋ฉ”์„ธ์ง• 
        • AMQP, Apache kafka ๋“ฑ์ด ์žˆ๋‹ค.

 

 

ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
์„ค๋ช…

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์„ ์œ„ํ•ด ์ž˜ ์„ค๊ณ„๋œ ํ”„๋กœ๊ทธ๋žจ
https://docs.spring.io/spring-cloud-commons/docs/3.1.1/reference/html/

 

 

 


์ฐธ๊ณ 

์ฑ…: http://www.yes24.com/Product/Goods/66581779
๋งํฌ: https://mangchhe.github.io/springcloud/2021/04/07/ServiceDiscoveryConcept/

 

[Spring Cloud] Service Discovery๋ž€?

Service Discovery๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€, Service Discovery์˜ ์ข…๋ฅ˜์™€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด์ž

mangchhe.github.io

๋งํฌ: https://www.baeldung.com/spring-cloud-bootstrapping

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ชผ๊ฐ ๊ฒƒ (๋А์Šจํ•œ ์—ฐ๊ฒฐ)
    → ํ”„๋กœ์ ํŠธ ์ฐธ์—ฌ์ž๊ฐ€ ์„œ๋น„์Šค ํŒŒ์•…์— ์šฉ์ด (์ชผ๊ฐœ์ ธ ์žˆ์œผ๋ฏ€๋กœ!)
    → ๋ถ„๋ฆฌ๋œ ์„œ๋น„์Šค๋ฅผ ๊ฐ ๋‹ด๋‹น์ž๋“ค์ด ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•จ.
    → ์ชผ๊ฐœ์ ธ์žˆ์–ด ์„œ๋น„์Šค๊ฐ„ ๋ฐฐํฌ์— ์˜ํ–ฅ๋„ X
    → ํ™•์žฅ์„ฑ, ๋…๋ฆฝ์„ฑ, ์œ ์—ฐ์„ฑ

์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„์ด๊ณ  ์ค‘์•™์—์„œ ๊ด€๋ฆฌ๊ฐ€ ๋จ.
    → ๋„คํŠธ์›Œํฌ ์œ„์น˜, ์ปจํ”ผ๊ทœ๋ ˆ์ด์…˜(configuration), ๋กœ๊น…ํŒŒ์ผ, ๋ฉ”ํŠธ๋ฆญ๋“ฑ์€ ์ค‘์•™์—์„œ ๊ด€๋ฆฌ๋จ.

โ€ป ๋ฉ”ํŠธ๋ฆญ
์†Œํ”„ํŠธ์›จ์–ด์˜ ์†์„ฑ์ด๋‚˜ ๊ทœ๊ฒฉ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ํ‘œ.
ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก์„ฑ, ์ฝ”๋“œ๋ณ„ ๋ฒ„๊ทธ์˜ ์ˆ˜, ์ˆ˜์š”์ž ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์ˆ˜ ๋”ฐ์œ„๋ฅผ ์ธก์ •ํ•œ๋‹ค.

 

 


์ฐธ๊ณ 

์ฑ…: http://www.yes24.com/Product/Goods/66581779

 

๋งˆ์Šคํ„ฐ๋ง ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ - YES24

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ณด์•ˆ ๊ฐ•ํ™”, ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ์ž!ํด๋ผ์šฐ๋“œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ปฌ ์• ํ”Œ๋ฆฌ

www.yes24.com

๋งํฌ: https://badadict.com/ko/1623891โ€‹

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
JPQL (Java Persistence Query Language)
์„ค๋ช…

ํ…Œ์ด๋ธ” ๋Œ€์ƒ์œผ๋กœ ํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ, ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌํ•œ ๊ฒƒ.
SQL์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL์— ์˜์กดํ•˜์ง€ ์•Š์Œ.
JPQL → SQL ์œผ๋กœ ๋ณ€ํ™˜ํ•จ
๊ฐ์ฒด์ง€ํ–ฅSQL

 

ํŠน์ง•
-- ์ผ๋ฐ˜ SQL ๋ฌธ
select * from Member as m where m.username = 'coffee' -- ๋ณ„์นญ(m)์€ ํ•„์ˆ˜๋‹ค.

-- JPQL ๋ฌธ
/**
@Entity(name="memeber")
class Memeber {
  ...
  private String username;
}
*/
select m from memeber as m where m.username = 'coffee'
-- → ์—”ํ‹ฐํ‹ฐ๋ช…(member)์œผ๋กœ ์กฐํšŒํ•ด์•ผํ•œ๋‹ค.
-- → ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค๋ช…(Member)์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. (ํด๋ž˜์Šค๋ช… ์ถ”์ฒœ)
-- → ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

select m.username from member as m 
-- → username ์„ ์กฐํšŒ ํ•œ๋‹ค๋ฉด, ๋ณ„์นญ(m)์€ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผํ•จ.

 

๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์„ ๋•Œ (createQuery ์‚ฌ์šฉ ์‹œ)

TypeQuery: ๋ฐ˜ํ™˜ํƒ€์ž…(๋ฉ”์†Œ๋“œ ๋ฆฌํ„ดํƒ€์ž…)์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ.
• Query: ๋ฐ˜ํ™˜ํƒ€์ž…(๋ฉ”์†Œ๋“œ ๋ฆฌํ„ดํƒ€์ž…)์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ.

 

๊ฒฐ๊ณผ ์กฐํšŒ API

query.getResultList(): ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ผ๋•Œ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
• query.getSingleResult(): ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํžˆ ํ•˜๋‚˜, ๋‹จ์ผ ๊ฐ์ฒด ๋ฐ˜ํ™˜.

 

JPQL ์กฐ์ธ


 ๋‚ด๋ถ€ ์กฐ์ธ๊ณผ ์™ธ๋ถ€์กฐ์ธ

-- ๋‚ด๋ถ€ ์กฐ์ธ (INNER JOIN, INNER ์ƒ๋žต ๊ฐ€๋Šฅ)
select m from Member m inner join m.team t where t.name = :teamName


-- ์™ธ๋ถ€ ์กฐ์ธ (LEFT OUTER JOIN, OUTER ์ƒ๋žต ๊ฐ€๋Šฅ)
select m from Member m left join m.team t


-- ์„ธํƒ€์กฐ์ธ (์—ฐ๊ด€๊ด€๊ณ„ ์—†๋Š”๋ฐ ์กฐ์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ!!)
select count(m) from Member m, Team t where m.username = t.name


์ปฌ๋ ‰์…˜ ์กฐ์ธ
  → ์ผ๋Œ€๋‹ค or ๋‹ค๋Œ€์ผ ๊ด€๊ณ„ ์ฒ˜๋Ÿผ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ์กฐ์ธํ•˜๋Š” ๊ฒƒ. 
  → ์ผ๋Œ€๋‹ค(=๋‹ค์˜ ์—ฐ๊ด€ํ•„๋“œ ์‚ฌ์šฉ) or ๋‹ค๋Œ€์ผ(=์ผ์˜ ์—ฐ๊ด€ํ•„๋“œ ์‚ฌ์šฉ)
 
์„ธํƒ€ ์กฐ์ธ
  → where ์ ˆ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ธ (select count(m) from Memeber m, Team t where m.username = t.name)

• JOIN ON ์ ˆ (JPA 2.1 ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  → ์™ธ๋ถ€์กฐ์ธ์—์„œ๋งŒ ์‚ฌ์šฉ.

 ํŽ˜์น˜ ์กฐ์ธ (FETCH JOIN)
  → JPQL์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ. ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ํ•œ๋ฒˆ์— ๊ฐ™์ด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ. join fetch ์œผ๋กœ ์‚ฌ์šฉ.
  → ํŽ˜์น˜์กฐ์ธ ์‚ฌ์šฉ์‹œ, SQL ํ•œ๋ฒˆ์œผ๋กœ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ํ•จ๊ป˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด, SQL ์กฐํšŒ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  → ์ง€์—ฐ๋กœ๋”ฉ ์‚ฌ์šฉ ๋ฐ  fetch join ์ ์šฉํ•˜๋Š”๊ฒƒ์ด ํšจ์œจ์ .
  ํŽ˜์น˜์กฐ์ธ์€ alias ์‚ฌ์šฉ์„ ๋ชปํ•˜๋ฉฐ, ๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง• API์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค...ํ—‰ 
  → ํŽ˜์น˜์กฐ์ธ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ์œ ์ง€ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ !
  → ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ตฌ์ง€ ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค.

-- fetch join ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, m ๋ฐ m.team ๋ชจ๋‘ ์กฐํšŒ๋จ.
-- >> JPQL ์‹
select m from Member m join fetch m.team where m.name = 'AA'

-- >> SQL ์‹ 
select
  m.*, t.*
from Member m join Team t on m.team_id = t.id
where m.name = 'AA'




-- fetch join ์ด ์•„๋‹Œ ์ผ๋ฐ˜ join ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” SQL ์—์„œ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ด
-- >> JPQL ์‹
select m from Member m join m.team

-- >> SQL ์‹ 
select
  m.*
from Member m join Team t on m.team_id = t.id

๋ฌต์‹œ์  ์กฐ์ธ
  → join ํ‚ค์›Œ๋“œ ์ง์ ‘ ์‚ฌ์šฉ (select ~~ from Member m join m.team t)
  → ์กฐ์ธ์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ,,์„ ํ•œ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์–ด๋ ต๋‹ค,,?

๋ช…์‹œ์  ์กฐ์ธ (์ถ”์ฒœโญ๏ธ)
  → ๊ฒฝ๋กœ ํ‘œํ˜„์‹์— ์˜ํ•ด ๋ฌต์‹œ์ ์œผ๋กœ SQL ์กฐ์ธ ๋ฐœ์ƒ (๋‚ด๋ถ€ ์กฐ์ธ๋งŒ ๊ฐ€๋Šฅ) (select m.team from Member m)

 

 

์„œ๋ธŒ์ฟผ๋ฆฌ

where, having ์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, select, from ์ ˆ์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ! (ใ… ใ… )
• EXISTS(๊ฒฐ๊ณผ ์กด์žฌ์‹œ ์ฐธ) → select ~~ where exsist (select t from ~~)
 ALL(๋ชจ๋‘ ๋งŒ์กฑ ์ฐธ) select ~~ where o.number > ALL (select b from ~~)
 ANY(์กฐ๊ฑด์ด ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑ์‹œ ์ฐธ=SOME)  select ~~ where a.tesm = ANY(select c from ~~) 
 IN(์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ™์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฐธ) select ~~ where a.count in (select d from ~~)

 

CASE ์‹

COALESCE: ํ•˜๋‚˜์”ฉ ์กฐํšŒํ•ด์„œ null ์ด ์•„๋‹ˆ๋ฉด ๋ฐ˜ํ™˜
NULLIF: ๋‘ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด null ๋ฐ˜ํ™˜, ๋‹ค๋ฅด๋ฉด ์ฒซ๋ฒˆ์งธ ๊ฐ’ ๋ฐ˜ํ™˜


์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜

select function('group_concat', name) from ~~
์‚ฌ์šฉ ์ „ group_concat์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ •์˜๋ฅผ ํ•ด์•ผ ํ•จ. (DB๋ฐฉ์–ธ ์ƒ์† ๋ฐ›๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๋“ฑ๋ก ํ•„์š”)

 

 


์ฐธ๊ณ 

- ์ฑ…: https://www.coupang.com/vp/products/20488571?itemId=80660090&vendorItemId=3314421212&src=1042503&spec=10304982&addtag=400&ctag=20488571&lptag=10304982I80660090&itime=20220302010946&pageType=PRODUCT&pageValue=20488571&wPcid=16461509863931582782572&wRef=&wTime=20220302010946&redirect=landing&gclid=CjwKCAiApfeQBhAUEiwA7K_UHxuELLbyb9IhdrRf5inlJZLtN8-t8cUswFHeV6fFp-Yd4RThtzZvHxoCPFsQAvD_BwE&campaignid=12207438463&adgroupid=115720946583&isAddedCart= 

๋ฐ˜์‘ํ˜•

+ Recent posts