๐Ÿš€ Groovy์˜ CompileStatic: ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ์˜ ๋งˆ๋ฒ•์„ ํ’€๋‹ค! ๐Ÿง™โ€โ™‚๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Groovy์˜ CompileStatic: ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ์˜ ๋งˆ๋ฒ•์„ ํ’€๋‹ค! ๐Ÿง™โ€โ™‚๏ธ

 

 

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

๐Ÿ” CompileStatic์ด๋ž€? Groovy ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ์• ๋…ธํ…Œ์ด์…˜์œผ๋กœ, ์ปดํŒŒ์ผ ์‹œ์ ์— ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ์žก์•„๋‚ด๊ณ , ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์ด๋ผ๋Š” ๋ฉ‹์ง„ ์žฌ๋Šฅ ๊ณต์œ  ํ”Œ๋žซํผ์„ ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ์ด๊ณณ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ๊ฐ€๋ฅด์น  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. CompileStatic ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ์„ ๋”์šฑ ๋น›๋‚˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜‰

๐ŸŽญ ๋™์  ํƒ€์ดํ•‘ vs ์ •์  ํƒ€์ดํ•‘: ๋ฌด๋Œ€ ์œ„์˜ ๋ฐฐ์šฐ๋“ค

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์„ธ๊ณ„๋ฅผ ๊ฑฐ๋Œ€ํ•œ ๊ทน์žฅ์ด๋ผ๊ณ  ์ƒ์ƒํ•ด๋ณผ๊นŒ์š”? ์ด ๊ทน์žฅ์—์„œ ๋ณ€์ˆ˜๋“ค์€ ๋ฐฐ์šฐ, ๊ทธ๋ฆฌ๊ณ  ํƒ€์ž…์€ ๋ฐฐ์šฐ๋“ค์˜ ์—ญํ• ์ด์—์š”.

  • ๋™์  ํƒ€์ดํ•‘ (Dynamic Typing): ์ฆ‰ํฅ ์—ฐ๊ธฐ์˜ ๋Œ€๊ฐ€๋“ค์ด์—์š”. ํ•„์š”์— ๋”ฐ๋ผ ์—ญํ• ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ฃ . ์œ ์—ฐํ•˜์ง€๋งŒ, ๊ฐ€๋” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‹ค์ˆ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์ •์  ํƒ€์ดํ•‘ (Static Typing): ์ฒ ์ €ํ•œ ๋ฉ”์†Œ๋“œ ์—ฐ๊ธฐ์ž๋“ค์ด์—์š”. ์—ญํ• ์ด ๋ฏธ๋ฆฌ ์ •ํ•ด์ ธ ์žˆ์–ด ์‹ค์ˆ˜ํ•  ํ™•๋ฅ ์ด ์ ์ฃ . ํ•˜์ง€๋งŒ ์œตํ†ต์„ฑ์€ ์กฐ๊ธˆ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

Groovy๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์  ํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์˜ˆ์š”. ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ์ •์  ํƒ€์ดํ•‘์˜ ์•ˆ์ •์„ฑ์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์ฃ . ๋ฐ”๋กœ ๊ทธ๋•Œ CompileStatic์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค! ๐Ÿฆธโ€โ™‚๏ธ

๋™์  ํƒ€์ดํ•‘ vs ์ •์  ํƒ€์ดํ•‘ ๋น„๊ต ๋™์  ํƒ€์ดํ•‘ ์ •์  ํƒ€์ดํ•‘ ์œ ์—ฐ์„ฑ ์•ˆ์ •์„ฑ

๐Ÿง  CompileStatic์˜ ์ž‘๋™ ์›๋ฆฌ: ์ฝ”๋“œ์˜ ๋‘๋‡Œ๋ฅผ ๊นจ์šฐ๋‹ค

