๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป Extracurricular/๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ11๊ธฐ

[์†Œ์ฃผ์ œ ์„ธ๋ฏธ๋‚˜ 1์ฐจ] ๋ธ”๋กœํ‚น-๋…ผ๋ธ”๋กœํ‚น / ๋™๊ธฐ - ๋น„๋™๊ธฐ

 

โœ… ๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น

๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น์€ I/O ์ž‘์—…์—์„œ ํ•œ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐœ๋…

 

โžก๏ธ ๋ธ”๋กœํ‚น์ด๋ž€?

ํ•œ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

 

ex) ํŒŒ์ผ์„ ์ฝ๋Š” ์ž‘์—…์—์„œ ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒ?
โ–ถ ํŒŒ์ผ์„ ์ฝ๋Š” ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ
    (๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Œ)

 

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

์ด๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์š”๊ตฌํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ โŒ

 

 

โžก๏ธ ๋…ผ๋ธ”๋กœํ‚น์ด๋ž€?

ํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

 

ex) ํŒŒ์ผ์„ ์ฝ๋Š” ์ž‘์—…์—์„œ ๋…ผ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒ?
โ–ถ ํŒŒ์ผ์„ ์ฝ๋Š” ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
    (๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Œ)

 

๋…ผ๋ธ”๋กœํ‚น I/O๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์€ ์Šค๋ ˆ๋“œ๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•œ ํ›„, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ์Šค๋ ˆ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์š”๊ตฌํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งค์šฐ ํšจ๊ณผ์ ! ๐Ÿ™†


โœ… ๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น์˜ ์žฅ๋‹จ์ 

โžก๏ธ ๋ธ”๋กœํ‚น์˜ ์žฅ๋‹จ์ 

1. ์žฅ์ 

1) ๋‹จ์ˆœ์„ฑ: ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

2) ์•ˆ์ •์„ฑ: ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, ์žฌ์‹œ๋„ํ•  ํ•„์š” ์—†์ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3) ์ง๊ด€์„ฑ: ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

 

2. ๋‹จ์ 

1) ๋Œ€๊ธฐ ์‹œ๊ฐ„: ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๋‹ค๋ฅธ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2) ์„œ๋ฒ„ ์ž์› ๋‚ญ๋น„: ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

โžก๏ธ ๋…ผ๋ธ”๋กœํ‚น์˜ ์žฅ๋‹จ์ 

1. ์žฅ์ 

1) ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ฐ์†Œ: ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

2) ์„œ๋ฒ„ ์ž์› ํ™œ์šฉ๋„ ์ฆ๊ฐ€: ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„ ์ž์›์˜ ํ™œ์šฉ๋„๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

2. ๋‹จ์ 

1) ๋ณต์žก์„ฑ: ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค

2) ์˜ˆ์™ธ์ฒ˜๋ฆฌ: ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋Š” ์žฌ์‹œ๋„๋‚˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3) ์„ฑ๋Šฅ: ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ์š”์†Œ๋“ค๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ๊ณผ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

โžก๏ธ ๊ฒฐ๋ก 

์Šคํ”„๋ง์—์„œ ๋ธ”๋กœํ‚น ๋ฐฉ์‹๊ณผ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋…ผ๋ธ”๋กœํ‚น : ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ

(์˜ˆ๋ฅผ ๋“ค์–ด, I/O ์ฒ˜๋ฆฌ์™€ ๊ฐ™์ด ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๊ธด ์ž‘์—…)

 

๋ธ”๋กœํ‚น : ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ

(์˜ˆ๋ฅผ ๋“ค์–ด, CPU๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ณ„์‚ฐ ์ž‘์—…)

 

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ตœ๋Œ€ํ•œ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์€ ์ž‘์—…!
๋”ฐ๋ผ์„œ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋ฉด ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

โœ… ์Šคํ”„๋ง(Spring)์—์„œ ๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์˜ ์‚ฌ์šฉ

โžก๏ธ ๋ธ”๋กœํ‚น ๋ฐฉ์‹ ์‚ฌ์šฉ ์˜ˆ์‹œ

์Šคํ”„๋ง์—์„œ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์™€ ๊ฐ™์ด ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

@GetMapping("/user/{userId}") public String getUserInfo(@PathVariable String userId) { 
User user = userRepository.findById(userId); return user.toString(); }

 

์ด ์ฝ”๋“œ์—์„œ userRepository.findById() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์Šคํ”„๋ง์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

 

โžก๏ธ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹ ์‚ฌ์šฉ ์˜ˆ์‹œ

์Šคํ”„๋ง์—์„œ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์€ ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๊ณผ ๊ฐ™์€ ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

@GetMapping("/user/{userId}") public CompletableFuture<String> getUserInfo(@PathVariable String userId){
	return CompletableFuture.supplyAsync(() -> { 
    	User user = userRepository.findById(userId);
        return user.toString(); 
        }
    );
}

 

์ด ์ฝ”๋“œ์—์„œ๋Š” supplyAsync() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ userRepository.findById() ๋ฉ”์„œ๋“œ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


โœ… ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ

์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹๊ณผ ์ˆœ์„œ์— ๊ด€๋ จ

 

โžก๏ธ ๋™๊ธฐ์ฒ˜๋ฆฌ๋ž€?

๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ.

๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ

 

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

 

 

โžก๏ธ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ž€?

๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์ˆœ์„œ์™€ ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅ

์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ „์ฒด์ ์ธ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฆ„

 

์ด๋Ÿฌํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ๋Œ€๊ฐœ ์ฝœ๋ฐฑ(callback) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋ก

 

๐Ÿ’ก์ฝœ๋ฐฑ์ด๋ž€?

https://steadily-hyunjin.tistory.com/67

 

[Node.js๋กœ ์„œ๋ฒ„๋งŒ๋“ค๊ธฐ] 2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• (์ฝœ๋ฐฑ ํ•จ์ˆ˜/Promise/async/await)

โœ… ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ฝœ๋ฐฑ์ด๋ž€? ๋‚˜์ค‘์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ์˜ˆ์‹œ 1) A()๋ผ๋Š” ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์คŒ. (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” '์ผ๊ธ‰ ๊ฐ์ฒด'์ด๋ฏ€๋กœ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•จ) 2) A ํ•จ์ˆ˜์˜

steadily-hyunjin.tistory.com

 

 

โžก๏ธ ๋™๊ธฐ vs ๋น„๋™๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •

1๏ธโƒฃ ๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์—์„œ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์—…๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
2๏ธโƒฃ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์—์„œ๋Š” ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

โœ… ๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์žฅ์ 

โžก๏ธ ๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์žฅ๋‹จ์ 

1. ์žฅ์ 

1) ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2) ๋””๋ฒ„๊น…์ด ์‰ฝ๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3) ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ๋‹จ์ 

1) ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•˜์—ฌ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2) ๋Œ€๊ธฐํ•˜๋Š” ๋™์•ˆ CPU ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

3) ๋Œ€๋ถ€๋ถ„์˜ ๋™๊ธฐ API๋Š” ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋น„ํ•ด ๊ตฌํ˜„์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

 

 

โžก๏ธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์žฅ๋‹จ์ 

1. ์žฅ์ 

1. ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.

2. ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค.

3. ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๋ฉฐ ์„œ๋ฒ„์˜ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ๋‹จ์ 

1. ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉฐ ๋””๋ฒ„๊น…์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

2. ๋น„๋™๊ธฐ API๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

3. ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ์ฒ˜๋ฆฌ ์‹œ๊ฐ„, ๋Œ€์šฉ๋Ÿ‰ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€, ์ฝ”๋“œ์˜ ๋ณต์žก๋„, API ์ง€์› ์—ฌ๋ถ€ ๋“ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒ!

โœ… ์Šคํ”„๋ง(Spring)์—์„œ ๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์‚ฌ์šฉ

โžก๏ธ ๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ

1. RestTemplate

์Šคํ”„๋ง์—์„œ๋Š” RestTemplate์„ ์‚ฌ์šฉํ•˜์—ฌ RESTful API๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ) RestTemplate์„ ์‚ฌ์šฉํ•œ GET ์š”์ฒญ

RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("https://api.example.com/data", String.class);

 

์œ„ ์ฝ”๋“œ๋Š” api.example.com ์„œ๋ฒ„์˜ /data API์— GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ String ํ˜•ํƒœ๋กœ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

์ด๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ธ”๋กœํ‚น๋˜์–ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

2. JdbcTemplate

JdbcTemplate์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ) JdbcTemplate์„ ์‚ฌ์šฉํ•œ SELECT ์ฟผ๋ฆฌ

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<User> users = jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper<>(User.class));

 

์œ„ ์ฝ”๋“œ๋Š” dataSource๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , users ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ ๋’ค,

User ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋งคํ•‘ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์—ญ์‹œ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ธ”๋กœํ‚น๋ฉ๋‹ˆ๋‹ค.

 

โžก๏ธ ๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ

1. @Async ์–ด๋…ธํ…Œ์ด์…˜

@Async ์–ด๋…ธํ…Œ์ด์…˜์€ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์ค‘ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.(ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰)

 

์˜ˆ์‹œ) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  @Async ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

@Service public class MyService { @Async public void doSomething() { // ... } }

 

์œ„์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋ฉด, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ์›๋ž˜ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

2. WebFlux

WebFlux๋Š” ์Šคํ”„๋ง 5๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

์ด ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebFlux๋Š” Reactor ํ”„๋กœ์ ํŠธ์˜ Mono์™€ Flux๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

@RestController public class MyController { 
	@GetMapping("/hello") public Mono<String> hello() { 
    return Mono.just("Hello, world!"); 
    } 
}

 

์œ„์˜ ์ฝ”๋“œ์—์„œ Mono๋Š” 0 ๋˜๋Š” 1๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

Mono.just() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ "Hello, world!" ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

 

โžก๏ธ ๊ฒฐ๋ก 

์Šคํ”„๋ง์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@Async ์–ด๋…ธํ…Œ์ด์…˜์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ ,

WebFlux๋Š” ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ• ์ง€๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.