์ธํ”„๋Ÿฐ ์˜๋ฌธ ๋ธŒ๋žœ๋“œ ๋กœ๊ณ 
์ธํ”„๋Ÿฐ ์˜๋ฌธ ๋ธŒ๋žœ๋“œ ๋กœ๊ณ 
BEST

์ž๋ฐ” ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ [๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ Part.1]

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

Thumbnail

์ดˆ๊ธ‰์ž๋ฅผ ์œ„ํ•ด ์ค€๋น„ํ•œ
[๋ฐฑ์—”๋“œ, ์›น ๊ฐœ๋ฐœ] ๊ฐ•์˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ฑธ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์š”

  • ์ž๋ฐ” ๋™์‹œ์„ฑ ์ดํ•ด

  • ๋‹ค์–‘ํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํŒจํ„ด ์ตํžˆ๊ธฐ

  • ๋™๊ธฐํ™” ๊ธฐ๋ฒ•๊ณผ ์ข…๋ฅ˜ ์ดํ•ด

  • ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ก ๊ณผ ์‹ค์Šต

  • ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ธฐ์ดˆ ๋‹ค์ง€๊ธฐ

์š”์ฆ˜ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์—์„œ ๊ผญ ํ•„์š”ํ•œ
๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ!

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


๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ํŒจํ„ด ์‹ค์Šต์œผ๋กœ ๋ฐฐ์šฐ๋Š”
์ž๋ฐ” ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ๋ชจ๋ธ์˜ ์ดํ•ด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ์Šค๋ ˆ๋“œ(Thread)์˜ ๊ด€๋ฆฌ, ๋™๊ธฐํ™”(Synchronization) ๊ธฐ๋ฒ•, ๋ฐ๋“œ๋ฝ(Deadlock) ํ•ด๊ฒฐ ์ „๋žต, ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ(Parallel Streams), ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์ธ CompletableFuture ๋“ฑ ๊ณ ๊ธ‰ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์‹ฌ๋„์žˆ๋Š” ์ง€์‹์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜์•„๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์€ Atomic ๋ณ€์ˆ˜, CountDownLatch, CyclicBarrier, Semaphore์™€ ๊ฐ™์€ ์ž๋ฐ”์˜ ๋™์‹œ์„ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์™€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋žต๋„ ์ค‘์š”ํ•œ ํ•™์Šต ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ธฐ์ดˆ ๋ฐ ๊ธฐ๋ณธ ์ง€์‹์„ ์Œ“๋Š” ์ดˆ์„์˜ ์—ญํ• ์„ ํ•  ๊ฒƒ์ด๋ฉฐ ์ž๋ฐ”์˜ ์ฐจ์„ธ๋Œ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์ธ Virtual Thread ๋ฅผ ์ค€๋น„ํ•˜๋Š” ์ค‘์š”ํ•œ ๋ฐ‘๊ฑฐ๋ฆ„์ด ๋  ๊ฒƒ์ด๋ผ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.


์ž…๋ฌธ์ž, ์ค‘ยท๊ณ ๊ธ‰์ž ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๊ฐ•์˜

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

์ฃผ์š” ํ•™์Šต ๋‚ด์šฉ ๐Ÿ’ก

๋ณธ ๊ฐ•์˜๋Š” ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ํ•ต์‹ฌ ์ฃผ์ œ๋กœ ํฌ๊ฒŒ ์ž๋ฐ” ์Šค๋ ˆ๋“œ์™€ ๋™๊ธฐํ™”, ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ ๊ฐ€์ง€ ์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ ์ˆ˜์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1. ์ž๋ฐ” ์Šค๋ ˆ๋“œ์™€ ๋™๊ธฐํ™” ์ดํ•ด

์ž๋ฐ”์—์„œ ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๊ฒฝ๋Ÿ‰ ํ”„๋กœ์„ธ์Šค๋กœ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์‹œ ์‹คํ–‰ ํ๋ฆ„์„ ์˜๋ฏธํ•˜๋ฉฐ, Thread ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค; ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ณต์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์‹คํ–‰์‹œ์ผœ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ํ›„, start() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉฐ, ์Šค๋ ˆ๋“œ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋Š” join(), sleep(), interrupt()์™€ ๊ฐ™์€ ๊ธฐ๋ณธ API๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ™œ์šฉ์€ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ๋ฐ ์ž์› ๊ณต์œ  ์ตœ์ ํ™”์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.



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

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


