DCEVM - aragorn/home GitHub Wiki

KakaoPick Server Project에 DCEVM(Dynamic Code Evolution VM) μ μš©ν•˜κΈ°

Introduction to HotSwap

  • HotSwap κ³Ό DCEVM 에 λŒ€ν•œ μ „λ°˜μ μΈ κ°œμš”λ₯Ό νŒŒμ•…ν•˜κΈ°μ— 쒋은 λ¬Έμ„œλ‘œ μ•„λž˜μ˜ λ¬Έμ„œλ“€μ΄ μžˆλ‹€. μ•„λž˜ λ¬Έμ„œμ˜ λ‚΄μš©μ„ μš”μ•½ν•˜κ³  λ³΄μ™„ν•˜μ—¬ μ •λ¦¬ν•˜μ˜€λ‹€.
  • Java 1.4 μ—μ„œ HotSwap 이 κ΅¬ν˜„λ˜μ–΄ κ³΅κ°œλ˜μ—ˆλ‹€. 이 HotSwap κΈ°λŠ₯κ³Ό IDE 섀정을 ν†΅ν•©ν•˜λŠ” 방법은 λͺ‡λͺ‡ λΈ”λ‘œκ·Έμ—μ„œ μ†Œκ°œλ˜μ–΄ μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 HotSwap 은 이미 μ‘΄μž¬ν•˜λŠ” λ©”μ˜λ“œλ₯Ό μž¬μ •μ˜(redefine)ν•œ κ²½μš°λ§Œμ„ μ§€μ›ν•œλ‹€. λ©”μ˜λ“œλ₯Ό μž¬μ •μ˜ν•˜μ˜€λ‹€λŠ” 것은 λ©”μ˜λ“œμ˜ κ΅¬ν˜„ λ‚΄μš©μ„ μˆ˜μ •ν•˜μ˜€λ‹€λŠ” μ˜λ―Έμ΄λ‹€. 즉, μƒˆλ‘œμš΄ λ©”μ˜λ“œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜, 이름이 λ³€κ²½λ˜λŠ” 경우 등을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 기쑴에 JRebel μ΄λΌλŠ” 유료 툴이 κΈ°λ³Έ JVM 의 HotSwap 을 λ³΄μ™„ν•˜λŠ” ν™•μž₯된 hot swap κΈ°λŠ₯을 μ œκ³΅ν•˜μ˜€λ‹€. JVM μˆ˜μ€€μ˜ HotSwap 뿐만 μ•„λ‹ˆλΌ, j2ee μ»¨ν…Œμ΄λ„ˆ νŠΉν™”λœ HotSwap κΈ°λŠ₯을 λŒ€μ²΄ν•˜λŠ” κΈ°λŠ₯을 JRebel 이 μ œκ³΅ν•˜κ³  있고, λ‹€μ–‘ν•œ κ°œλ°œνˆ΄μ΄λ‚˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ‰½κ²Œ ν™œμš©ν•  수 μžˆλ„λ‘ κΈ°μˆ μ§€μ›μ„ μ œκ³΅ν•œλ‹€. JRebel 은 JVM 을 μˆ˜μ •ν•˜λŠ” 방식이 μ•„λ‹ˆλΌ, κ°œλ°œμžκ°€ κ΅¬ν˜„ν•˜λŠ” μžλ°”μ½”λ“œμ˜ λ°”μ΄νŠΈμ½”λ“œλ₯Ό 항상 μˆ˜μ •ν•˜μ—¬ Java 1.4 μ—μ„œ μ†Œκ°œλœ 'old HotSwap' 을 μ μš©ν•  수 있게 λ§Œλ“€μ–΄ μ£ΌλŠ” 도ꡬ이닀. 이 λ•Œλ¬Έμ—, IDE μ—μ„œ μ½”λ“œλ₯Ό λ””λ²„κΉ…ν•˜λ €λ©΄, κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œμ™€λŠ” μƒλ‹Ήνžˆ λ‹€λ₯Έ λ°”μ΄νŠΈμ½”λ“œκ°€ λ°°ν¬λ˜μ—ˆκΈ°μ—, λ°˜λ“œμ‹œ IDE μ—μ„œ λ³€ν˜•λœ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‚΄νŽ΄λ³Ό 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•΄μ•Ό ν•œλ‹€.
  • DCEVM (Dynamic Code Evolution VM)은 method μž¬μ •μ˜ 뿐만 μ•„λ‹ˆλΌ, 클래슀의 ν•„λ“œλ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ λ©”μ˜λ“œλ₯Ό μΆ”κ°€, μ‚­μ œν•œ 경우, super 클래슀λ₯Ό λ³€κ²½ν•œ κ²½μš°μ—λ„ hot swap 을 μ§€μ›ν•˜κ²Œ λœλ‹€. DCEVM 은 Thomas WΓΌrthingerκ°€ 박사과정 연ꡬ 주제둜 κ΅¬ν˜„ν•œ κΈ°λŠ₯으둜, JVM을 μˆ˜μ •ν•˜λŠ” 패치 ν˜•νƒœμ΄λ‹€. DCEVM의 μž₯점은 JRebel 에 λΉ„ν•΄ μ‹€ν–‰ 속도가 λΉ λ₯΄λ‹€λŠ” 것, 그리고 κ°œλ°œμžκ°€ κ΅¬ν˜„ν•œ μ½”λ“œμ˜ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, IDEμ—μ„œ 별닀λ₯Έ κΈ°λŠ₯을 μ§€μ›ν•˜μ§€ μ•Šμ•„λ„ 되고, IDE μ˜μ‘΄μ„±μ΄ μ—†λ‹€λŠ” 것이닀. 단지 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ JVM을 DCEVM 패치 적용된 κ²ƒμœΌλ‘œ μ„ νƒν•˜λ©΄ λœλ‹€.
    • https://github.com/HotswapProjects/HotswapAgent μ—μ„œ λ°°ν¬ν•˜λŠ” DCEVM installerλŠ” Java 7κ³Ό Java 8 버전을 μ§€μ›ν•œλ‹€.
    • https://github.com/dcevm/dcevm μ—μ„œ μ΅œμ‹  λ²„μ „μ˜ μ†ŒμŠ€μ½”λ“œλ₯Ό κ΄€λ¦¬ν•œλ‹€. Java 7, Java 8 μ—…λ°μ΄νŠΈμ— 따라 패치λ₯Ό 계속 μˆ˜μ •ν•˜λŠ” κ²ƒμœΌλ‘œ 보인닀. DCEVM 이 light 버전과 full λ²„μ „μœΌλ‘œ λΆ„λ¦¬λ˜μ—ˆλŠ”λ°, full 버전은 ν˜„μž¬ Java 7 λ²„μ „λ§Œμ„ μ§€μ›ν•œλ‹€. light 버전은 Java 7 κ³Ό Java 8 을 λͺ¨λ‘ μ§€μ›ν•˜λŠ”λ°, class hierarchy μˆ˜μ •μ— λŒ€ν•œ κΈ°λŠ₯이 μ œν•œμ μ΄λ‹€. κΈ°λŠ₯ μ œν•œμ„ κ°„λ‹¨νžˆ μ„€λͺ…ν•˜λ©΄, class hierarchy 에 μΆ”κ°€λ˜λŠ” 것은 κ°€λŠ₯ν•œλ°, μ‚­μ œλ˜λŠ” 것은 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν•œλ‹€. – 2014λ…„ 11μ›” ν˜„μž¬
  • DCEVM 기반의 Hotswap Agent κ°€ κ³΅κ°œλ˜μ–΄ μžˆλ‹€. jar 둜 λ°°ν¬ν•˜λŠ” 이 agent λ₯Ό μ μš©ν•˜κ²Œ 되면, 좔가적인 μœ μš©ν•œ κΈ°λŠ₯을 μ‚¬μš©ν•  수 있게 λœλ‹€.

