๐Ÿ“š Study

[Kotlin/์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด์˜ ์ •์„] 1์žฅ. ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์ž‘์—…์˜ ํ•œ๊ณ„์™€ ์ฝ”๋ฃจํ‹ด์˜ ๋“ฑ์žฅ

์ ์ด 2024. 5. 8. 22:30
๋ฐ˜์‘ํ˜•

JVM ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๊ณผ์ •

  1. JVM์ด ํ”„๋กœ์„ธ์Šค ์‹œ์ž‘
  2. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
  3. `main` ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋“ค์„ ์ˆ˜ํ–‰
  4. `main` ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ
๐Ÿ’ก JVM ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ํ•ด์„œ ์‹คํ–‰๋˜๋ฉฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ข…๋ฃŒ๋จ

 

๋‹จ์ผ ์Šค๋ ˆ๋“œ์˜ ํ•œ๊ณ„์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋‹จ์ผ ์Šค๋ ˆ๋“œ์˜ ํ•œ๊ณ„

  • ํ•ด์•ผ ํ•  ์ž‘์—…์ด ๋‹ค๋ฅธ ์ž‘์—…์— ์˜ํ•ด ๋ฐฉํ•ด๋ฐ›๊ฑฐ๋‚˜ ์ž‘์—… ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Œ → ์‘๋‹ต์„ฑ์˜ ๋ฌธ์ œ

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallel Processing)
  • ์Šค๋ ˆ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•
  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ์š”์ฒญ๋์„ ๋•Œ, ์ด ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•จ
  • โœ”๏ธ ์ž‘์€ ์ž‘์—… ๊ฐ„์— ๋…๋ฆฝ์„ฑ์ด ์žˆ์„ ๋•Œ์—๋งŒ ๋ณ‘๋ ฌ ์‹คํ–‰์ด ๊ฐ€๋Šฅ!

 

์Šค๋ ˆ๋“œ, ์Šค๋ ˆ๋“œํ’€์„ ์‚ฌ์šฉํ•œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Thread ํด๋ž˜์Šค

Thread ํด๋ž˜์Šค ์‚ฌ์šฉ

class ExampleThread: Thread() {
	override fun run() {
		// TO DO SOMETHING
	}
}
  • Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ
  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€์˜ ๊ด€๊ณ„
    1. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์‹œ์ž‘
    2. ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ ์‹œ์ž‘
    3. ๋ฉ”์ธ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ
    4. ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ(๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ธธ ๊ฒฝ์šฐ)
    5. ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ

๐Ÿ”Ž ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ์™€ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ

  • ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ: ์šฐ์„ ๋„๊ฐ€ ๋†’์€ ์Šค๋ ˆ๋“œ / ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ: ์šฐ์„ ๋„๊ฐ€ ๋‚ฎ์€ ์Šค๋ ˆ๋“œ
  • ์šฐ์„ ๋„๊ฐ€ ๋†’์€ ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‘ ์ข…๋ฃŒ๋  ๋•Œ JVM ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ
  • ์‚ฌ์šฉ์ž ๋ฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๊ฒฝ์šฐ, ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ์‹คํ–‰ ์ค‘์— ๊ฐ•์ œ ์ข…๋ฃŒ ๋œ๋‹ค. → ์ •์ƒ ์ข…๋ฃŒ

๐Ÿ”Ž  thread ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

fun main() {
	thread(isDaemon=false){
		// TO DO SOME PARALLEL THING
	}
}
  • `thread(){}` : ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ์ž‘์—…์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Œ

Thread ํด๋ž˜์Šค์˜ ํ•œ๊ณ„

  1. ์ƒ์„ฑ ๋น„์šฉ์ด ๋น„์‹ผ ์Šค๋ ˆ๋“œ → ์„ฑ๋Šฅ ์ด์Šˆ
  2. ์ƒ์„ฑ, ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์žˆ์Œ → ํ”„๋กœ๊ทธ๋žจ ๋ณต์žก์„ฑ ์ฆ๊ฐ€ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ

 

Executor ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œํ’€ ์‚ฌ์šฉํ•˜๊ธฐ

  • ์Šค๋ ˆ๋“œํ’€์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋ฐ›์€ ์ž‘์—…์„ ๊ฐ ์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ
  • ์Šค๋ ˆ๋“œํ’€์— ์†ํ•œ ์Šค๋ ˆ๋“œ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ ๋ฐ ์ž‘์—… ๋ถ„๋ฐฐ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ๋‹ด๋‹น → ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋จ

Executor Service

  • ์Šค๋ ˆ๋“œํ’€์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
  • Blocking Queue (์ž‘์—… ๋Œ€๊ธฐ์—ด) : ํ• ๋‹น ๋ฐ›์€ ์ž‘์—…์„ ์ ์žฌ
  • Thread Pool (์Šค๋ ˆ๋“œ ํ’€): ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ์˜ ์ง‘ํ•ฉ
fun main() {
	val executorService: ExecutorService = Executors.newFixedThreadPool(2)
	executorService.submit {	// Executor Service์— ์ž‘์—… ์ œ์ถœ
		...	
	}
}

