Framework & Library/Spring & Spring Boot

IoC ์ปจํ…Œ์ด๋„ˆ์™€ ๋นˆ(Bean)

yoooCo 2025. 5. 24. 14:32

๐ŸŒฑ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์‹ฌ์žฅ, IoC ์ปจํ…Œ์ด๋„ˆ์™€ ๋นˆ(Bean)

์Šคํ”„๋ง์„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ๊ผญ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜๋Š” ๊ฐœ๋…, ๋ฐ”๋กœ IoC ์ปจํ…Œ์ด๋„ˆ์™€ ๋นˆ(Bean)์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ์—” ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง€์ง€๋งŒ, ๊ฐœ๋…์„ ํ•˜๋‚˜์”ฉ ํ’€์–ด๋ณด๋ฉด ๋†€๋ž๋„๋ก ๊น”๋”ํ•˜๊ฒŒ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring์˜ IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ญ˜ ํ•˜๋Š”์ง€, Bean์ด ์™œ ์ค‘์š”ํ•œ์ง€ ์ฐฌ์ฐฌํžˆ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐ŸŒ€ IoC๋ž€? (Inversion of Control)

IoC๋Š” โ€œ์ œ์–ด์˜ ์—ญ์ „โ€์ด๋ผ๋Š” ๋ง ๊ทธ๋Œ€๋กœ,
๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•˜์ง€ ์•Š๊ณ , ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Œ€์‹ ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ „ํ†ต ๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด์ 

๊ตฌ๋ถ„ ์ „ํ†ต์ ์ธ ๋ฐฉ์‹ IoC ๋ฐฉ์‹ (Spring)
๊ฐ์ฒด ์ƒ์„ฑ ์ง์ ‘ new ํ•ด์„œ ๋งŒ๋“ฆ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•Œ์•„์„œ ์ƒ์„ฑ
์˜์กด์„ฑ ์ฃผ์ž… ์ง์ ‘ ์ฐพ์•„์„œ ์—ฐ๊ฒฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•Œ์•„์„œ ๋„ฃ์–ด์คŒ

โ€œ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฐ๊ฒฐํ•˜๋˜ ์ฃผ๋„๊ถŒ์„ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋„˜๊ธด ๊ฒƒโ€
์ด๊ฒŒ ๋ฐ”๋กœ ์ œ์–ด์˜ ์—ญ์ „์ž…๋‹ˆ๋‹ค.

๐Ÿ’‰ IoC์˜ ๊ตฌํ˜„ ๋ฐฉ์‹ - DI (Dependency Injection)

์Šคํ”„๋ง์—์„œ๋Š” IoC๋ฅผ DI, ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ์™ธ๋ถ€(์ปจํ…Œ์ด๋„ˆ)์—์„œ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

DI์˜ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• ์„ค๋ช…
์ƒ์„ฑ์ž ์ฃผ์ž… ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ
Setter ์ฃผ์ž… ์ƒ์„ฑ ํ›„ Setter ๋ฉ”์„œ๋“œ๋กœ ์ฃผ์ž…
ํ•„๋“œ ์ฃผ์ž… (์ถ”์ฒœX) ํ•„๋“œ์— ๋ฐ”๋กœ ์ฃผ์ž… (ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€)

์Šคํ”„๋ง์€ ์ด ์˜์กด์„ฑ ์ •๋ณด๋“ค์„ ๋ฏธ๋ฆฌ ํŒŒ์•…ํ•ด์„œ, ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ํ•„์š”ํ•œ ์˜์กด์„ฑ๊นŒ์ง€ "์ž๋™"์œผ๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

๐Ÿ—๏ธ IoC ์ปจํ…Œ์ด๋„ˆ๋ž€?

IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ง ๊ทธ๋Œ€๋กœ Spring์ด ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ฐ์ฒด๋“ค์„ ๋“ฑ๋กํ•ด๋‘๋ฉด, ํ•„์š”ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜์ฃ .

์ปจํ…Œ์ด๋„ˆ์˜ ๋‘ ๊ฐ€์ง€ ๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด

