배포 옵션

  • 빌드 및 실행 방법
    • STS나 IntelliJ IDEA 등의 IDE에서 애플리케이션을 빌드하고 실행
    • 메이븐 springboot:run이나 그래들 bootRun 태스크를 사용해서 명령행에서 애플리케이션을 빌드하고 실행한다.
    • 메이븐이나 그래들을 사용해서 실행 가능한 JAR 파일을 생성한다.
    • 메이븐이나 그래들을 사용해서 WAR 파일을 생성한다.
  • 배포 방법
    • 자바 애플리케이션 서버에 배포하기: 톰캣, 웹스피어, 웹로직 등의 자바 애플리케이션 서버에 애플리케이션을 배포해야 한다면, 선택의 여지없이 WAR 파일로 애플리케이션을 빌드해야 한다.
    • 클라우드에 배포하기: AWS, Azure 등의 클라우드 플랫폼으로 배포한다면, 실행 가능한 JAR 파일이 최사으이 선택이다. WAR보다 JAR 형식이 훨씬 간단하므로 WAR 파일 배포를 지원하더라도 JAR 파일로 배포하는 것이 좋다.

WAR 파일 빌드하고 배포하기

  • JAR 파일로 빌드할 때는, 스프링 부트의 자동-구성 덕분에 스프링을 DispatcherServlet을 선언하기 위해 web.xml 파일이나 서블릿 초기화 클래스를 생성하지 않아도 되었다.
  • 그러나 WAR 파일을 빌드하기 위해서는 DispatcherServlet을 선언하는 서블릿 초기화 클래스도 WAR 파일에 포함해야 한다.
  • 스프링 부트는 SpringBootServletInitializr를 사용해서 DispatcherServlet 구성을 쉽게 해준다.
    • SpringBootServletInitializer는 스프링 WebApplicationInitializer의 구현체다.
    • SpringServletInitialzer의 역할
      • DispatcherServlet 구성
      • Filter, Servlet, ServletContextInitialzer타입의 빈들을 스프링 애플리케이션 컨텍스트에서 찾아서 서블릿 컨텍스트에 바인딩
  • 아래 사진과같이 sources() 메서드를 오버라이드하여, 구성 클래스를 등록하면 된다.
  • 빌드하기
    • 메이븐으로 빌드하는 경우 pom.sml 파일의 <packaging> 요소를 war로 설정하면 된다.
      • 빌드 명령어: mvnw package
    • 그래들은 build.gradle 파일에 war 플러그인만 추가하면 된다.
      • 빌드 명령어: gradlew build
  • 빌드가 완료되면 WAR 파일이 build/libs 디렉터리에 생성된다.
  • WAR 파일을 빌드했더라도 실행 가능한 JAR 파일처럼 여전히 명령행에서 실행할 수 있다.
java -jar target/ingredient-service-0.0.19-SNAPSHOT.war
  • WAR 파일은 과거에 주로 사용헀던 자바 애플리케이션 서버에 애플리케이션을 배포하기 위해 설계되었다.
    • 현대의 클라우드 배포에는 WAR 파일이 필요하지 않으며, 지원하지 않는 경우도 있다.

클라우드 파운드리에 JAR 파일 푸시하기

  • PaaS는 몇 가지 부가 서비스(DBB, 메시지 브로커 등)와 함께 미리 구축된 애플리케이션 배포 플랫폼을 제공하여 우리 애플리케이션과 결합한다.
  • 클라우드 파운드리는 애플리케이션의 개발, 배포, 확장을 위한 오픈소스/멀티 클라우드 PaaS 플랫폼이며, 클라우드 파운드리 재단에 의해 최초 개발되었다.
  • 상용 버전은 스프링 플랫폼의 스프링 프레임워크와 다른 라이브러리를 주관하는 피보탈사에서 제공한다.
  • 피보탈에 배포하기 위해선은 피보탈의 명령행 도구를 설치해서 명령어를 통해 배포할 수 있다.

도커 컨테이너에서 스프링 부트 실행하기

방법1: Spotify 메이븐 플로그인 이용하는 방법

  • <configuration> 블록 아래에 도커 이미지 생성에 필요한 속성들을 설정한다.
  • <repository> 요소에는 도커 리퍼지터리에 나타나는 도커 이미지의 이름을 지정한다.
    • docker.iamge.prefix는 아래와 같이 properties로 명시해야된다.
  • <buildArgs> 요소 메이븐 빌드가 생성하는 JAR 파일을 지정한다.

방법2: Dockerfile 이용하는 방법

    • FROM: 새 이미지의 기반이 되는 이미지를 지정한다. 새 이미지는 기본 이미지를 확장한다.
    • ENV: 환경 변수를 설정한다.
    • VOLUME: 컨테이너의 마운트 지점을 생성한다.
    • ARG: 빌드 시에 전달할 수 있는 인자를 선언한다.
    • COPY: 지정된 경로의 파일을 도커 이미지에 복사한다.
    • ENTRYPOINT: 컨테이너가 시작될 때 실행하기 위한 명령행 코드를 배열로 지정한다.
  • 일반적으로 스프링 부트 애플리케이션을 포함하는 컨테이너 이미지에는 SPRING_PROFILES_ACTIVE 환경 변수를 ENV에 설정하는 것이 좋다.
    • 이렇게 하면 도커에 실행되는 애플리케이션에 고유한 빈과 구성 속성을 구성할 수 있기 때문이다.
  • 도커를 사용할 때 DB의 호스트는 --link 매개변수를 사용하는 방법이 있다.
    • 아래 사진과 같이 구성 파일에는 mongo라고 호스트를 지정해둔다.
    • mvnw package dockerfile:build 명령어를 통해 jar 파일을 빌드하고 이미지가 생성된다.
    • docker iamges 명령을 사용하면 생성된 이미지가 로컬 이미지 리퍼지터리에 있는지 검사할 수 있다.
    • docker run --name tacocloud-mongo -d mongo:3.7.9-xenial 명령을 통해터 몽도 데이터베이스의 컨테이너를 실행한다.
    • 아래 --link 매개변수는 tacocloud-mongo 컨테이너와 연결된다. 그리고 tacocloud-mongo 컨테이너의 호스트 이름을 mongo로 지정한다. 스프링 데이터가 이 호스트 이름을 사용해서 연결할 수 있도록 하기 위해서다.
  • 빌드된 도커 이미지를 Dockerhub나 다른 도커 이미지 리퍼지터리에 푸시하면 다른 환경에서도 배포할 수 있다.