์˜์˜์™€ ํ•œ๊ณ„

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ์ด์ƒ ์Šค๋ ˆ๋“œ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์Šค๋ ˆ๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์คŒ
  • `Thread Blocking`
    • ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋Š” ์ƒํƒœ
    • ๋†’์€ ๊ฐ€๊ฒฉ์œผ๋กœ ์ธํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์— ๋†“์ด๋Š” ๊ฒƒ์ด ๋ฐ˜๋ณต๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜ ์ดˆ๋ž˜
    • ์ œ์ถœํ•œ ์ž‘์—…์—์„œ ๊ฒฐ๊ณผ(Future ๊ฐ์ฒด)๋ฅผ ์ „๋‹ฌ๋ฐ›๊ธฐ๊นŒ์ง€ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒ

 

๊ธฐ์กด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•œ๊ณ„์™€ ์ฝ”๋ฃจํ‹ด

๊ธฐ์กด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•œ๊ณ„

  • ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น: ์Šค๋ ˆ๋“œ๋ผ๋Š” ๋น„์‹ผ ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ฆ → ์„ฑ๋Šฅ์— ์น˜๋ช…์ 
  • ์ž‘์—… ๊ฐ„์˜ ์ข…์†์„ฑ์ด ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋†’์Œ

์ฝ”๋ฃจํ‹ด์˜ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ์ฝ”๋ฃจํ‹ด: ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—… ์‹คํ–‰ ๋„์ค‘ ์ผ์‹œ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ๋‹จ์œ„

๋™์ž‘ ๋ฐฉ์‹

  1. ์ฝ”๋ฃจํ‹ด ์ž‘์—… ์ผ์‹œ ์ค‘๋‹จ: ์ฝ”๋ฃจํ‹ด 1 ์ˆ˜ํ–‰ ๋„์ค‘ ์ฝ”๋ฃจํ‹ด 2 ๊ฒฐ๊ณผ ํ•„์š” (์ผ์‹œ ์ค‘๋‹จ)
  2. ๋”์ด์ƒ ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ → ์Šค๋ ˆ๋“œ์˜ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ์–‘๋ณด
  3. ์–‘๋ณด๋œ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹คํ–‰: ์ฝ”๋ฃจํ‹ด 3 ์ˆ˜ํ–‰
  4. ์žฌ๊ฒŒ ์‹œ์ ์— ๋‹ค์‹œ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋˜์–ด ์‹คํ–‰: ์ฝ”๋ฃจํ‹ด 1 ๋งˆ์ € ์ˆ˜ํ–‰

์žฅ์ 

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

http://www.acornpub.co.kr/book/kotlin-coroutines

 

์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด์˜ ์ •์„

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์–ด๋ ต๊ฒŒ ๋Š๋ผ๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋‹ค์–‘ํ•œ ์‹œ๊ฐ์  ์ž๋ฃŒ์™€ ์„ค๋ช…์„ ํ†ตํ•ด ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์“ฐ์ธ ์ฑ…์ด๋‹ค.

www.acornpub.co.kr

๐ŸŒŸํ›„๊ธฐ๐ŸŒŸ

Spring Boot - Kotlin ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ฝ”๋ฃจํ‹ด์— ๋Œ€ํ•œ ๋” ๊นŠ์€ ์ง€์‹์ด ํ•„์š”ํ•ด ์ฐพ๋‹ค ๋ฐœ๊ฒฌํ•œ ์ฑ…. 
ํ•œ๊ตญ์ธ ์ €์ž ๋ถ„์ด์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์ „๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ๋˜์–ด์žˆ๊ณ ,
๊ธฐ์กด ์ฝ”ํ‹€๋ฆฐ ์ฑ…์—์„œ๋Š” ์‰ฝ๊ฒŒ ๋‹ค๋ค„์ง€์ง€ ์•Š๋Š” ๋” ๋”ฅํ•œ ์ฝ”๋ฃจํ‹ด ๊ธฐ๋Šฅ๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ.
(์ง€๊ธˆ๊นŒ์ง€ ์ฝ์€ ๊ธฐ์ˆ ์„œ ์ค‘ ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ์ž˜ ์“ฐ๊ณ  ์žˆ๋Š” ์ฑ…...๊ฐ€์žฅ ์ˆ ์ˆ  ์ฝํžŒ ์ฑ…...๐Ÿ‘)
SpringBoot-Kotlin ํ™˜๊ฒฝ์—์„œ ์ฝ”๋ฃจํ‹ด์„ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ •๋ง ๊ฐ•์ถ” ํ•„์ˆ˜ ํ•„์ˆ˜ ๐Ÿ‘๐Ÿ”ฅ๐Ÿ‘๐Ÿ”ฅ๐Ÿ‘๐Ÿ”ฅ๐Ÿ‘๐Ÿ”ฅ๐Ÿ‘๐Ÿ”ฅ
๋ฐ˜์‘ํ˜•