๊ทธ๋ž˜์„œ ๋จผ์ € ์ž๋ฐ” ์Šค๋ ˆ๋“œ์˜ ์ „๋ฐ˜์ ์ธ ๊ฐœ๋…๊ณผ ๋™์‹œ์„ฑ์˜ ๋ฌธ์ œ ๊ทธ๋ฆฌ๊ณ  ๋™๊ธฐํ™” ์ข…๋ฅ˜์™€ ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด ๋ด…๋‹ˆ๋‹ค.

2. ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์Šค๋ ˆ๋“œ ํ’€์€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, Executor ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋ฉฐ, ์ด๋Š” ExecutorService, ScheduledExecutorService์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , Callable๊ณผ Future ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



ExecutorService๋Š” ์Šค๋ ˆ๋“œ ํ’€์˜ ์‹คํ–‰ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, submit() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์Šค๋ ˆ๋“œ ํ’€์— ์ œ์ถœํ•˜๊ณ , shutdown() ๋˜๋Š” shutdownNow() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œ ํ’€์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ค‘๋‹จ ๋ฐ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, Executors ํด๋ž˜์Šค๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์Šค๋ ˆ๋“œ ํ’€์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ThreadPoolExecutor๋Š” ์Šค๋ ˆ๋“œ ํ’€์˜ ๊ตฌ์ฒด์ ์ธ ์‹คํ–‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์—ฌ, ๋‹ค์ค‘ ์ž‘์—… ์ฒ˜๋ฆฌ ์‹œ ์„ฑ๋Šฅ๊ณผ ์ž์› ํ™œ์šฉ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ ํ’€๊ณผ ๊ด€๋ จ๋œ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด๋Š” ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์žˆ์–ด ํ•„์ˆ˜์ ์ธ ์š”์†Œ์ด๋ฉฐ, ํšจ์œจ์ ์ธ ์ž์› ๊ด€๋ฆฌ์™€ ๋†’์€ ์„ฑ๋Šฅ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„์„ ์œ„ํ•ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.



ํ•ด๋‹น ํŒŒํŠธ์—์„œ๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‰ฝ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค

3. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์ˆ˜์ ์ธ ๋™์‹œ์„ฑ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ, ๋™๊ธฐ ๋ฐ ๋น„๋™๊ธฐ ๋ฐฉ์‹๊ณผ ๊ทธ์™€ ๊ด€๋ จ๋œ Blocking๊ณผ Non-Blocking ํ˜ธ์ถœ์˜ ๊ฐœ๋…์„ ํ†ตํ•ด ์ž‘์—…์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

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


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

๋˜ํ•œ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํฌํ•จํ•˜์—ฌ, ์ž‘์—…์˜ ์™„๋ฃŒ ์ฒ˜๋ฆฌ์™€ ๋”๋ถˆ์–ด ๋Œ€๊ธฐ ๋ฐ ์ทจ์†Œ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋”์šฑ ๊ฒฌ๊ณ ํ•˜๊ณ  ์œ ์—ฐํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‹œ์Šคํ…œ์˜ ๋ฐ˜์‘์„ฑ์„ ๋†’์ด๊ณ , ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํฐ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.





ํ•ด๋‹น ํŒŒํŠธ์—์„œ๋Š” CompletableFuture ๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ์‚ดํŽด ๋ด…๋‹ˆ๋‹ค.

๊ฐ•์˜ ๊ตฌ์„ฑ ๋ฐ ์ƒ์„ธ ์ปค๋ฆฌํ˜๋Ÿผ ๐Ÿƒ

์„น์…˜ 1. ์šด์˜ ์ฒด์ œ ๊ธฐ๋ณธ

  • ์šด์˜ ์ฒด์ œ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ์™€ ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น, ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด์ ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • Parallel & Concurrent, Context Switch, CPU Bound & I/O Bound, ์‚ฌ์šฉ์ž ๋ชจ๋“œ & ์ปค๋„ ๋ชจ๋“œ ๋“ฑ ํ•ต์‹ฌ์ ์ธ ์šด์˜ ์ฒด์ œ ๊ฐœ๋…์„ ํ†ตํ•ด ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ดˆ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šค์ผ€์ค„๋ง์˜ ๊ธฐ๋ณธ ์›์น™์„ ๋ฐฐ์›๋‹ˆ๋‹ค

