๐ก Spring ํต์ฌ ๊ฐ๋
์ธํฐ๋ทฐ Q&A
์ ๊ฐ๋
์ค๋ช
์ ์์ beanFactory๋ฅผ ์ดํดํด์ผํ๋ค.
Q.BeanFactory๋?
- BeanFactory๋ ์คํ๋ฆฌ์์ ์ ๊ณตํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ธํฐํ์ด์ค์ด์ ์ปจํ
์ด๋์ด๋ค.
- ๋น(๊ฐ์ฒด)์ ์์ฑ๊ณผ ์์กด์ฑ์ฃผ์
(DI)๋ฅผ ๋ด๋นํ๋ฉฐ,์ง์ฐ๋ก๋ฉ(lazy loading)๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
ํน์ง
- ์ธํฐํ์ด์ค, getBean()์ผ๋ก ํธ์ถํ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
- AOP์์
- ๋ด๋ถ์ ์ผ๋ก๋ง ์ฌ์ฉ๋๋ค. ApplicationContext์ ์ฌ์ฉํ๋ฉฐ ๋ด๋ถ์์ ์์๋ฐ์ beanFactory๋ฅผ ์ฌ์ฉํ๋ค.
Q.IoC๋?
- Inversion of Control์ ์ฝ์์ด๋ฉฐ ์ ์ด์ ์ญ์
- ๊ฐ์ฒด ์์ฑ, ์์กด์ฑ ์ค์ ์ ์ด๊ถ์ ์คํ๋งํ๋ ์์ํฌ๊ฐ ๊ฐ์ง, ์๋๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ง๋๋ฐ ํ๋ ์์ํฌ๊ฐ ์ ์ด๊ถ์ ๊ฐ์ง๋ฏ๋ก โ์ ์ด์ ์ญ์ โ์ด๋ผ ์นญํ๋ค.
์์
Service svc = new ServiceImpl();
@Autowired
Service svc;
- ์ฃผ๋ก ์ง์ ์์ฑํ๋ ๊ธฐ์กด๋ฐฉ์์์ ์คํ๋ง์ด ์ฃผ์
ํ๋ ๋ฐฉ์์ ์ฌ์ฉํจ(์ ์ด์ ์ญ์ )
- IOC์ ๊ตฌํ ๋ฐฉ์ ์ค ํ๋๋ก DI(์์กด์ฑ ์ฃผ์
, @Autowired)์ด ์๋ค.
Q. DI๋?
- dependency injection์ ์ฝ์์ด๋ฉฐ, ์์กด์ฑ ์ฃผ์
- ๊ฐ์ฒด๊ฐ ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ์ธ๋ถ(์คํ๋ง์ปจํ
์ด๋)์์ ์ฃผ์
๋ฐ๋(๊ฐ์ ธ์ค๋) ๋ฐฉ์
๊ตฌํ๋ฐฉ๋ฒ
- ์์ฑ์ ์ฃผ์
- ์ธํฐ ์ฃผ์
- ํ๋ ์ฃผ์
- ์ 3๊ฐ์ง๊ฐ ์์ผ๋ฉฐ ์์ฑ์ ์ฃผ์
์ ๊ถ์ฅํ๋ค. ์๋ํ๋ฉด ๋ถ๋ณ์ฑ์ ๋ณด์ฅ, ํ
์คํธ์ฉ์ด์ฑ ๋๋ฌธ์ด๋ค.
Q. DL์ด๋?
- dependency lookup์ด๋ฉฐ, ์์กด์ฑ ์กฐํ
- ํ์ํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ปจํ
์ด๋์์๊บผ๋ด ์ฌ์ฉํ๋ ๋ฐฉ์
์์
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Service service = context.getBean(Service.class);
Q. DI์ DL ๋น๊ต
- ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์
(ํ๋ ์์ฃผ๋) โ DI
- ์์กด ๊ฐ์ฒด๋ฅผ ์ง์ ์กฐํ(๊ฐ๋ฐ์ ์ฃผ๋) โ DL
- DI๊ฐ ๊ถ์ฅ๋๋ฉฐ ๊ฒฐํฉ๋๋ฎ๊ณ , ํ
์คํธ์ฑ๋๋ค.
Q. AOP๋?
- aspect-oriented-programming, ๊ด์ ์งํฅํ๋ก๊ทธ๋๋ฐ
- ๊ณตํต์ ์ธ ๊ธฐ๋ฅ(ํธ๋์ญ์
, ๋ก๊น
) ๊ณผ ํต์ฌ๋น์ฆ๋์ค๋ก์ง์ ๋ถ๋ฆฌํด ๋ชจ๋ํ ํ๋ ๊ฐ๋
- ๋์
๋ชฉ์ ์ ์ค๋ณต๋๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ชจ๋ํํด ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ์ ์ง๋ณด์๋ฅผ ํฅ์ํ๊ธฐ ์ํจ์ ์๋ค.
- AOPย ๊ฐ๋
์ย ์ ์ฉํ๋ฉดย ํต์ฌ๊ธฐ๋ฅย ์ฝ๋ย ์ฌ์ด์ย ๋ผ์ด์๋ย ๋ถ๊ฐ๊ธฐ๋ฅ์ย ๋
๋ฆฝ์ ์ธย ์์๋กย ๊ตฌ๋ถํดย ๋ผย ์ย ์๊ณ ,
- ์ด๋ ๊ฒย ๊ตฌ๋ถ๋ย ๋ถ๊ฐ๊ธฐ๋ฅย Aspect๋ย ๋ฐํ์ย ์์ย ํ์ํย ์์น์ย ๋์ ์ผ๋กย ์ฐธ์ฌํ๊ฒย ํ ย ์ย ์๋ค.
Q. AOP๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์ ?
- AOP๋ ์ค๋ณต ์ ๊ฑฐ, ํต์ฌ ๋ก์ง๊ณผ ๋ถ๊ฐ ๋ก์ง์ ๋ถ๋ฆฌ, ์ ์ง๋ณด์์ฑ ํฅ์์ํจ๋ค.
- ํธ๋์ญ์
, ๋ก๊น
, ๋ณด์ ๊ฐ์ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
1. ๊ณตํต ๊ธฐ๋ฅ(ํก๋จ ๊ด์ฌ์ฌ)์ ๋ชจ๋ํํ ์ ์๋ค
ํธ๋์ญ์
์ฒ๋ฆฌ, ๋ก๊น
, ๋ณด์ ๊ฒ์ฌ ๋ฑ ์ฌ๋ฌ ํด๋์ค์์ ๋ฐ๋ณต๋๋ ๋ก์ง์ ํ๋์ ๊ณตํต ๋ชจ๋๋ก ์ ์ ๊ฐ๋ฅ
โ ์ฝ๋ ์ค๋ณต ์ ๊ฑฐ, ์ค์์ง์ค์ ๊ด๋ฆฌ ๊ฐ๋ฅ
2. ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ค ๊ฐ๋ฅ
ํต์ฌ ๋ก์ง์์ ๋ถ์์ ์ธ ๊ธฐ๋ฅ(๋ก๊น
, ๋ณด์ ๋ฑ)์ ์ ๊ฑฐํ๊ณ ์์ํ ๋น์ฆ๋์ค ๋ก์ง๋ง ๋จ๊ธธ ์ ์์
โ ์ฝ๋ ๊ฐ๋
์ฑ โ, ์ ์ง๋ณด์์ฑ โ
3. ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ (Separation of Concerns)
ํต์ฌ ๋ก์ง๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์์ค์ฝ๋์ ์์ง๋๋ ๋์ด๊ณ , ๊ฒฐํฉ๋๋ ๋ฎ์ถ ์ ์์
๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น ์ค SRP(๋จ์ผ ์ฑ
์ ์์น) ์คํ์ ๋์
4. ๋ณ๊ฒฝ์ ์ ์ฐํด์ง
๋ถ๊ฐ๊ธฐ๋ฅ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ก์ง ์์ ์ ํต์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์์ด๋ ์์ ๊ฐ๋ฅ
5. ์ ์ธ์ ํธ๋์ญ์
์ฒ๋ฆฌ ๊ฐ๋ฅ
@Transactional ํ๋๋ง ๋ถ์ฌ๋ ํธ๋์ญ์
begin/commit/rollback ๊ด๋ฆฌ ๊ฐ๋ฅ
์ฝ๋์ ๋ช
์์ ์ผ๋ก try-catch๋ก ํธ๋์ญ์
์ฒ๋ฆฌํ ํ์ ์์
์์: AOP๊ฐ ์์ ๋ vs ์์ ๋
- AOP ์์ ๋ (๋ชจ๋ ์๋น์ค์ ๋ก๊น
์ฝ์
)
public void transferMoney() {
long start = System.currentTimeMillis();
try {
// ์ค์ ๋ก์ง
} finally {
log.info("์คํ ์๊ฐ: {}", System.currentTimeMillis() - start);
}
}
@LogExecutionTime
public void transferMoney() {
// ์ค์ ๋ก์ง๋ง ๋จ๊น
}
โ ๋ก๊น
๊ธฐ๋ฅ์ ๋ณ๋ Aspect๋ก ๋ถ๋ฆฌ๋จ
Q. PSA
- portable service abstraction
- ์ผ๊ดํ๋ ์ถ์ํ ์ ๊ณต, ์ค์ ๋ก ๋ค๊ณ ๋ค๋์๋ ์์ง๋ง ๊ทธ์ ๋๋ก ์ถ์ํ๋์ด ์๋ค
- JDBC, JPA, JMS ๋ฑ ์ฌ๋ฌ ๊ธฐ์ ์ Spring์ด ์ถ์ํ๋์ด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ตฌ์กฐ
- ๊ธฐ์ ์ด ๋ฐ๋๋๋ผ๋ ์ฝ๋์ ๋ณ๊ฒฝ์ด ์ต์ํ๋๋ค.

- ์๋ฅผ ๋ค์ด JDBC๋ฅผ ์ฌ์ฉํ๋ DatasourceTransactionManager, JPA๋ฅผ ์ฌ์ฉํ๋ JPATransactionManager, Hibernate๋ฅผ ์ฌ์ฉํ๋ HibernateTransactionManager๋ฅผ ์ ์ฐํ๊ฒ ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์๋ค.