๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] Bean, Component ๋ณธ๋ฌธ

โญ ์Šคํ”„๋ง ๋นˆ(Spring Bean)

  • Spring IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด
  • Class๋ฅผ ์ƒ์„ฑํ•˜๊ณ  new ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•œ ํ›„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  Spring์ด ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด
  • ์ฆ‰, new ์—ฐ์‚ฐ์ž๋กœ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ๊ทธ ๊ฐ์ฒด๋Š” Bean ์ด ์•„๋‹ˆ๋ฉฐ ApplicationContext.getBean()์œผ๋กœ ์–ป์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • Spring์—์„œ์˜ ๋นˆ์€ ApplicationContext๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด, ์ฆ‰ ApplicationContext๊ฐ€ ๋งŒ๋“ค์–ด์„œ ๊ทธ ์•ˆ์— ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ @Component, @Service, @Repository, @Controller, @Configuration ๋“ฑ๋“ฑ ์ด๋Ÿฌํ•œ Bean ๋“ค์€ ์–ด๋–ป๊ฒŒ ๋“ฑ๋กํ• ๊นŒ์š”?

๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” 2๊ฐ€์ง€ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

โญSpring IoC Container์— Bean์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. @Component , @ComponentScan ์‚ฌ์šฉ
  2. ๋นˆ ์„ค์ • ํŒŒ์ผ์— ์ง์ ‘ ๋นˆ์„ ๋“ฑ๋ก

 

1. @Component , @ComponentScan ์‚ฌ์šฉ

 

  • @Component
    • @component๋Š” ํด๋ž˜์Šค์— ๋ถ™์–ด์„œ ํด๋ž˜์Šค๋ฅผ custom bean(๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ๋นˆ)์œผ๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
    • ์‹ค์ œ๋กœ Bean์œผ๋กœ ๋“ฑ๋กํ•  ํด๋ž˜์Šค ์œ„์— ๋ถ™์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ @ComponentScan์ด base package์—์„œ๋ถ€ํ„ฐ ๋ชจ๋“  @Component๋ฅผ ๊ฒ€์ƒ‰ํ•œํ›„, ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ํ•„์š”ํ•œ๊ณณ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฃผ์ž…์„ ํ•ด์ค๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ

 

์˜ˆ์‹œ์—๋Š” Spring์—๊ฒŒ Controller์ž„์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด @Controller์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

 

@Controller Annotation์˜ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด @Component Annotation์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Spring์€ @Component Annotation์„ ํ†ตํ•ด ํ•ด๋‹น Controller์„ Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

 

 

  • @ComponentScan 
    • ComponentScan์€ ์šฐ๋ฆฌ๊ฐ€ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์„ค์ •ํ•œ Bean ๋“ค์„ ์ฐพ์•„์„œ Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
    • @ComponentScan์€ ํ•ด๋‹น ์• ๋„ˆํ…Œ์ด์…˜์ด ์ž‘์„ฑ๋œ ํŒจํ‚ค์ง€ ์ดํ•˜์˜ ํด๋ž˜์Šค๋“ค์„ ์ˆœํšŒํ•˜๋ฉด Bean ๋“ฑ๋กํ•  ๊ฐ์ฒด๋“ค์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

 

Spring Boot ํ”„๋กœ์ ํŠธ์—์„œ๋Š” @SpringBootApplication์ด @ComponentScan์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ @ComponentScan Annotation์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

 

SpringBoot ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด

 

 

HelloApplication ํด๋ž˜์Šค ์œ„์— @SpringBootApplication Annotation์ด ๋ถ™์–ด์žˆ๋Š”๋ฐ ์ด ์†Œ์Šค๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด

 

 