์„น์…˜ 2. Java Thread Fundamentals - ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ ๊ตฌ์กฐ

  • ์ž๋ฐ”์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ, ์‹คํ–‰, ์ข…๋ฃŒ ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ๋ฐฐ์›๋‹ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ ์ƒํƒœ๋ณ„๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•˜๋ฉด์„œ ๊ฐ ์ƒํƒœ๋งˆ๋‹ค ์–ด๋–ค ํŠน์ง•๊ณผ ์‹คํ–‰ํ๋ฆ„์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 3. Java Thread Fundamentals - ์Šค๋ ˆ๋“œ ๊ธฐ๋ณธ API

  • ์ž๋ฐ”์˜ ์Šค๋ ˆ๋“œ ๊ด€๋ จ API์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ธ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • sleep, join, interrupt, priority ๋“ฑ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ตฌํ˜„์— ์žˆ์–ด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ๊ฐœ๋…๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์‹คํ–‰์— ์˜ํ•œ JVM ๊ณผ OS ๊ฐ„ ์—ฐ๊ฒฐ ๊ตฌ์กฐ ๋ฐ ํ๋ฆ„์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๊ฒŒ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 4. Java Thread Fundamentals - ์Šค๋ ˆ๋“œ ํ™œ์šฉ

  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

  • ์ค‘๋‹จ ๋ฐ ๋ณต๊ตฌ ๋“ฑ์˜ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ, ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน๊ณผ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ, ์Šค๋ ˆ๋“œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 5. Synchronization Fundamentals - ๋™๊ธฐํ™” ๊ฐœ๋…

  • ๋™๊ธฐํ™”์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ์˜ ์ค‘์š”์„ฑ์„ ๊นŠ์ด ์žˆ๊ฒŒ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • ๋™๊ธฐํ™”์™€ CPU ์™€์˜ ๊ด€๊ณ„, Critical Seciton, ์•ˆ์ €ํ•œ ์Šค๋ ˆ๋“œ ๊ตฌ์„ฑ ๋“ฑ ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ดˆ์ ์ธ ๊ฐœ๋…์„ ์‹ฌ๋„์žˆ๊ฒŒ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 6. Synchronization Fundamentals - ๋™๊ธฐํ™” ๊ธฐ๋ฒ•

  • ๋™๊ธฐํ™”์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•๊ณผ ๊ทธ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์‹ฌ์ธต์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์ธ ๋ฎคํ…์Šค, ์„ธ๋งˆํฌ์–ด, ๋ชจ๋‹ˆํ„ฐ, Spin Lock ๋“ฑ ๋ฝ์˜ ๊ฐœ๋…๊ณผ ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐ ์ผ๊ด€์„ฑ ์œ ์ง€ ์ „๋žต์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

์„น์…˜ 7. Java Synchronization

  • ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‹ฌ์ธต์ ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • Synchronized ์˜ ๊ฐœ๋…, ์กฐ๊ฑด ๋ณ€์ˆ˜, volatile, ๊ต์ฐฉ์ƒํƒœ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์„น์…˜ 8. Java Locks

  • ์ž๋ฐ”์˜ ๋ฝ(Lock) ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ํด๋ž˜์Šค๋“ค์„ ์•Œ์•„๋ณด๊ณ  Lock ์‚ฌ์šฉ๋ฒ• ๋ฐ Lock ์„ ํ†ตํ•œ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • ํŠนํžˆ ์“ฐ๊ธฐ๋ฝ๊ณผ ์ฝ๊ธฐ๋ฝ์˜ ํŠน์ง•๊ณผ ์žฅ๋‹จ์  ๋“ฑ์„ ์‚ดํŽด๋ณด๊ณ  ๋ฝ์˜ ์กฐ๊ฑด๋ณ€์ˆ˜ ํ™œ์šฉ๋ฒ•๊ณผ ์‹ค๋ฌด ์˜ˆ์ œ๋ฅผ ํ†ตํ•œ ์ •ํ™•ํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜ 9. Java ๋™๊ธฐํ™” ๋„๊ตฌ

  • ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋™๊ธฐํ™” ๋„๊ตฌ๋“ค์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • Atomic Variables (๋‹จ์ผ์—ฐ์‚ฐ๋ณ€์ˆ˜), Atomic * FieldUpdater(๋‹จ์ผ์—ฐ์‚ฐํ•„๋“œ์—…๋ฐ์ดํŠธ), ์นด์šดํŠธ๋‹ค์šด ๋ž˜์น˜, ์‚ฌ์ดํด๋ฆญ ๋ฐฐ๋ฆฌ์–ด ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ ์‹ค์งˆ์ ์ธ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

