๐ŸŒฟSpring

[Spring] SpringBoot์—์„œ์˜ Bean ๊ฐœ๋… & ๋“ฑ๋ก ๋ฐฉ๋ฒ• ์ •๋ฆฌ

์†Œ์˜ ๐Ÿ€ 2025. 2. 17. 01:52

 

๐Ÿ€ ๋“ค์–ด๊ฐ€๋ฉด์„œ

๋จผ์ € ์ฝ์œผ๋ฉด ์ข‹์€ ๊ธ€.
์ด ๊ธ€์—์„œ ์–ธ๊ธ‰ํ•  ์ œ์–ด์˜ ์—ญ์ „(IoC), ์˜์กด์„ฑ ์ฃผ์ž…(DI) ๋“ฑ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

๐Ÿ”Ž ์ฃผ์ œ

Spring Boot์—์„œ ์–ด๋–ป๊ฒŒ Bean์„ ๋“ฑ๋กํ•˜๊ณ  ์‚ฌ์šฉํ• ๊นŒ?

โœ… Bean์˜ ๊ฐœ๋…

Bean์ด๋ž€?

  • ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด

์Šคํ”„๋ง์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์˜์กด ๊ด€๊ณ„๊ฐ€ ๊ด€๋ฆฌ๋˜๊ณ , ํ•„์š” ์—†๋Š” ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋œ๋‹ค.

๐Ÿซ› Bean์˜ ํŠน์ง•

POJO(Plain Old Java Object)

  • ํŠน๋ณ„ํ•œ ๊ทœ์•ฝ์— ์–ฝ๋งค์ด์ง€ ์•Š์€ ์ˆœ์ˆ˜ ์ž๋ฐ” ๊ฐ์ฒด.
  • ์Šคํ”„๋ง Bean์€ ๋Œ€๊ฐœ POJO ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜์—ฌ, ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ

  • Bean์€ IoC ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜์–ด ๊ด€๋ฆฌ๋œ๋‹ค.
  • ๋“ฑ๋ก๋œ Bean์€ ํ•„์š” ์‹œ์ ์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ , ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ ์—ญ์ „(Inversion of Control)

  • Bean์€ ์ž๊ธฐ ์Šค์Šค๋กœ๊ฐ€ ์˜์กด์„ฑ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ์˜ค์ง ์ž์‹ ์˜ ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•œ๋‹ค.
  • ํ•„์š”ํ•œ ์˜์กด์„ฑ(๋‹ค๋ฅธ Bean๊ณผ์˜ ๊ด€๊ณ„)์€ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฃผ์ž…ํ•ด ์ค€๋‹ค.

๋ฐฐ์น˜(Assembly)์™€ ์„ค์ •(Configuration)

  • Bean๋ผ๋ฆฌ์˜ ๊ด€๊ณ„(์–ด๋–ค Bean์ด ์–ด๋–ค Bean์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ๋“ฑ)๋Š” ๋ณ„๋„์˜ ์„ค์ • ํŒŒ์ผ(์ž๋ฐ” ์„ค์ •, XML, ์–ด๋…ธํ…Œ์ด์…˜ ์Šค์บ” ๋“ฑ)์„ ํ†ตํ•ด ์ •์˜ํ•œ๋‹ค.
  • ๋•๋ถ„์— ์ฝ”๋“œ์™€ ์„ค์ •์„ ๋ถ„๋ฆฌํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

โš™๏ธ ์ˆ˜๋™ ๋“ฑ๋ก: Configuration & Bean

@Configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋Š” ์Šคํ”„๋ง ๋นˆ์„ ์„ค์ •ํ•˜๋Š” ํด๋ž˜์Šค์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

@Configuration
public class AppConfig {

    // ๋นˆ ๋“ฑ๋ก
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

 

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

 

@Bean์€ ์ฃผ๋กœ ์™ธ๋ถ€์—์„œ ๋งŒ๋“ (์ž์‹ ์ด ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ) ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ,
์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“  ํ›„ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ด์ฒ˜๋Ÿผ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด Bean์„ ์ •์˜ํ•˜๊ณ  ์˜์กด ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„
Java Config๋ผ๊ณ  ํ•œ๋‹ค.

โœ… ์žฅ์ 