CompileStatic์€ ๋งˆ์น˜ ์ฝ”๋“œ์˜ ๋‘๋‡Œ๋ฅผ ๊นจ์šฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ "๋” ๊ผผ๊ผผํžˆ ์ฒดํฌํ•ด์ค˜!"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฑฐ์ฃ . ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. ํƒ€์ž… ์ถ”๋ก  (Type Inference): CompileStatic์€ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•ด์š”. ๋งˆ์น˜ ์…œ๋ก ํ™ˆ์ฆˆ๊ฐ€ ๋‹จ์„œ๋ฅผ ๋ชจ์•„ ์‚ฌ๊ฑด์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ•ต๏ธโ€โ™‚๏ธ
  2. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ฒ€์ฆ: ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ๋ฐ”๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์š”. ์‹ค์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์žก์•„์ฃผ๋Š” ์นœ์ ˆํ•œ ๊ฒฝ์ฐฐ๊ด€ ๊ฐ™์ฃ ! ๐Ÿ‘ฎโ€โ™€๏ธ
  3. ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ณด์žฅ: ์ž˜๋ชป๋œ ํƒ€์ž…์˜ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ฆ‰์‹œ ๊ฒฝ๊ณ ๋ฅผ ํ•ด์ค˜์š”. ๋งˆ์น˜ ๊ฑด๊ฐ•์— ์ข‹์ง€ ์•Š์€ ์Œ์‹์„ ๋จน์œผ๋ ค ํ•  ๋•Œ ๋ง๋ฆฌ๋Š” ์˜์–‘์‚ฌ ๊ฐ™์•„์š”! ๐Ÿฅ—
  4. ์„ฑ๋Šฅ ์ตœ์ ํ™”: ์ •์  ํƒ€์ž… ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ๋” ํšจ์œจ์ ์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์š”. ๋งˆ์น˜ ์ „๋ฌธ ํŠธ๋ ˆ์ด๋„ˆ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์šด๋™ ๋ฃจํ‹ด์„ ์ตœ์ ํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ’ช

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ํŒ: CompileStatic์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ Groovy ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ ฅ์ด ํ•œ์ธต ์—…๊ทธ๋ ˆ์ด๋“œ๋  ๊ฑฐ์˜ˆ์š”. ์žฌ๋Šฅ๋„ท์—์„œ ์ด ๊ธฐ์ˆ ์„ ๊ณต์œ ํ•˜๋ฉด ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

๐Ÿ›  CompileStatic ์‚ฌ์šฉํ•˜๊ธฐ: ๋งˆ๋ฒ•์˜ ์ฃผ๋ฌธ์„ ์™ธ์šฐ์ž

์ž, ์ด์ œ CompileStatic์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๋งˆ์น˜ ๋งˆ๋ฒ• ์ฃผ๋ฌธ์„ ์™ธ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•ด์š”!


import groovy.transform.CompileStatic

@CompileStatic
class MagicCalculator {
    int add(int a, int b) {
        return a + b
    }

    String greet(String name) {
        return "Hello, $name!"
    }
}
  

์œ„์˜ ์ฝ”๋“œ์—์„œ @CompileStatic ์• ๋…ธํ…Œ์ด์…˜์€ ๋งˆ์น˜ ๋งˆ๋ฒ• ์ง€ํŒก์ด๋ฅผ ํœ˜๋‘๋ฅด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ด ํด๋ž˜์Šค ์ „์ฒด์— ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ์˜ ๋งˆ๋ฒ•์„ ๊ฑธ์–ด์ฃผ๋Š” ๊ฑฐ์ฃ ! ๐Ÿง™โ€โ™‚๏ธโœจ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋–ค ์žฅ์ ์ด ์žˆ์„๊นŒ์š”?

  • ์ปดํŒŒ์ผ ์‹œ์ ์— ํƒ€์ž… ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.
  • IDE์˜ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์ด ๋” ์ •ํ™•ํ•ด์ ธ์š”.
  • ์ฝ”๋“œ์˜ ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์ ธ์š”.
  • ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ์š”.

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ๋„ ์žˆ์–ด์š”. CompileStatic์„ ์‚ฌ์šฉํ•˜๋ฉด Groovy์˜ ์ผ๋ถ€ ๋™์  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ผ์š”. ๋งˆ์น˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ผ๋ถ€ ์ฃผ๋ฌธ์„ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ . ํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ ๋” ๊ฐ•๋ ฅํ•œ ํž˜์„ ์–ป๋Š” ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ช

CompileStatic์˜ ์žฅ๋‹จ์  ์žฅ์  ๋‹จ์  ์•ˆ์ •์„ฑ ์„ฑ๋Šฅ ์œ ์—ฐ์„ฑ ๊ฐ์†Œ

