(예전에 다른 카페 및 블로그에 정리했었던 글을 옮겨온 것입니다!)

 

주말에 AWS 클라우드 서비스로 웹서버 구축 공부를 좀 하다가...

마침 지금 듣고 있는 한큐에자바 강의 스텝2 수업에서 스프링 부트를 다루고 있으니 수업시간에 진행하였던 스프링 부트를 서버에 올려보는것을 한 번 시도해봤습니다.

스프링부트를 로컬이 아닌 외부 서버에 올려서 실행하는것은 아주 간단한 방법이기는 한데요..

정말 정말 간단하지만 혹시 모르시는 분들이 계실까봐 그냥 정보 공유 차원에서 잡담 형식으로 올려봅니다..

스프링 부트는 알다시피 톰캣이 내장되어 있기 때문에 별도로 톰캣을 설치해줄 필요가 없습니다.(물론, 내장된 톰캣이 아닌 외부 톰캣을 연동해서 구동하셔도 됩니다.)

준비할것은 스프링 부트가 올라갈 서버가 필요합니다. 그것이 리눅스 서버든 윈도우 서버든 중요치 않구요.. 집에서 놀고 있는 PC나 회사 서버를 이용하셔도 되구요. 버추얼박스 같은거 설치하셔도 되고, 나 돈 좀 있다 하시는 분은 유료 서버 구매하셔도 되구요..

일단 저는 아마존 클라우드에 우분투를 설치하였구요. 거기에 올려보도록 하겠습니다.

(참고로 AWS는 신규 가입시 처음 1년은 일정 용량은 무료로 이용이 가능합니다. 물론, 1년이 지나면 과금이 부과되기에 유료로 이용하고 싶지 않다면 1년이 되기 직전에 해지하는것은 필수입니다.)

 

지난주 수업시간에 했던 ↑ 요것을 서버에 띄워보기로...

우선 STS를 키고...

스프링부트는 기본적으로 jar로 패키징이 됩니다.

Gradle Tasks 항목에서 해당 프로젝트의 빌드를 더블 클릭하면

프로젝트 최상위 경로 > build > libs에 jar 파일이 생성이 됩니다.

바로 요렇게.... 파일명은 gradle에서 설정한 버전 정보까지 붙여서 나와서 좀 길어보이는데... 저걸 짧게 수정해도 실행하는데는 문제는 없습니다.

저거 서버에 올려서 실행만 해주면 되는데 일단 서버에 올리기 전에 지금 개인 PC에서 실행을 해봅시다.

cmd모드로 진입후 저 경로로 가서

java -jar 파일명.jar 로 실행을 해주면 됩니다.

정상 실행이 되는가 싶더니 오류가 나면서 중단되네요ㅜㅜ;;;

