본문 바로가기
PlayGround/AWS 연습

[Project] mini1 - 애플리케이션 실행 전 스크립트 작성

by HJ0216 2023. 10. 6.

이 글은 향로님의 [스프링부트로 웹 서비스 출시하기] 참고하며 프로젝트를 만들며 정리한 글입니다.

 

3) 스프링부트로 웹 서비스 출시하기 - 3. SpringBoot & Handlebars로 화면 만들기

이번 시간엔 SpringBoot & Handlebars로 간단한 화면을 만들 예정입니다. (모든 코드는 Github에 있습니다.) Handlebars는 흔히 사용하시는 Freemarker, Velocity와 같은 서버 템플릿 엔진입니다. JSP는 서버 템플릿

jojoldu.tistory.com

 

 

👉 기본 환경

- Language: Java

- DB: MySQL

- IDE: IntelliJ

 

 

🤔

정보처리기사 실기 시험이 코 앞으로 다가왔기 때문에, 간단하게 SQL 실행 스크립트 예제를 정리해보고자 합니다.

시작 전에 먼저 알아야 할 점은,

 

⭐ 스크립트 기반의 초기화화 Hibernate 기반의 초기화가 함께 사용되는 것은 권장되지 않음 ⭐

 

 

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
spring:
  profiles:
    active: local # 기본 환경 선택
 
# local 환경
---
spring:
  profiles: local
  datasource:
    data: classpath:data-h2.sql # 시작할때 실행시킬 script
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: create-drop
  h2:
    console:
      enabled: true
 
 

저는 application.properties를 사용했지만, 게시글에서는 yml로 작성이 되어있습니다.

그래서 이 application.yml → application.properties로 변경하면,

스프링부트 3.x대 기준으로 동작하지 않을 확률이 높습니다.

 

5년의 시간동안 스프링부트도 변화했기 때문이죠.

 

그래서 우리의 친구 🌎Google과 🤖GPT의 도움을 받아 가장 먼저 properties 파일을 분리하였습니다.

 

- application.properties(전역 설정)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/DB이름?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
spring.datasource.username=USER이름
spring.datasource.password=비밀번호
 
# JPA 설정
spring.jpa.show-sql=true
# true 설정 시, JPA 쿼리문 확인 가능
spring.jpa.hibernate.ddl-auto=create-drop 
# DDL(create, alter, drop) 정의 시, DB의 고유 기능을 사용할 수 있음
spring.jpa.properties.hibernate.format_sql=true
# JPA의 구현체인 Hibernate가 동작하면서, 발생한 SQL의 가독성을 높여줌
 
# .jsp 설정
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
 
# 기본 환경 선택 (local 환경으로 선택)
spring.profiles.active=local 
 
 

spring.profiles

- 어플리케이션 실행시 파라미터로 넘어온게 없으면 active 값을 인식

 

application-local.properties(전역 설정)

- 프로파일에 따라 다른 설정을 사용하도록 하기 위해 별도의 설정 파일을 생성

1
2
3
4
5
6
# local 환경
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=always
 
 

- 공통영역의 값은 각 profile환경에 동일한 설정이 있으면 무시되고, 없으면 공통영역의 설정값이 사용됨

    🚨 그러므로, 공통영역에 설정값을 넣는것에 주의

    - 만약 공통영역에 jpa.hibernate.ddl-auto:create-drop가 있고 운영 profile에 해당 설정값이 없다면 운영환경에서 배포시 모든 테이블이 drop -> create 됨
    - ⭐ 이 때문에 datasource, table 등과 같은 옵션들은 공통영역엔 두지 않고 각 profile마다 별도로 두는것을 추천

 

1. spring.jpa.defer-datasource-initialization=true

스프링의 경우, 내장 데이터베이스(H2, HSQL, Derdy)에 대해서 스크립트 기반의 초기화를 기본적으로 실행하지만, 내장 데이터베이스가 아닌 경우(MySQL 등) 다음 옵션을 활성화(= always) 해야함
외부 데이터베이스와 연결되어 있다면   해당 옵션을 활성화해야 script 파일이 적용됨

Options

    - always: 모든 데이터베이스에 sql script를 동작

    - embedded: embedded(내장) 데이터베이스만 sql 스크립트를 동작

    - never: 모든 데이터베이스에 sql script를 동작시키지 않음

 

⭐ SpringBoot Ver 확인

1
2
3
4
5
6
# Springboot 2.4.x 버전 이전
spring.datasource.initialization-mode
# Springboot 2.5.x 버전 이후
# 'spring.datasource.initialization-mode' Deprecated
spring.sql.init.mode
 
 

 

2. spring.sql.init.mode=always

Spring Boot 애플리케이션에서 데이터베이스 초기화를 설정하는 속성

데이터베이스 초기화 스크립트는 기본적으로 schema.sql 파일과 data.sql 파일을 찾아서 실행

프로젝트의 클래스패스에 위치해야 하며 일반적으로 src/main/resources 디렉토리에 위치

Options

    - always

        - 애플리케이션이 시작될 때 마다 데이터베이스 스키마 초기화 스크립트가 항상 실행

        - 개발 및 테스트 환경에서 주로 사용되며, 애플리케이션을 새로 시작할 때마다 데이터베이스 스키마를 초기화하고 테스트 데이터를 적재하려는 경우에 유용

    - embedded: 데이터베이스가 내장(embedded) 데이터베이스 (예: H2, HSQLDB)인 경우에만 데이터베이스 스키마 초기화를 시도
    - never: 데이터베이스 스키마 초기화를 시도하지 않음, 보통 실제 환경에서 사용

 

 

3. data.sql

스프링부트에서는 데이터베이스 초기 설정을 위해 기본적으로 script(schema.sql, data.sql) 파일을 사용

- schema.sql: 데이터 정의어(DDL) 작성

- data.sql: 데이터 조작어(DML) 작성

 

 

🤹 실행 결과

 

 

+ Project Structure

 

 

 

🔗 소스 코드 

 

GitHub - HJ0216/mini1: SpringBoot+JPA Board Mini Project

SpringBoot+JPA Board Mini Project. Contribute to HJ0216/mini1 development by creating an account on GitHub.

github.com

 

📚 참고 자료

 

Spring Boot 초기 데이터 설정 방법 정리(data.sql, schema.sql)

스프링부트 초기 데이터 설정 방법에 대한 정리 스프링부트에서는 데이터베이스 초기 설정을 위해 기본적으로 script(schema.sql, data.sql) 파일을 사용할 수 있는데요. 관념적으로 데이터 정의어(DDL)

wildeveloperetrain.tistory.com