.์„น์…˜ 10. ์ž๋ฐ” ๋™์‹œ์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ

  • ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” Executor, ExecutorService ๋ฐ Executors ํด๋ž˜์Šค๋“ค์˜ ๊ฐœ๋…๊ณผ ํŠน์ง•์„ ์ดํ•ดํ•˜๊ณ  ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.

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

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

์„น์…˜ 11. ThreadPoolExecutor

  • ThreadPoolExecutor์˜ ์›๋ฆฌ์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ๋ฐฐ์›๋‹ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ ํ’€์˜ ์ƒ์„ฑ, ๊ด€๋ฆฌ, ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ๋ฉฐ, ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•œ ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์™€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• ๋“ฑ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๋ฉฐ ์ „์ฒด ์•„ํ‚คํ…์ฒ˜์™€ ํ๋ฆ„๋„์— ๋Œ€ํ•ด ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

์„น์…˜ 12: CompletableFuture

  • ์ž๋ฐ”์˜ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์ธ CompletableFuture์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • ์ž๋ฐ” 8์—์„œ ๋„์ž…๋œ ์ด ๊ฐ•๋ ฅํ•œ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด, ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ์‹ค์ œ ์ž‘์—… ํ๋ฆ„์„ ๊ตฌ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ ์„ธ์…˜์€ CompletableFuture์˜ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•˜๋ฉฐ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ๊ฒฐ๊ณผ ์กฐํ•ฉ, ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ ์ž‘์—… ์—ฐ์‡„ ๋“ฑ์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ธ ๊ธฐ๋ฒ•๋“ค์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ•์˜๋ฅผ ๋งŒ๋“  
์ง€์‹๊ณต์œ ์ž๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

์ •์ˆ˜์›(leaven)

  • ํ˜„์ง ์ž๋ฐ” ๊ฐœ๋ฐœ์ž

  • SI/SM/์†”๋ฃจ์…˜/Mobile/Front&Back-end ์˜ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜

  • Architect/PM/PL ๋กœ์„œ ์—ญํ•  ์ˆ˜ํ–‰

  • Github

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”!

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • ์ž๋ฐ” ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ๊ณ„๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ  ์‹ถ์€ ๋ถ„

  • ์Šค๋ ˆ๋“œ์˜ ์ „๋ฐ˜์ ์ธ ๊ฐœ๋…์„ ํ™•์‹คํ•˜๊ฒŒ ์ •๋ฆฝํ•˜๊ณ ์ž ํ•˜๋Š” ๋ถ„

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜๋Š” ๋ถ„

  • ๋™๊ธฐํ™” ๊ธฐ๋ฒ•๊ณผ ์ข…๋ฅ˜์— ๋Œ€ํ•œ ํ™•์‹คํ•œ ๊ฐœ๋…์„ ์•Œ๊ณ  ์‹ถ์€ ๋ถ„

  • ์ž๋ฐ” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์•Œ๊ณ ์ž ํ•˜๋Š” ๋ถ„

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • ์ž๋ฐ” ๊ธฐ์ดˆ

  • ์ž๋ฐ” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ ๋žŒ๋‹ค ์‚ฌ์šฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š”
์ •์ˆ˜์›์ž…๋‹ˆ๋‹ค.

9,473

๋ช…

์ˆ˜๊ฐ•์ƒ

285

๊ฐœ

์ˆ˜๊ฐ•ํ‰

1,200

๊ฐœ

๋‹ต๋ณ€

4.9

์ 

๊ฐ•์˜ ํ‰์ 

5

๊ฐœ

๊ฐ•์˜

๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์›น/๋ชจ๋ฐ”์ผ/์†”๋ฃจ์…˜ ์ œํ’ˆ ๊ฐœ๋ฐœ๊ณผ ๊ด€๋ จ๋œ ์—…๋ฌด๋ฅผ ์ง„ํ–‰ํ•ด ์˜ค๊ณ  ์žˆ์œผ๋ฉฐ ๋ถ„์„/์„ค๊ณ„/๊ฐœ๋ฐœ Role ์„ ๋งก์•„ ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ณต๊ธฐ๊ฐ„, ๊ต์œกํ”„๋กœ๊ทธ๋žจ, ๊ธฐ์—… ํ”„๋กœ์ ํŠธ, ์‡ผํ•‘๋ชฐ ๋“ฑ์˜ ์›น ๊ฐœ๋ฐœ ๋ฐ ์†”๋ฃจ์…˜ ํ”„๋กœ๊ทธ๋žจ, ํ”„๋ ˆ์ž„์›Œํฌ, ์˜คํ”ˆ์†Œ์Šค ์—ฐ๋™ ๋“ฑ์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌ์กฐ์  ๊ณ ๋„ํ™” ๊ฐœ์„  ๋“ฑ์„ ํ•ด ์˜ค๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ, PL ๋“ฑ์˜ ์—ญํ• ์„ ๋งก์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ Open Source ์™€ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์ ์ธ ๊ฒฝํ—˜๋“ค์„ ํ†ตํ•ด ์›น์˜ ์ „๋ฐ˜์ ์ธ ๊ธฐ์ˆ  ํ๋ฆ„๋“ค์„ ์ตํ˜”์œผ๋ฉฐ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ๊ฑฐ๋“ญ๋  ์ˆ˜๋ก ์š”๊ตฌ์‚ฌํ•ญ์˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์—๋งŒ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ข€ ๋” OOP ์ ์ธ ๊ตฌ์กฐ์˜ ์†Œํ”„ํŠธ์›จ์–ด๋กœ์„œ ์•ˆ์ „์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•œ ์•„ํ‚คํ…์ฒ˜๋ง๊ณผ ํŠœ๋‹์˜ ๊ธฐ์ˆ ๋“ค์„ ์ ‘๋ชฉ์‹œ์ผœ ์ง€์†์ ์œผ๋กœ ๋” ํ›Œ๋ฅญํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์™„์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ๊ตฌ์™€ ๊ฐœ๋ฐœ ์‹ค๋ฌด๋ฅผ ์ฑ…์ž„๊ฐ ์žˆ๊ฒŒ ๋งก์•„ ์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

103๊ฐœ โˆ™ (44์‹œ๊ฐ„ 9๋ถ„)

ํ•ด๋‹น ๊ฐ•์˜์—์„œ ์ œ๊ณต:

์ˆ˜์—…์ž๋ฃŒ
๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

46๊ฐœ

5.0

