[57일차] 애플리케이션 Build

유태형·2022년 7월 19일
0

코드스테이츠

목록 보기
57/77

오늘의 목표

  1. build
  2. 프로파일



내용

build

Spring으로 만든 웹 애플리케이션은 코드만 작성한다고, 또는 IDE에서 실행만 한다고 작성 되는 것은 아닙니다.

.jar실행 파일로 만들고 실행파일을 서버에서 실행시켜야 진정한 웹 서버가 완성이 됩니다.

애플리케이션을 로컬 환경이 아닌 서버 환경에서 실행 가능하게 하려면 Gradle이나 Maven같은 빌드 툴을 이용하여 빌드하는 방법을 알아야 합니다. 기본적으로 여지껏 gradle을 사용하였기에 gradle로 빌드를 진행 하겠습니다.



실행파일 생성

실행파일을 생성하는 방법은 2가지가 존재합니다. 인텔리제이와 같은 IDE를 통하여 만들 수 있고, cmd나 터미널로 환경변수를 활용하여 실행파일을 만들 수 있습니다.

  1. IntelliJ의 우측의 Gradle을 클릭하여 창을 연다음, Task -> build -> bootJar 또는 build를 실행하면 .jar실행파일을 생성 할 수 있습니다.
  • bootJar : 단순히 실행파일을 생성하기만 합니다.
  • build : :assemble, :check와 같은 빌드와 관련된 모든 task들을 실행시킵니다. 또한 PLAIN으로 끝나는 .jar 실행파일을 하나 더 생성합니다.
  1. 프로젝트 디렉터리에서 cmd터미널로 실행파일을 생성할 수 있습니다. 프로젝트의 실행 파일 내에서 우클클릭을 누르고
  • 윈도우 터미널로 생성시 : .\gradlew bootJar 입력
  • gitBash로 생성시 : ./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.ymlapplication-server.yml로 추가한다면 각각 local프로파일과 server프로파일의 경우로 나뉠 수 있을 것입니다.

  • local프로파일 = application.yml + application-local.yml
  • server프로파일 = application.yml + application-server.yml

application.yml은 실행환경에 상관없이 공통적으로 적용할 수 있는 프로퍼티를 설정하고, application-local, application-server는 특정 실행 환경에서만 실행할 수 있는 프로퍼티를 설정합니다.



application-프로파일.yml

build.gradle에서 dependencies 외부 라이브러리에 runtimeOnly 'com.h2database:h2runtimeOnly '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에서 프로파일를 지정할 수 있습니다.

  1. cmd나 터미널에서 java -jar 실행파일.jar --spring.profiles.active=프로파일로 실행시 설정할 수 있습니다.

  1. IDE에서 Run/Debug Configuration설정 탭에서 Program arguments--spring.profiles.active=프로파일를 입력하여 설정할 수 있습니다.
  2. IDE에서 Run/Debug Configuration설정 탭에서 Active profiles프로파일을 입력하여 설정할 수 있습니다. (인텔리제이 얼티밋 버전만 가능)

코드의 변화 없이 프로퍼티만 바꾸어 줘도 저장할 데이터 베이스를 변경할 수 있습니다.



결과

application-local.yml -> local프로퍼티를 실행했을 때 결과입니다. 웹상에서 h2 데이터베이스로의 접근이 가능합니다.

application-server.yml -> server프로퍼티를 실행했을 때 결과입니다. 웹상에서 h2 데이터베이스로의 접근이 불가능합니다.

대신에 MySQL 데이터베이스에 잘 접근하여 테이블들을 생성하였음을 확인할 수 있습니다.




후기

구현한 애플리케이션을 실행파일로 build도 해보고 실행환경에 따라 다르게 동작하도록 application.yml도 설정하여 코드의 변경 없이 다른 데이터베이스에 저장하도록 프로파일도 지정해 보았습니다. 실제로 빌드하는 것 까지 큰 흐름의 깃발을 꼳은 기분입니다.




GitHub

private!

profile
오늘도 내일도 화이팅!

0개의 댓글