Spring Boot CommandLineRunner를 사용하여 초기 처리 실행

초기화 처리 작성



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!!!"))
    }
}


기동시의 로그를 보면, 지정한 순서로 실행되고 있는 것을 알 수 있다.

좋은 웹페이지 즐겨찾기