0418 ~ 0424


# 0418 ~ 0424

# 0418 - ํผ์‚ฌ๋“œ ํŒจํ„ด(Facade Pattern)

# ํผ์‚ฌ๋“œ ํŒจํ„ด์ด๋ž€

์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ์ƒ์œ„ ์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํŒจํ„ด

ํผ์‚ฌ๋“œ ํŒจํ„ด(Facade Pattern)์€ ๊ตฌ์กฐํŒจํ„ด(Structural Pattern)์˜ ํ•œ ์ข…๋ฅ˜๋กœ, ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์˜ ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๋Š” ๋‹จ์ˆœํ™”๋œ ์ƒ์œ„ ์ˆ˜์ค€์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค ์‚ฌ์ด์˜ ์ข…์†์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

# ๊ตฌ์กฐ ํŒจํ„ด(Structural Pattern)

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

  • ์ ์‘์ž ํŒจํ„ด(Adapter)
  • ๊ฐ€๊ต ํŒจํ„ด(Bridge)
  • ๋ณตํ•ฉ์ฒด ํŒจํ„ด(Composite)
  • ์žฅ์‹์ž ํŒจํ„ด(Decorator)
  • ํผ์‚ฌ๋“œ ํŒจํ„ด(Facade)
  • ํ”Œ๋ผ์ด๊ธ‰ ํŒจํ„ด(Flyweight)
  • ํ”„๋ก์‹œ ํŒจํ„ด(Proxy)

# ๊ตฌ์„ฑ

image

  • Facade : ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด์— ์ „๋‹ฌํ•˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ผ๊ด€๋œ ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค
  • Subsystem Classes : Facade์— ๋Œ€ํ•ด ์ •๋ณด๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค

# ํผ์‚ฌ๋“œ ํŒจํ„ด ์˜ˆ์ œ

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

# Facade

public class GoOffice {

    public void goToWork() {
        Wash wash = new Wash();
        Breakfast breakfast = new Breakfast();
        Move move = new Move();

        wash.brushTeeth();
        wash.shower();
        breakfast.eat();
        breakfast.water();
        move.bus();
    }
}

# Subsystem Classes

public class Wash {

    public void brushTeeth() {
        System.out.println("Brush my teeth");
    }

    public void shower() {
        System.out.println("Take a shower");
    }
}
public class Breakfast {

    public void eat() {
        System.out.println("Have breakfast");
    }

    public void water() {
        System.out.println("Drink water");
    }
}
public class Move {

    public void bus() {
        System.out.println("Take the bus");
    }
}

# ํŠน์ง•

  • ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ์ฝ”๋“œ๋ฅผ ๋ชจ๋ฅด๋”๋ผ๊ณ  Facade ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์„œ๋ธŒ ํด๋ž˜์Šค ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ : Facade ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€, ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ• ์ง€ ์„ ํƒ ๊ฐ€๋Šฅ

# 0422 - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ(Application Context)

# ApplicationContext๋ž€?

Spring์—์„œ๋Š” ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ • ๊ฐ™์€ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” IoC(Inversion of Control) ์ปจํ…Œ์ด๋„ˆ์ธ ๋นˆ ํŒฉํ† ๋ฆฌ(Bean Factory)๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ • ์™ธ์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋นˆ ํŒฉํ† ๋ฆฌ๋ฅผ ์ƒ์†๋ฐ›์•„ ํ™•์žฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ๋ณ„๋„์˜ ์„ค์ • ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ  IoC๋ฅผ ์ ์šฉํ•˜์—ฌ ๋นˆ์˜ ์ƒ์„ฑ, ๊ด€๊ณ„์„ค์ • ๋“ฑ์˜ ์ œ์–ด ์ž‘์—…์„ ์ด๊ด„ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์—๋Š” ์ง์ ‘ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๊ณ , ๊ทธ๋Ÿฐ ์ƒ์„ฑ ์ •๋ณด์™€ ์—ฐ๊ด€๊ด€๊ณ„ ์ •๋ณด์— ๋Œ€ํ•œ ์„ค์ •์„ ์ฝ์–ด ์ฒ˜๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด @Configuration๊ณผ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋Œ€ํ‘œ์ ์ธ IoC์˜ ์„ค์ •์ •๋ณด์ด๋‹ค.