DCEVM 기반의 Hotswap Agent

  • Hotswap Agent Homepage
  • DCEVM 기반의 Hotswap Agent κ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯
    • DCEVM light 버전을 μΈμŠ€ν†¨λŸ¬λ‘œ λ°°ν¬ν•˜κ³  μžˆλ‹€. full 버전이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, class hierarchy 변경을 hot swap ν•˜λŠ”λ° μ œμ•½μ΄ μžˆλ‹€.
      • IDE 개발 ν™˜κ²½μ—μ„œλŠ” debug mode 둜 μ‹€ν–‰ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ λ³€κ²½λœ class λ₯Ό reload ν•˜λŠ” hot swap κΈ°λŠ₯을 μ΄μš©ν•  수 μžˆλ‹€.
      • autoHotswap ν”„λ‘œνΌν‹°λ₯Ό μ„€μ •ν•˜λ©΄, ν”„λ‘œλ•μ…˜ μ‹œμŠ€ν…œμ—μ„œλ„ JVM μž¬μ‹œμž‘ 없이 클래슀λ₯Ό reload ν•  수 있게 λœλ‹€.
    • JAR 에 λ“€μ–΄μžˆμ§€ μ•Šμ€ λͺ¨λ“  둜컬 νŒŒμΌμ‹œμŠ€ν…œμ˜ νŒŒμΌμ— λŒ€ν•΄ 변경을 λͺ¨λ‹ˆν„°λ§ν•˜λ©° reload ν•˜λŠ” κΈ°λŠ₯을 μžλ™μ μœΌλ‘œ μˆ˜ν–‰ν•œλ‹€. μ–΄λŠ 경둜의 μ–΄λ–€ νŒŒμΌλ“€μ˜ 변경을 μ§€μΌœλ΄μ•Ό ν•˜λŠ”μ§€ λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•Šμ•„λ„, κΈ°λ³Έ μ„€μ •μœΌλ‘œ μž‘λ™ν•˜κ²Œ λœλ‹€.
    • μΆ”κ°€ classpath λ₯Ό μ§€μ •ν•  수 μžˆλ‹€. extraClasspath ν”„λ‘œνΌν‹°λ₯Ό μ΄μš©ν•΄, 변경을 λͺ¨λ‹ˆν„°λ§ν•  클래슀 νŒŒμΌλ“€μ˜ 디렉토리λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.
    • resource 파일이 λ³€κ²½λœ κ²½μš°μ—λ„ reload ν•˜λ„λ‘ μ„€μ •ν•  수 μžˆλ‹€. webapp 디렉토리 λ‚΄μ˜ resources λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„κ°€ reload ν•˜λŠ” 것이 일반적인데, src/main/resources λŠ” κ·Έλ ‡μ§€ μ•Šλ‹€. watchResources ν”„λ‘œνΌν‹°λ₯Ό μ΄μš©ν•΄ resource 파일 변경을 λͺ¨λ‹ˆν„°λ§ν•  수 μžˆλ‹€.
    • ν”„λ ˆμž„μ›Œν¬λ₯Ό μ§€μ›ν•œλ‹€. μƒμ„Έν•œ κΈ°λŠ₯은 https://github.com/HotswapProjects/HotswapAgent#hotswap-agent-1 λ₯Ό μ°Έκ³ ν•˜λ©΄ λœλ‹€. 이 κ°€μš΄λ°, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 지원 κΈ°λŠ₯은 μ•„λž˜μ™€ κ°™λ‹€. Modify root Spring classes to get Spring contexts and registered scan path
      • Watch for any resource change on a scan path
      • Watch for a hotswap of a class file within a scan path package
      • Reload bean definition after a change
      • ... and many other
    • IntelliJ μ—μ„œλŠ” DCEVM 을 μœ„ν•œ ν”ŒλŸ¬κ·ΈμΈμ„ μ œκ³΅ν•œλ‹€. 이 ν”ŒλŸ¬κ·ΈμΈμ€ 본질적으둜 νŠΉλ³„ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 것은 μ•„λ‹ˆκ³ , ν”„λ‘œμ νŠΈ μ„€μ •μ—μ„œ VM을 선택할 수 있게 λͺ©λ‘μ„ μ œκ³΅ν•˜λŠ” λ“± 섀정을 λ„μ™€μ£ΌλŠ” 것이닀.

