[Spring] IoC, DI, DL, AOP, PSA*

[verify$y]ยท2025๋…„ 5์›” 26์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
5/16

๐Ÿ’ก Spring ํ•ต์‹ฌ ๊ฐœ๋… ์ธํ„ฐ๋ทฐ Q&A

์œ„ ๊ฐœ๋… ์„ค๋ช…์— ์•ž์„œ beanFactory๋ฅผ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค.

Q.BeanFactory๋ž€?

  • BeanFactory๋Š” ์Šคํ”„๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค์ด์ž ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.
  • ๋นˆ(๊ฐ์ฒด)์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ์ฃผ์ž…(DI)๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ,์ง€์—ฐ๋กœ๋”ฉ(lazy loading)๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํŠน์ง•

  • ์ธํ„ฐํŽ˜์ด์Šค, getBean()์œผ๋กœ ํ˜ธ์ถœํ• ๋•Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
  • AOP์—†์Œ
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ApplicationContext์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋‚ด๋ถ€์—์„œ ์ƒ์†๋ฐ›์•„ beanFactory๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


Q.IoC๋ž€?

  • Inversion of Control์˜ ์•ฝ์ž์ด๋ฉฐ ์ œ์–ด์˜ ์—ญ์ „
  • ๊ฐ์ฒด ์ƒ์„ฑ, ์˜์กด์„ฑ ์„ค์ • ์ œ์–ด๊ถŒ์„ ์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ€์ง, ์›๋ž˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์ง€๋Š”๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๋ฏ€๋กœ โ€˜์ œ์–ด์˜ ์—ญ์ „โ€™์ด๋ผ ์นญํ•œ๋‹ค.

์˜ˆ์‹œ

// ๊ธฐ์กด ๋ฐฉ์‹ (์ง์ ‘ ์ƒ์„ฑ)
Service svc = new ServiceImpl();

// IoC ์ ์šฉ ๋ฐฉ์‹ (Spring์ด ์ƒ์„ฑ ๋ฐ ์ฃผ์ž…)
@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);
    }
}
  • AOP ์žˆ์„ ๋•Œ
@LogExecutionTime
public void transferMoney() {
    // ์‹ค์ œ ๋กœ์ง๋งŒ ๋‚จ๊น€
}
โ†’ ๋กœ๊น… ๊ธฐ๋Šฅ์€ ๋ณ„๋„ Aspect๋กœ ๋ถ„๋ฆฌ๋จ



Q. PSA

  • portable service abstraction
  • ์ผ๊ด€ํ™”๋œ ์ถ”์ƒํ™” ์ œ๊ณต, ์‹ค์ œ๋กœ ๋“ค๊ณ ๋‹ค๋‹์ˆ˜๋Š” ์—†์ง€๋งŒ ๊ทธ์ •๋„๋กœ ์ถ”์ƒํ™”๋˜์–ด ์žˆ๋‹ค
  • JDBC, JPA, JMS ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์„ Spring์ด ์ถ”์ƒํ™”๋˜์–ด ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ
  • ๊ธฐ์ˆ ์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์ด ์ตœ์†Œํ™”๋œ๋‹ค.


  • ์˜ˆ๋ฅผ ๋“ค์–ด JDBC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” DatasourceTransactionManager, JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” JPATransactionManager, Hibernate๋ฅผ ์‚ฌ์šฉํ•˜๋Š” HibernateTransactionManager๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
profile
welcome

0๊ฐœ์˜ ๋Œ“๊ธ€