ApplicationContext๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•œ๋‹ค. ApplicationContext๋Š” BeanFactory ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ฆ‰, ApplicationContext๋Š” BeanFactory์— ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค. BeanFactory๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์Šคํ”„๋ง ๋นˆ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ApplicationContext๋Š” BeanFactory + ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ(๊ตญ์ œํ™” ๊ธฐ๋Šฅ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ จ ์ฒ˜๋ฆฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ, ๋ฆฌ์†Œ์Šค ์กฐํšŒ)์„ ๊ฐ€์ง„๋‹ค. ์ •ํ™•ํžˆ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ถ€๋ฅผ ๋•Œ, BeanFactory, ApplicationContext๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ๋งํ•˜์ง€๋งŒ, BeanFactory๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ApplicationContext๊ฐ€ BeanFactory์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ApplicationContext์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ๋Š”๋ฐ, ๊ตฌํ˜„์ฒด์— ๋”ฐ๋ผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ XML์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ณ , ์ž๋ฐ” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๋นˆ ๋“ฑ๋ก์„ BeanDefinition์œผ๋กœ ์ถ”์ƒํ™”ํ•ด์„œ ์ƒ์„ฑ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. XML๋กœ ํ•˜๋“ , ์ž๋ฐ”๋กœ ํ•˜๋“  BeanDefinition์ด ์ƒ์„ฑ๋œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—๋Š” ๋นˆ ์ €์žฅ์†Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋นˆ ์ €์žฅ์†Œ๋Š” key๋กœ ๋นˆ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, value๋กœ ์‹ค์ œ ๋นˆ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นˆ์„ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋นˆ์„ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ๋ฉด์„œ ๊ธฐ์กด ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ๋ฌธ์ œ์ (์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๊ตฌํ˜„์„ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผํ•จ, ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กด, ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง etc)์€ ์—†์–ด์ง€๊ณ , ์‹ฑ๊ธ€ํ†ค์˜ ์žฅ์ (๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”์—†์ด ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.)๋งŒ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

# ๋นˆ(Bean) ์š”์ฒญ ์‹œ ์ฒ˜๋ฆฌ ๊ณผ์ •

ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•ด๋‹น ๋นˆ์„ ์š”์ฒญํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋นˆ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. ApplicationContext๋Š” @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค๋“ค์„ ์„ค์ • ์ •๋ณด๋กœ ๋“ฑ๋กํ•ด๋‘๊ณ , @Bean์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ๋นˆ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•œ๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ๋นˆ์„ ์š”์ฒญํ•œ๋‹ค.
  3. ApplicationContext๋Š” ์ž์‹ ์˜ ๋นˆ ๋ชฉ๋ก์—์„œ ์š”์ฒญํ•œ ์ด๋ฆ„์ด ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค.
  4. ApplicationContext๋Š” ์„ค์ • ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋นˆ ์ƒ์„ฑ์„ ์š”์ฒญํ•˜๊ณ , ์ƒ์„ฑ๋œ ๋นˆ์„ ๋Œ๋ ค์ค€๋‹ค.

image

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํƒ์ŠคํŠธ๋Š” @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค๋“ค์„ ์„ค์ • ์ •๋ณด๋กœ ๋“ฑ๋กํ•ด๋‘๊ณ , @Bean์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ๋นˆ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ๋นˆ์„ ์š”์ฒญํ•œ๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ์ž์‹ ์˜ ๋นˆ ๋ชฉ๋ก์—์„œ ์š”์ฒญํ•œ ์ด๋ฆ„์ด ์žˆ๋Š”์ง€ ์ฐพ๊ณ , ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋นˆ ์ƒ์„ฑ ๋ฉ”์†Œ๋“œ(@Bean)์„ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋Œ๋ ค์ค€๋‹ค. (๊ตฌ์ฒด์ ์œผ๋กœ๋Š” Spring ๋‚ด๋ถ€์—์„œ Reflection API๋ฅผ ์ด์šฉํ•ด ๋นˆ ์ •์˜์— ๋‚˜์˜ค๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋นˆ ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค.)

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์˜ ์žฅ์ 

# - ํด๋ผ์ด์–ธํŠธ๋Š” @Configuration์ด ๋ถ™์€ ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.

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

# - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋Š” ์ข…ํ•ฉ IoC ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.

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

# - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋นˆ ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋นˆ ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•˜์—ฌ, ๋นˆ์˜ ์ด๋ฆ„์ด๋‚˜ ํƒ€์ž… ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์„ค์ • ๋“ฑ์œผ๋กœ ๋นˆ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋นˆ์„ ์ง์ ‘ ์ฐพ๋Š” ๋ฐฉ์‹์€ ์˜์กด์„ฑ ๊ฒ€์ƒ‰(dependency lookup)์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.