๐ŸŽญ ์‹ค์ „ ์˜ˆ์ œ: CompileStatic์˜ ๋งˆ๋ฒ•์„ ํŽผ์น˜๋‹ค

์ด์ œ CompileStatic์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”? ์žฌ๋ฏธ์žˆ๋Š” ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๐Ÿง™โ€โ™‚๏ธ ๋งˆ๋ฒ•์‚ฌ์˜ ํฌ์…˜ ์ œ์ž‘์†Œ


import groovy.transform.CompileStatic

@CompileStatic
class PotionMaker {
    String brewPotion(String ingredient1, String ingredient2) {
        return "Magic potion of ${ingredient1} and ${ingredient2}"
    }

    int calculatePotency(int base, int multiplier) {
        return base * multiplier
    }
}

def magician = new PotionMaker()
println magician.brewPotion("dragon scale", "unicorn hair")
println magician.calculatePotency(5, 3)
  

์ด ์˜ˆ์ œ์—์„œ PotionMaker ํด๋ž˜์Šค๋Š” CompileStatic์˜ ๋งˆ๋ฒ•์œผ๋กœ ๋ณดํ˜ธ๋ฐ›๊ณ  ์žˆ์–ด์š”. ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. ํƒ€์ž… ์•ˆ์ •์„ฑ: brewPotion ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ String ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›์•„์•ผ ํ•ด์š”. ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋„ฃ์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์š”.
  2. ์„ฑ๋Šฅ ํ–ฅ์ƒ: calculatePotency ๋ฉ”์†Œ๋“œ๋Š” ์ •์ˆ˜ํ˜• ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, CompileStatic ๋•๋ถ„์— ์ตœ์ ํ™”๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋ผ์š”.
  3. ๋ช…ํ™•ํ•œ ์ธํ„ฐํŽ˜์ด์Šค: ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๊ฐ ๋ฉ”์†Œ๋“œ๊ฐ€ ์–ด๋–ค ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›๊ณ  ์–ด๋–ค ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.

๐ŸŒŸ ์žฌ๋Šฅ๋„ท ๊ฟ€ํŒ: CompileStatic์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ๋” ์•ˆ์ •์ ์ด๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์•„์š”. ์žฌ๋Šฅ๋„ท์—์„œ Groovy ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์˜๋ฅผ ํ•  ๋•Œ, ์ด๋Ÿฐ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ์†Œ๊ฐœํ•˜๋ฉด ์ˆ˜๊ฐ•์ƒ๋“ค์˜ ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

๐Ÿฐ ์ค‘์„ธ ์™•๊ตญ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ

์ด๋ฒˆ์—๋Š” ์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด CompileStatic์˜ ์ง„๊ฐ€๋ฅผ ๋ฐœํœ˜ํ•ด๋ณผ๊นŒ์š”?


import groovy.transform.CompileStatic

@CompileStatic
class Kingdom {
    String name
    int population
    double treasury

    Kingdom(String name, int population, double treasury) {
        this.name = name
        this.population = population
        this.treasury = treasury
    }

    void collectTaxes(double taxRate) {
        treasury += population * taxRate
    }

    void expandPopulation(int growth) {
        population += growth
    }

    String getStatus() {
        return "${name} - Population: ${population}, Treasury: ${treasury}"
    }
}

@CompileStatic
class KingdomSimulator {
    static void main(String[] args) {
        def camelot = new Kingdom("Camelot", 10000, 5000.0)
        camelot.collectTaxes(0.1)
        camelot.expandPopulation(500)
        println camelot.getStatus()
    }
}
  

