
회사 프로젝트를 배포하는 역할을 맡았는데, 기존에 사용하던 Spring Boot 구조가 아니라 Dynamic Web Project로 되어 있어서 조금 당황했다.
Maven이나 Gradle도 없고, .war 파일을 직접 만들어서 배포해야 했기 때문에 어떻게 해야 하는지 하나씩 정리해봤다.
Dynamic Web Project는 Eclipse에서 제공하는 웹 개발 템플릿 중 하나로, Servlet 기반의 웹 애플리케이션 개발을 위한 구조다. 보통은
.java,.jsp,WEB-INF,lib폴더 등이 포함되어 있고, 최종적으로는 .war 파일을 만들어 톰캣 같은 WAS에 배포하게 된다.
빌드 도구(Maven/Gradle)가 없다 보니 의존성 추가나 배포가 전부 수동이라는 단점이 있었고, 다음 글에서는 Maven 프로젝트로 리팩터링하는 내용을 다룰 예정이다.
.war 파일을 export 하려면 Eclipse의 JEE 버전이 필요하다.
brew명령어를 통해 간단하게 설치했다.brew install --cask eclipse-jee설치 후에는 기존 Dynamic Web Project를 import해서 사용하면 된다.
Eclipse에서 해당 프로젝트 우클릭 →
Export→Export...→Web→WAR file선택
Export 시 설정은 아래처럼 하면 된다:
- Web project: 현재 프로젝트 자동 선택됨
- Destination: .war 파일 저장 경로 지정
- Target runtime: 별도 설정 없이 기본값 사용
- Overwrite existing file: 필요시 체크 (같은 이름의 .war가 있을 경우 덮어쓰기)
.war 파일을 Docker 이미지로 배포하기 위한 작업을 시작했다.
Dockerfile을 작성했는데, 이클립스 내 터미널에서 docker 명령어가 안 먹히는 문제가 발생했다. macOS 기본 터미널에서 실행하여 문제를 해결했다.
Eclipse는 환경변수 로딩이 제한적이라 docker 명령어를 인식 못 하는 경우가 있다고 한다.
또한, 프로젝트의 인코딩이EUC-KR로 되어 있어서 톰캣 설정을 변경해주었다.RUN sed -i 's/URIEncoding="UTF-8"/URIEncoding="EUC-KR"/' /usr/local/tomcat/conf/server.xml \ && echo 'JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=EUC-KR"' >> /usr/local/tomcat/bin/setenv.sh \ && chmod +x /usr/local/tomcat/bin/setenv.sh
환경변수 주입 및 포트 설정 등을 위해 Docker Compose를 구성하고
docker.properties를 작성했다.
WebContet → WEB-INF → spring → appServlet폴더 안에 있는.properties파일들은 환경별 설정을 관리하는 용도로 쓰이고 있었는데, 파일 내용을 외부에서 관리하기 위해 docker.properties를 만들어 설정을 따로 분리했다.
docker-compose.yaml의environment항목에는 해당.properties에서 사용되는 값들을 정의한다. 예를 들면 아래와 같이 구성할 수 있다:environment: - DB_HOST= - DB_PORT= - DB_NAME= - DB_USERNAME= - DB_PASSWORD=이렇게 정의된 값들은 root-context.xml에서
context:property-placeholder을 통해 로딩된다.
현재는 root-context.xml내에서PropertyPlaceholderConfigurer를 사용해 docker.properties를 직접 명시해서 불러오도록 설정했다.<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreResourceNotFound"><value>true</value></property> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <list> <value>/WEB-INF/spring/appServlet/docker.properties</value> </list> </property> </bean>향후 운영/개발 등 여러 환경을 분기하고 싶다면
spring.profiles.active를 사용해 원하는 .properties 파일을 로드하도록 개선할 수 있다.
마지막으로 설정이 문제없는지 확인하기 위해 아래 명령어로 파싱 검증을 진행했다:docker-compose config
- Dynamic Web Project는 처음에는 익숙하지 않지만 .war 파일 단위로 배포할 수 있어 구조를 이해하고 나면 적용은 어렵지 않았다.
- docker-compose.yaml의 environment 항목을 통해 .properties에서 사용하는 설정 값을 외부에서 관리할 수 있고, Spring에서는
spring.profiles.active=docker설정을 통해 어떤 .properties를 로드할지 결정할 수 있다는 것도 새롭게 알게 된 부분이다.