Tomcat 8 에서 WildFly(JBoss) 13 로...

2018. 9. 9. 15:58

Spring Boot 어플리케이션을 Tomcat에 배포하여 사용중이었습니다.

화면은 Vue.js로 개발하였고, Spring Boot는 API Server의 역할이었죠.


Tomcat에 war로 배포하여 사용하다가 WildFly로 이동하게 되었습니다.

이유는 기술 지원 그룹 분들이 WildFly가 익숙하기 때문이었습니다.

Tomcat이나 WildFly나 그게 그거라는 말씀만 덜컥 믿었죠.

시간상 기술적으로 충분히 검토될 수 없었습니다.


From Tomcat to WildFly


그러다보니 2가지 알 수 없는 에러에 부딪쳤습니다.


첫 번째 문제는 java.lang.ClassCastException 입니다.

Tomcat에서는 발생하지 않던 문제였고, WildFly로 옮기자 발생하였습니다.

org.apache.tomcat.websocket.server.WsServerContainer 

cannot be cast to io.undertow.websockets.jsr.ServerWebSocketContainer


이 문제는 Spring Boot의 dependency 설정을 변경해줘야 합니다.

Spring Boot의 내장 톰캣을 제외합니다.

그리고 undertow를 provided scope에 추가합니다.

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
    <exclusions>
	<exclusion>
	    <groupid>org.springframework.boot</groupid>
	    <artifactid>spring-boot-starter-tomcat</artifactid>
	</exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-undertow</artifactid>
    <version>2.0.4.RELEASE</version>
    <scope>provided</scope>
</dependency>


두 번째 문제는 multipart/form-data 였습니다.

화면단 Vue.js에 API 서버로 파일을 전송하는 로직이 있습니다.

multipart/form-data를 이용하여 파일을 전송하죠.

매우 일반적인 상황입니다.


그러나 파일이 없는 multipart/form-data 요청시 문제가 발생하였습니다.

Create가 아닌 Update의 경우에도 같은 API를 사용합니다.

파일의 변경이 없을 경우가 바로 그런 경우입니다.

이 역시 Tomcat에서는 문제가 없었던 로직이죠.


이 문제는 파일 저장 API를 분리하여 해결하였습니다.

파일의 변경이 없는 경우에는 API를 호출하지 않도록 화면을 수정했죠.


Tomcat과 Wildfly(JBoss)는 비슷한듯 하지만 엄연히 다른 WAS 입니다.

어떤 이유에서든 기술적인 검토를 충분히 해야했습니다. 

아마 앞으로 어떤 문제가 더 생길지... 막연한 두려움이 생기네요.

TechTrip IT Tech