์ด ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” ์ค‘์„ธ ์™•๊ตญ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์žˆ์–ด์š”. CompileStatic์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ป๋Š” ์ด์ ์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • ํƒ€์ž… ์•ˆ์ •์„ฑ: population์€ ํ•ญ์ƒ ์ •์ˆ˜ํ˜•, treasury๋Š” ํ•ญ์ƒ ์‹ค์ˆ˜ํ˜•์œผ๋กœ ์œ ์ง€๋ผ์š”. ์‹ค์ˆ˜๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์š”.
  • ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์˜ ์•ˆ์ „์„ฑ: collectTaxes์™€ expandPopulation ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ์ „๋‹ฌํ–ˆ๋Š”์ง€ ์ปดํŒŒ์ผ ์‹œ์ ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ํŠนํžˆ collectTaxes ๋ฉ”์†Œ๋“œ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ˆ˜ํ•™ ์—ฐ์‚ฐ์ด ์ตœ์ ํ™”๋ผ์š”. ํฐ ๊ทœ๋ชจ์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ์ด๋Š” ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”.
  • ์ฝ”๋“œ์˜ ์ž๊ธฐ ๋ฌธ์„œํ™”: ๊ฐ ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ์˜ ํƒ€์ž…์ด ๋ช…ํ™•ํžˆ ์ •์˜๋˜์–ด ์žˆ์–ด, ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋ ‡๊ฒŒ CompileStatic์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋งˆ์น˜ ์ค‘์„ธ ์™•๊ตญ์„ ๋” ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ์šด์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์‹ค์ˆ˜๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ , ์™•๊ตญ(ํ”„๋กœ๊ทธ๋žจ)์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ‘‘

์ค‘์„ธ ์™•๊ตญ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ Camelot CompileStatic Kingdom

๐Ÿ” CompileStatic์˜ ๋‚ด๋ถ€ ๋™์ž‘: ๋งˆ๋ฒ•์˜ ๋น„๋ฐ€์„ ํŒŒํ—ค์น˜๋‹ค

์ž, ์ด์ œ CompileStatic์˜ ๋‚ด๋ถ€ ๋™์ž‘์„ ๋” ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณผ ์‹œ๊ฐ„์ด์—์š”. ๋งˆ์น˜ ๋งˆ๋ฒ•์‚ฌ์˜ ๋น„๋ฐ€ ๋ ˆ์‹œํ”ผ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฒƒ ๊ฐ™์ฃ ? ๐Ÿง™โ€โ™‚๏ธ๐Ÿ“œ

1. AST ๋ณ€ํ™˜ (Abstract Syntax Tree Transformation)

CompileStatic์€ Groovy์˜ AST(Abstract Syntax Tree) ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์š”. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๊ณ ์š”? ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”!

  • AST๋ž€?: ์†Œ์Šค ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด์—์š”. ๋งˆ์น˜ ๊ฐ€์กฑ ์กฑ๋ณด์ฒ˜๋Ÿผ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฑฐ์ฃ .
  • ๋ณ€ํ™˜ ๊ณผ์ •: CompileStatic์€ ์ด AST๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ˆ˜์ •ํ•ด์„œ, ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•ด์š”.
  • ๊ฒฐ๊ณผ: ์ตœ์ข…์ ์œผ๋กœ Java ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ๋งŽ์€ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ ธ์š”.

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ์ธ์‚ฌ์ดํŠธ: AST ๋ณ€ํ™˜์€ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์ด์—์š”. ์ด๋Ÿฐ ๊นŠ์ด ์žˆ๋Š” ์ง€์‹์„ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณต์œ ํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์˜๋‚˜ ์ปจ์„คํŒ… ์„œ๋น„์Šค์˜ ๊ฐ€์น˜๊ฐ€ ํ›จ์”ฌ ๋†’์•„์งˆ ๊ฑฐ์˜ˆ์š”!

2. ํƒ€์ž… ์ถ”๋ก  ๋ฐ ๊ฒ€์‚ฌ

CompileStatic์€ ์ฝ”๋“œ์˜ ๊ฐ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ณ  ๊ฒ€์‚ฌํ•ด์š”. ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ํ˜•์‚ฌ๊ฐ€ ์ฆ๊ฑฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”! ๐Ÿ•ต๏ธโ€โ™€๏ธ

  1. ๋ณ€์ˆ˜ ํƒ€์ž… ์ถ”๋ก : ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์„ ๋ถ„์„ํ•ด ๊ฐ€์žฅ ์ ์ ˆํ•œ ํƒ€์ž…์„ ์ถ”๋ก ํ•ด์š”.
  2. ๋ฉ”์†Œ๋“œ ๋ฐ˜ํ™˜ ํƒ€์ž… ๊ฒ€์‚ฌ: ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ์‹ค์ œ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์š”.
  3. ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ๊ฒ€์‚ฌ: ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋˜๋Š” ์ธ์ž์˜ ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์‚ฌํ•ด์š”.
  4. ์ œ๋„ค๋ฆญ ํƒ€์ž… ๊ฒ€์‚ฌ: ์ปฌ๋ ‰์…˜ ๋“ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์š”.

