03. Bean ๋“ฑ๋ก (JAVA)

JAVA Class ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Bean ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ

1๏ธโƒฃ ย src/main/java

โœ”๏ธ Bean ๋“ฑ๋ก ์‹ค์Šต์„ ์ง„ํ–‰ํ•  class ์ •๋ณด

2๏ธโƒฃ ย BeanClass.java

โœ”๏ธ Bean ์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด Class ์ƒ๋‹จ์— @Configuration ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. (ํ•ด๋‹น ์ž๋ฐ” ํŒŒ์ผ์ด Bean ๋“ฑ๋ก์„ ์œ„ํ•œ ํŒŒ์ผ์ž„์„ ์•Œ๋ฆฌ๋Š” ๊ฒƒ)

package config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanClass {

}
  1. Bean ๐Ÿ›’ ์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด @Bean ์„ ์ ์–ด๋„ฃ์–ด์•ผ ํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, ๋ฉ”์†Œ๋“œ๋ช…์ด ํ•ด๋‹น Bean ์˜ name ์ด ๋œ๋‹ค.

  2. Bean ๐Ÿฅ‘ ์— name์„ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ๋ช…(avoavo)์ด ์•„๋‹Œ name(avocado) ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

@Configuration
public class BeanClass {

	@Bean
	public Cart cart() {
		return new Cart();
	}

	@Bean(name="avocado")
	public Avocado avoavo() {
		return new Avocado();
	}

}
  1. Bean ์„ ๋“ฑ๋กํ–ˆ๋‹ค๋ฉด main ์—์„œ (1) Configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ , (2) @Bean ์ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ฐพ์•„์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
public class Main {

	public static void main(String[] args) {

		//(1)
		AnnotationConfigApplicationContext atx = new AnnotationConfigApplicationContext(BeanClass.class);

		//(2)
		Cart cart = atx.getBean("cart", Cart.class);

	}

}

๐Ÿ’ก @Configuration ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ Bean ์ด ์ƒ์„ฑ๋˜๋ฉฐ, getBean() ๋ฉ”์†Œ๋“œ๋Š” ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…์„ ํ•œ๋‹ค. ๋˜ํ•œ Bean ์€ Singleton ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

3๏ธโƒฃ ย @lazy

โœ”๏ธ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ฌด๋Ÿฐ ์„ค์ •์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด Configuration ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋งŒ, @Lazy ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด getBean() ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ•  ๋•Œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

	@Bean(name="avocado")
	@Lazy
	public Avocado avoavo() {
		return new Avocado();
	}

4๏ธโƒฃ ย @scope

โœ”๏ธ @scope(โ€œprototypeโ€) ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ๊ธฐ๋ฅผ getBean() ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœํ•  ๋•Œ๋กœ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์œผ๋ฉด์„œ Singleton ์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

	@Bean
	@Scope("prototype")
	public Jumeokbap jumeokbap() {
		return new Jumeokbap();
	}

5๏ธโƒฃ ย @PostConstruct

โœ”๏ธ init-method ์™€ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ, ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์„ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

โœ”๏ธ ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์ด๋ž€ ์Šคํ”„๋ง ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ , ๋นˆ์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งํ•œ๋‹ค.

@Controller
public class BasicItemController {

	@PostConstruct
    public void init() {
        itemRepository.save(new Item("itemA", 10000, 10));
        itemRepository.save(new Item("itemB", 30000, 30));
    }

}

6๏ธโƒฃ ย @PreDestroy

  • destroy-method ์™€ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ, ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋นˆ์ด ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค.
@Controller
public class BasicItemController {

	@PreDestroy
    public void init() {
		itemRepository.clear();
    }

}