[Spring] ๐Ÿ’พ IOC, DI, Container, Bean

shrยท2022๋…„ 2์›” 9์ผ
0

Concept

๋ชฉ๋ก ๋ณด๊ธฐ
1/13
post-thumbnail

Spring (์Šคํ”„๋ง)


์Šคํ”„๋ง์ด๋ž€ IOC์™€ AOP๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋‹ค.


IOC (Inversion Of Control)


์ œ์–ด์˜ ์—ญ์ „. ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ฃผ์ž… ๋ฐ ์†Œ๋ฉธ์„ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•œ๋‹ค. ๊ทธ ์™ธ ์ œ์–ด๊ถŒ์„ ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ๊ฐ€์ ธ๊ฐ„๋‹ค๋Š” ๋ง๋กœ๋„ ์“ฐ์ธ๋‹ค. ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ์—ญ์ „์‹œ์ผœ ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ๊ฐ€๋…์„ฑ ๋ฐ ์ฝ”๋“œ ์ค‘๋ณต, ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์Šคํ”„๋ง์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ์‹คํ–‰๋œ๋‹ค.

1. ๊ฐ์ฒด ์ƒ์„ฑ
2. ์˜์กด์„ฑ ๊ฐ์ฒด ์ฃผ์ž…
3. ์˜์กด์„ฑ ๊ฐ์ฒด ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ


DI (Dependency Injection)


์˜์กด์„ฑ ์ฃผ์ž…. ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•œ ํ›„ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์Šคํ”„๋ง์ด IOC๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด, A ๊ฐ์ฒด์—์„œ B ๊ฐ์ฒด์™€ C ๊ฐ์ฒด๋ฅผ ์˜์กดํ•  ๋•Œ A ๊ฐ์ฒด์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€(IOC ์ปจํ…Œ์ด๋„ˆ)์—์„œ ์ƒ์„ฑ๋œ B ๊ฐ์ฒด์™€ C ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…์‹œ์ผœ setter() ํ˜น์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


Container



์Šคํ”„๋ง์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์œ„์ž„๋ฐ›์•„ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์กด์žฌ์ด๋‹ค. ๊ธฐ์กด์—๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฐ์ฒด ๋‚ด์—์„œ new ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ getter()์™€ setter() ๊ธฐ๋Šฅ์„ ์จ์•ผ ํ–ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋“ค์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์— ๋ฌด์ˆ˜ํžˆ ๋งŽ์ด ์กด์žฌํ•˜๊ณ  ์„œ๋กœ ์ฐธ์กฐํ•œ๋‹ค. ์ด๋ฅผ ์˜์กด์„ฑ์ด ๋†’๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. IOC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜์กด์„ฑ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

BeanFactory์™€ ApplicationContext๊ฐ€ ์ด์— ์†ํ•œ๋‹ค.


Bean


์Šคํ”„๋ง์˜ IOC ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” POJO(Plain Old Java Object)๋ฅผ ๋œปํ•œ๋‹ค. ๋นˆ์€ ์‹ฑ๊ธ€ํ†ค(Singleton)์˜ ํ˜•ํƒœ์ด๋‹ค.

์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

1. xml ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•œ ๋“ฑ๋ก

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
    <bean id="bookService" class="com.example.demo.BookService">
        <property name="bookRepository" ref="bookRepository" />
    </bean>
    <bean id="bookRepository" class="com.example.demo.BookRepository">
    </bean>
</beans>

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ, ๋‹ค์†Œ ๊ท€์ฐฎ์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

2. ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•œ ๋“ฑ๋ก

์ปจํ…Œ์ด๋„ˆ์— ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก์‹œ์ผœ ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ (Annotation)

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

์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์•„ ์ฃผ์ž…์‹œ์ผœ ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ (Annotation)

  • @Autowired
    IOC ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ์ฐธ์กฐํ•  ๋นˆ์„ ์ฐพ์•„ ์ฃผ์ž…ํ•œ๋‹ค.

Component-Scan

@ComponentScan์ด๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ํŒจํ‚ค์ง€๋ฅผ ์ ์–ด ์ฃผ๋ฉด ํ•ด๋‹น ํŒจํ‚ค์ง€ ์•„๋ž˜์— ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋ ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ฐพ์•„ ๋ชจ๋‘ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด ์ค€๋‹ค. ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋ ค๋Š” ์–ด๋…ธํ…Œ์ด์…˜์€ @Component, @Service, @Repository, @Controller, @RestController๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ๋Š” ํŒจํ‚ค์ง€์ด๋ฆ„Application.java ํŒŒ์ผ(ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ ์ƒ๊ธฐ๋Š” ํŒŒ์ผ)์—์„œ ApplicationContext๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด @SpringBootApplication์ด๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด @ComponentScan ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

[Spring] ์Šคํ”„๋ง ์˜์กด์„ฑ ์ฃผ์ž…(DI) ์ด๋ž€?
[Spring] ์˜ˆ์ œ๋กœ ๋ฐฐ์›Œ๋ณด๋Š” IoC/DI & Spring Bean Life Cycle
[Spring] ์Šคํ”„๋ง ๋นˆ(Bean)์˜ ๊ฐœ๋…๊ณผ ์ƒ์„ฑ ์›๋ฆฌ
[SpringBoot] @Bean, @Configuration, @Component ์–ด๋…ธํ…Œ์ด์…˜

profile
๋ชปํ•˜๋‹ค ๋ณด๋ฉด ์ž˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ์•ผ ๏ฝฅแด—๏ฝฅฬฅฬฅฬฅ

0๊ฐœ์˜ ๋Œ“๊ธ€