programing

SQL 스크립트를 실행하고 애플리케이션 부팅 시 데이터를 얻는 방법

cafebook 2023. 4. 3. 21:43
반응형

SQL 스크립트를 실행하고 애플리케이션 부팅 시 데이터를 얻는 방법

Spring Boot 어플리케이션을 개발 중입니다.현재 일부 구성은 하드 코딩되어 있습니다(Hystrix 속성 등).

따라서 어플리케이션 부팅 시 또는 그 직후에 이러한 설정을 취득하고 싶습니다.

Spring Boot을 사용하여 할 수 있습니까?부팅 시 SQL 스크립트를 실행하여 데이터를 가져오는 것을 의미합니다.

응용 프로그램에 속성/구성 검색 및 저장 방법

MyBatis와 Oracle DB를 사용하고 있습니다.

" " " " " " " " 를 로드합니다.data.sql "/"/"data-${platform}.sql.

단, 스크립트는 시작할 때마다 로드되기 때문에 (적어도 실가동 시에는) 처음부터 다시 삽입하지 않고 데이터베이스에 이미 존재하는 값만 갖는 것이 더 타당하다고 생각합니다.저는 개인적으로 메모리 데이터베이스를 사용할 때 테스트/개발 목적으로만 데이터베이스 초기화를 사용했습니다.단, 이는 Spring-Boot에서 제공하는 기능입니다.

소스: spring-boot-how-to-foot-initialization:

Spring JDBC에는 Data Source 이니셜라이저 기능이 있습니다.Spring Boot은 기본적으로 이 기능을 활성화하고 표준 위치 schema.sql 및 data.sql(클래스 경로 루트)에서 SQL을 로드합니다.또한 Spring Boot은 schema-${platform.sql 및 data-${platform.sql 파일(있는 경우)을 로드합니다.

src/main/data-backets/data-backets.sql:

insert into...
insert into...
  • 은 다음과 같이 할 수 .spring.datasource.platform=oracle.
  • 할 수 .「 SQL 」 。spring.datasource.data=myscript.sql.
  • ★★★★★★와 함께data.sqlschema.sql)data.sql를 참조해 주세요.
  • 데이터에 "업데이트 또는 삽입" 논리를 사용할 수도 있습니다.sql: oracle sql: update(존재하는 경우)

가 있었던 은 에에과 what what what를 사용한 것이다.DataSourceInitializer:

@Bean
public DataSourceInitializer dataSourceInitializer(@Qualifier("dataSource") final DataSource dataSource) {
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
    resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));
    DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
    dataSourceInitializer.setDataSource(dataSource);
    dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
    return dataSourceInitializer;
}

초기화 중에 데이터베이스를 설정하고 파기 중에 데이터베이스를 정리하는 데 사용됩니다.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/datasource/init/DataSourceInitializer.html

시작 후 sql 스크립트에서 데이터를 로드하려면 ResourceDatabasePopulator 클래스 개체를 다음과 같이 사용합니다.

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;

import javax.sql.DataSource;

@Component
public class InitializeData {

    @Autowired
    private DataSource dataSource;

    @EventListener(ApplicationReadyEvent.class)
    public void loadData() {
            ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(false, false, "UTF-8", new ClassPathResource("data.sql"));
        resourceDatabasePopulator.execute(dataSource);
    }
}

sql 파일에서 데이터를 쉽게 로드할 수 있고 sql 파일 내에서 잘못된 sql 문이 무시되기 때문에 걱정하지 않습니다.

비즈니스 로직을 기반으로 데이터를 삽입하려면 이벤트 리스너를 사용하는 것이 좋습니다.따라서 기본적으로 응용 프로그램 부팅 시 @EventListener 메서드로 주석이 붙어 있는 "OnApplicationEvent"가 자동으로 호출됩니다.

또한 데이터를 가져와야 하는 경우와 마찬가지로 저장소 개체를 사용하여 데이터를 가져오기만 하면 됩니다.

예를 들어 다음과 같습니다.

@Component
public class OnApplicationStartUp {

   @Autowired
   private ServiceRepository repository;


   @EventListener
   public void onApplicationEvent(ContextRefreshedEvent event) {

       //Write your business logic here.
       if (repository.findAll().size() <= 0) {
           preloadData();
       }else{
           fetchData();
       }
   }

    private void preloadData() {

       List<Service> services = new ArrayList<>();
       Service someService= new Service("name", "type");
       services.add(someService);
       ...
       ...
       repository.saveAll(services);
   }
}

application.properties 파일에서 가져오면 Environment 클래스를 사용할 수 있습니다.이런 거죠.

Autowired
private Environment environment;
...
environment.getProperty("propertyName")

이렇게 해서 얻을.@PropertySource(name = "myProperties", value = "example.properties")

정의한 속성 파일에서 특정 값을 가져오려면 @Value 주석을 사용해야 합니다.

@Value("${propertyNameInYourPropertFile}")
private String url;

그리고 어플리케이션이 막 시작되었을 때 무언가를 시작하고 싶다면 메서드 전에 이것을 사용할 수 있습니다.

@EventListener(ApplicationReadyEvent.class)

