[IntelliJ] Spring 재시작 없이 리로드(Hot-swap)하기!

스프링 핫스왑

  IntelliJ를 사용하면서 불편한 점이 하나 있었습니다. 방금 전까지요. 바로 js, css, html, jsp 등등 정적 리소스는 수정하고 On Frame Deactivation 이벤트에 지정한 대로 자동으로 리로드가 되는데, Controller, Service, Repository, Mapper 등등은 알아서 리로드가 되지 않는 것이었죠.

  근데, 제가 회사에서 일 할 때의 기억으론 이클립스 사용시 컨트롤러 역시 핫스왑이 되었던 것 같은데, 왜 IntelliJ에선 안 되지? 하고 생각하게 되었습니다. 얼마 지나지 않아, 안 되는 게 아니라 못 찾은 것 뿐일 거라는 생각이 들어 찾아봤습니다.

  역시 답은 금방 나오더군요.

컨트롤러, 리포지토리, 서비스 모두 핫스왑!

  방법은 Maven과 Gradle이 다릅니다. 따지고 들어가 보면 같은 원리긴 하지만... 아무튼 설명 들어갑니다.

  메이븐 사용시:
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
            <version>1.2.6.RELEASE</version>
        </dependency>
    </dependencies>
</plugin>

  그래들 사용시:
buildscript {
    repositories { jcenter() }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE"
        classpath 'org.springframework:springloaded:1.2.6.RELEASE'
    }
}

apply plugin: 'idea'

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

  보시다시피, org.springframework:springloaded 라는 플러그인을 사용하는 것을 알 수 있습니다. 아래 링크할 참고 페이지에 들어가 보시면 ApplicationContext를 강제로 refresh시키는 원리라고 합니다. 그냥 refresh시키면 여러 문제가 발생할 가능성이 있는데, 그런 점을 여러 트릭을 써서 안전하게 refresh시켜주는 게 바로 이 라이브러리라고 하네요.

  아무튼, 플러그인을 추가하고 코드를 수정하면 수정사항이 재시작 혹은 Redeploy 없이 적용되는 것을 확인할 수 있습니다. 다만, On Frame Deactivation 이벤트가 정적 리소스에 비해 좀 늦게 작동하는 것 같더군요.

  만약 수정한 뒤 바로 적용시키고 싶으시면 해당 클래스만 Rebuild(단축키 기본값: Ctrl + Shift + F9)시키면 즉시 적용되는 것을 확인했습니다.


댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