Adapter ํจํด์ด๋?
์ธํฐํ์ด์ค๊ฐ ๋ง์ง ์๋ ๋ ๊ฐ์ฒด ์ฌ์ด๋ฅผ ์ค๊ฐ์์ “๋ณํ”ํด์ฃผ๋ ํจํด
“๋ณํ ์ด๋ํฐ” ์ญํ ์ ํ๋ ํด๋์ค
์ฝ๊ฒ ๋งํ๋ฉด,
๋ด๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ธฐ์กด ์ฝ๋๋ฅผ “๊ฐ์ธ์” ์ฐ๊ฒ ํด์ฃผ๋ ๊ตฌ์กฐ๋ค.
์ Adapter ํจํด์ด ํ์ํ ๊น?
1.๊ธฐ์กด ํด๋์ค๊ฐ ๋๋ฌด ๋ณต์กํ๊ฑฐ๋ ๋ถํธํ ๋
→ ex. Properties, InputStream, Thread ๋ฑ
2.๋ด๊ฐ ์ํ๋ ๋ฉ์๋ ์ด๋ฆ์ด๋ ๊ตฌ์กฐ์ ์๋ง์ ๋
→ ๋ฉ์๋ ์ด๋ฆ ๋ฐ๊พธ๊ฑฐ๋, ๊ธฐ๋ฅ์ ์กฐํฉํด์ ์ ์ธํฐํ์ด์ค๋ก ์ ๊ณตํ๊ณ ์ถ์ ๋
๊ตฌ์กฐ ์ดํด (ํด๋์ค ๋ช ์ ์์)
| ์ญํ | ์ด๋ฆ | ์ค๋ช |
| Target (ํ๊ฒ ์ธํฐํ์ด์ค) | ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ๋ํ๋ ์ธํฐํ์ด์ค | |
| 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๋ฅผ ํตํด ํจ์ฌ ๋ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ ์ข์ ์ฝ๋๋ฅผ ์งค ์ ์๋ค.