- Spring DI/IoC ๋์๋ฐฉ์
- Spring Bean
- ์คํ๋ง Bean์ ์์ฑ ๊ณผ์
- IoC ์ปจํ ์ด๋์ ์ญํ
- 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๋ฅผ ๊ตฌํํ๋ ์ฃผ์ ๊ธฐ์
- ๊ฐ์ฒด๊ฐ ์ฌ์ฉํ ์์กด์ฑ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ์
- ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ๊ด๋ฆฌํด ํ ์คํธ ์ฉ์ด์ฑ๊ณผ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ํฅ์
- Constructor Injection (์์ฑ์ ์ฃผ์ )
public class OrderService {
private PaymentService paymentService;
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
- Setter Injection
public class OrderService {
private PaymentService paymentService;
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
- 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 ์ปจํ ์ด๋์ ์ํด ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ์ฌ์ฌ์ฉ๋จ
- ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ๋ฑ๋กํ๊ฑฐ๋ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด ์๋์ผ๋ก ๋ฑ๋กํ ์ ์์
- XML ํ์ผ์ ์ฌ์ฉํ Bean ๋ฑ๋ก
- Java Config ๊ธฐ๋ฐ ๋ฑ๋ก (@Configuration, @Bean)
- 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)์ผ๋ก ์ค๊ณํ์ฌ ๋์์ฑ ๋ฌธ์ ๋ฅผ ์ค์ด๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ ๋๋ค.