๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

Adapter ํŒจํ„ด์ด๋ž€?

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งž์ง€ ์•Š๋Š” ๋‘ ๊ฐ์ฒด ์‚ฌ์ด๋ฅผ ์ค‘๊ฐ„์—์„œ “๋ณ€ํ™˜”ํ•ด์ฃผ๋Š” ํŒจํ„ด
“๋ณ€ํ™˜ ์–ด๋Œ‘ํ„ฐ” ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด,
๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ “๊ฐ์‹ธ์„œ” ์“ฐ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ๋‹ค.

 

์™œ Adapter ํŒจํ„ด์ด ํ•„์š”ํ• ๊นŒ?

1.๊ธฐ์กด ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋ถˆํŽธํ•  ๋•Œ

→ ex. Properties, InputStream, Thread ๋“ฑ

 

2.๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ์™€ ์•ˆ๋งž์„ ๋•Œ

→ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ฑฐ๋‚˜, ๊ธฐ๋Šฅ์„ ์กฐํ•ฉํ•ด์„œ ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ

 

๊ตฌ์กฐ ์ดํ•ด (ํด๋ž˜์Šค ๋ช…์€ ์˜ˆ์‹œ)

์—ญํ•  ์ด๋ฆ„ ์„ค๋ช…
Target (ํƒ€๊ฒŸ ์ธํ„ฐํŽ˜์ด์Šค) Print ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
Adaptee (๊ธฐ์กด ํด๋ž˜์Šค) Banner ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งž์ง€ ์•Š๋Š” ๊ธฐ์กด ํด๋ž˜์Šค
Adapter PrintBanner Print ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ Banner ์‚ฌ์šฉ

 

์ฝ”๋“œ ์˜ˆ์ œ

Target ์ธํ„ฐํŽ˜์ด์Šค

public interface Print {
    void printWeak();
    void printStrong();
}

 

Adaptee ํด๋ž˜์Šค

public class Banner {
    private String string;

    public Banner(String string) {
        this.string = string;
    }

    public void showWithParen() {
        System.out.println("(" + string + ")");
    }

    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

 

Adapter ํด๋ž˜์Šค

public class PrintBanner implements Print {
    private Banner banner;

    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }

    public void printWeak() {
        banner.showWithParen(); // (Hello)
    }

    public void printStrong() {
        banner.showWithAster(); // *Hello*
    }
}

 

์‚ฌ์šฉ ์ฝ”๋“œ

public class Main {
    public static void main(String[] args) {
        Print p = new PrintBanner("Hello");
        p.printWeak();    // (Hello)
        p.printStrong();  // *Hello*
    }
}

Banner๋Š” ์›๋ž˜ showWith...() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ

printWeak(), printStrong()์ด๋ผ๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์“ฐ๊ณ  ์‹ถ์Œ. ๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์— PrintBanner๊ฐ€ ๋ฒˆ์—ญํ•ด์ฃผ๋Š” ์—ญํ• 

 

์‹ค๋ฌด์—์„œ Adapter๋Š” ์–ธ์ œ ์“ฐ์ด๋‚˜?

  • ๊ธฐ์กด ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ์“ฐ๋ ค๋Š” ์ฝ”๋“œ๋ž‘ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•ˆ ๋งž์„ ๋•Œ
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๊ฐ์Œ€ ๋•Œ (์˜ˆ: ์™ธ๋ถ€ API → ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ๊ธฐ)
  • ์Šคํ”„๋ง์—์„œ๋„ ๋งŽ์ด ์”€ → HandlerAdapter, WebMvcConfigurerAdapter

 

โ— ๊ทผ๋ฐ ์š”์ฆ˜์—๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์— Adapter๊ฐ€ ๋ถ™๋Š” ๊ฒฝ์šฐ๋Š” ๋งŽ์ด ์ค„์Œ.

Java 8์—์„œ default method ๊ธฐ๋Šฅ์ด ์ƒ๊น€

→ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ตฌํ˜„ํ•ด๋„ ๋ฉ”์„œ๋“œ ๋‹ค ๊ตฌํ˜„ ์•ˆ ํ•ด๋„ ๋จ
→ WebMvcConfigurerAdapter ๊ฐ™์€ ์ด๋ฆ„์ด ์‚ฌ๋ผ์ง

 

Spring์€ ํ™•์žฅ์„ฑ, ์œ ์—ฐ์„ฑ ์ค‘์‹œ → ์ „๋žต ํŒจํ„ด์ด๋‚˜ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์œผ๋กœ ๋งŽ์ด ํ•ด๊ฒฐ

 

ํด๋ž˜์Šค ์ด๋ฆ„ ์—ญํ•  ์™œ Adapter์ธ์ง€
HandlerAdapter ๋‹ค์–‘ํ•œ Controller ๋ฐฉ์‹ ์ฒ˜๋ฆฌ (ex. @Controller, HttpRequestHandler, Controller) ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ค ๋‹ค๋ฅธ ๋ฐฉ์‹์ด๋‹ˆ๊นŒ → ์ค‘๊ฐ„์—์„œ ๋งž์ถฐ์คŒ
MessageConverter HTTP ๋ฐ”๋”” <-> ์ž๋ฐ” ๊ฐ์ฒด ๋ณ€ํ™˜ (JSON, XML ๋“ฑ) JSON ํŒŒ์„œ์™€ ์ž๋ฐ” ๊ฐ์ฒด ๊ฐ„ ํ˜•์‹ ์–ด๋Œ‘ํ„ฐ ์—ญํ• 
WebMvcConfigurer Web ์„ค์ •์„ ๋‚ด ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ” ๋ผ์šฐ๊ฒŒ ํ•ด์คŒ ์„ค์ • ์ธํ„ฐํŽ˜์ด์Šค ↔ ๋‚ด ์„ค์ • ํด๋ž˜์Šค ์—ฐ๊ฒฐ
ResourceHttpRequestHandler ์ •์  ์ž์› ์ฒ˜๋ฆฌ๊ธฐ ์š”์ฒญ ↔ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ

 

์ž๋ฐ” ๊ธฐ๋ณธ ํด๋ž˜์Šค์—์„œ ์–ด๋Œ‘ํ„ฐ๋กœ ๊ฐ์‹ธ๊ธฐ ์ข‹์€ ๊ฒƒ๋“ค

ํด๋ž˜์Šค why?
Properties key-value ์ฝ๊ณ  ์“ฐ๊ธฐ ๋ถˆํŽธํ•จ
InputStream ๋ฐ”์ดํŠธ ๊ธฐ๋ฐ˜, ๋ฌธ์ž ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์‹ธ์•ผ ํŽธํ•จ
Thread ์ƒ์† ๋ฐฉ์‹ ๋ถˆํŽธ → Runnable๋กœ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์ข‹์Œ
Map ๋ฐ˜๋ณต๋ฌธ/์ •๋ ฌ ๋“ฑ ํ™•์žฅํ•˜๊ธฐ ์• ๋งคํ•จ
Socket ํ†ต์‹  ๋ฐฉ์‹ ์ถ”์ƒํ™”ํ•  ๋•Œ ์œ ์šฉ

 

๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

Adapter ํŒจํ„ด์€ ๋‹จ์ˆœํ•œ ๋””์ž์ธ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ “๋‚ด ์ฝ”๋“œ๋‹ต๊ฒŒ” ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฌด๊ธฐ๋‹ค.

 

์ž๋ฐ”์—์„œ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ๋งŽ์ด ์•Œ์ˆ˜๋ก,
Adapter๋ฅผ ํ†ตํ•ด ํ›จ์”ฌ ๋” ์œ ์—ฐํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•