1. Spring DI/IoC ๋™์ž‘๋ฐฉ์‹
  2. Spring Bean
  3. ์Šคํ”„๋ง Bean์˜ ์ƒ์„ฑ ๊ณผ์ •
  4. IoC ์ปจํ…Œ์ด๋„ˆ์˜ ์—ญํ• 
  5. DI ์ข…๋ฅ˜์™€ ์ด๋“ค์˜ ์ฐจ์ด

1. Spring DI/IoC

IoC (Inversion of Control), ์ œ์–ด์˜ ์—ญ์ „

  • ์ „ํ†ต์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ โ†’ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„๊ณผ ์ œ์–ด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃธ

  • IoC โ†’ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ๊ด€๋ฆฌ, ์ œ์–ด ํ๋ฆ„์„ ๋‹ด๋‹นํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐœ๋…

  • Spring์€ ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ApplicationContext๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ œ๊ณต

  • Application Context : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์กฐ๋ฆฝํ•˜๋ฉฐ, ๊ฐ์ฒด์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ

  • IoC ์—†์ด ์˜์กด์„ฑ ์ง์ ‘ ๊ด€๋ฆฌ

public class OrderService {
    private PaymentService paymentService = new PaymentService();
    // OrderService๋Š” PaymentService์˜ ์ƒ์„ฑ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌ
}
  • IoC ์ ์šฉ ํ›„
public class OrderService {
    private PaymentService paymentService;
 
    // PaymentService๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

Question

Spring IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

IoC๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„๊ณผ ์ œ์–ด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋˜ ์ „ํ†ต์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด ์•„๋‹Œ ์Šคํ”„๋ง์˜ IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ์ œ์–ด์˜ ํ๋ฆ„์„ ์—ญ์ „์‹œํ‚ค๋Š” ๋””์ž์ธ ์›์น™์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ†’ ์ฃผ์š” ๊ตฌํ˜„์ฒด : ApplicationContext, BeanFactory

DI (Dependency Injection), ์˜์กด์„ฑ ์ฃผ์ž…

  • IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฃผ์š” ๊ธฐ์ˆ 
  • ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•  ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹
  • ์˜์กด์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ
  1. Constructor Injection (์ƒ์„ฑ์ž ์ฃผ์ž…)
public class OrderService {
    private PaymentService paymentService;
 
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}
  1. Setter Injection
public class OrderService {
    private PaymentService paymentService;
 
    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}
  1. Field Injection (@Autowired)
public class OrderService {
    @Autowired
    private PaymentService paymentService;
}

Question

DI๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

DI๋Š” Dependency Injection์œผ๋กœ IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ฃผ์š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•  ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…, ํ•„๋“œ ์ฃผ์ž…, ์„ธํ„ฐ ์ฃผ์ž…, ํ•„๋“œ ์ฃผ์ž…, XML ์„ค์ •, Config ๋ฐฉ์‹ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โ†’ ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜ : @Autowired, @Conponent, @Configuration, @Bean

Question

IoC์™€ DI์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

IoC๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ œ์–ด ํ๋ฆ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ์ œ์–ด๋ฅผ ์—ญ์ „์‹œํ‚ค๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด ์Šค์Šค๋กœ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. DI๋Š” IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. DI๋Š” IoC์˜ ์‹ค์งˆ์ ์ธ ๊ตฌํ˜„ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด OrderService๊ฐ€ PaymentService๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  Spring์ด ์ด๋ฅผ ์ฃผ์ž…ํ•จ์œผ๋กœ์จ IoC๊ฐ€ ์ ์šฉ๋˜๊ณ  ์ด ์ฃผ์ž…๊ณผ์ •์ด DI ์ž…๋‹ˆ๋‹ค.

Question

IoC ์ปจํ…Œ์ด๋„ˆ์˜ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

IoC ์ปจํ…Œ์ด๋„ˆ๋Š” Spring์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ, ๊ด€๋ฆฌ, ์˜์กด์„ฑ ์ฃผ์ž…, ๊ฐ์ฒด ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

Question

DI์˜ ์ฃผ์š” ๋ฐฉ์‹์—๋Š” ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?

DI์˜ ์ฃผ์š” ๋ฐฉ์‹์€ Constructor Injection, Setter Injection, Field Injection์ด ์žˆ์Šต๋‹ˆ๋‹ค. Constructor Injection์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฃผ์ž…๋ฐ›์€ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๊ณ  ํ•„์ˆ˜์ ์ธ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ ์ ํ•ฉํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Setter Injection์€ Setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ ํƒ์  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. Field Injection์€ ์ฃผ๋กœ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ํ•„๋“œ์— ์ง์ ‘ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ•ํ•˜๊ฒŒ ์˜์กดํ•ด ํ…Œ์ŠคํŠธ๋‚˜ ์œ ์ง€๋ณด์ˆ˜์— ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Question

@Autowired์™€ @Qualifier์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”

@Autowired๋Š” ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ , @Qualifier๋Š” ํŠน์ • ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

Autowired๋Š” ๋™์ผํ•œ ํƒ€์ž…์˜ Bean์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, Qualifier๋Š” ์›ํ•˜๋Š” Bean์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Question

์˜์กด์„ฑ ์ฃผ์ž…์—์„œ ์ˆœํ™˜์ฐธ์กฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

์ˆœํ™˜์ฐธ์กฐ๋Š” Bean์ด ์„œ๋กœ๋ฅผ ์˜์กดํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  Setter Injection์„ ์‚ฌ์šฉํ•ด Bean ์ฃผ์ž… ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๊ฑฐ๋‚˜ @Lazy ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Question

Spring IoC์™€ DI์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

๋จผ์ € config๋‚˜ XML ํŒŒ์ผ์—์„œ Bean์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด Bean์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉด์„œ Bean์„ ๋กœ๋“œํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean์„ ์ƒ์„ฑํ•  ๋•Œ ์˜์กด ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•˜๊ณ  ์„ค์ •๋œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

2. Spring Bean

