인프라 슛슈슛슛

[Infra] heroku로 스프링 프로젝트 빠르고 쉽게 배포해보기

bimppap 2022. 6. 14. 10:32

 

 

시작하기에 앞서

배포가 뭐임?

📌 배포를 알기 전에 잠깐!! 컴파일과 빌드와 배포의 차이는 알고 있나요?
--본인이 번역가라고 해보자--

1. 영문으로된 글을 한글로 번역하는 것은 컴파일이다.

2. 번역한 글을 책으로 엮는 것은 빌드이다.

3. 완성된 책을 고객들이 읽을 수 있도록 서점에 진열하는 것은 배포이다.

4. 1~2번 과정을 하나로 묶어 '빌드한다'고 하기도 한다.

순서대로 보면 컴파일-빌드-배포지만 “빌드하고 배포하죠” 안에서 빌드는 보통 컴파일을 포함하고 있다.

--프로그래밍적 관점으로 보자면...--

1. 컴파일: 사용자가 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 번역하는 일

2. 빌드: 컴파일된 코드를 실제 실행할 수 있는 상태로 만드는 일

3. 배포: 빌드가 완성된 실행 가능한 파일을 사용자가 접근할 수 있는 환경에 배치시키는 일

4. 혹은 컴파일을 포함해 war, jar 등의 실행 가능한 파일을 뽑아내기까지의 과정을 빌드한다고도 함.

InteliJ에서 JAVA로 코딩을 한다고 해보자.

코드를 짜고 나서 Run 버튼을 눌러 실행시킨다 → 컴파일 + 실행

정상적으로 실행되면 이것을 jar(혹은 war) 파일로 뽑는다. → 빌드

jar 파일을 웹서버에 올린다 → 배포

❗ 즉, 배포란 빌드가 완료된 파일을 사용자가 접근할 수 있는 환경에 배치하는 것!

heroku는 뭐임?

📌 잠깐!! 호스팅에 대해서 알고 있나요?

우리가 일반적으로 말하는 서버는 하나의 컴퓨터라고 보면 된다.
이 서버(=컴퓨터)를 사용자들이 편하게 사용하려면!!

  • 24시간 내내 안정적으로 전기를 공급해야 하고
  • 빠르고 안정적인 인터넷 회선을 사용해야 하며
  • 철저한 보안 시스템을 갖추고 있어야 함

근데 일반인인 우리가 컴퓨터를 24시간 내내 돌리고 있으면…

  • 전기세 폭탄!
  • 집 와이파이에 의존적!
  • V3에게 내맡긴 보안!

콩쥐야...조때써...

그래서 우리같은 나약한 일반인들의 컴퓨터를 살리기 위해 등장한 게 호스팅이다.

❗ 호스팅이란, 서버의 전체 혹은 일부를 이용할 수 있도록 임대해 주는 서비스를 말합니다.

가장 대표적인 호스팅 사이트는 당연히 AWS 다.
하지만 AWS 무료 티어는 임대해 주는 서버 사이즈가 작아서!!!!
스프링 프로젝트 같은 용량이 좀 되는 놈들은 넣자마자 터질 수 있다.(실화)

 

때문에 트래픽이나 프로젝트 스케일 걱정을 할 필요가 없다면

무료 호스팅 사이트를 써보자!!!

 

무료 호스팅에는 국내에는 유명한 닷넷, 카페24, 해외에는 netflify, firebase, 기타 등등이 있으나…

 

우리는 heroku를 쓸 거다. 이유는 다음과 같다.

  • 배포가 (정말) 쉽다. 익숙해지면 초기 세팅 초스피드로 할 수 있음 짱
  • 웹 호스팅이라 배포가 덜 힘들다.
  • 널리 알려진 프론트엔드 친화적 Netflify와 다르게 백엔드 친화적임
  • 명령어가 쉬움(딥하게 들어가면 어려운 건 매한가지지만 간단한 배포는 일단 쉬움)

웹 호스팅은 뭔가용? 에 대한 답변

 

하지만 미리 말해두자면 heroku가 짱이라는 건 아니다. 단점 당연히 있음

  • 해외 서비스라 느림(당연함 해외에 있는 컴퓨터를 빌리는 거임)
  • 하루에 최대 16시간만 켜둘수 있음
    (but, 잠자는 시간 대에 설정해 두면 해결)
  • 30분동안 서비스 접속이 없으면 sleep 모드로 들어감. 이후 첫 접속시 시간 소요
    (however, 자동으로 api 호출하는 서비스 있음)
  • 인프라를 깊이 다루지 않음
    (nevertheless, 이렇게 얕게 인프라를 맛보고 시작하는 것도 나쁘지 않다고 생각함)

 

본격적으로 배포를 해보자!

0. Heroku를 사용하기 위한 준비

❗ 준비물 : IDE, 터미널, YOU
깃허브 필요없음!! 깃허브에 후크 걸어서 하는 것도 있긴 한데 제가 바빠서 이건 못해봄 ㅈㅅ

0-1. 여기로 들어가 운영체제 맞는 heroku를 설치합니다.

 

잘 깔렸는지 궁금하면 터미널에 heroku --version 치면 됨

0-2. heroku 회원가입

사이트에서 회원가입만 하면 되니까 PASS

0-3. App 생성

회원가입 하고 나면 대시보드가 나올 텐데 create new app 누르기

차피 연습용이니까 이름은 대충 test-닉네임 하세요

리전은 US랑 UK 밖에 없으니까 US ㄱㄱ

앱 생성하고 Settings 들어가서 Add buildpack 해가지고 gradle 누르고 save 하기