Using hot swap with DCEVM and IntelliJ

  • 이 λ¬Έμ„œλŠ” ν”½ κ°œλ°œμ‹œ Java Class 변경이 μžˆμ„ 경우, 맀번 톰캣을 μž¬μ‹œμž‘ν•˜μ§€ μ•Šκ³  λ™μ μœΌλ‘œ Hotswap ν•˜λŠ” 방법을 μ„€λͺ…ν•˜λŠ” λ¬Έμ„œμ΄λ‹€.
  • 기쑴에 IntelliJ에 Hotswap κΈ°λŠ₯이 μžˆμ§€λ§Œ, Method Bodyμ˜μ—­λ§Œ Howswap이 κ°€λŠ₯ν•˜κ³ , μƒˆλ‘œμš΄ λ©”μ†Œλ“œμ˜ add / remove, class μƒμ„±μž λ“±μ˜ κΈ°λŠ₯듀은 μ œκ³΅λ˜μ§€ μ•Šμ•„, 일λͺ… Full featured hotswap (true hotswap)을 μ μš©ν•˜λŠ” 방법을 μ†Œκ°œν•œλ‹€.
  1. μ€€λΉ„λ¬Ό
  • JDK 1.8.0 Update 5 build 13
  • DCEVM Installer
  • IntellIJ DCEVM Integration Plugin
  1. μ„€μΉ˜λ°©λ²•
  2. JDK 1.8.0 Update 5 build 13을 μ„€μΉ˜ν•œλ‹€. DCEVM Installκ°€ λͺ¨λ“  λ²„μ „μ˜ jdk8을 μ§€μ›ν•˜μ§€ μ•Šμ•„μ„œ jdk8 update 5λ₯Ό μ„€μΉ˜ν•œλ‹€ - 2014.10.29 κΈ°μ€€
  3. μ„€μΉ˜κ°€λ˜λ©΄ /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk에 μ„€μΉ˜λœλ‹€.
  4. DCEVM Installλ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€. rootκΆŒν•œμ΄ ν•„μš”ν•˜λ‹€. sudo java -jar installer-light-jdk8u5.52.jar
  5. Add installation directoryλ₯Ό λˆŒλŸ¬μ„œ .../jdk1.8.0_05.jdk/Contents/Home 폴더λ₯Ό μ§€μ •ν•œλ‹€.
  6. Replaced by DCEVM / Install DCEVM as altjvm μ°¨λ‘€λ‘œ λˆ„λ₯Έλ‹€.
  7. μ™„λ£Œν›„μ— java -version 을 ν–ˆμ„κ²½μš° λ‹€μŒκ³Ό 같이 λ‚˜μ™€μ•Ό 함. $ java -version java version "1.8.0_05" Java(TM) SE Runtime Environment (build 1.8.0_05-b13) Dynamic Code Evolution 64-Bit Server VM (build 25.5-b02-dcevmlight-58, mixed mode) $
  8. IntelliJμ—μ„œ DECVM을 κ²€μƒ‰ν•΄μ„œ DCEVM Integeration ν”ŒλŸ¬κ·ΈμΈ μ„€μΉ˜ ν›„ IntellIJ μž¬μ‹œμž‘.
  9. μ‚¬μš©λ°©λ²•
  10. Java νŒŒμΌμ„ ν•˜λ‚˜ λ°”κΎΌλ‹€μŒμ— Compile ν•œν›„, Tomcat restart 없이 λ°˜μ˜λ˜λŠ”μ§€ 확인
  11. tip : Ctrl + Sλ‚˜ Cmd+S 등을 Save And Compile Macro둜 걸어두면 Save & Compileμ΄λ˜μ„œ μ €μž₯κ³Ό λ™μ‹œμ— ν•«μŠ€μ™‘μ΄ λœλ‹€.