programing

스프링 부츠: 앱을 시작하지 않고 리퀴베이스 이행 실행

javamemo 2023. 3. 6. 20:36
반응형

스프링 부츠: 앱을 시작하지 않고 리퀴베이스 이행 실행

Spring Boot에서 설명서는 앱 시작 시 마이그레이션을 실행하도록 권장하는 것으로 보입니다.

이것은 괜찮지만, 때때로 앱 부팅 시 제가 신경쓰고 싶지 않은 부작용/의존성이 있을 수 있습니다.그냥 이행을 스스로 실행하고 싶을 뿐입니다.앱을 실행하지 않고 로컬 개발 데이터베이스를 설정하기만 하면 됩니다.

이에 비해 Dropwizard에서는 다음과 같은 앱에 대한 기본 제공 인수를 사용하여 마이그레이션만 실행하는 것이 간단합니다.

java -jar hello-world.jar db migrate helloworld.yml

Spring Boot에 준하는 것이 있습니까?아니면 그냥 쓰러져서 직접 리퀴바제를 달면 되는 건가요?

저는 직접적인 답변에 관심이 있지만 더 높은 수준의 오해도 하고 있습니다.예를 들어, 아직 깨닫지 못한 이유로 스타트업에서 실행하는 이 접근법이 일반적으로 '더 나은' 것이므로, Spring Boot을 통해 디자인 선택으로만 이 방법을 사용하는 것이 좋습니다.

다른 스프링 프로파일을 사용할 수 있습니다.예를 들어 'init'라는 프로파일을 사용하여 'liquibase' 프로파일을 활성화합니다.

application.yml: (디폴트로는 Liquibase를 무효로 합니다)

spring:
  liquibase:
    enabled: false

application-init.yml: (웹 컨테이너를 실행하지 않으므로 시작 후 스프링이 자동으로 닫힙니다.)

spring:
  profiles:
    include: liquibase
  main:
    web-application-type: none

봄철 병yml: (리퀴바아제

spring:
  liquibase:
    enabled: true
    change-log: classpath:/db/changelog/changelog.xml

이 셋업에서는 리키바제를 초기 컨테이너(spring.disc.active=init)로 실행할 수 있지만, 원하는 경우 웹 앱(spring.disc.active=springibase)의 일부로 리키바제를 실행할 수 있습니다.

오래된 질문인 건 알지만, 혹시 다른 사람이 실수하면 도움이 될 수도 있어요.

앱에 대한 명령줄 인수를 정의할 수 있습니다. 이 인수를 사용하여 마이그레이션을 실행할 앱 컨텍스트의 일부만 스핀업할 수 있습니다.

다음은 Kotlin의 예입니다.

import org.springframework.boot.ApplicationContextFactory.ofContextClass
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.boot.runApplication
import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.annotation.Import

@SpringBootApplication
class Application

@Import(DataSourceAutoConfiguration::class, LiquibaseAutoConfiguration::class)
class LiquibaseInit

fun main(args: Array<String>) {
    if (args.contains("dbinit")) {
        SpringApplicationBuilder(LiquibaseInit::class.java)
            .contextFactory(ofContextClass(AnnotationConfigApplicationContext::class.java))
            .run(*args)
        return
    }

    runApplication<Application>(*args)
}

주의: Spring Boot 2.4.0 이전 사용SpringApplicationBuilder#contextClass대신contextFactory.

여기에서는 2개의 클래스가 선언되어 있습니다.Application(메인 앱클래스는@SpringBootApplication주석) 및LiquiBaseInit(가져 있다@DataSourceAutoConfiguration그리고.@LiquibaseAutoConfiguration첫 번째 것은 전체 컨텍스트를 스핀업하고, 두 번째 것은 Liquibase의 이행에 필요한 콩만 스핀업합니다.

에 문자열이 있는지 합니다.dbinit에는 ' 콘텍스트'를 '어플리케이션 콘텍스트는 '어플리케이션 는 '어플리케이션 컨텍스트'입니다.LiquiBaseInit를 누릅니다

이제 다음과 같이 jar 파일을 사용하여 마이그레이션을 실행할 수 있습니다.

java -jar hello-world.jar dbinit

Kubernetes에서 앱을 실행할 예정이라면 제 블로그에서 https://blog.monosoul.dev/2021/12/26/using-liquibase-with-kubernetes/도 확인해 보시기 바랍니다.

답변은 리키베이스 다음에 이어지는 후크를 언급하고 있습니다.이 질문에서는 데이터베이스(아마도 테스트 값 또는 기본값)를 입력하기 위해 사용되었습니다.

@Bean
@DependsOn("liquibase")
public YourBean yourBean() {
    return new YourBean();
}

static class YourBean {

    @PostConstruct
    public void shutdown() {
         // Exit your application here.
         );
    }

}

잘 될 거야.모르겠어요, 아마 액상 베이스 모드에 접속해서 "만들기"만 하면 종료될 거예요.

일반적으로 Spring Boot을 사용하고 있고 모든 것이 설정되어 있는 경우에는 앱 시작 시 마이그레이션을 실행하는 것이 더 쉬울 수 있습니다.그런 다음 앱을 정지하면 됩니다.

그러나 Spring Boot 앱 없이 이행을 실행하고 싶다면 Liquibase Gradle 및 Maven 플러그인을 사용할 수 있습니다.https://github.com/liquibase/liquibase-gradle-plugin

이 경우 플러그인이 데이터베이스에 연결할 수 있도록 애플리케이션 구성 외에 다른 구성 파일에 데이터베이스 자격 증명을 설정해야 합니다.

이를 위해 이행 생성뿐만 아니라 수동으로도 적용할 수 있는 자체 스크립트를 작성했습니다.단, gradle에서만 적용할 수 있습니다.https://github.com/Wissance/SpringUu 를 참조해 주세요.

업데이트를 적용하려면 다음 명령을 사용합니다.

.\gradlew.bat update -PrunList='changesApply'

db 연결을 지정하려면 그라들 섹션 변경 편집적용

툴에 대한 자세한 내용은 다음 문서를 참조하십시오.

https://m-ushakov.medium.com/code-first-with-spring-boot-hibernate-and-liquibase-48f5c9998d95

maven liquibase 플러그인을 설정 및 구성할 수 있습니다.https://docs.liquibase.com/tools-integrations/maven/commands/home.html

스프링 부트 앱 자체를 시작하지 않고 이행을 사용할 수 있습니다.

빌드 아티팩트 또는 이와 유사한 개별 작업의 일부로 설정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/49532668/spring-boot-run-liquibase-migrations-without-starting-app

반응형