์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋งŽ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์— ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ๋ฒ„๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐฑ์‹  ๊ฐ™์€ ๊ฑฐ์ฃ ! ๐Ÿ’‰

3. ์ตœ์ ํ™”

CompileStatic์€ ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š์•„์š”. ์ฝ”๋“œ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋งˆ๋ฒ•์‚ฌ์ด๊ธฐ๋„ ํ•˜์ฃ ! ๐Ÿง™โ€โ™‚๏ธโœจ

  • ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ตœ์ ํ™”: ๋™์  ๋ฉ”์†Œ๋“œ ๋””์ŠคํŒจ์น˜ ๋Œ€์‹  ์ •์  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ด์š”.
  • ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ์ตœ์ ํ™”: getter/setter ๋ฉ”์†Œ๋“œ ๋Œ€์‹  ์ง์ ‘ ํ•„๋“œ ์ ‘๊ทผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฃจํ”„ ์ตœ์ ํ™”: ํŠน์ • ์ƒํ™ฉ์—์„œ ๋ฃจํ”„๋ฅผ ๋” ํšจ์œจ์ ์ธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์š”.
  • ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ ์ตœ์†Œํ™”: ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ž˜ํผ ํด๋ž˜์Šค ๊ฐ„์˜ ๋ถˆํ•„์š”ํ•œ ๋ณ€ํ™˜์„ ์ค„์—ฌ์š”.

์ด๋Ÿฐ ์ตœ์ ํ™” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ Groovy ์ฝ”๋“œ๋Š” ๋งˆ์น˜ ์Šˆํผ์นด์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ๋‹ฌ๋ฆด ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ๏ธ๐Ÿ’จ

CompileStatic์˜ ์ตœ์ ํ™” ๊ณผ์ • ์†Œ์Šค ์ฝ”๋“œ CompileStatic ์ตœ์ ํ™”๋œ ์ฝ”๋“œ

๐ŸŽญ CompileStatic vs ๋™์  ํƒ€์ดํ•‘: ๋‘ ๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ€๊ฒฐ

์ž, ์ด์ œ CompileStatic๊ณผ Groovy์˜ ๊ธฐ๋ณธ ๋™์  ํƒ€์ดํ•‘์„ ๋น„๊ตํ•ด๋ณผ๊นŒ์š”? ๋งˆ์น˜ ๋‘ ๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ€๊ฒฐ์„ ๋ณด๋Š” ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿง™โ€โ™‚๏ธ vs ๐Ÿง™โ€โ™€๏ธ

๋™์  ํƒ€์ดํ•‘์˜ ์žฅ์ 

  • ์œ ์—ฐ์„ฑ: ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ๋ณ€์‹  ๋งˆ๋ฒ•์„ ์“ฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿฆ‹
  • ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ: ํƒ€์ž… ์„ ์–ธ์ด ํ•„์š” ์—†์–ด ์ฝ”๋“œ๊ฐ€ ์งง๊ณ  ์ฝ๊ธฐ ์‰ฌ์›Œ์š”.
  • ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘: ์•„์ด๋””์–ด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ๋Ÿฐํƒ€์ž„์— ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์š”.

CompileStatic์˜ ์žฅ์ 

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

๐ŸŒŸ ์žฌ๋Šฅ๋„ท ํŒ: ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฐ ๊ท ํ˜• ์žกํžŒ ์‹œ๊ฐ์€ ์žฌ๋Šฅ๋„ท์—์„œ ๋†’์ด ํ‰๊ฐ€๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ด์—์š”!

๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ์š”?

  • ๋™์  ํƒ€์ดํ•‘ ์„ ํƒ ์‹œ: ์Šคํฌ๋ฆฝํŒ…, ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘, ์„ค์ • ํŒŒ์ผ ์ฒ˜๋ฆฌ ๋“ฑ
  • CompileSt atic ์„ ํƒ ์‹œ: ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๋ถ€๋ถ„, ํŒ€ ํ”„๋กœ์ ํŠธ ๋“ฑ

