본편은 이전 글인
ALTIBASE-MIGRATION-WITH-DOCKER와 연동되는 내용이다.
이전 편에서 연동을 완료하고 개발 환경을 사용하면서
불편한 점을 찾았다.
바로 Docker 컨테이너를 수동으로 키고 꺼야한다는 점이다.
일단 컨테이너가 상시 실행 중이라는 점에서 리소스 낭비와
개발 환경이라 컨테이너를 신경 쓰지 않아도 된다는 점이다.
물론 컨테이너 시작과 종료 명령어 또는 마우스 클릭또한
안할 수 있는 방법이 있지 않을까? 에서 시작되었다.
필자의 경우 Intelj IDE를 사용하였고
아래와 같이 설정을 변경하였다.
File - Settings - Tools - External Tools 추가

Program에는 docker.exe가 설치된 경로가 들어가야하고
Arguments는 실행할 명령어
필자는 컨테이너 실행 명령어를 삽입했다.
Tomcat의 Edit Configurations에서

Before launch부분의 +버튼을 클릭 후 Run External Tool 선택 후 방금 생성했던 start altibase를 추가해주고 Apply후 OK클릭
위와 같이 세팅하면 WAS실행 시 컨테이너도 같이 실행이 된다.
종료 시에는 안타깝게도 위와 같은 기능이 없다...
그래서 생각해낸 대안이 Spring의 이벤트 리스너 인터페이스를
구현하여 ContextClosedEvent (컨텍스트 종료 이벤트)
즉 Tomcat 종료 또는 Spring Application 종료 시 이벤트가 발생한다.
@Component
public class ShutdownListener implements ApplicationListener<ContextClosedEvent> {
@Override
public void onApplicationEvent(ContextClosedEvent event) {
try {
Process process = Runtime.getRuntime().exec("docker stop altibase");
process.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
onApplicationEvent 메서드란?
Tomcat 서버 또는 Spring Application 종료 시 자동으로
호출되는 메서드를 실행시켰다.
exec() 메서드란?
자바에서 외부 프로그램이나 운영 체제 명령어를
실행할 수 있게 해주는 메서드
Docker에서 실행되어야하는 명령어인 docker stop altibase를
사용하기 위해 exec()메서드를 사용하였다.
위와 같이 세팅을 하면 Tomcat 실행/종료시 Docker 컨테이너도
함께 관리를 할 수가 있다.
하지만 운영 환경이나 서버 재시작을 자주하게 되는 경우
그만큼 컨테이너를 재시작해야하므로 비효율적일 수 있다.
상황에 맞춰 세팅을 하고 사용하는게 좋을 것 같다.
번외로 Intelj 내장 Tomcat이므로 shutdown.bat 또는
shutdown.sh를 수정하여도 해당 파일들에 docker stop ~
같은 명령어들을 입력하여도 명령어가 실행되지 않는다.