  1. ํƒ€์ž… ์•ˆ์ „์„ฑ(Type-safety)
    • ๊ธฐ์กด์˜ ์„ค์ • ๋ฐฉ๋ฒ• XML์€ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜์ด๋ผ ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ปดํŒŒ์ผ ์‹œ์ ์— ์žกํžˆ๊ธฐ ์–ด๋ ต๋‹ค.
    • ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋˜๋ฏ€๋กœ IDE์˜ ์ฝ”๋“œ ์ž๋™ ์™„์„ฑ, ์ปดํŒŒ์ผ ํƒ€์ž„ ์ฒดํฌ, ๋ฆฌํŒฉํ† ๋ง ์ง€์›์ด ์šฉ์ดํ•˜๋‹ค.
  2. ๊ฐ„๊ฒฐ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ
    • ์ž๋ฐ” ํด๋ž˜์Šค๋Š” ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์„ ์–ธํ•˜๊ณ , ๋กœ์ง์— ๊ฐ€๊นŒ์šด ๋ฐฉ์‹์œผ๋กœ Bean ์ •์˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ์œ ์—ฐํ•œ ๊ตฌ์กฐ
    • ์„ค์ •์„ ์—ฌ๋Ÿฌ ์ž๋ฐ” ํด๋ž˜์Šค๋กœ ๋ชจ๋“ˆํ™”ํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๋‹ค.
    • ์กฐ๊ฑด๋ถ€ ๋กœ์ง(if/else) ๋“ฑ์„ ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. (์˜ˆ: ์šด์˜ ํ™˜๊ฒฝ/ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋ถ„๊ธฐ)
    • ๋ฐ˜๋ฉด XML ์„ค์ •์—๋„ ์™ธ๋ถ€ ์„ค์ • ๊ด€๋ฆฌ, ๋ฐฐํฌ ์‹œ์ ์— ์†Œ์Šค ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์„ค์ •๋งŒ ๋ฐ”๊พธ๊ธฐ ๋“ฑ์˜ ์žฅ์ ์ด ์žˆ์œผ๋ฏ€๋กœ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ˜ผํ•ฉ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

๐Ÿ“ข ์ž๋™ ๋“ฑ๋ก: Annotation

 

์–ด๋…ธํ…Œ์ด์…˜์ด๋ž€?

์‚ฌ์ „์ ์œผ๋กœ๋Š” '์ฃผ์„'์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋˜๊ฑฐ๋‚˜ ์‹คํ–‰๋  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ๋ฌธ๋ฒ• ์š”์†Œ์ด๋‹ค.

@Component

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

@Component
public class MyComponent {
    public void sayHello() {
        System.out.println("Hello from MyComponent!");
    }
}

์œ„ ์˜ˆ์‹œ์—์„œ MyComponent ํด๋ž˜์Šค๋Š” @Component ์• ๋…ธํ…Œ์ด์…˜ ๋•๋ถ„์— Spring ์ปจํ…Œ์ด๋„ˆ์— Bean์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.


@Componet๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ˆ˜ํ™”๋œ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์ด ์žˆ๋‹ค.
์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ @Service, @Controller, @Repository๊ฐ€ ์žˆ๋‹ค.

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

  • @Service: ์ฃผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์˜ ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • @Controller: HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์›น ๊ณ„์ธต์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • @Repository: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์˜ ํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

@Service, @Controller, @Repository๋Š” ๋ชจ๋‘ @Component์˜ ํŠน์ˆ˜ํ™”๋œ ์• ๋…ธํ…Œ์ด์…˜์œผ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” @Component์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐ ์• ๋…ธํ…Œ์ด์…˜์€ ํŠน์ • ๊ณ„์ธต์ด๋‚˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•˜์—ฌ
๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ ํด๋ž˜์Šค์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

โœ… ์žฅ์ 

  1. ์ž๋™ ๋“ฑ๋ก์˜ ํŽธ๋ฆฌํ•จ
    • @Configuration ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์ผ์ผ์ด @Bean ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ํ•„์š” ์—†์ด ํ•„์š”ํ•œ ํด๋ž˜์Šค์— ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด๋ฉด Spring์ด ์ž๋™์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค.
  2. ์ฝ”๋“œ ์˜๋„ ์ „๋‹ฌ ๋Šฅ๋ ฅ
    • @Service, @Controller, @Repository ๋“ฑ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง๊ด€์ ์ด๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

[JAVA] ์–ด๋…ธํ…Œ์ด์…˜ (Annotation)
@Bean vs @Component

 

๋ฐ˜์‘ํ˜•