Error creating bean with name 'tilesConfigurer' defined in class path resource [com/step2/mvc/cmmn/TilesConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No URL for ServletContext resource [/WEB-INF/tiles/default-layout.xml]

이런 오류인데....

음... 잘 모르겠습니다. STS에서 바로 실행할때는 잘 되었는데 왜 jar 파일로 묶어서 따로 실행하니 오류가 날까요....

구글링 좀 해보니 jar파일은 템플릿 경로를 못가져오는 경우가 가끔 있다고 하는 카더라도 있고...

이 오류에 대한 해결책은 나중에 찾아보기로 하고..

이번에 jar 파일이 아닌 war 파일로 패키징해보도록 하겠습니다.

스프링부트는 처음 프로젝트 생성시에 패키징 방식을 jar 할것인지 war로 할 것인지 선택이 가능합니다. 지금 현재 프로젝트는 jar로 이미 생성이 되어 있기에 굳이 다시 플젝을 만들 필요는 없구요.

몇 가지 설정을 추가하면 war로 패키징이 가능합니다.

build.gradle에 간략하게 위에 체크된 설정만 추가해줘도 war로 패키징하는데 문제가 없습니다.

그럼 아까 jar를 생성했던 것처럼 Gradle Tasks에서 다시 한 번 build를 해주시면 됩니다.

그럼 아까 jar 파일이 생성되었던 경로에 가면 war 파일이 생성된것을 확인할 수가 있습니다!!

(+ 지금 보니까 jar 와 war가 용량이 다르네요.. jar로 묶을려면 다른 설정 추가가 필요했던걸까요..??)

아무튼 그럼 war파일은 정상적으로 실행이 되는지 확인해봅시다.

오류없이 정상 실행되는것 확인이 가능합니다.

그럼 이 war 파일을 서버에 올리시면 되구요.

파일질라를 이용해서 올리셔도 되고 다른 방식으로 올리셔도 됩니다. 어찌되었건 서버에 저 파일이 올라가면 되구요. 일단 단순히 서버에서 띄우는게 목적이므로 war파일을 놔둘 경로는 일단 아무데나 올리셔도 상관없을 것 같네요.

그리고 해당 서버 운영체제에 자바는 설치가 되어 있어야 합니다. 톰캣은 스프링 부트에 내장되어 있으니 필요가 없지만 자바는 그렇지 않으니까요. 오라클JDK를 설치하든 오픈JDK를 설치하시든 간에요.

저는 우분투에 오픈JRE, JDK를 설치하였습니다. 자바 버전은 스프링부트에 맞춰주는게 좋구요.

자바 설치 명령어는 아래와 같습니다.

sudo apt-get install openjdk-8-jre

sudo apt-get install openjdk-8-jdk

그리고 나서 서버에 올린 war 파일을 아까처럼 실행해주면 되는데요.

그런데 여기서 주의할점은 아까랑 똑같이

java -jar 파일명.war 이렇게 실행을 하면 실행이야 되겠지만 터미널(까만 콘솔창)을 끄면 그대로 스프링 부트도 종료가 됩니다.(저희가 이클립스 안에서 톰캣 실행시킬시 이클립스 끄면 톰캣도 종료되는 것처럼요)

그래서 터미널을 종료해도 프로젝트는 계속 구동되도록 하기위해서 아래 명령어 방식으로 실행합니다.

nohup java -jar 파일명.war > /dev/null &

이렇게 실행을 해주면 됩니다. (리눅스 기준입니다)

터미널을 종료해도 백그라운드 상태로 계속 프로세스가 실행된다고 이해하시면 되구요. 나중에 정말로 구동을 멈출려면

kill -9 PID(프로세스 번호)

이 명령어로 프로세스 강제 종료하시면 됩니다.

실행이 되면 외부에서 접속을 해보시면 되는데요.

그 전에 이용하려는 포트가 방화벽에 막혀 있다면 허용해주는거 잊지 마시구요. 실무에서는 네트워크/인프라 담당자에게 요청하시면 됩니다.

STS에서 포트번호는 application.properties 에서 설정이 가능합니다.

저는 8080 포트를 사용하였기에 8080 포트만 허용해주었구요.

아마존 서비스로부터 무료로 받은 고정 아이피에 8080 포트를 붙여서 접속을 시도해봤습니다.

외부에서 이상없이 잘 접속되는것이 확인되네요. 폰으로도 잘 접속되구요.

물론,아직 우분투에 mysql를 설치하지는 않았기에 레프트 메뉴 중 WELCOMEWEB를 누르면 오류가 납니다ㅠㅜ DB에서 데이터를 조회해오는 메뉴라서요..

사실 요즘 실무에서 이런 방식으로 서버에 플젝 올리는 것은 그리 많지는 않을 것 같아요.

소스 코드 하나 수정하였는데 수작업으로 전체를 war로 묶고 서버에 올려서 다시 실행하고.... 개 노가다죠..ㅠ

요즘은 CI 기법이라고 해서 다양한 자동화 배포툴이 실무에서 많이 쓰이고 있으니까요. 제가 지금 들어가있는 사이트도 플젝들이 대부분 git + 젠킨스 연동으로 되어있네요.

이 글에서 다룬 방식으로 스프링부트를 올려야하는 케이스가 있다면

그것은 그 프로젝트가 볼륨이 작은 편이고,

소스가 추후에 수정될 일이 거의 없고,

당장 서버에 플젝을 올려야 하는 상황이 발생했는데 주위에 도와줄 사람이 아무도 없고, 서버 배포,구축 환경 경험이 전무한 이런 상황에서.. 그런데 공교롭게도 이 프로젝트 개발방식이 스프링부트라면....

일단은 이런 방식으로라도 올려서 구동시켜서 그 위기(?)를 넘기면 되지 않을까 싶네요.

모르는 것보단 아는 것이 힘이다 라는 생각으로 도움이 될까 해서 한 번 끄적여봤습니다.

+ Recent posts