해결된 질문
작성
·
1.8K
0
롬복 테스트를위해서 강의영상처럼 똑같이 작성하였는데, 실행됬을 때 콘솔을 보면 data = hello가 2번 출력됩니다.
코드
콘솔
밑에 아무런 출력이나 넣고 다시 해보면 그 출력까지도 2번출력되네요. 마치 메인메서드 2번실행되는것처럼 나옵니다.
답변 3
1
1
안녕하세요. 승빈님
확인을 해보니 spring-boot-devtools가 포함되어 있네요^^
다음과 같이 코드를 실행해보면 명확하게 알 수 있습니다.
private static Logger logger = LoggerFactory.getLogger(JpashopApplication.class);
public static void main(String[] args) {
logger.info("hello!");
SpringApplication.run(JpashopApplication.class, args);
}
출력결과
15:35:43.408 [main] INFO jpabook.jpashop.JpashopApplication - hello!
15:35:43.547 [restartedMain] INFO jpabook.jpashop.JpashopApplication - hello!
원래는 JVM이 실행되면서 main 쓰레드에서 스프링을 실행해야 하는데, devtools가 포함되어 있으면 JVM이 실행되고, main을 호출하면서 main 쓰레드가 실행은 됩니다. 그런데 스프링은 main 쓰레드가 아닌 restartedMain이라는 쓰레드에서 실행됩니다. 이 과정에서 restartedMain 쓰레드에서 스프링 컨테이너를 실행하기 위해서 main 메서드를 한번 더 호출합니다. 참고로 이때는 main쓰레드에서 스프링 컨테이너를 실행하지는 않습니다.
devtools는 코드에 변화가 있으면 JVM은 그대로 유지한채 스프링 컨테이너만 다시 실행합니다(인텔리J의 경우 build-> recompile 실행). 그래서 자바 JVM을 실행하는 시간을 줄일 수 있습니다. 결과적으로 스프링을 실행하는 시간만 추가됩니다.
이런 메커니즘을 정상 수행하기 위해서 main 쓰레드가 아닌 별도의 쓰레드에서 dev-tools가 스프링을 실행하게 됩니다.
감사합니다.
1