이렇게 뜨면 됨

0-4. Heroku CLI로 로그인

터미널에 일케 적으셈 [APPNAME]은 0-3에서 쓴 App name 쓰면 됨

heroku config:add TZ="Asia/Seoul" --app [APPNAME]

그담에 이렇게 써서 헤로쿠에 로그인하셈(암거나 치면 홈피로 이동됨 놀라지 마셈)

heroku login

 

1. 프로젝트 생성

1-1. 인텔리제이로 스프링 프로젝트 생성

연습용이니까 대충 만드셈요

  • 이름 상관없음
  • 그룹 상관없음
  • 언어 JAVA
  • 타입 Gradle
  • JDK는 8추천이지만 저는 11로 했습니다(그래서 따로 설정해줘야 하는 게 있음 나중에 설명)
  • 패키지 Jar

그 뒤에 뜨는 건 걍 대충 넘겨도 됨

스프링부트 2.5.5 뜨면 그걸로 하고(우리 플젝 버전이 2.5.5임)

없으면 걍 기본으로 가세요 전 2.7.0 이엇음

아 이거 잘 만들어진건가?? 싶으면 인텔리제이 터미널에

./gradlew clean build 라고 치면 됨

대충 BUILD SUCCESFUL 뜨면 된거임

1-2. 프로젝트 세팅

프로젝트가 완료됐으면 인텔리제이 터미널에 git init이라고 치기

그래야 아래처럼 git이 생김

(+) 브랜치 없으면 main으로 하나 파세요 git checkout -b main 치면 됨

이제 디렉토리를 보면 대충 이렇게 뜰거임

주황색 build 파일은 ./gradlew clean build 치면 나오는 거라 없어도 ㄱㅊ

  • build 파일 글자색이 노랗지 않아여
    1. .gitignore 파일에 build/ 추가하고
    2. git rm -r --cached . 실행
    3. git add . 실행
    4. 좀만 기다리면 노랗게 변함
❗ target 디렉토리랑 Procfile 이랑 system.properties를 만들어야 함!! 없으면 이 배포는 죽소

1-3. target 디렉토리

디렉토리 직접 만들 필요 없음!

먼저 build.gradle 맨 아래에 이렇게 적으셈

그 담에 ./gradlew clean build 돌리면 자동으로 생길 거임

(build 할 때 bootJar가 돌아가는데 저 명령어 때문에 target 파일이 생기면서 안에 jar 파일이 생김!)

1-4. Procfile

먼저 src/main/resources에 있는 application.properties를 application.yml로 바꾸고 이렇게 치셈

heroku는 랜덤 포트로 열어주기 때문에 고정시키려면 이래야 함ㅇㅇ

이러고 Prockfile을 루트 디렉토리에서 만들어서 이렇게 치셈

-jar [jar파일명] 에서 jar파일명은 1-3에서 빌드 돌리고 나온 파일명 쓰면 됨

1-5. system.properties

heroku는 기본적으로 자바8로 돌아가서 우리가 버전 설정을 해줘야 함ㅇㅇ

루트 디렉토리에 파일 만들고 이렇게 적으면 됨

 

1-6. 확인용 API 만들기

build.gradle 에서 dependencies에 아래 코드 추가

implementation 'org.springframework.boot:spring-boot-starter-web

그 담에 배포한 다음에 잘 나오는지 확인하게 간단한 API 구현하면 됨

구현하고 애플리케이션 Run 시키면 로컬 서버에서 작동하는지 확인할 수 있음

여기까지 다 됐으면 커밋하면 됨(그 전에 조금씩 커밋했어도 ㄱㅊ)

2. 프로젝트 배포(드디어!!!)

2-1. heroku 서버와 연결하기

인텔리제이 터미널에 heroku git:remote -a <app-name> 라고 쳐서

님이 0-3에서 만든 헤로쿠 원격 저장소와 연결시키면 됨

그럼 git remote -v 라고 쳤을 때 이렇게 뜰거임(연결된 원격저장소 목록 불러오는 명령어)

오리진은 제가 깃헙에도 연결한 거라 절케 뜬거고 헤로쿠 어쩌구만 뜨면 됨

  • Q. 헤로쿠 원격저장의 저긴 뭔 주소죠
  • A. 만든 앱 Settings에 들어가면 나오는 info에 걸린 깃 url임

2-2. 진짜진짜 배포하기

마음의 준비가 됐으면 git push heroku 를 하면 됩니다.

이제 실패가 뜨지 않길 기도메타를 하면서 결과를 기다리면 됩니다

무사히 배포가 완료되면 대충 이런 식으로 뜹니다(와!!)

헤로쿠 사이트로 가서 Activity를 클릭하면 빌드가 성사했다는 걸 보여줍니다

저 페이지의 오른쪽 상단을 보면 Open app이 보이죠?

저걸 누르면 우리의 플젝이 배포된 사이트로 이동합니다..

🎉 축하합니다 heroku로 첫 배포를 성공했습니다!!!

배포 후기

배포가 처음인 분들도 있고 아닌 분들도 있을테죠…

처음인 분들에게 좋은 경험이 되길 바라는 마음으로 작성했습니다.

잘못된 부분이나 수정할 부분은 댓글로 편히 남겨주세요.

감사합니다.

 

참고링크

https://hsik0225.github.io/heroku/2021/12/13/Spring-Boot-Application-배포/

https://hayden-archive.tistory.com/465

https://devcenter.heroku.com/articles/getting-started-with-gradle-on-heroku?singlepage=true