๊ฒฐ๊ตญ, ์ด ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ์ž์˜ ์žฅ๋‹จ์ ์ด ์žˆ์–ด์š”. ๋งˆ์น˜ ๋ถˆ๊ณผ ์–ผ์Œ์˜ ๋งˆ๋ฒ•์„ ๋ชจ๋‘ ๋‹ค๋ฃฐ ์ค„ ์•„๋Š” ๋Œ€๋งˆ๋ฒ•์‚ฌ์ฒ˜๋Ÿผ, ๋‘ ๊ฐ€์ง€๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•  ์ค„ ์•„๋Š” ๊ฒƒ์ด ์ง„์ •ํ•œ Groovy ๋งˆ์Šคํ„ฐ์˜ ๊ธธ์ด๋ž๋‹ˆ๋‹ค! ๐Ÿ”ฅโ„๏ธ

๋™์  ํƒ€์ดํ•‘ vs CompileStatic ๋™์  ํƒ€์ดํ•‘ CompileStatic ๊ท ํ˜•

๐Ÿš€ CompileStatic์˜ ์‹ค์ „ ํ™œ์šฉ: ๋งˆ๋ฒ•์˜ ์ง€ํŒก์ด๋ฅผ ํœ˜๋‘๋ฅด์ž

์ด์ œ CompileStatic์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”? ๋งˆ์น˜ ๋งˆ๋ฒ• ์ง€ํŒก์ด๋กœ ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”! ๐Ÿง™โ€โ™‚๏ธโœจ

1. ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ CompileStatic์€ ํŠนํžˆ ์œ ์šฉํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์€ํ–‰ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณผ๊นŒ์š”?


import groovy.transform.CompileStatic

@CompileStatic
class BankAccount {
    String accountNumber
    BigDecimal balance

    void deposit(BigDecimal amount) {
        balance += amount
    }

    boolean withdraw(BigDecimal amount) {
        if (balance >= amount) {
            balance -= amount
            return true
        }
        return false
    }
}

@CompileStatic
class Bank {
    List<BankAccount> accounts = []

    void createAccount(String accountNumber, BigDecimal initialDeposit) {
        def account = new BankAccount(accountNumber: accountNumber, balance: initialDeposit)
        accounts << account
    }

    BankAccount findAccount(String accountNumber) {
        accounts.find { it.accountNumber == accountNumber }
    }
}
  

์ด ์˜ˆ์ œ์—์„œ CompileStatic์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ:

  • ๊ณ„์ขŒ ๋ฒˆํ˜ธ(String)์™€ ์ž”์•ก(BigDecimal)์˜ ํƒ€์ž…์ด ๋ช…ํ™•ํžˆ ๋ณด์žฅ๋ผ์š”.
  • ์ž…๊ธˆ๊ณผ ์ถœ๊ธˆ ์—ฐ์‚ฐ์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋ผ์š”.
  • ๊ณ„์ขŒ ๊ฒ€์ƒ‰ ์‹œ ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋ผ์š”.

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

2. ์„ฑ๋Šฅ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋‚˜ ๊ณผํ•™ ๊ณ„์‚ฐ๊ณผ ๊ฐ™์ด ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ CompileStatic์€ ํฐ ๋„์›€์ด ๋ผ์š”. ๊ฐ„๋‹จํ•œ ํ–‰๋ ฌ ๊ณ„์‚ฐ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ์š”?


import groovy.transform.CompileStatic

@CompileStatic
class MatrixCalculator {
    static double[][] multiply(double[][] a, double[][] b) {
        int m = a.length
        int n = b[0].length
        int p = b.length
        double[][] result = new double[m][n]

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < p; k++) {
                    result[i][j] += a[i][k] * b[k][j]
                }
            }
        }

        return result
    }
}
  

์ด ์ฝ”๋“œ์—์„œ CompileStatic์„ ์‚ฌ์šฉํ•˜๋ฉด:

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

3. API ๊ฐœ๋ฐœ

๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•  API๋ฅผ ๋งŒ๋“ค ๋•Œ๋„ CompileStatic์€ ๋งค์šฐ ์œ ์šฉํ•ด์š”. RESTful API์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณผ๊นŒ์š”?