Spring Framework

Spring Framework

Spring Framework ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ์˜์กด์„ฑ ์ฃผ์ž…(dependency injection) - ๋ชจ๋“ˆ ๊ฒฐํ•ฉ ์šฉ์ด(Maven : build ํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํˆด)
  • ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ(transaction management) - JAVA EE์—์„œ๋„ ์ œ๊ณต

์›น์„ ์œ„ํ•œ Spring Framework ๋ชจ๋“ˆ

Spring์„ ์ด์šฉํ•œ ์›น๊ฐœ๋ฐœ ์‹œ ์ฃผ์š” ๋ชจ๋“ˆ์€ ์•„๋ž˜ 3๊ฐ€์ง€์ผ ๊ฒƒ์ด๋‹ค.

MVC

  • Model, View, Controller ๋ฐฉ์‹์˜ ์›น ๊ฐœ๋ฐœ ํŒจํ„ด๋“ค ์ค‘ ํ•˜๋‚˜

  • DI(Dependency Injection)
  • ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋ ฅ

ํŠธ๋žœ์žญ์…˜

  • ๊ฐ์ข… ์„œ๋น„์Šค ๊ณ„์ธต์„ ๋‚˜๋ˆ  ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๊ฒฝ์šฐ, ๊ทธ๋“ค๊ฐ„์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ด€๊ณ„์— ๋‹จ์ผ ํŠธ๋žœ์žญ์…˜์„ ์ œ๊ณต

  • AOP(Aspect Oriented Programming)

์ธ์ฆ๊ณผ ๊ถŒํ•œ

  • ์›น์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ๊ณผ ๊ถŒํ•œ

  • Servlet Filter

๊ทธ๋ ‡๋‹ค๋ฉด Spring Framework์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ  ์‹œ์ž‘ํ•˜์ž.


๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋ ฅ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค

Spring์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•˜์—ฌ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋ ฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ Interface์™€ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋ ฅ์— ๋Œ€ํ•˜์—ฌ ์ดํ•ดํ•ด ๋ณด์ž.

์šฐ์„  Interfaceํด๋ž˜์Šค๋ฅผ ์•Œ๊ธฐ ์ „์— ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง• ์ค‘ ์ƒ์†์˜ ๊ฐœ๋…๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ  ์˜ค๊ธธ ๋ฐ”๋ž€๋‹ค.

Interface์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜๋งŒ ํ•ด๋†“๊ณ , ์ด Interface๋ฅผ implements๋กœ ์ƒ์†๋ฐ›์€ Class์—์„œ Interface์˜ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Class๋งŒ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

์˜ˆ๋กœ ํ•œ๊ตญ์ธ์„ ์œ„ํ•œ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ณธ๋‹ค. ์—ฌ๋Ÿฌ ์–ธ์–ด๋“ค์— ๋Œ€ํ•œ ๋ฒˆ์—ญ ํด๋ž˜์Šค๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค.

// ํ•œ๊ตญ์–ด - ์˜์–ด
public class EnglishTrans {
    public String koreanToEnglish(String str) {
        //TODO: ํ•œ๊ตญ์–ด๋ฅผ ์˜์–ด๋กœ ๋ฒˆ์—ญ
    }
    public String englishToKorean(String str) {
        //TODO: ์˜์–ด๋ฅผ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ
    }
}

// ํ•œ๊ตญ์–ด - ์ค‘๊ตญ์–ด
public class ChineseTrans {
    public String koreanToChinese(String str) {
        //TODO: ํ•œ๊ตญ์–ด๋ฅผ ์ค‘๊ตญ์–ด๋กœ ๋ฒˆ์—ญ
    }
    public String chineseToKorean(String str) {
        //TODO: ์ค‘๊ตญ์–ด๋ฅผ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ
    }
}

์˜์–ด์™€ ์ค‘๊ตญ์–ด์— ๋Œ€ํ•œ 2๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ๋งŒ๋“ค์–ด ์กŒ๋‹ค.

์ด์ œ ์œ„ ํด๋ž˜์Šค๋“ค์„ ์‚ฌ์šฉํ•ด ๋ณด์ž. ๋จผ์ € ์˜์–ด ๋ฒˆ์—ญ์ด๋‹ค.

// ์˜์–ด ๋ฒˆ์—ญ
EnglishTrans trans = new EnglishTrans();
String str = trans.koreanToEnglish(str);

์ด๋ฒˆ์—” ์ค‘๊ตญ์–ด๋กœ ๊ณ ์ณ์ฃผ๊ณ  ์‹ถ๋‹ค

// ์ค‘๊ตญ์–ด ๋ฒˆ์—ญ
ChineseTrans trans = new ChineseTrans();
String str = trans.koreanToChinese(str);

