[Spring] Bean ๋“ฑ๋ก

์Šคํ”„๋ง์—์„œ ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋นˆ์ƒ์„ฑ ์ „์ฒ˜๋ฆฌ/ํ›„์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

1. ๋นˆ ๋“ฑ๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•

@Bean์„ ํ†ตํ•ด์„œ ๋นˆ์œผ๋กœ ๋“ฑ๋ก ํ•œ๋‹ค.

note: ๋นˆ์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ @ComponentScan์˜ ๋Œ€์ƒ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด ๋ง์ธ ์ฆ‰์Šจ, ComponentScan์˜ ๋Œ€์ƒ์ด ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— @Component @Configuration @Repository @Service ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด, ์Šคํ”„๋ง์ด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Component
public class BeanConfiguration {

    @Bean
    public String hello() {
        return "Hello world";
    }
}

@Bean์„ ํ†ตํ•ด์„œ Hello world๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” hello๋ผ๋Š” ๋นˆ์„ ๋“ฑ๋ก ํ–ˆ๋‹ค. @Bean ํ”„๋กœํผํ‹ฐ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด ๋นˆ ๋„ค์ž„์€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ ๋„ค์ž„์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” hello๋ผ๋Š” ๋นˆ์œผ๋กœ ๋“ฑ๋ก์ด ๋œ๋‹ค.

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    private String hello;  // Stringํƒ€์ž…์˜ hello ๋นˆ์ด ์ฃผ์ž…๋œ๋‹ค.

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(hello);
    }
}

๋นˆ์„ ๋“ฑ๋กํ–ˆ์œผ๋‹ˆ, ๋‹ค์Œ์€ @AutoWired๋ฅผ ํ†ตํ•ด์„œ ๋“ฑ๋ก๋œ ๋นˆ์„ ์‚ฌ์šฉํ•ด๋ณด์ž. ์˜ˆ์ œ ์—์„œ๋Š” ApplicationRunner๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ž‘ํ•  ๋•Œ, run() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

Hello world

์ฝ˜์†”์ฐฝ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฐํžŒ๋‹ค.

2. ๋นˆ ์ƒ์„ฑ ์ „์ฒ˜๋ฆฌ/ํ›„์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. JSR-250 ์–ด๋…ธํ…Œ์ด์…˜ (@PostConstruct, @PreDestroy โ€ฆ ) ์‚ฌ์šฉ
  2. @Bean์˜ ํ”„๋กœํผํ‹ฐ๋กœ (initMethodName, destroyMethodName) ์‚ฌ์šฉ

JSR-250 ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

JSR-250 ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋นˆ์„ ์ƒ์„ฑ, ํ๊ธฐ ์‹œ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

@Service
public class BarService {

    @PostConstruct
    public void init() {
        // BarService ๋นˆ ์ƒ์„ฑ ์ „์— ๋™์ž‘
        System.out.println("Post Init bean");

    }

    @PreDestroy
    public void destroy() {
        // BarService ๋นˆ ํ๊ธฐ ์ „์— ๋™์ž‘
        System.out.println("Pre Destroy bean");

    }
}

BarService๋ฅผ @Service๋กœ ๋“ฑ๋กํ•ด์ฃผ๊ณ , ๋นˆ์˜ ์ƒ์„ฑ ํ›„, ํ๊ธฐ ์ „์— ๋งž๋Š” @PostConstruct ์™€ @PreDestroy ๋ฅผ ํ†ตํ•ด์„œ ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ , ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค. ์‹คํ–‰ํ•  ๋•Œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋นˆ๋“ค์„ ๋“ฑ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

Post Init bean
> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜๋ฉด
Pre Destroy bean

@Bean ํ”„๋กœํผํ‹ฐ initMethodName / destroyMethodName ๋ฅผ ํ†ตํ•œ ๋ฐฉ๋ฒ•

public class Foo {
    public void init() {
        // init logic
        System.out.println("Init Foo");
    }
}

public class Bar {
    public void cleanup() {
        // destory logic
        System.out.println("cleanup Bar");
    }
}

Foo, Bar ํด๋ž˜์Šค์—์„œ ๊ฐ๊ฐ ๋นˆ์˜ ์ดˆ๊ธฐํ™”, ํ๊ธฐ ๊ด€๋ จ ์ž‘์—…์„ ํ•  ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

@Configuration
public class AppConfig {

    @Bean(initMethod = "init")
    public Foo foo() {
        return new Foo();
    }

    @Bean(destroyMethod = "cleanup")
    public Bar bar() {
        return new Bar();
    }
}

๋นˆ์„ ๋“ฑ๋กํ•˜๋ฉด์„œ ํ•ด๋‹น ๋นˆ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์œ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ ๋ฉ”์„œ๋“œ๋ช…์„ ๋„˜๊ธด๋‹ค. ์ธํ…”๋ฆฌJ์—๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ๋ช…์„ ์ž๋™์œผ๋กœ ๋„์›Œ์ค€๋‹ค.

JSR-250 ๊ณผ @Bean ํ”„๋กœํผํ‹ฐ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋ฉด ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

PostConstruct Init bean  // JSR-250
Init Foo // @Bean์˜ ํ”„๋กœํผํ‹ฐ
cleanup Bar // @Bean์˜ ํ”„๋กœํผํ‹ฐ
PreDestroy bean // JSR-250

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, JSR-250์ด ๋จผ์ € ์ดˆ๊ธฐํ™”๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— @Bean์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ทธ ๋‹ค์Œ ๋™์ž‘ ํ•œ๋‹ค.

์—ฐ๊ด€ ํฌ์ŠคํŠธ