# ์ž๋ฐ” ์„ค์ • ํด๋ž˜์Šค๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑํ•˜๊ธฐ

์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ž๋ฐ” ํฌ๋ž˜์Šค๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“  ์˜ˆ์‹œ์ด๋‹ค.

@Configuration
public class AppConfig {

    @Bean
    public StationService stationService() {
        return new StationServiceImpl(stationRepository());
    }
    
    @Bean
    public StationRepository stationRepository() {
        return new MemoryStationRepository();
    }
    
    @Bean
    // ...

}

new AnnotationConfigApplicationContext()๋ฅผ ํ†ตํ—ค ์ž๋ฐ” ๊ธฐ๋ฐ˜ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค. ๊ทธ๋Ÿผ ๋น„์–ด์žˆ๋Š” ๋นˆ ์ €์žฅ์†Œ๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด๋•Œ ๋งŒ๋“ค์–ด ๋‘” ์ž๋ฐ” ์„ค์ • ํฌ๋ž˜์Šค๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค˜์„œ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋Ÿผ ์ž๋ฐ” ์„ค์ • ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ @Bean ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋นˆ ์ €์žฅ์†Œ์— ์‹ค์ œ ๋นˆ์„ ๋“ฑ๋กํ•œ๋‹ค.

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

์‚ฌ์šฉํ•  ๋•, ๋นˆ ๋“ฑ๋ก ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

StationService stationService = applicationContext.getBean("stationService", StationService.class);

# 0424 - ์Šคํ”„๋ง(Spring)์˜ ์‹ฑ๊ธ€ํ†ค(Singleton)

# ์Šคํ”„๋ง์—์„œ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๋“ฑ๋ก๋œ ๋นˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ์ฆ‰, ์Šคํ”„๋ง์— ์—ฌ๋Ÿฌ ๋ฒˆ์„ ์š”์ฒญํ•˜๋”๋ผ๋„ ๋งค๋ฒˆ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋Œ๋ ค์ค€๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ๊ธ‹ํŠธ๊ฐ€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋นˆ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ด์œ ๋Š” ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
์Šคํ”„๋ง์€ ์ตœ์ดˆ์— ์„ค๊ณ„๋  ๋•Œ ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ์˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์•ˆ๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ์—๋”ฐ๋ผ ๊ณ„์ธต์ ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ(Controller, Service, Repository ๋“ฑ)๊ฐ€ ๋‚˜๋‰˜์–ด์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋งค๋ฒˆ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋ฌด๋‹ค ๊ฐ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋นˆ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์š”์ฒญ 1๋ฒˆ์— 5๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด ์ง„๋‹ค๊ณ  ํ•˜๊ณ , 1์ดˆ์— 500๋ฒˆ ์š”์ฒญ์ด ์˜จ๋‹ค๊ณ  ํ•˜๋ฉด ์ดˆ๋‹น 2500๊ฐœ์˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์•„๋ฌด๋ฆฌ GC์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„์กŒ๋‹ค ํ•˜๋”๋ผ๋„ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ๊ฐ๋‹น์ด ํž˜๋“ค ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋นˆ์„ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋กœ ๊ด€๋ฆฌํ•˜์—ฌ 1๊ฐœ์˜ ์š”์ฒญ์ด ์™”์„ ๋•Œ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋นˆ์„ ๊ณต์œ ํ•ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

# ์Šคํ”„๋งใ…‡์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค์˜ ์žฅ์ 

  • private ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
  • ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹ฑ๊ธ€ํ†ค์ด 1๊ฐœ๋งŒ ์ƒ์„ฑ๋จ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ „์—ญ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์Šคํ”„๋ง์€ ์ง์ ‘ ์‹ฑ๊ธ€ํ†ค ํ˜•ํƒœ์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(Singleton Registry)์ด๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ฑ๊ธ€ํ†ค์„ ์ƒ์„ฑํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๊ณ  ๊ณต๊ธ‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ธฐ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์‹ฑ๊ธ…ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • static ๋ฉ”์†Œ๋“œ๋‚˜ private ์ƒ์„ฑ์ž ๋“ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ๊ฐ์ฒด์ง€ํ–ฅ์  ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค.

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

Last update: September 13, 2022 21:44
Contributors: ahnjs