์œ„์™€ ๋‘ ๊ฐ์ฒด ์„ ์–ธ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๊ฐ์ฒด์˜ ํƒ€์ž…๋„ ๋ฐ”๋€Œ์–ด ์ง„๋‹ค. ๋ฌผ๋ก  ์—ฌ๊ธฐ์— ๊ธฐ๋Šฅ์  ๋ฌธ์ œ๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์ œ๋‚˜ ๊ฐœ๋ฐœ์€ ๋งŒ๋“ ๋‹ค๊ณ  ๋‹ค๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋งŒ๋“ค ๋•Œ์˜ ํšจ์œจ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ดํ›„์˜ ์œ ์ง€๋ณด์ˆ˜ ์ž‘์—…์„ ์ƒ๊ฐํ•˜๋ฉฐ ๊ฐœ๋ฐœ์„ ํ•ด์•ผํ•œ๋‹ค.

๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ํ˜‘์—…์„ ํ•˜์—ฌ ๊ฐ์ž ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๋Š” ๋” ์‹ฌ๊ฐํ•ด์ง„๋‹ค. ๊ฐ์ž์˜ ์Šคํƒ€์ผ๋Œ€๋กœ ๊ฐœ๋ฐœ์„ ํ•˜์—ฌ ํด๋ž˜์Šค๋ช…, ๋ฉ”์„œ๋“œ๋ช…, ๊ฐ์ฒด๋ช…์ด ๋ชจ๋‘ ์ œ๊ฐ๊ฐ์ธ ๋“ฑ ํ†ต์ผ์„ฑ์ด ์—†์–ด์ ธ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋“ฑ์ด ๋–จ์–ด์งˆ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ฝ”๋“œ์— ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”ํ•˜์—ฌ, ๊ฐœ๋ฐœ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‹ค.

Interface๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

์œ„ ์˜์–ด๋ฒˆ์—ญ, ์ค‘๊ตญ์–ด ๋ฒˆ์—ญ ๊ธฐ๋Šฅ ์ค‘ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์€ ํ•œ๊ตญ์–ด๋ฅผ ๋ฒˆ์—ญ, ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ Interface๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž

public interface Translation {
    // ํ•œ๊ตญ์–ด๋ฅผ ๋ฒˆ์—ญ
    public String translate(String str);
    // ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ
    public String translateInto(String str);
}

์ด์ œ ์ถ”์ƒํ™”ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ฐ ํด๋ž˜์Šค์—์„œ ์ƒ์†๋ฐ›์•„ ์„ธ๋ถ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

// ํ•œ๊ตญ์–ด - ์˜์–ด
public class EnglishTranslation implements Translation {
    @Override
    public String translate(String str) {
        //TODO: ํ•œ๊ตญ์–ด๋ฅผ ๋ฒˆ์—ญ
    }
    @Override
    public String translateInto(String str) {
        //TODO: ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ
    }
}

// ํ•œ๊ตญ์–ด - ์ค‘๊ตญ์–ด
public class ChineseTranslation implements Translation {
    @Override
    public String translate(String str) {
        //TODO: ํ•œ๊ตญ์–ด๋ฅผ ๋ฒˆ์—ญ
    }
    @Override
    public String translateInto(String str) {
        //TODO: ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญ
    }
}

ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

// ์˜์–ด ๋ฒˆ์—ญ
Translation trans = new EnglishTranslation();
String str = trans.translate(str);

// ์ค‘๊ตญ์–ด ๋ฒˆ์—ญ
Translation trans = new ChineseTranslation();
String str = trans.translate(str);

์ฝ”๋“œ๊ฐ€ ์ •๋ฆฌ๋˜๊ณ  ํ†ต์ผ์„ฑ ์žˆ์–ด์กŒ๋‹ค.

์ด์   ์‚ฌ์šฉํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์›ํ•˜๋Š” ์–ธ์–ด์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋งŒ ๊ณจ๋ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ์˜ ์žฌํ™œ์šฉ์ด ํ›จ์”ฌ ์šฉ์ดํ•ด์กŒ๋‹ค.

๋ฌผ๋ก  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ํ˜‘์—… ์‹œ์— ์„œ๋กœ ์‚ฌ์šฉํ•  ์ด๋ฆ„์— ๋Œ€ํ•ด ์•ฝ์†ํ•˜๊ณ , ์˜คํƒ€ ์กฐ์‹ฌํ•˜๊ณ  ํ•˜๋ฉด ๋ฌธ์ œ๋ ๊ฑด ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฐœ๋ฐœ ์‹œ ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ€๋ฉด ์ข€๋” ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

