티스토리 뷰

프레임워크/Spring

[Spring]Bean 생명주기 콜백

꼬마우뇽이(원종운) 2022. 3. 19. 21:56

Bean 생명 주기 콜백

Bean은 Bean Scope에 따라 생성되고, 소멸됩니다. 목적에 따라 Bean이 생성될 때와 소멸되기 직전에 특정한 로직을 수행하여야 하는 일이 있을 수 있습니다. 그렇기 때문에 Spring은 다양한 방법으로 Bean의 생명 주기에 대한 콜백을 지정할 수 있는 방법을 크게 3가지 제공합니다.

 

1. 인터페이스 사용

Spring에서 초창기에 제공했던 방법으로 아래와 같은 단점을 가지고 있으므로 지금은 추천되지 않는 방법입니다.

 

Bean이 생성되고 Bean 기본 설정이 끝난 후 호출될 콜백을 설정하고 싶다면 InitializingBean 인터페이스, Bean이 소멸되기 직전에 호출될 콜백을 설정하고 싶다면 DisposableBean 인터페이스를 상속받아 메서드를 구현하시면 됩니다.

 

단점

1. Spring에서 제공해주는 인터페이스이므로, 해당 Bean이 Spring에 종속적입니다.

2. 인터페이스 상속이 강제되고, 그에 따라 메서드 명 또한 강제됩니다.

3. 외부 라이브러리와 같이 수정이 불가능한 코드에는 적용할 수 없습니다.

 

사용 방법

data class Student(val age: Int, val name: String) : InitializingBean, DisposableBean {

    override fun afterPropertiesSet() {
        println("Student Bean 생성 후 기본 설정이 완료되었습니다.")
    }

    override fun destroy() {
        println("Student Bean 소멸 되기 직전입니다.")
    }
}

@Configuration
class Config {

    @Bean
    fun student() = Student(14, "JongWoon")
}

fun main(args: Array<String>) {
    val ac = AnnotationConfigApplicationContext(Config::class.java)
    val student = ac.getBean(Student::class.java)
    println(student)
    ac.close() 
}

 

인터페이스 메서드 설명
InitializingBean afterPropertiesSet Bean이 생성되고 Bean 설정이 끝난 후 호출됩니다.
DisposableBean destroy Bean이 소멸되기 직전에 호출됩니다.

 

결과

Student Bean 생성 후 기본 설정이 완료되었습니다.
Student(age=14, name=JongWoon)
Student Bean 소멸 되기 직전입니다.

 

2. 애너테이션 사용

Spring에서 권장하는 최신 방법으로 사용자 작성한 메서드 위에 받고자 하는 콜백에 해당하는 애너테이션을 명시하는 방법입니다.

 

Bean이 생성되고 Bean 기본 설정이 끝난 후 호출될 콜백을 설정하고 싶다면 콜백 메서드에 @PostConstruct 애너테이션, Bean이 소멸되기 직전에 호출될 콜백을 설정하고 싶다면 콜백 메서드에 @PreDestroy 애너테이션을 붙이면 됩니다.

 

 

장점

1. Spring에서 제공하는 애너테이션이 아닌 JSR-250 자바 표준 애너테이션이므로 Spring에 종속적이지 않습니다.

2. 애너테이션 하나만 붙이면 간편하게 사용할 수 있습니다.

3. Spring에서 권장하는 방법입니다.

 

단점

1. 인터페이스와 마찬가지로 외부 라이브러리와 같이 수정이 불가능한 코드에는 적용할 수 없습니다.

 

사용 방법

data class Student(val age: Int, val name: String) {

    @PostConstruct
    fun init() {
        println("Student Bean 생성 후 기본 설정이 완료되었습니다.")
    }

    @PreDestroy
    fun close() {
        println("Student Bean 소멸 되기 직전입니다.")
    }
}

@Configuration
class Config {

    @Bean
    fun student() = Student(14, "JongWoon")
}

fun main(args: Array<String>) {
    val ac = AnnotationConfigApplicationContext(Config::class.java)
    val student = ac.getBean(Student::class.java)
    println(student)
    ac.close()
}
애너테이션 설명
PostConstruct Bean이 생성되고 Bean 설정이 끝난 후 호출됩니다.
PreDestroy Bean이 소멸되기 직전에 호출됩니다.

 

결과

Student Bean 생성 후 기본 설정이 완료되었습니다.
Student(age=14, name=JongWoon)
Student Bean 소멸 되기 직전입니다.

 

3. 사용자 메서드 사용

Bean 등록을 위하여 Bean 애너테이션을 사용할 때, Bean 애너테이션의 속성으로 Bean이 생성되고 기본 설정이 끝난 후 호출할 콜백 메서드의 이름, Bean이 소멸되기 직전에 호출될 콜백 메서드 이름을 지정하여 줄 수 있습니다.

 

Bean이 생성되고 Bean 기본 설정이 끝난 후호출될 콜백을설정하고 싶다면 initMethod 속성에 해당 콜백 메서드 이름을, Bean이 소멸되기 직전에 호출될 콜백을 설정하고 싶다면 destroyMethod 속성에 해당 콜백 메서드 이름을 명시하면 됩니다.

장점

1. 외부 라이브러리와 같이 수정이 불가능한 코드에도 적용할 수 있습니다.

 

사용 방법

data class Student(val age: Int, val name: String) {
    // 외부 라이브러리라고 가정
    fun init() {
        println("Student Bean 생성 후 기본 설정이 완료되었습니다.")
    }

    fun close() {
        println("Student Bean 소멸 되기 직전입니다.")
    }
}

@Configuration
class Config {

    @Bean(initMethod = "init", destroyMethod = "close")
    fun student() = Student(14, "JongWoon")
}

fun main(args: Array<String>) {
    val ac = AnnotationConfigApplicationContext(Config::class.java)
    val student = ac.getBean(Student::class.java)
    println(student)
    ac.close()
}
속성 기본값 설명
initMethod "" Bean이 생성되고 Bean 설정이 끝난 후 호출될 Bean 내의 메서드 명
destroyMethod (inferred) Bean이 소멸되기 직전에 호출될 Bean 내의 메서드 명
(기본 값일 경우, 종료 메서드 관습을 기반으로 추론합니다. close, shutdown, ...)

추론 기능을 사용하기 싫다면, "" 을 사용하면 됩니다.

 

결과

Student Bean 생성 후 기본 설정이 완료되었습니다.
Student(age=14, name=JongWoon)
Student Bean 소멸 되기 직전입니다.

 

'프레임워크 > Spring' 카테고리의 다른 글

Reactive Streams란 무엇인가 ?  (0) 2022.07.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함