46๊ฐœ์˜ ์ˆ˜๊ฐ•ํ‰

  • ์ˆ˜ํ™˜๋ฌด๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ์ˆ˜ํ™˜๋ฌด

    ์ˆ˜๊ฐ•ํ‰ 16

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๋•Œ๋ถ€ํ„ฐ ๋“ฃ๊ณ  ์žˆ๋Š”๋ฐ ๊ฐ•์˜ ์ž๋ฃŒ์— ๋””ํ…Œ์ผ์ด๋‚˜ ๊ผผ๊ผผํ•œ ์„ค๋ช…์ด ์ •์ˆ˜์› ๊ฐ•์‚ฌ๋‹˜์˜ ๊ฐ•์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. !!! ์ด๋Ÿฐ ๊ฐ•์˜๋ฅผ ์ค€๋น„ํ•œ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋งŽ์Œ ํ’ˆ์ด ๋“ค์–ด๊ฐ€๋Š” ์ž‘์—…์ธ๋ฐ, ๋งค๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋กœ์„œ ์„ฑ์žฅํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ผญ ๋“ค์–ด์•ผํ•  ๊ฐ•์˜๋„ค์š” !!!

    • ์ •์ˆ˜์›
      ์ง€์‹๊ณต์œ ์ž

      ๋„ค ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ์ˆ˜ํ™˜๋ฌด๋‹˜๋„ ๊ณ„์† ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๋˜๊ธธ ์ง„์‹ฌ์œผ๋กœ ์‘์›ํ•ฉ๋‹ˆ๋‹ค!!

  • ์ •ํšŒ์šด๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ์ •ํšŒ์šด

    ์ˆ˜๊ฐ•ํ‰ 15

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    30% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ๋™์‹œ์„ฑ, ๋ณ‘๋ ฌ์„ฑ ๋“ฑ ๊ฐ•์˜ํ•ด์ฃผ์‹œ๋Š” ๋‚ด์šฉ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ์ดํ•ด๊ฐ€ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„, ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„์„ ์™„๋ฒฝํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์ข‹์€ ๊ฐ•์˜ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    • ํ•œ์žฌ๋‚จ๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
      ํ•œ์žฌ๋‚จ

      ์ˆ˜๊ฐ•ํ‰ 28

      โˆ™

      ํ‰๊ท  ํ‰์  5.0

      5

      100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

      ๋งค์šฐ ์ž˜ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค!!!! ์ข‹์€ ๊ฐ•์˜์˜€์Šต๋‹ˆ๋‹ค!

      • ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
        ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

        ์ˆ˜๊ฐ•ํ‰ 7

        โˆ™

        ํ‰๊ท  ํ‰์  5.0

        5

        19% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

        ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ๋ถ€์กฑํ–ˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ๊ฐ•์ถ”ํ•˜๋Š” ๊ฐ•์˜์ž…๋‹ˆ๋‹ค! ์•„์ง ์™„๊ฐ•ํ•˜๋ ค๋ฉด ๋ฉ€์—ˆ์ง€๋งŒ ์ •๋ง ๋ˆ์ด ์•„๊น์ง€ ์•Š์€ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค! ์ด๋Ÿฐ๋ถ„์ด ์‚ฌ์ˆ˜๋กœ ๊ณ„์…จ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ์ข‹์•˜์„๊นŒ์š”..! ์—ฌํŠผ ๊ฐ•์ถ”์ž…๋‹ˆ๋‹ค! ๋‹ค์Œ ๊ฐ•์˜๋„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค! ์‹œํ๋ฆฌํ‹ฐ ๊ฐ•์˜๋„ ์ž˜๋ดค์Šต๋‹ˆ๋‹ค~ ๋‚˜์ค‘์— DB ๊ด€๋ จ๋œ ๊ฐ•์˜๋„ ์ง„ํ–‰ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

        • ์ •์ˆ˜์›
          ์ง€์‹๊ณต์œ ์ž

          ๋„ค ์ด๋ฒˆ์— ์Šค๋ ˆ๋“œ์— ๊ฐœ๋…์„ ํ™•์‹คํžˆ ๋‹ค์ง€๊ณ  ํ•œ๋‹จ๊ณ„ ๋” ์„ฑ์žฅํ•˜๋Š” ๋ฐ‘๊ฑฐ๋ฆ„์ด ๋˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

      • pcdoom.co๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
        pcdoom.co

        ์ˆ˜๊ฐ•ํ‰ 1

        โˆ™

        ํ‰๊ท  ํ‰์  5.0

        5

        6% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

        ์—ด์‹ฌํžˆ๊ณต๋ถ€ํ•ด์„œ ๋งˆ์Šคํ„ฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

        • ์ •์ˆ˜์›
          ์ง€์‹๊ณต์œ ์ž

          ๋„ค pcdoom.co ๋‹˜ ์ €๋„ ๊ผญ ๋งˆ์Šคํ„ฐํ•˜์‹œ๊ธธ ์‘์›ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค^^ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~

        • ํ–ฅํ›„ ์ •์ˆ˜์›๋‹˜์˜ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ง๊ณ  ์Šคํ”„๋ง ์›น๊ฐœ๋ฐœ ๊ด€๋ จ ๊ฐ•์˜๋“ค์„ ๊ผญ ๋“ฃ๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค. ์ง„์งœ ๋ชจ๋“  ๊ฐ•์˜๋“ค์ด ๋‹ค ๋””ํ…Œ์ผ์„ ์‚ด๋ ค ๊ฐ•์˜ํ•˜์‹ ๊ฒƒ๊ฐ™์•„์š”

        • ์ •์ˆ˜์›
          ์ง€์‹๊ณต์œ ์ž

          ๋„ค ์ €๋„ ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ๋Š์ž„์—†๋Š” ์„ฑ์žฅ์„ ์œ„ํ•ด ๊ณ„์† ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~

      ์ •์ˆ˜์›๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜

      ์ง€์‹๊ณต์œ ์ž๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

      ๋น„์Šทํ•œ ๊ฐ•์˜

      ๊ฐ™์€ ๋ถ„์•ผ์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

      ์›” โ‚ฉ19,800

      5๊ฐœ์›” ํ• ๋ถ€ ์‹œ

      โ‚ฉ99,000