Spring으로 만든 웹 애플리케이션은 코드만 작성한다고, 또는 IDE에서 실행만 한다고 작성 되는 것은 아닙니다.
.jar
실행 파일로 만들고 실행파일을 서버에서 실행시켜야 진정한 웹 서버가 완성이 됩니다.
애플리케이션을 로컬 환경이 아닌 서버 환경에서 실행 가능하게 하려면 Gradle
이나 Maven
같은 빌드 툴을 이용하여 빌드하는 방법을 알아야 합니다. 기본적으로 여지껏 gradle
을 사용하였기에 gradle
로 빌드를 진행 하겠습니다.
실행파일을 생성하는 방법은 2가지가 존재합니다. 인텔리제이와 같은 IDE를 통하여 만들 수 있고, cmd나 터미널로 환경변수를 활용하여 실행파일을 만들 수 있습니다.
Gradle
을 클릭하여 창을 연다음, Task
-> build
-> bootJar
또는 build
를 실행하면 .jar
실행파일을 생성 할 수 있습니다.bootJar
: 단순히 실행파일을 생성하기만 합니다.build
: :assemble
, :check
와 같은 빌드와 관련된 모든 task들을 실행시킵니다. 또한 PLAIN으로 끝나는 .jar
실행파일을 하나 더 생성합니다.프로젝트
디렉터리에서 cmd
나 터미널
로 실행파일을 생성할 수 있습니다. 프로젝트의 실행 파일 내에서 우클클릭을 누르고.\gradlew bootJar
입력./gradlew build
입력맥의 경우 맥 나름대로의 터미널에서 명령어를 입력하여 실행파일을 생성할 수 있습니다.
생성된 .jar
실행 파일은 프로젝트/build/libs/
디렉터리에 생성됩니다.
만약 bootJar
로 생성하였다면 .jar
실행파일이 하나만 존재하고 build
로 생성하였다면 .jar
파일 하나와 PLAIN.jar
파일 하나로 2개의 실행파일이 존재합니다.
빌드가 성공적으로 이루어진다면 .jar
실행파일이 하나이상 존재할 것입니다.
만들어진 실행파일은 로컬이나 서버에서 실행할 수 있습니다.
프로젝트/build/libs/
디렉터리로 이동하여 터미널이나 cmd를 열고 java -jar 실행파일.jar
를 입력하면 실행파일을 실행하여 웹 애플리케이션을 구동할 수 있습니다.
여지껏 H2 인메모리 데이터베이스를 활용하여 서버 구동마다 초기화된 데이터베이스, 종료마다 모두 삭제를 간편히 수행하여 로컬에서 구현을 했습니다. 하지만 실제 서버에서 구동을 인메모리 방식의 데이터베이스를 사용하면 서버 다운 시 모든 데이터가 삭제 되므로 기존의 디스크에 저장하는 데이터베이스로 바꾸어 서버에 구동시켜야 합니다.
Spring은
프로파일
을 제공하여 간편하게 실행 환경에 맞추어 애플리케이션을 구동할 수 있는 기능을 제공합니다.
기존의 application.yml
파일 외에 application-local.yml
과 application-server.yml
로 추가한다면 각각 local
프로파일과 server
프로파일의 경우로 나뉠 수 있을 것입니다.
local
프로파일 = application.yml
+ application-local.yml
server
프로파일 = application.yml
+ application-server.yml
application.yml
은 실행환경에 상관없이 공통적으로 적용할 수 있는 프로퍼티를 설정하고, application-local
, application-server
는 특정 실행 환경에서만 실행할 수 있는 프로퍼티를 설정합니다.
build.gradle
에서 dependencies
외부 라이브러리에 runtimeOnly 'com.h2database:h2
와 runtimeOnly 'mysql:mysql-connector-java'
를 추가하여 인메모리 데이터베이스와 디스크 데이터베이스를 모두 사용할 수 있도록 합니다.
spring:
h2:
console:
enabled: true
path: /h2
datasource:
url: jdbc:h2:mem:test
jpa:
hibernate:
ddl-auto: create
show-sql: true
properties:
hibernate:
format_sql: true
sql:
init:
data-locations: classpath*:db/h2/data.sql
logging:
level:
org:
springframework:
orm:
jpa: DEBUG
server:
servlet:
encoding:
force-response: true
application-local.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/coffee_order?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: guest
password: guest
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
properties:
hibernate:
format_sql: true
logging:
level:
org:
springframework:
orm:
jpa: DEBUG
server:
servlet:
encoding:
force-response: true
applicatoin-server.yml
application-local.yml
은 프로퍼티로 h2
를 사용하여 인메모리 데이터베이스에 저장하도록 가리키고, application-server.yml
은 프로퍼티로 MySqL를 사용하여 디스크 데이터베이스에 저장하도록 가리킵니다.
.yml
파일 이름으로 프로퍼티를 구분할 수 있으니 실행시 프로파일를 지정하는 방법으로는 cmd나 터미널에서 프로퍼티를 지정할 수 있고, IDE에서 프로파일를 지정할 수 있습니다.
java -jar 실행파일.jar --spring.profiles.active=프로파일
로 실행시 설정할 수 있습니다.Run/Debug Configuration
설정 탭에서 Program arguments
에 --spring.profiles.active=프로파일
를 입력하여 설정할 수 있습니다.Run/Debug Configuration
설정 탭에서 Active profiles
에 프로파일
을 입력하여 설정할 수 있습니다. (인텔리제이 얼티밋 버전만 가능)코드의 변화 없이 프로퍼티만 바꾸어 줘도 저장할 데이터 베이스를 변경할 수 있습니다.
application-local.yml
-> local
프로퍼티를 실행했을 때 결과입니다. 웹상에서 h2 데이터베이스로의 접근이 가능합니다.
application-server.yml
-> server
프로퍼티를 실행했을 때 결과입니다. 웹상에서 h2 데이터베이스로의 접근이 불가능합니다.
대신에 MySQL 데이터베이스에 잘 접근하여 테이블들을 생성하였음을 확인할 수 있습니다.
구현한 애플리케이션을 실행파일로 build도 해보고 실행환경에 따라 다르게 동작하도록 application.yml도 설정하여 코드의 변경 없이 다른 데이터베이스에 저장하도록 프로파일도 지정해 보았습니다. 실제로 빌드하는 것 까지 큰 흐름의 깃발을 꼳은 기분입니다.
private!