์ •๋ฆฌํ•˜์ž๋ฉด, Interface์˜ ์‚ฌ์šฉ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ํšจ์œจ์„ฑ : ์ฝ”๋“œ์˜ ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๊ณ , ์˜คํƒ€๊ฐ€ ์ค„์–ด ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ• ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ํ‘œ์ค€ํ™” : ํ˜‘์—… ์‹œ์— ์ตœ์†Œํ•œ์˜ ๊ทœ์•ฝ๋งŒ์œผ๋กœ ์ฝ”๋“œ์˜ ํ†ต์ผ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋ ฅ : ํด๋ž˜์Šค๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ ์ฝ”๋“œ์˜ ์ข…์†์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ๋„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.


IoC(Inversion of Control) ์ปจํ…Œ์ด๋„ˆ

์—ฌ๋Ÿฌ ๋ถ€ํ’ˆ๋“ค์„ ์ฃผ๋ฌธ์„œ์— ์ž…๋ ฅ์„ ํ•ด์„œ spring์— ์ œ๊ณต์„ ํ•˜๊ฒŒ๋˜๋ฉด, spring์€ ๊ทธ ์ฃผ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์กฐ๋ฆฝ์„ ํ•œ๋‹ค.

spring์—์„  ์ฃผ๋ฌธ์„œ์— ์ž…๋ ฅ๋œ ๋‚ด์šฉ๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋‹ด์„ ๊ทธ๋ฆ‡์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ ๊ทธ๋ฆ‡์ด ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. ์•ˆ์— ๋‚ด์šฉ๋งˆ๋‹ค ์ปจํ…Œ์ด๋„ˆ์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

Spring์—์„œ ์‚ฌ์šฉ๋˜๋Š” IoC๋ž€ ๊ฐ์ฒด๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์กฐ์ž‘ํ•  ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ฃผ์ž…๋ฐ›๋Š” ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋•Œ ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ์ž‘์—…์„ DI(์˜์กด์„ฑ ์ฃผ์ž…)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ทธ๋ฆผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

IoC Container๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ •, ์‚ฌ์šฉ, ์ œ๊ฑฐ ๋“ฑ์˜ ์ž‘์—…์„ ๋Œ€์‹  ํ•ด์ค€๋‹คํ•˜์—ฌ ๋ถ™์—ฌ์ง„ ์ด๋ฆ„์ด๋‹ค. ์ด๋•Œ, IoC Container์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์€ Bean ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. IoC Container๋Š” Bean์„ ์ €์žฅํ•œ๋‹ค๊ณ  ํ•˜์—ฌ, BeanFactory ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

undefined

IoC Container์„ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • IoC ์ปจํ…Œ์ด๋„ˆ๋Š” spring์—์„œ ์‚ฌ์šฉํ•˜๋Š” Bean ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์ฑ…์ž„์ง€๊ณ , ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.


DI(Dependency Injection)

๋ถ€ํ’ˆ์„ ์กฐ๋ฆฝํ•ด์ค€๋‹ค๊ณ  ์•Œ์•„๋‘๋ฉด ๋œ๋‹ค.

Setter Injection

Setter ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ข…์†์„ฑ ์ฃผ์ž…

B b = new B();
A a = new A();
a.setB(b);


Construnction Injection

์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ข…์†์„ฑ ์ฃผ์ž…

B b = new B();
A a = new A(b);


Method Injection

๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ข…์†์„ฑ ์ฃผ์ž…

B b = new B();
A a = new A();
a.customSet(b);

AOP(Aspect Oriented Programming)๋ž€?

๋ฐฉ๋ฒ•๋ก ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, spring์ด ๋„์›€์„ ์ค€๋‹ค.

OOP(Object Oriented Programming)๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ฃผ์—…๋ฌด๋ผ๋ฉด, AOP๋Š” ์ฃผ์—…๋ฌด์™€ ํ•จ๊ป˜, ๊ฐœ๋ฐœ์ž ๋˜๋Š” ์šด์˜์ž ๊ด€์ ์—์„œ์˜ ์—…๋ฌด๊นŒ์ง€ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

AOP๋ž€ OOP๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋กœ๊ทธ์ฒ˜๋ฆฌ, ๋ณด์•ˆ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด๋‹ค. ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ถ€๊ฐ€๋จ์œผ๋กœ์จ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ํŠน๋ณ„ํ•œ ๋ชจ๋“ˆ์ด๋‹ค. AOP๋Š” ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ Aspect๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ OOP๋ฅผ ๋ณด์™„ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

AOP ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ต์‹ฌ๊ธฐ๋Šฅ์˜ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆด ํ•„์š” ์—†์ด, ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”๋ถˆ์–ด ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค๊ฐ€ Aspect๋ฅผ ์žฌํ™œ์šฉํ•˜๋ฉฐ ๊ณตํ†ต ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

aop

Leave a comment