Spring Boot CommandLineRunner를 사용하여 초기 처리 실행
10947 단어 spring-bootSpringBootspring자바Kotlin
초기화 처리 작성
Spring Boot에서는 DI 컨테이너에 모든 Bean이 등록된 후 CommandLineRunner 인터페이스를 구현한 Bean이 실행된다. 이것을 이용해, 기동시에 DB에 데이터를 등록하는 등의 초기 처리를 실장할 수 있다.
방법은 간단하고, CommandLineRunner 인터페이스를 구현해, run 메소드내에 실행하고 싶은 처리를 기술한 클래스를 DI 컨테이너에 등록하면 된다. 이 예에서는 @Component을 사용합니다. 아래의 예에서는 개발 환경(Profile = "dev")에서 기동했을 경우에 리포지토리 클래스를 사용해 DB에 초기 데이터를 보존한다.
@Component
@Profile(value = ["dev"]) // 開発環境のプロファイルの場合は実行
class DevDataInitializer(@Autowired private val greetingRepository: GreetingRepository) : CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev!!!"))
}
}
아래의 클래스는 예이므로 처리에 특별한 의미는 없습니다.
리포지토리 클래스
import com.example.springsecuritydemo.domain.Greeting
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface GreetingRepository: JpaRepository<Greeting, Long>
엔티티 클래스
import org.springframework.data.jpa.domain.support.AuditingEntityListener
import javax.persistence.*
@EntityListeners(AuditingEntityListener::class)
@Entity
@Table(name = "greeting")
data class Greeting(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
var id: Long = 0,
@Column(name = "value")
val value: String = ""
)
실행 순서 지정
복수의 CommandLineRunner를 구현한 클래스를 DI 컨테이너에 등록했을 때에, 각 클래스의 실행 순서를 @Order 그리고 지정할 수 있다. 아래와 같이 @Order 의 인수로 실행 순서를 지정한다.
import com.example.springsecuritydemo.domain.Greeting
import com.example.springsecuritydemo.repository.GreetingRepository
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.context.annotation.Profile
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
@Component
@Order(1)
@Profile(value = ["dev"])
class DevDataInitializer(@Autowired private val greetingRepository: GreetingRepository) : CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev!!!"))
}
}
import com.example.springsecuritydemo.domain.Greeting
import com.example.springsecuritydemo.repository.GreetingRepository
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.context.annotation.Profile
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
@Component
@Order(2)
@Profile(value = ["dev"])
class DevDataInitializer2(@Autowired private val greetingRepository: GreetingRepository): CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev2!!!"))
}
}
기동시의 로그를 보면, 지정한 순서로 실행되고 있는 것을 알 수 있다.
Reference
이 문제에 관하여(Spring Boot CommandLineRunner를 사용하여 초기 처리 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fanfanta/items/7a3a343b2d5b0c2e7337
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@Component
@Profile(value = ["dev"]) // 開発環境のプロファイルの場合は実行
class DevDataInitializer(@Autowired private val greetingRepository: GreetingRepository) : CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev!!!"))
}
}
import com.example.springsecuritydemo.domain.Greeting
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface GreetingRepository: JpaRepository<Greeting, Long>
import org.springframework.data.jpa.domain.support.AuditingEntityListener
import javax.persistence.*
@EntityListeners(AuditingEntityListener::class)
@Entity
@Table(name = "greeting")
data class Greeting(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
var id: Long = 0,
@Column(name = "value")
val value: String = ""
)
복수의 CommandLineRunner를 구현한 클래스를 DI 컨테이너에 등록했을 때에, 각 클래스의 실행 순서를 @Order 그리고 지정할 수 있다. 아래와 같이 @Order 의 인수로 실행 순서를 지정한다.
import com.example.springsecuritydemo.domain.Greeting
import com.example.springsecuritydemo.repository.GreetingRepository
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.context.annotation.Profile
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
@Component
@Order(1)
@Profile(value = ["dev"])
class DevDataInitializer(@Autowired private val greetingRepository: GreetingRepository) : CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev!!!"))
}
}
import com.example.springsecuritydemo.domain.Greeting
import com.example.springsecuritydemo.repository.GreetingRepository
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.context.annotation.Profile
import org.springframework.core.annotation.Order
import org.springframework.stereotype.Component
@Component
@Order(2)
@Profile(value = ["dev"])
class DevDataInitializer2(@Autowired private val greetingRepository: GreetingRepository): CommandLineRunner {
private val logger = LoggerFactory.getLogger(javaClass)
override fun run(vararg args: String?) {
logger.info("${this.javaClass.simpleName} Run")
greetingRepository.save(Greeting(value = "Dev2!!!"))
}
}
기동시의 로그를 보면, 지정한 순서로 실행되고 있는 것을 알 수 있다.
Reference
이 문제에 관하여(Spring Boot CommandLineRunner를 사용하여 초기 처리 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fanfanta/items/7a3a343b2d5b0c2e7337텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)