인프런 커뮤니티 질문&답변

우럭아왜우럭님의 프로필 이미지
우럭아왜우럭

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

프로젝트 생성

애플리케이션이 2번실행?됩니다.

해결된 질문

작성

·

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

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 승빈님

저도 정확한 이유를 모르겠네요. 전체 프로젝트를 압축해서 올려주세요.

감사합니다.

우럭아왜우럭님의 프로필 이미지
우럭아왜우럭

작성한 질문수

질문하기