본문 바로가기

프로그래밍/Spring

Spring Boot, IntelliJ, Docker Wildfly 연동과 관련된 정리

IntelliJ를 이용해서 Spring Boot와 Docker에서 실행중인 Wildfly를 연동해서 개발하는 방법에 대한 내용을 적어보기로 한다

 

먼저 IntelliJ에 Docker에서 실행중인 Wildfly container를 연동하는 개발방법에 대해서는 여기에 언급이 되어 있어서 별도의 설명은 하지 않도록 한다. 다만 링크되어 있는 글에 대한 방법을 따라 하면서 내가 시행착오(?)를 겪어본 일들에 대해서만 설명하도록 하겠다.

 

위의 링크를 읽어보면 wildfly를 자신의 PC에 설치되어 있는 wildfly를 이용하는 것이 아니라 docker wildfly 이미지를 별도로 만들어서 하고 있다. 이 부분때문에 docker에 대한 이해가 필요한 부분이 있다. 나의 경우는 docker hub에 올린 내가 만든 image인 furywolf/centoslocal_wildfly를 사용해서 연동했다. docker image에 대한 container를 foreground로 실행하는 경우(docker run 또는 docker-compose up 명령 사용시 -d 옵션을 사용하지 않는 경우를 의미한다) 해당 command 창에서 wildfly 로그를 볼 수 있다. 그러나 IntelliJ 안에서는 로그를 볼 수가 없다. 이 부분은 개발할때 불편함으로 다가오는 부분이 있다.

 

그리고 eclipse와 docker wildfly container를 연동할때와 같이 개발하는 PC에 같은 버전의 Wildfly가 설치되어 있어야 한다(eclipse의 경우는 docker wildfly container와 연동하는 방법이 2가지가 제공되는데 Management 기능을 사용할 경우엔 개발하는 PC에 같은 버전의 Wildfly가 설치되어 있지 않아도 된다) 이것은 remote 서버와의 연동으로 인해 발생한 사항이다. 이것을 꼭 합리적이지 않다고 볼수는 없다. 가령 개발할때는 자신의 local에 설치된 wildfly 서버를 사용하고 remote 서버의 디버깅 용도로 연동할때 자신의 local에 설치된 wildfly 서버를 사용할 수도 있기 때문이다. 그러나 이것에 대해 거부감이 느껴진다면 그냥 local에 설치된 wildfly 서버에서 개발해도 된다.

 

개발을 하다보면 수정사항이 발생하여 서버를 재기동 하지 않은 상태에서 자신의 수정 사항이 반영되길 바라는 상황이 존재한다. 이렇게 할려면 IntelliJ에서 설정된 wildfly를 실행시킬때 Run이 아닌 Debug로 실행해야 한다. Run으로 실행하게 되면 Wildfly서버를 재기동시키면서 반영하게 되는 Redeploy 기능만 제공되지만 Debug로 실행시키면 Widlfly 서버를 재기동 하지않으면서 변경된 클래스가 교체되는 식으로 반영이 되는 Hot Swap Classes와 Redeploy 모두 제공하기 때문에 개발할때는 Debug 모드에서 개발하면 편리한 점이 있게 된다.

 

이렇게 연동된 wildfly에 Spring Boot Project를 실행하게 되면 해당 Context Root가 Spring Boot Project가 생성하는 war 파일 이름으로 잡히게 된다(예를 들어 Spring Boot Project가 최종적으로 mysample.war 파일을 만들게 되면 Context Root는 /mysample로 설정이 된다) 그래서 Conext Root를 /로 설정하려면 WEB-INF 디렉토리에 jboss-web.xml이 다음의 내용으로 있으면 된다

 

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
               http://www.jboss.com/xml/ns/javaee
               http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
    <context-root>/</context-root>
</jboss-web>

 

<context-root> 태그의 값으로 /를 설정함으로써 Context Root를 /로 설정이 된다. 근데 여기서 주의해야 할 점이 있다. 바로 jboss-web.xml을 Spring Boot Project에서 두어야 할 위치이다. 위에서 언급했을때 이 jboss-web.xml의 위치는 WEB-INF 디렉토리에 있어야 한다고 했다. 그러면 우리가 알고 있는 Spring Boot Project의 구조에서 이 WEB-INF 디렉토리에 파일을 설정해 둘 수 있는가? 그럴수 없다. 어 왜? 우리가 src/main/java 에서 만든 java package 및 class 들, src/main/resources 에서 만든 각종 properties 파일들 모두 WEB-INF에 들어가잖아? 맞다. WEB-INF에 들어간다. 근데 엄밀하게 말하면 WEB-INF에 들어가는 것이 아니라 WEB-INF/classes 디렉토리에 들어가게 된다. 즉 WEB-INF 디렉토리의 하위 디렉토리인 classes 디렉토리에서부터 들어가지기 때문에 기존의 프로젝트 구조에 jboss-web.xml을 설정하게 되면 WEB-INF/classes 디렉토리를 기준으로 해서 들어가지기 때문에 Wildfly에서 인식을 하지 못하게 된다. 그래서 IntelliJ에서 다음과 같이 디렉토리를 만들어서 jboss-web.xml을 넣어두어야 한다. 다음의 그림을 보도록 하자.

 

 

노란색 박스가 되어 있는 부분을 보자. 원래 Spring Boot Project 구조에서는 webapp 폴더가 없는데 src/main에 webapp 디렉토리를 만들고 그렇게 만든 webapp 디렉토리 밑에 WEB-INF 디렉토리를 만들고 이렇게 만든 디렉토리에 위에서 언급한 jboss-web.xml을 넣게 된다. 이렇게 하면 Wiildfly에서 Context Root를 /로 설정된 상태에서 내가 만든 Project가 Wildfly에 실행되게 된다