í°ì¤í 리 ë·°
[BE] ì¤íë§ IoCì DI | ì¤íë§ ìëª ì£¼ê¸° | @Autowiredì getBean()
ì¤ë©ì´ 2026. 1. 11. 00:30ë©´ì ì¤ë¹í ë 미리 ì¤ë¹ ì í´ê°ë©´ íì ì§ë¬¸ ëì¤ë ì¤íë§ IoCì DI
ì¤ì ë¡ íë ììí¬íìì ë°±ìë ê°ë°ì íë©´ì íì ê³ ë ¤í´ì¼ íë ê°ë ì´ì§ë§
ë©´ì ìì 물ì´ë³´ë©´ ì´ê² ê·¸ë ê² ëµë³íê¸°ê° íë¤ëë¼
ì¸ì°ë ë°©ì ë§ê³ ì´í´í ì ìê² ìì±íë ê¸
âï¸ Springì IoCì DI ê°ë
ì¤íë§ íë ììí¬ë¥¼ ì§í±íë ê°ì¥ ê±°ëí ë¿ë¦¬, IoC(Inversion of Control)ì DI(Dependency Injection)ì ëí´ ìì본ë¤
ì´ ê°ë ë¤ì ì ëë¡ ì´í´íë©´ "ì ì¤íë§ì ì¨ì¼ íëê°?"ì ëí ëµì ì°¾ì ì ìì ê²ì´ë¤.
IoC (Inversion of Control, ì ì´ì ìì ) : ë´ê° ì§ì ê´ë¦¬íë걸 íë ììí¬ê° ëì ê´ë¦¬í´ì¤
DI (Dependency Injection, ìì¡´ì± ì£¼ì ) : íìí ë¶íì ë´ê° ë§ë¤ì§ ìê³ ì¸ë¶ìì ë£ì´ì¤
ì¼ì ë¹ì ë¡ ë³´ë IoCì DI
ìí©1) ë´ê° ì§ì ì리í기 (기존방ì)
ë°°ê° ê³ í ë¹ì ì íì¤í를 ë§ë¤ê¸°ë¡ íë¤. ë§í¸ì ê°ì ë©´ê³¼ ìì¤ë¥¼ ì§ì ê³ ë¥´ê³ , ëë¹ë¥¼ êº¼ë´ ë¬¼ì ëì¸ë¤. 모ë ì¬ë£ì ì íê³¼ 조리 ê³¼ì ì 주ëê¶ì ë¹ì (ê°ë°ì)ìê² ìë¤.
ìí©2) ë ì¤í ëìì 주문í기 (IoC/DIë°©ì)
ë¹ì ì ë ì¤í ëì ìì "íì¤í íë 주ì¸ì"ë¼ê³ 주문íë¤. 주방ì¥(Spring Container)ì´ ììì ì¢ì ë©´ê³¼ ìì¤ë¥¼ ê³¨ë¼ ì리í ë¤ ë¹ì ì í ì´ë¸ì ë´ì´ì¤ë¤. ë¹ì ì ì¬ë£ê° ì´ëì ìëì§ ì ê²½ ì¸ íì ìì´, ë§ë¤ì´ì§ íì¤í를 ë¨¹ê¸°ë§ íë©´ ëë¤.
âï¸ IoC (Inversion of Control, ì ì´ì ìì )
IoCë ë§ ê·¸ëë¡ íë¡ê·¸ë¨ì ì ì´ íë¦ì ê°ë°ìê° ì§ì ê´ë¦¬íë ê²ì´ ìëë¼, ì¸ë¶(íë ììí¬)ì 맡기ë ê²ì ì미íë¤.
- 기존 : ê°ë°ìê° New Service()를 í¸ì¶íì¬ ê°ì²´ë¥¼ ì§ì ìì±íê³ ê´ë¦¬í¨
- IoC : ê°ì²´ì ìì±ë¶í° ìëª ì£¼ê¸° ê´ë¦¬ê¹ì§ 모ë Spring Containerê° ë´ë¹í¨
íµì¬ ì¤ë¸ì í¸ : Beanê³¼ 컨í ì´ë
- Bean : ë¨ìí ê°ì²´ê° ìë. ì¤íë§ì´ ì§ì ìì±íê³ , ìì¡´ê´ê³ë¥¼ ì¤ì íë©°, 주ì ê¹ì§ ë´ë¹íë ì í리ì¼ì´ì ì ìµì ë¨ì
- ApplicationContext : 'ë¹ ê³µì¥(BeanFactory)'ì íì¥íì¼ë¡, ì¤íë§ìì IoC를 ë´ë¹íë íµì¬ 컨í ì´ë. ì´ë¤ ê°ì²´ë¥¼ ìì±íê³ ì°ê²°í ì§ ê²°ì íë 'ì§íì'ì ìí ì í¨
âï¸ DI (Dependency Injection, ìì¡´ì± ì£¼ì )
IoCê° 'ì ì´ê¶ì ë기ë íì'ì´ë¼ë©´, DIë ê·¸ íìì 구ííë ì¤ì 기ë²ì´ë¤. í´ëì¤ ì¬ì´ì ìì¡´ ê´ê³ë¥¼ ë¹ ì¤ì ì 보를 ë°íì¼ë¡ 컨í ì´ëê° ìëì¼ë¡ ì°ê²°í´ì£¼ë ê²ì ë§íë¤.
ê·¸ë¬ë©´ ì´ë»ê² íì©ë ê¹?
ê°ì¥ ê¶ì¥ëë ë°©ìì ìì±ì 주ì (Constructor Injection)ì´ë¤.
@Service
public class OrderService {
private final DiscountPolicy discountPolicy;
// ìì±ì를 íµí´ ì¸ë¶(ì¤íë§)ìì ìì¡´ì±ì 주ì
í´ì¤
@Autowired
public OrderService(DiscountPolicy discoutPolicy) {
this.discountPolicy = discountPolicy;
}
}
âï¸ getBean()ê³¼ IoC ì¤ë¸ì í¸
ì¤íë§ ì»¨í ì´ëê° ê´ë¦¬íë ê°ì²´ë¥¼ ì¬ì©íê³ ì¶ì ë ê°ë°ìë ApplicationContextìì ê°ì²´ë¥¼ 꺼ë´ì¨ë¤.
- getBean() : 컨í ì´ëìì ê´ë¦¬ ì¤ì¸ í¹ì ë¹ì ì´ë¦ì´ë íì ì¼ë¡ ì°¾ìì¤ë ë©ìë
- íì§ë§ ì¤ì ê°ë° ììë @Autowired를 íµí´ ìëì¼ë¡ 주ì
ë°ì¼ë¯ë¡, getBean()ì ì§ì í¸ì¶íë ê²½ì°ë ë물ë¤
(→ ìì ì±ì ìê°íë©´ getBean() ë°©ìì´ ë ì¢ì ê±° ìëê° ???? )
âï¸ Springì ìëª ì£¼ê¸°
ì¤íë§ì ìëª ì£¼ê¸°ë IoC컨í ì´ëë¼ë 주방ìì ì¬ë£(Bean)ê° ì¤ë¹ëê³ , ì리ëì´ ìëìê² ëê°ê³ , ëì¤ì ë·ì 리ëë ì ì²´ ê³¼ì ì´ë¼ê³ ì´í´íë¤.
ê°ë°ìê° newë¡ ì§ì ê°ì²´ë¥¼ ë§ë¤ë©´ ìì±ê³¼ ëìì ëì´ì§ë§, ì¤íë§ì´ ê´ë¦¬íë©´ "íì´ëì 죽ì ëê¹ì§" ì í´ì§ ì 차를 ë°ë¥´ê² ëë¤.
í¬ê² [ìì± → ì¤ì → ì¬ì© → ì멸]ì ë¨ê³ë¥¼ ë°ëë¤.
â ì¤íë§ ì»¨í
ì´ë ìì± : ApplicationContextê° ë§ë¤ì´ì§ë¤.
â¡ ì¤íë§ ë¹ ìì± : ì¤ì ì 보를 ë³´ê³ í´ëì¤ì ì¸ì¤í´ì¤ë¥¼ ìì±íë¤ (ìì±ì 주ì
ì ì´ ë¨ê³ìì ë°ì)
⢠ìì¡´ê´ê³ 주ì : @Autowired ê°ì ìì¡´ì±ë¤ì ì°ê²°í´ì¤ë¤. (ìì ì/íë 주ì )
⣠ì´ê¸°í ì½ë°± : ë¹ì´ ì¤ë¹ëììì ìë¦¬ê³ íìí ì¤ì ì ë§ì¹ë¤. (@PostConstruct)
⤠ì¬ì© : ì í리ì¼ì´ì ìì ë¹ì ê°ì ¸ì ë¡ì§ì ìííë¤.
⥠ì멸 ì ì½ë°± : 컨í ì´ëê° ì¢ ë£ë기 ì§ì , ììì ë°ë©íë ë± ì 리 ìì ì íë¤. (@PreDestroy)
⦠ì¤íë§ ì¢ ë£ : ë¹ê³¼ 컨í ì´ëê° ì멸íë¤.
ì¬ê¸°ì, ë¨ìí ê°ì²´ê° ìì±ëë ê²ê³¼ ìë¹ì¤ê° ì¤ë¹ëë ê²ì ë¤ë¥´ë¤
- ì´ê¸°í(Initialize) : ë°ì´í°ë² ì´ì¤ 커ë¥ì íì 미리 ì°ê²°í´ ëê±°ë, ì¸ë¶ ìë²ì ìì¼ì ì´ì´ëë ë± ë¬´ê±°ì´ ìì ì ê°ì²´ ìì±ì´ ëë í ìì¡´ê´ê³ê° ë¤ ë§ºì´ì§ ë¤ì ìíí´ì¼ ìì íë¤.
- ì멸(Destroy) : ì í리ì¼ì´ì ì´ êº¼ì§ ë ì´ë ¤ìë íì¼ì´ë DB ì°ê²°ì ìì íê² ë«ìì¤ì¼ ë°ì´í° ìì¤ì ë§ì ì ìë¤.
ì¤ë¬´ììë 과거 ë³µì¡í ì¸í°íì´ì¤ë¥¼ ì§ì 구ííë ëì , @PostContruct @PreDestroy ì´ë ¸í ì´ì ì¼ë¡ ëë¸ë¤
@Component
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("1. ìì±ì í¸ì¶: ìì§ URLì´ ìì");
}
public void setUrl(String url) {
this.url = url;
}
// ì´ê¸°í ì½ë°± : ìì¡´ê´ê³ 주ì
ì´ ëª¨ë ëë ë¤ í¸ì¶í¨
@PostConstruct
public void init() {
System.out.println("2. ì´ê¸°í: "+url+" ìë²ì ì°ê²°ì ìë");
}
// ì멸 ì ì½ë°± : 컨í
ì´ëê° ì¢
ë£ë기 ì§ì ì í¸ì¶ë¨
@PreDestroy
public void close() {
System.out.println("3. ì멸 : ìë² ì°ê²°ì ìì íê² ì¢
ë£");
}
}
ì´ ì½ë를 íµí´ ì ì ìë IoCì DI
1) ì @PostConstructê° IoCì ì¦ê±°ì¸ê°?
IoCì íµì¬ì "ë´ê° í¸ì¶íë ê² ìëë¼, íë ììí¬ê° ë를 í¸ì¶íë ê²"ì´ë¤.
- ì¼ë°ì ì¸ ìë° ì½ë : ë´ê° newë¡ ê°ì²´ë¥¼ ë§ë¤ê³ , ë°ë¡ ë¤ì ì¤ì myObject.init()ì ì§ì í¸ì¶í´ì¼ íë¤. í¸ì¶ ìì ì ë´ê° ê²°ì í´ì¼ í¨
- ì¤íë§ì @PostConstruct : ê°ë°ìë "ì´ ë©ìëë ì¤ë¹ê° ëëë©´ ì¤íí´ ì¤"ë¼ê³ íì(Annotation)ë§ í´ëë¤. ì¤ì í¸ì¶ì ì¤íë§ ì»¨í
ì´ëê° ì ì í ìì (ìì¡´ì± ì£¼ì
ì´ ìë£ë ì§í)ì ììì ì¤ííë¤.
ì¦, ì¤í ììì ëí ì ì´ê¶ì´ ì¤íë§ìê² ëì´ê°ê¸° ë문ì ì íì ì¸ IoCì 모ìµì¸ ê²ì´ë¤.
2) DI(ìì¡´ì± ì£¼ì )ê³¼ì ê´ê³ë?
@PostConstructê° ì미 ìë ì´ì ë ë°ë¡ DI ë문ì´ë¤.
- ê°ì²´ê° ë§ ìì±ë ìì (new ì§í)ìë ìì§ ìì¡´ì±(@Autowiredë¡ ë¶ì¸ ê°ì²´ë¤)ì´ ì£¼ì ëì§ ììì ì ìë¤.
- ë§ì½ 주ì ëì§ë ìì ê°ì²´ë¥¼ ì¬ì©í´ ì´ê¸°í ë¡ì§ì ì¤ííë©´ NullPointerExceptionì´ ë°ìíê² ì§?
- ì¤íë§ì DI를 ìë²½íê² ëë§ì¹ ì§íì @PostConstructê° ë¶ì ë©ìë를 ì¤íí´ ì¤ë¤
"íìí 모ë ì¬ë£(DI)를 ë¤ ê°ë¤ ì¤ í ë, ì´ì ì리(ì´ê¸°í)를 ììí´"ë¼ê³ ì¤íë§ì´ ì í¸ë¥¼ 주ë ì ì´ë¤.
âï¸ IoCì DIì ì¥ë¨ì
ì¥ì
â ê²°í©ë ê°ì : ê°ì²´ ê°ì ê²°í©ëê° ë®ìì ¸ í í´ëì¤ë¥¼ ìì í´ë ë¤ë¥¸ í´ëì¤ì 미ì¹ë ìí¥ì´ ì ë¤.
â¡ ì ì°ì± ë° íì¥ì± : ì½ë ìì ìì´ ì¤ì ë§ì¼ë¡ 구í체를 ê°ì ë¼ì¸ ì ìë¤ (ex. DB ë³ê²½)
⢠í ì¤í¸ ì©ì´ì± : ê°ì§ ê°ì²´(Mock)를 주ì í기 ì¬ì ë¨ì í ì¤í¸ê° ììí´ì§ë¤.
ë¨ì
â ë³µì¡ë ì¦ê° : ìì íë¡ì í¸ììë ì¤íë ¤ êµ¬ì¡°ê° ë³µì¡í´ ë³´ì¼ ì ìë¤.
â¡ ë°íì ìë¬ : ìì¡´ì± ì£¼ì ì´ ì못ë ê²½ì° ì»´íì¼ ìì ì´ ìë ì¤í ìì ì ìë¬ê° ë ì ìë¤.
âï¸ ê²°ë¡
IoCì DIë ê²°êµ "ë ëì ëêµ°ê° ê°ì²´ë¥¼ ê´ë¦¬íê² í¨ì¼ë¡ì¨, ê°ë°ìë ë¹ì¦ëì¤ ë¡ì§ìë§ ì§ì¤íê² ë¤"ë 목ì ì´ë¤.
IoCë ì ëµ(목ì )ì´ê³ , DIë ê·¸ ì ëµì ìííë ë°©ë²(ìë¨)ì´ë¤.
âï¸ Ps. @Autowired ë°©ìê³¼ getBean()ì ì°¨ì´
1. ì¤í¨ìì ì ì°¨ì´ (Fail-Fast ìì¹)
- @Autowired (ì¬ì 주ì ) : ì í리ì¼ì´ì ì´ ìë²ê° ë° ë(기ë ìì ) 모ë ë¶íì 조립í´ë³¸ë¤. ì´ ë ë¶íì´ ìì¼ë©´ ìë²ê° ìì ìë¬ë¤.
- getBean() (ì§ì°ì¡°í) : ìë²ë ì ë¨ì§ë§, ì¬ì©ìê° í¹ì 기ë¥ì í´ë¦í´ì ì¤ì ë¡ì§ì´ ëìê°ë ìì (ë°íì)ì ê°ì기 ìë¬ê° ëë©° ìë¹ì¤ê° ë©ì¶ë¤.
→ ð¡ê²°ë¡ : ìë²½ 3ìì ì¬ì©ìê° ê²°ì ë²í¼ì ëë ì ë ìë²ê° í°ì§ë ê²ë³´ë¤, ê°ë°ìê° ë°°í¬íë ìê° "ë¶íì´ ìì´ì ë°°í¬ ìë¨"ì´ë¼ê³ ìë ¤ì£¼ë ê²ì´ í¨ì¬ ìì í ì¤ê³ì´ì§ ììê¹? ì´ë¥¼ Fail-Fast(빨리 ì¤í¨í기) ì ëµì´ë¼ê³ íë¤.
2. ê°ì²´ì§í¥ ì¤ê³ì 침í¬ì ì½ë
- 침í¬ì ì½ë : getBean()ì ì°ë ¤ë©´ ì½ë ìì ApplicationContextë¼ë ì¤íë§ì íµì¬ í´ëì¤ê° ì§ì ë±ì¥í´ì¼ íë¤. ë´ ë¹ì¦ëì¤ ë¡ì§ì´ ì¤íë§ì´ë¼ë íë ììí¬ì ë무 ê¹ê² ìì¡´íê² ë¨
- ë¹ì¹¨í¬ì ì½ë (POJO) : @Autowiredë ìì±ì 주ì ì ì°ë©´, ë´ ì½ëë ì¤íë§ ìì´ë ê·¸ë¥ ìë° ê°ì²´ë¡ ëìí ì ìë¤. ì¤íë§ì ë¨ì§ ë°ìì ë¶íì ë£ì´ì¤ ë¿ì´ëê¹
3. ìì¡´ì± ìê°íì ëë½ ë°©ì§
- @Autowired를 ì¬ì©íë©´ í´ëì¤ ìë¨ì´ë ìì±ìë§ ë´ë "ì, ì´ í´ëì¤ë Aì Bê° ìì´ì¼ ëìê°ë구ë"를 í ëì ì ì ìë¤.
- getBean()ì ì½ë 곳곳ì ì¨ê²¨ëë©´, ì´ë¤ ìì¡´ì±ì´ íìíì§ íì í기 ì´ë µê³ , ì¤ìë¡ ë¹ ì¤ì ì ëë½í íë¥ ì´ ëìì§ë¤.
→ ê·¸ë¥ ë±ë´ë @Autowiredë°©ìì´ ë ìì ì ì¸ ê² ê°ìë° ,, ì§ì§ ìë íëë문ì getBean() ë°©ìì ì ííê±´ì§ ì문ì´ë¤
ì« ë ììë´¤ëë ë´ê° "íë ììí¬" ê°ë°ì íë í¹ìí ìí©ì´ë¼ getBean()ì ì¬ì©íë걸ì§ë
íë ììí¬ íì´ getBean()ì ì íí í©ë¦¬ì ì¸ ì´ì
1. ì íì ìì¡´ì± (Optional Dependency)
íë ììí¬ë ìë§ì 기ë¥ì ì ê³µíì§ë§, ê° ì 무íì ê·¸ ì¤ ì¼ë¶ë§ ì¬ì©í ì ìë¤.
- @Autowired : ìë¹ì¤ê° ë° ë 모ë ë¹ì 조립íë ¤ íë¯ë¡, ì 무íì´ í¹ì 기ë¥ì ìì¨ì ê´ë ¨ ë¼ì´ë¸ë¬ë¦¬ë¥¼ ë¹¼ë²ë¦¬ë©´ ìë² ê¸°ëì ìë¬ê° ëë¤.
- getBean() : ì¤ì ê·¸ 기ë¥ì í¸ì¶í ëë§ ë¹ì ì°¾ëë¤. ì 무íì´ í´ë¹ 기ë¥ì ìì´ë¤ë©´, ê´ë ¨ ë¹ì´ 컨í ì´ëì ìì´ë ìë²ë ì무 문ì ìì´ ì ë¬ë¤.
2. ìí 참조(Circular Dependency) ìë°©
ëê·ëª¨ íë ììí¬ë 기ë¥ì´ ìë ë°©ëí´ì A 기ë¥ì´ B를 참조íê³ , Bê° ë¤ì A를 참조íë 'ìí 참조' êµ¬ì¡°ê° ë°ìí기 ì½ë¤.
- @Autowiredë ìë²ê° ë° ë 조립ì ìëíë¯ë¡ ìí ì°¸ì¡°ê° ìì¼ë©´ 기ë ìì²´ê° ìëë¤.
- getBean()ì í¸ì¶ ìì ì ë¹ì ì°¾ì¼ë¯ë¡, 조립 ìì ì ìí 참조 문ì 를 íí¼í ì ìì´ ê±°ë íë ììí¬ì ë³µì¡í 구조를 ê´ë¦¬í기ì ì 리íë¤.
3. ëì ë¹ ê²°ì (Dynamic Strategy)
íë ììí¬ë ìí©ì ë°ë¼ ì¤í ìì ì ì´ë¤ 구í체를 ì¸ì§ ê²°ì í´ì¼ í ëê° ë§ë¤.
ì를 ë¤ì´, ì¤ì íì¼ ê°ì ë°ë¼ A_SESSION_WAS를 ì¸ì§, B_SESSION_REDIS를 ì¸ì§ ë¶ê¸°í´ì¼ íë¤ë©´, ì½ëê° ì¤íëë ëì¤ì getBean(beanName)ì í¸ì¶íë ë°©ìì´ í¨ì¬ ì§ê´ì ì´ê³ ê°ë ¥íë¤.
'Programming > BackEnd' ì¹´í ê³ ë¦¬ì ë¤ë¥¸ ê¸
- ë°ê°ìµëë¤. ê¸ì 구ì±ê³¼ íë¦ì´ ë§¤ì° ìì°ì¤ë¬ì ìµëë¤.â¯
- ë¤ë ë¤ ê°ëë¤~ ì½ë ë´ë´ 몰ì íì´ì. ììì ìë¯¸ë¡ â¯
- ë°ë»í ì´ì¼ê¸° ëë¶ì íë£¨ê° ë ì¦ê±°ìì¡ì´ì. ê°ì¬í©ëâ¯
- ê¸ì´ ì°¸ ê¹ì´ê° ìë¤ì. ê°ì ê³¼ ë ¼ë¦¬ê° ì ì¡°í를 ì´ë¤â¯
- Total
- 1,011
- Today
- 0
- Yesterday
- 0
- ìì íì
- docker-compose
- ìì´í 60
- BFS
- ì¡°í©
- DevOps
- ìì´í 59
- Container
- bruteforce
- ê·¸ëííì
- ìì´í 61
- í í°ê¸°ë°ì¸ì¦
- springboot
- cicd
- EffectiveJava
- Retrofit2
- BOJ
- docker
- Java
- ì´ìì²´ì
- dp
- ìê³ ë¦¬ì¦
- dfs
- OS
- ìì´
- subset
- ë°±ì¤
- ìí
- IMAGE
- ì´íí°ë¸ìë°