์ข…๋ฅ˜ ํŠน์ง•
BeanFactory ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํ…Œ์ด๋„ˆ (๊ฐ€๋ณ์ง€๋งŒ ๊ธฐ๋Šฅ ์ œํ•œ์ )
ApplicationContext BeanFactory + ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ(AOP, ์ด๋ฒคํŠธ, ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋“ฑ)
๐Ÿ’ก ๋Œ€๋ถ€๋ถ„์˜ ์‹ค๋ฌด์—์„œ๋Š” ๊ธฐ๋Šฅ์ด ๋” ํ’๋ถ€ํ•œ ApplicationContext๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿซ˜ Bean์ด๋ž€?

Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ Bean์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๊ทธ๋ƒฅ ํ‰๋ฒ”ํ•œ ์ž๋ฐ” ๊ฐ์ฒด(POJO)์ง€๋งŒ,
Spring์—๊ฒŒ โ€œ์ด๊ฑฐ ๊ด€๋ฆฌํ•ด์ค˜โ€ ํ•˜๊ณ  ๋“ฑ๋กํ•˜๋ฉด ๊ทธ๊ฒƒ๋ถ€ํ„ฐ Bean์ด ๋˜๋Š” ๊ฑฐ์˜ˆ์š”.

์ฆ‰,
class MemberService {}

์ด๊ฑด ๊ทธ๋ƒฅ ํด๋ž˜์Šค

๊ทธ๋Ÿฐ๋ฐ,
@Component public class MemberService {}

์ด๋ ‡๊ฒŒ ๋“ฑ๋กํ•˜๋ฉด โ†’ Bean!

๐Ÿ“‹ Bean์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•

Spring ์ปจํ…Œ์ด๋„ˆ๋Š” Bean๊ณผ ๊ทธ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ตฌ์„ฑ ์ •๋ณด๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋ฐฉ๋ฒ• ์„ค๋ช… ์˜ˆ์‹œ
XML ์„ค์ • ์ „ํ†ต์ ์ธ ๋ฐฉ์‹ <bean id="memberService" class="..."/>
์ž๋ฐ” ์„ค์ • @Configuration ํด๋ž˜์Šค์—์„œ @Bean์œผ๋กœ ๋“ฑ๋ก @Bean public MemberService memberService() {}
์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ž๋™ ๊ฐ์ง€ ๋ฐฉ์‹ @Component, @Service, @Repository ๋“ฑ

์š”์ฆ˜์€ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ž…๋‹ˆ๋‹ค.

โœ… ์˜ˆ์‹œ ์ฝ”๋“œ ๋ชจ์Œ

1. ๐Ÿ“„ XML ์„ค์ • ๋ฐฉ์‹

<!-- applicationContext.xml -->
<beans>
    <bean id="memberService" class="com.example.MemberService" />
</beans>

2. โš™๏ธ ์ž๋ฐ” ์„ค์ • ๋ฐฉ์‹

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService();
    }
}

3. ๐Ÿงฉ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹ (์š”์ฆ˜ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ์‹)

@Component
public class MemberService {
    // ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
}
// ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ†ตํ•ด ์ž๋™ ๋“ฑ๋ก
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

๐Ÿงญ ํ•ต์‹ฌ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช…
IoC ๊ฐ์ฒด ์ƒ์„ฑ/์—ฐ๊ฒฐ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ˆ˜ํ–‰
DI IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹, ์˜์กด์„ฑ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…
BeanFactory ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํ…Œ์ด๋„ˆ ์ธํ„ฐํŽ˜์ด์Šค
ApplicationContext BeanFactory๋ณด๋‹ค ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ํฌํ•จํ•œ ์ปจํ…Œ์ด๋„ˆ
Bean Spring์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด (POJO๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ ๊ฒƒ)
๊ตฌ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ Bean์œผ๋กœ ๋งŒ๋“ค๊ณ , ๋ฌด์—‡์„ ์ฃผ์ž…ํ• ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์„ค์ • ์ •๋ณด

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