Hello World

Spring-loadded로 WAS 재기동 없이 개발하기 본문

Spring/Boot(4.x)

Spring-loadded로 WAS 재기동 없이 개발하기

EnterKey 2016. 1. 10. 12:50
반응형

Spring-Loaded 란?


JVM 기동중 class 파일의 변경을 반영해주도록 해주는 JVM 에이전트이다.

'hot code replace' 같이 JVM이 한번 기동된 이후 간단한 변경에 대한 허용(메소드 내용 변경)과 다르게 Spring Loaded는 메소드, 필드, 구조등에 대한 추가/변경/삭제를 허용한다.

types/methods/fields/constructors 어노테이션 또한 변경이 가능하고, enum타입들에 대한 추가/변경/삭제 가 가능하다.


설치 방법


현재(2015.8.20)기준으로 1.2.3 이 배포 : springloaded-1.2.3.RELEASE.jar


1.2.4 스냅샷 버젼이 배포 : repo.spring.io


실행 방법


java -javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify SomeJavaClass


어떤 바이트 코드들 중에 재작성 운동을 하는 어떤 바이트 코드 때문에 verifier를 끈다.




------------------------------------------------------------------------------------------------------------------------------



원본 : https://github.com/spring-projects/spring-loaded

Spring Loaded

Spring Loaded 란?

JVM이 동작 중에 class 파일의 변경을 재반영해주는 JVM 대행자이다. 이는 로딩 시간에 class들을 늦은 재반영을 하도록 변형해줍니다.
hot code replace와 다르게 JVM이 단 한 번 기동 중에 쉽게 변경을 반영한다. (유래:Method 내용의 변경)
Spring Loaded는 메소드/필드/생성자에 대한 추가/변경/삭제를 지원합니다.
또한, 어노테이션은 타입/메소드/필드/생성자에 대한 변경을 지원하고 Enum 타입은 값에 대한 추가/수정/삭제가 가능합니다.

Spring Loaded 는 JVM에서 실행할 수 있는 bytecode를 사용한다. 또한, 정확하게는 재반영 체계는 Grails 2를 사용한다.

설치

agent jar를 내려받아 사용한다. 또한, 사용하기 전에 압출을 풀 필요가 없다.

동작 중 재반영

java -javaagent:<pathTo>/springloaded-{VERSION}.jar -noverify SomeJavaClass

증명자에 대한 옵션은 꺼야 합니다. (-noverify 옵션 관련) bytecode는 재작성 중 일부는 bytecode의 일부의 의미로 늘어나기 때문이다(번역 주: bytecode의 변경을 의미 하는 듯합니다.) 일단 시작하고 동작 중에 재반영되도록 대우 되지 않은 jar파일들에서(의존성을가진), 로드되는 모든 .class 파일들이 디스크에서 재반영할 수 있도록 만들어 효과적으로 클래스들이 로드되도록 한다. 한번 로드된 .class 파일은 감시될 것이다(초당 한 번씩) 그리고 새로운 버전이 나타나면 SpringLoaded는 그 것을 반영할 것이다. 모든 살아있는 클래스의 인스턴스는 즉시 새로운 객체를 바라볼 것이다, 인스턴스는 소멸과 재생성이 필요하지 않다.

의심의 여지가 없이 많은 질문과 희망적인 적절한 FAQ를 조만간 내놓을 것이다. 그러는 동안에 여기에서 얼마간 기본적인 것의 질의와 답변을 남긴다.

Q. class 파일이 변경되면 무조건 재반영 되는 것인지요?
A. 아니요, 당신은 유형의 계층 구조를 변경할 수 없습니다. 또한, 실제로 특정한 생성자 패턴을 사용하면 지금 처리 할 수 없습니다.