단, @Service 또는 @Component Annotation을 사용해야 합니다.이 경우 Class에는 메서드가 있습니다.

네, 이거 쓰셔도 돼요.

example.properties:

url=yourValue
userName=yourDBUserName
password=yourDBPassword

클래스 예:

@Service
@PropertySource(name = "myProperties", value = "example.properties")
public class Start{

    @Value("${url}")
    private String url;

    @Value("${userName}")
    private String userName;

    @Value("${password}")
    private String password;


    //Run this method when application started
    @EventListener(ApplicationReadyEvent.class)
    public ResultSet getConnection()
    {

        //Connect to Database
        Connection connection = null;
        String QUERY="your sql query";
        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            connection = DriverManager.getConnection(url, userName, password );
        } catch (SQLException e) {
        }


        //Run your query
        Statement stmt = null;
        try {
            stmt = connection.createStatement();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        ResultSet rs = null;
        try {
            rs = stmt.executeQuery(QUERY);
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

        return rs;
    }

}
  1. Global Bean 합니다.
    파일: @Scope(scopeName = Web Application Context)._SCOPE_APPLICATION)
    이 Bean은 Bean 초기화 중에 데이터베이스 테이블에서 데이터를 가져오는(구성 속성 유지 관리) 업무를 담당합니다.

  2. @PostConstructure @ @ @ @ @ @ @ @ @ 。
    이 메서드는 데이터베이스 테이블에서 구성 파라미터를 가져오는 로직을 가집니다.

  3. 를 들어 네이티브됩니다.
    는, 같은 애플리케이션내의 다른 콘텍스트의 모든 콩에 사용할 수 있습니다.

「Configuration Properties(설정 속성)」를 참조해 주세요.

★★★

Commons Configuration 도 : Apache Commons Database Configuration <--
메모: 캐시를 지원하지 않습니다.그러나 데이터베이스 구성 속성은 응용 프로그램 시작 시 한 번만 로드해야 하므로 캐싱이 필요하지 않습니다.

★★★

Trandational Old way : Property Place Holder Configr : 프로퍼티 플레이스 홀더 설정.
이 구현에는 구성 속성을 유지하는 데이터베이스 테이블에서 데이터를 가져오는 논리가 있어야 합니다.

스프링 부트 시 JDBC를 사용하여 데이터베이스 초기화(schema.sql 및 data.sql 실행)

주의: 다음 절차를 따르십시오.

  1. 샘플 프로젝트 pom.xml을 만듭니다(사용자의 버전에 따라 편집).

             <?xml version="1.0" encoding="UTF-8"?>
             <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
                 <modelVersion>4.0.0</modelVersion>
                 <parent>
                     <groupId>org.springframework.boot</groupId>
                     <artifactId>spring-boot-starter-parent</artifactId>
                     <version>3.0.1</version>
                     <relativePath /> <!-- lookup parent from repository -->
                 </parent>
                 <groupId>com.example</groupId>
                 <artifactId>Init_Sql_Script</artifactId>
                 <version>0.0.1-SNAPSHOT</version>
                 <name>Init_Sql_Script</name>
                 <description>Initialize a Database Using Basic SQL Scripts</description>
                 <properties>
                     <java.version>17</java.version>
                 </properties>
                 <dependencies>
    
                     <dependency>
                         <groupId>org.springframework.boot</groupId>
                         <artifactId>spring-boot-starter-jdbc</artifactId>
                     </dependency>
    
                     <dependency>
                         <groupId>org.springframework.boot</groupId>
                         <artifactId>spring-boot-starter-web</artifactId>
                     </dependency>
    
                     <dependency>
                         <groupId>mysql</groupId>
                         <artifactId>mysql-connector-java</artifactId>
                         <scope>runtime</scope>
                     </dependency>
    
                     <dependency>
                         <groupId>org.springframework.boot</groupId>
                         <artifactId>spring-boot-starter-test</artifactId>
                         <scope>test</scope>
                     </dependency>
                 </dependencies>
    
                 <build>
                     <plugins>
                         <plugin>
                             <groupId>org.springframework.boot</groupId>
                             <artifactId>spring-boot-maven-plugin</artifactId>
                         </plugin>
                     </plugins>
                 </build>
    
             </project>
    
  2. 응용 프로그램 속성 및 DB에 직원과 같은 새 DB 이름 만들기

            # connection code for spring boot to your DB
            spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
            spring.datasource.url=jdbc:mysql://localhost:3306/employee
            spring.datasource.username=Hari
            spring.datasource.password=1998
    
            spring.jpa.hibernate.ddl-auto=none
    
            #--- control the sql db initialization (from schema.sql and data.sql)---
            spring. SQL.init.mode=always
    
    
            #---if any error it skips the script and executes the next script----
            #spring.sql.init.continue-on-error=true
    
  3. 리소스 폴더에 두 개의 SQL 파일(schema.sql-create table 쿼리와 data.sql-insert 쿼리)을 생성합니다.

  4. db를 체크한 후 어플리케이션을 실행합니다.해 보세요.

나에게도 잘 먹혀들었으면 좋겠다.

언급URL : https://stackoverflow.com/questions/39280340/how-to-run-sql-scripts-and-get-data-on-application-startup

반응형