티스토리 뷰

일전에 springloaded를 이용하여 일반적인 tomcat 개발환경에서 hot swapping을 하는 방법에 대해 다룬적이 있었다. 

 

 

Eclipse, tomcat 환경에서 hot deploy 적용하기 (with springloaded)

springloaded는 hot deploy를 가능하게 해주는 기술 중 하나이다. hot deploy는 뭐냐? 쉽게 설명을 하자면 소스의 변경을 was의 재기동 없이 반영을 해주는 것이라고 생각 하면 된다. was의 재기동은 상황에

oingdaddy.tistory.com

마찬가지로 springboot를 쓸때도 이런 기술은 적용이 가능하다. springboot는 embeded tomcat 이 들어있고 이 또한 간단하게 hot swapping 을 할 수 있다. 무료로 사용할 수 있는 hot swapping 기술중에 springloaded, devtools를 사용하는 방법에 대해서 알아보자.


springloaded 를 사용하는 방법 (reload)

 

이것도 maven plugin을 통해서 동작시키는 방법이 있고 jvm argument에 추가해서 사용하는 방법이 있는데 필자는 후자를 더 선호하므로 jvm argument에 추가하는 방법에 대해 기술하도록 하겠다. 

일단은 springloaded.jar 파일을 받는다. jar 파일 하나만 받으면 된다.

 

 

Maven Repository: org.springframework » springloaded » 1.2.8.RELEASE

org.springframework springloaded 1.2.8.RELEASE // https://mvnrepository.com/artifact/org.springframework/springloaded compile group: 'org.springframework', name: 'springloaded', version: '1.2.8.RELEASE' // https://mvnrepository.com/artifact/org.springframe

mvnrepository.com

이곳에서 받은 후 적당한 곳에 위치를 시킨다. 그리고 경로를 잘 기억해 둔다. 

 


그런다음 Boot Dashboard > 적용시킬 프로젝트 우클릭 > Open Config

 

Arguments에 -javaagent:C:\설치한경로\springloaded-1.2.8.RELEASE.jar -noverify 입력 하고 Apply > Debug

 

이렇게 한다음에 JAVA 클래스의 method 내에서 값 변경을 해보면 재기동이 되지 않고 값이 변경이 되는 것을 확인할 수 있다. 이 springloaded를 이용해 모든걸 바꾸고 적용되기를 바라지는 않는게 좋다. 그냥 메소드 안에 비즈니스 로직 구현하고 잘 되는지 정도 테스트하는 용도로 사용하는것이 가장 바람직하다. 그리고 또한 개발 단계에서만 사용하되 운영단계에서는 사용하지 않는것이 좋다. 

 


devtools 사용하는 방법 (restart)

 

devtools 이란 springboot에서 제공을 하는 hot swapping을 위한 기술이다. 소스코드를 변경하고 저장하면 자동으로 build 및 재기동을 해주는 기술이다.

재기동을 하는데 무슨 hot swapping? 

springboot는 두개의 classloader를 사용하는데 하나는 base classloader로 library와 변경되지 않는 것을 다루는 classloader 이며 다른 하나는 restart classloader로 application을 읽어들이는 classloader이다. 즉 devtools를 이용하면 전체 재기동이 아닌 restart classloader만 재기동이 되는것이다. 물론 전체를 재기동(cold start)하는것보다는 빠르다. 이를 사용하는 방법에 대해 알아보자. 

 

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

 

spring-boot-devtools 의존성을 추가해준다. <scope>runtime</scope> 는 꼭 추가시켜줘야지 안그러면 오류가 발생한다. 의존성 추가가 끝났다면 cache를 사용하지 않는 옵션을 application.properties에 추가를 해줘야한다. 적용할 수 있는 property는 다음과 같다. 

 

spring.thymeleaf.cache=false
spring.freemarker.cache=false
spring.groovy.template.cache=false
spring.mustache.cache=false

 

위 설정이 이다. 이클립스를 사용하는 사용자라면 더이상 설정할 것은 없다. (build automatically는 체크되있어야함) intellij를 사용한다면 이곳을 참조하도록 한다. 

 

devtools 사용하면 단점이 저장만 누르면 서버가 재기동되므로 불편할때가 많다. 이럴때는 application.properties에서 

spring.devtools.restart.enabled=false

설정을 해줘서 강제 재시작을 막는다. 이것이 불편하다면 저장을 누를때 빌드를 build automatically 를 통해서 하지 않고 수동으로 하는 방법이 있다. 습관적으로 저장을 누르는 사람에게는 이것이 더 괜찮을것 같다. 


이 두개를 비교해보자면

일단 springloaded는 지원이 끊겼다. 더이상 개발되지 않는다는것이다. 그리고 변경을 할수 있는 부분이 제한적이다. 하지만 적어도 JAVA 메소드 내에서 변경 후 반영되는것을 확인하는것은 거의 실시간으로 가능하다. (Reload)

그리고 devtools는 springboot에서 밀고 있는만큼 발전가능성이 크다. 하지만 어찌됐든 반영을 하려면 재기동을 해야 하고 반영된 결과물을 확인하는데 시간이 필요하다. 하지만 재기동을 하는만큼 변경된 결과는 확실하게 반영을 해준다. (Restart)

이렇게 각각의 장단이 존재하므로 본인의 개발스타일에 맞는것을 사용하면 되겠다. 

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31