Q. 객체의 형태가 변경될 때 반영과는 어떤 관계가 있습니까?
A. 변경 결과는 시간이 지남에 따라 변경된 객체가 재반영 됩니다. 예를 들면, 새로운 메소드를 가진 변경된 클래스가 getDeclaredMethods()를 호출하기 전에 새로운 메소드를 바라보도록 합니다. 그러나 이 의미는 만약 당신의 시스템에서 캐시가 존재할 경우 그것을 제거하지 않으면 반영되지 않습니다. 이 경우는 지우고 다시 로드 해야 합니다.

Q. 어떻게 재반영이 실행 되었을 때 내가 알고 내 상태를 지우나요?
A. 플러그인을 설치해서 재반영이 일어났을 때 해당 활동을 확인할 수 있다.ReloadEventProcessPlugin을 상속받고SpringLoadedPreProcessor.registerGlobalPlugin(plugin)을 통해 등록하면 된다. (희망적으로 다른 문서를 보면 등록하는 플러그인의 다른 방법이 있을 것이다.)

Q. 코드의 기본이 되는 것은 어떤 것입니까?
A. 이 기술은 Grails를 이용하여 성공적으로 재반영 되도록 하는 것입니다. 이것은 약간의 성능이 필요하고, 몇 가지 방법의 리펙토링 망치가 필요합니다. 이것은 여기저기에 invokedynamic 명령을 허용하는 것에 대한 향상이 필요하고 JAVA7의 새로운 정수 풀 항목과 연합합니다.

이 코드 동작시키기

git clone https://github.com/SpringSource/spring-loaded

한번 이 프로젝트를 eclipse에 적당한 곳에 복제해야 합니다. 메인 프로젝트와 몇 가지 테스트 프로젝트들을요. 테스트 프로젝트 중 하나는 AspectJ 프로젝트(Java와 AspectJ 코드 두 개에 포함됨) 와 다른 하나는 Groovy 프로젝트입니다. 이 테스트 프로젝트들을 Eclipse에서 컴파일하려면, 관련된 Eclipse 플러그인이 필요합니다.

AJDT : update site http://download.eclipse.org/tools/ajdt/42/dev/update
Groovy-Eclipse : update site :http://dist.springsource.org/snapshot/GRECLIPSE/e4.2/

이것을 가지고 온후 테스트를 동작시키세요. 이것은 두 가지 손으로 하는 방법과 생성하는 방법의 테스트가 있습니다. 모든 테스트를 포함하여 생성할 경우 오랜 시간이 걸릴 수 있습니다. 손으로 하는 방법은 테스트 JVM 기동 시 다음을 추가합니다.

-Dspringloaded.tests.generatedTests=false

NOTE : 또한 테스트 기동시도 -noverify 옵션이 JVM에서 필요합니다.

만약 이 프로젝트를 eclipse에 가져왔으면 실행되거나 실행되지 않을 경우의 생성된 테스트들이 이미 포함 되어 있습니다.

gradle 빌드 스크립트는, 에이전트를 다시 빌드하는 ./gradlew build 실행이 포함되어 있습니다. - 이것은 다음과 같이 생성됩니다. : springloaded/build/libs/springloaded-1.1.5.BUILD-SNAPSHOT.jar

내가 도움을 줄 수 있을까요?

물론이지요! 그냥 최상위의 github 페이지에서 Fork 버튼을 눌러 코드를 가져가셔요. 우리는 끌어오기 요청을 수락하기 전에 당신이 간단한 기여자의 계약서에 서명해야 합니다. - 여기를 확인하셔요. 기여자의 사인은 메인 저장소에 대한 권한을 위탁하지 않습니다, 그러나 이것은 우리가 당신의 공헌을 받아들일 수 있고, 우리가 필요할 경우 저자의 신용을 얻을 것입니다. 열정적인 기여자에게 우리의 코어 팀에서 함께 하기를 물을 것이며 풀 병합을 할 수 있는 권한을 줄 것입니다.


MD 파일 : 

 SpringLoaded.md



반응형
Comments