
심볼릭 링크로 스프링 배치 무중단 배포하기
안녕하세요. 11번가 클레임개발팀 박지훈입니다. 11번가에서는 전사 배치 서버가 있고, 각 팀별로 팀 전용 배치 서버를 추가로 관리하기도 합니다. (최종 목표는 모든 팀이 함께 관리하는 레거시 배치를 각 팀 전용 배치로 이관하는 것입니다.) 클레임개발팀에서는 한 대의 서버로 운영되는 팀 배치 서버를 추가로 관리하고 있고, Spring Batch Job(이하 Job) 스케줄러는 Jenkins 툴을 사용하여 Job 들을 주기적으로 실행시켜 주고 있습니다. 평화롭던 어느 날.. 팀 배치 서버에서 한 가지 문제를 발견하게 되었습니다. Job 수행을 위해 jar 파일을 실행하는 도중 배포가 진행될 경우, jar 파일이 변경(업데이트, 제거)되면서 에러가 발생하는 문제입니다. 이러한 이슈를 해결하기 위해 스프링 배치 무중단 배포를 적용하게 된 과정을 공유해 드리고자 합니다. Contents Contents 문제 상황 기존 배포 방식 아이디어 Symbolic link 적용 배포 이후 단계 Job 실행 단계 적용 결과 마무리 문제 상황 아래와 같은 상황에 처하게 되면 java.lang.NoClassDefFoundError 또는 java.lang.ClassNotFoundException 예외가 터지면서 비정상적으로 배치가 실패하거나 중단되는 현상이 발생하였습니다. Job 실행 중일 때 배포 진행 빌드&배포 중일 때 Job 실행 마주했던 문제의 로그 일부입니다. Exception in thread "main" java.lang.reflect.InvocationTargetException ... Caused by: java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy ... Exception in thread "SpringApplicationShutdownHook" java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy ... 이제 열심히 서칭해야 할 시간입니다. stack overflow 에서 유사한 사례를 발견하게 되었는데, 서론에서 언급했듯이 Job 수행을 위해 jar 파일을 실행하는 도중 배포가 진행될 경우, jar 파일이 변경(업데이트, 제거)되면서 에러가 발생한다는...