  • Spring ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์ค‘์— ์žฌ์‚ฌ์šฉ๋จ
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Œ
  1. XML ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ Bean ๋“ฑ๋ก
  2. Java Config ๊ธฐ๋ฐ˜ ๋“ฑ๋ก (@Configuration, @Bean)
  3. Component Scan ๊ธฐ๋ฐ˜ ๋“ฑ๋ก (@Component, @Service, @Repository, @Controller)

Question

Spring Bean์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

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

Question

Spring์—์„œ Bean์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

XML ํŒŒ์ผ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ configuration ํด๋ž˜์Šค์—์„œ @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, @Component, @Service, @Controller๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Question

Bean์˜ ์ƒ์„ฑ ๊ณผ์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

Bean์„ ์ •์˜ํ•˜๊ณ  ์ƒ์„ฑํ•œ ๋’ค ์˜์กด ๊ด€๊ณ„์— ๋”ฐ๋ผ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•œ ๋’ค ์‚ฌ์šฉํ›„์—” ์†Œ๋ฉธ๋ฉ๋‹ˆ๋‹ค.

Question

Bean ์ดˆ๊ธฐํ™”์™€ ์†Œ๋ฉธ ์‹œ์ ์— ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•?

  • ์ดˆ๊ธฐํ™”: @PostConstruct, InitializingBean ์ธํ„ฐํŽ˜์ด์Šค์˜ afterPropertiesSet().
  • ์†Œ๋ฉธ: @PreDestroy, DisposableBean ์ธํ„ฐํŽ˜์ด์Šค์˜ destroy().

Question

Spring์—์„œ Bean Scope๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”

scope๋Š” ๋นˆ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค, ํ”„๋กœํ† ํƒ€์ž…, ๋ฆฌํ€˜์ŠคํŠธ, ์„ธ์…˜, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค์€ ์ปจํ…Œ์ด๋„ˆ๋‹น ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๊ฒƒ์„ ๋œปํ•˜๋ฉฐ ํ”„๋กœํ† ํƒ€์ž…์€ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค, ๋ฆฌํ€˜์ŠคํŠธ๋Š” http ์š”์ฒญ๋‹น ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค, ์„ธ์…˜์€ http ์„ธ์…˜๋‹น ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Question

@Bean๊ณผ @Component์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • @Bean: ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ง์ ‘ ์ œ์–ด.
  • @Component: ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉ, Component Scan์— ์˜ํ•ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ.

Question

ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋Œ€๋Ÿ‰์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ์˜์‹ฌํ•ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์„ค๊ณ„ ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ผ๊นŒ?

๋นˆ ์ƒ์„ฑ ๋น„์šฉ: ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์ด ๋ˆ„์ ๋˜์–ด ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜) ๋ถ€ํ•˜: ๋Œ€๋Ÿ‰์˜ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ  ์š”์ฒญ์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค ์†Œ๋ฉธ๋˜๋ฏ€๋กœ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์žฆ์•„์ง€๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”: ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์ƒ์„ฑ ๊ณผ์ •์—์„œ ๋นˆ ํŒฉํ† ๋ฆฌ๋‚˜ DI ๊ด€๋ จ ๋™๊ธฐํ™”๊ฐ€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: ๋นˆ ์žฌ์‚ฌ์šฉ ์ „๋žต: ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ํ’€(Object Pool)์„ ๋„์ž…ํ•˜์—ฌ ๋นˆ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Apache Commons Pool ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นˆ ์ƒ์„ฑ์„ ์ง€์—ฐ(Lazy Initialization): ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ฒ€ํ† ํ•˜๊ณ , ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ์ง€์—ฐ ์ดˆ๊ธฐํ™”(Lazy Initialization)๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒด ์„ค๊ณ„: ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ๊ธฐ๋Šฅ์„ ์ง€์—ญ ๋ณ€์ˆ˜๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋นˆ ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ณ  ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

Question

์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์—์„œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋นˆ์˜ ์Šค์ฝ”ํ”„๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ• ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. , Singleton ๋นˆ์œผ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ• ๊นŒ? ๋‹ค๋ฅธ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ค ์ ์„ ๊ณ ๋ คํ•ด์•ผ ํ• ๊นŒ?

Singleton ๋นˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋ฉด ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์—์„œ ๊ณต์œ  ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜๋”๋ผ๋„, Singleton ๋นˆ์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ(์œ ์ƒํƒœ)๋ผ๋ฉด ์‚ฌ์šฉ์ž ๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์„ž์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๊ฐ„ ๊ณต์œ  ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, Session ์Šค์ฝ”ํ”„๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Session ์Šค์ฝ”ํ”„๋Š” ์‚ฌ์šฉ์ž๋ณ„๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ ๊ฐ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Session ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTTP ์„ธ์…˜ ๊ด€๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ธ์…˜ ์ข…๋ฃŒ ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ์บ์‹œ ์‚ฌ์šฉ: ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์š”์ฒญ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋นˆ์˜ ์ƒํƒœ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ธฐ๋ณด๋‹ค๋Š” Redis ๊ฐ™์€ ์™ธ๋ถ€ ์บ์‹œ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. Immutable ๊ฐ์ฒด ์‚ฌ์šฉ: ๊ณต์œ  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€(Immutable)์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.