Spring Boot - 1

spring boot server

Stack

  • Java 11 ????/

  • Spring Boot

Java version

  • 8

  • 11

  • 17 ✅

JDK

  • openjdk

  • oracle jdk

Story

  • RDB에 넣어둔 데이터들을 가져와서 프론트 단 차트에 필요한 데이터를 보내주는 API 서버

Dev Log

Spring Boot initializer

MySQL 연결

build.gradle
plugins {
    id 'org.springframework.boot' version '3.0.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '1.0.0'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/database?useSSL=false&serverTimezone=Asia/Seoul
    username: username
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true

Trouble Shooting

1. application.properties 파일 정리

개발과 프로덕션 환경에 따라 설정을 분리하면 더욱 관리하기 쉬워집니다.

application.properties

기본 설정 파일에는 공통 설정만 두고, 환경별 설정 파일을 추가로 작성합니다.

properties코드 복사# Common settings
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

# Ensure data.sql is executed
spring.sql.init.mode=always

# Logging
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

application-dev.properties

개발 환경에서 사용할 설정을 추가합니다.

properties코드 복사spring.datasource.url=jdbc:postgresql://localhost:5432/petdb
spring.datasource.username=petuser
spring.datasource.password=petpassword
spring.jpa.hibernate.ddl-auto=update

application-prod.properties

프로덕션 환경에서 사용할 설정을 추가합니다.

properties코드 복사spring.datasource.url=jdbc:postgresql://prod-db:5432/petdb
spring.datasource.username=produser
spring.datasource.password=prodpassword
spring.jpa.hibernate.ddl-auto=validate

2. 프로파일 활성화

Spring Boot가 올바른 프로파일을 사용하도록 애플리케이션 실행 시 프로파일을 지정합니다.

bash코드 복사./gradlew bootRun --args='--spring.profiles.active=dev'

또는, 환경 변수로 설정할 수도 있습니다.

bash코드 복사export SPRING_PROFILES_ACTIVE=dev
./gradlew bootRun

3. 데이터베이스 마이그레이션 도구 사용

Flyway 또는 Liquibase와 같은 데이터베이스 마이그레이션 도구를 사용하면 스키마 관리와 데이터 초기화를 더욱 효율적으로 할 수 있습니다.

Flyway 설정 예제

build.gradle

groovy코드 복사dependencies {
    implementation 'org.flywaydb:flyway-core'
}

application.properties

properties코드 복사spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration

마이그레이션 파일 생성

src/main/resources/db/migration/V1__init.sql

sql코드 복사-- Create tables
CREATE TABLE species (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    description VARCHAR(255)
);

CREATE TABLE disease (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    description VARCHAR(255)
);

데이터 삽입 파일 생성

src/main/resources/db/migration/V2__insert_data.sql

sql코드 복사-- Initialize species
INSERT INTO species (name, description) VALUES ('Dog', 'A common domestic animal');
INSERT INTO species (name, description) VALUES ('Cat', 'A common domestic animal');
INSERT INTO species (name, description) VALUES ('Parrot', 'A colorful bird');
INSERT INTO species (name, description) VALUES ('Rabbit', 'A small mammal');
INSERT INTO species (name, description) VALUES ('Koala', 'A herbivorous marsupial');
INSERT INTO species (name, description) VALUES ('Squirrel', 'A small rodent');

-- Initialize diseases
INSERT INTO disease (name, description) VALUES ('Constipation', 'A common digestive problem');
INSERT INTO disease (name, description) VALUES ('Diabetes', 'A metabolic disease');
INSERT INTO disease (name, description) VALUES ('Skin', 'Various skin conditions');
INSERT INTO disease (name, description) VALUES ('Coat', 'Issues with coat health');
INSERT INTO disease (name, description) VALUES ('Stomach', 'Gastrointestinal issues');
INSERT INTO disease (name, description) VALUES ('Intestines', 'Intestinal issues');
INSERT INTO disease (name, description) VALUES ('Digestion', 'Digestive problems');
INSERT INTO disease (name, description) VALUES ('Tartar', 'Dental plaque');
INSERT INTO disease (name, description) VALUES ('Oral', 'Oral health issues');
INSERT INTO disease (name, description) VALUES ('Bone', 'Bone health issues');
INSERT INTO disease (name, description) VALUES ('Joint', 'Joint problems');

이렇게 하면 Flyway가 데이터베이스 초기화 및 마이그레이션을 관리해 줍니다.

Last updated