@ComponentScan ์„ ์ฐพ์„์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” @SpringBootApplication์€ ๋‚ด๋ถ€์ ์œผ๋กœ @ComponentScan์„ ๋“ค๊ณ  ์žˆ์Œ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.  @ComponentScan์€ @ComponentScan Annotation์ด ๋ถ™์€ ํ•ด๋‹น ํŒจํ‚ค์ง€์—์„œ๋ถ€ํ„ฐ ๋ชจ๋“  ํ•˜์œ„ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ํ›‘์–ด๋ณด๋ฉฐ @Component ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ฐพ์€ ํ›„ Spring IoC ์ปจํ…Œ์ด๋„ˆ์— Bean์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

 

 

2. ๋นˆ ์„ค์ • ํŒŒ์ผ์— ์ง์ ‘ ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•

 

@Component Annotation์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ง๊ณ ๋„ XML๊ณผ ์ž๋ฐ” ์„ค์ • ํŒŒ์ผ์—์„œ ์ง์ ‘ Bean์„ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


์ž๋ฐ” ์„ค์ • ํŒŒ์ผ์€ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ XMLํŒŒ์ผ์„ ๋Œ€์ฒดํ•˜๋Š” Bean ์„ค์ • ํŒŒ์ผ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” @Configuration Annotation์„ ํด๋ž˜์Šค ์œ„์— ๋ถ™์ด๊ณ  ๋ฉ”์„œ๋“œ ์œ„์˜ @Bean Annotaion์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ Bean์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

* @Configuration

  • "์ด ํด๋ž˜์Šค๋Š” ๊ฐ์ข… ๋นˆ ์„ค์ •์„ ๋‹ด๊ณ  ์žˆ๋‹ค"
  • @SpringBootApplication์ด ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ†ตํ•ด @Configuration์„ ์ฐพ์•„๋‚ธ๋‹ค.
  • ์•ˆ์˜ ๋นˆ ์„ค์ •(๋ฉ”์†Œ๋“œ)๋ฅผ ์ฝ์–ด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ๋‹ค.
  • ํ•„์š”ํ•œ ๊ณณ์— ์ฃผ์ž…ํ•œ๋‹ค.
  • ๋˜๋Š” ๊ฐ์ข… ์Šคํ”„๋ง ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์— ํ•จ๊ป˜ ํ™œ์šฉํ•œ๋‹ค.

 

์˜ˆ์‹œ

 

๊ทธ๋Ÿผ return ๋˜๋Š” PageController() ๊ฐ์ฒด๊ฐ€ IoC ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

 

 

@Bean ๊ณผ @Component์˜ ์ฐจ์ด

์Šคํ”„๋ง์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ @Bean ๊ณผ @Component ์ด ๋น„์Šทํ•œ๊ฒƒ๊ฐ™์•„ ์ฐจ์ด์ ์„ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

@Bean

  • @Bean์˜ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปจํŠธ๋กค์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋งํ•ด, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค
  • ๋ฉ”์†Œ๋“œ ๋‹จ์œ„์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ํด๋ž˜์Šค์— ๋ถ™์ผ์ˆ˜์žˆ๋Š” @Component์™€ ๋‹ฌ๋ฆฌ @Bean์€ ๋ฉ”์„œ๋“œ์—๋งŒ ๋ถ™์ผ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค.

 

@Component

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•œ ๊ฐ์ฒด ํด๋ž˜์Šค ์ž์ฒด๋ฅผ ๋นˆ ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.
  • @Componet ์–ด๋…ธํ…Œ์ด์…˜์€ ํƒ€์ผ“์€ Type์œผ๋กœ ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ์—ด๊ฑฐํ˜•์— ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

[์ฐธ์กฐ]

  1. https://melonicedlatte.com/2021/07/11/232800.html
  2. https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88Bean%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%83%9D%EC%84%B1-%EC%9B%90%EB%A6%AC
  3. https://mungto.tistory.com/448
  4. https://effectivesquid.tistory.com/entry/Bean-%EA%B3%BC-Component%EC%9D%98-%EC%B0%A8%EC%9D%B4