โ๏ธ Java Design-Pattern XVI - Facade
โ๏ธ Java Design-Pattern XVI - Facade
๐
ใJAVA ์ธ์ด๋ก ๋ฐฐ์ฐ๋ ๋์์ธ ํจํด : ์ฝ๊ฒ ๋ฐฐ์ฐ๋ GoF์ 23๊ฐ์ง ๋์์ธ ํจํดใ
๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Facade
ํจํด์ด๋?
- ํด๋น ํจํด์ ๋ณต์กํ๊ฒ ์ฝํ์ ๋์ ๋ถํ ์ธ๋ถ ๋ด์ฉ์ ์ ๋ฆฌํ์ฌ ๋์ ์์ค์ ์ธํฐํ์ด์คย
API
๋ฅผ ์ ๊ณตํ๋ค. - ์ฆ ์์คํ
์ธ๋ถ์ ๊ฐ๋จํ ์ธํฐํ์ด์คย
API
๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์์คํ ๋ด๋ถ์ ๊ฐ ํด๋์ค์ ์ญํ ๊ณผ ์์กด ๊ด๊ณ๋ฅผ ๊ณ ๋ คํ์ฌ ์ฌ๋ฐ๋ฅธ ์์๋ก ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
์์ ํ๋ก๊ทธ๋จ
- ์ฌ์ฉ์์ ์น ํ์ด์ง๋ฅผ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
- ์ด๋ฉ์ผ ์ฃผ์์์ ์ด๋ฆ์ ๊ตฌํ๋ย
Database
ย ํด๋์ค,ยHTML
ย ํ์ผ์ ์์ฑํ๋ยHtmlWriter
ย ํด๋์ค,ยFacade
ย ์ญํ ๋ก์ ๋์ ์์ค์ ์ธํฐํ์ด์คยAPI
๋ฅผ ์ ๊ณตํ๋ยPageMaker
๋ก ๊ตฌ์ฑ๋๋ค.
Database
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package pagemaker;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class Database {
private Database() {
}
public static Properties getProperties(String dbname) throws IOException {
String filename = dbname + ".txt";
Properties prop = new Properties();
prop.load(new FileReader(filename));
return prop;
}
}
/* maildata.txt */
// name@example.com=Kim dojun
// ...
- ํด๋น ํด๋์ค๋ย
Properties
์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์๊ณ ยgetProperties
ยstatic
ย ๋ฉ์๋๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์ป๋๋ค.
HtmlWriter
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package pagemaker;
import java.io.Writer;
import java.io.IOException;
public class HtmlWriter {
private Writer writer;
public HtmlWriter(Writer writer) {
this.writer = writer;
}
public void title(String title) throws IOException {
writer.write("<!DOCTYPE html>");
writer.write("<html>");
writer.write("<header>");
writer.write("<title>" + title + "</title>");
writer.write("</header>");
writer.write("<body>");
writer.write("\n");
writer.write("<h1>" + title + "</h1>");
writer.write("\n");
}
public void paragraph(String msg) throws IOException {
writer.write("<p>" + msg + "</p>");
writer.write("\n");
}
public void link(String href, String caption) throws IOException {
paragraph("<a href=\"" + href + "\">" + caption + "</a>");
}
public void mailto(String mailAddr, String userName) throws IOException {
link("mailto:" + mailAddr, userName);
}
public void close() throws IOException {
writer.write("</body>");
writer.write("</html>");
writer.write("\n");
writer.close();
}
}
- ์ธ์คํด์ค ์์ฑ ์ย
Writer
๋ฅผ ์ฃผ๊ณ ๊ทธยWriter
์ยHTML
์ ์ถ๋ ฅํ๋ค. - ์ ๋ชฉ, ๋จ๋ฝ, ๋งํฌ, ๋ฉ์ผ ์ฃผ์์ ๋งํฌ๋ฅผ ์ถ๋ ฅํ๋ ๋ฉ์๋์ ์ถ๋ ฅ์ ์ข ๋ฃํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- ํด๋น ํด๋์ค์๋ย
title
ย ๋ฉ์๋๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ถ๋ ฅํด์ผ ํ๋ ์ ์ฝ ์กฐ๊ฑด์ด ์์ผ๋ฉฐ, ์ฐฝ๊ตฌ๊ฐ ๋๋ยpageMaker
ย ํด๋์ค์์ ํด๋น ์ ์ฝ์ ์งํค๋๋ก ์์ฑ๋์ด ์๋ค.
PageMaker
ย ํด๋์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package pagemaker;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class PageMaker {
private PageMaker() {
}
public static void makeWelcomePage(String mailAddr, String fileName) {
try {
Properties mailProp = Database.getProperties("maildata");
String userName = mailProp.getProperty(mailAddr);
HtmlWriter writer = new HtmlWriter(new FileWriter(fileName));
writer.title(userName + "'s web page");
writer.paragraph("welcome to " + userName + "'s web page!");
writer.paragraph("Nice to meet you!");
writer.mailto(mailAddr, userName);
writer.close();
System.out.println(fileName + " is created for " + mailAddr + " (" + userName + ")");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Database
ย ํด๋์ค์ยHtmlWriter
ย ํด๋์ค๋ฅผ ์กฐํฉํ์ฌ ์ง์ ํ ์ฌ์ฉ์์ ์น ํ์ด์ง๋ฅผ ๋ง๋ ๋ค.- ์ด ํด๋์ค์์ ์ ์๋ย
public
ย ๋ฉ์๋๋ยmakeWelcomePage
ย ๋ฟ์ด๋ค. - ์ด ๋ฉ์๋์ ์ด๋ฉ์ผ ์ฃผ์์ ์ถ๋ ฅ ํ์ผ ์ด๋ฆ๋ง ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ๋ฉด ์น ํ์ด์ง๊ฐ ๋ง๋ค์ด ์ง๋ค.ย
HtmlWriter
ย ํด๋์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ณต์กํ ๋ถ๋ถ์ยPageMaker
ย ํด๋์ค๊ฐ ๋๋งก๊ณ , ์ธ๋ถ์๋ยmakeWelcomePage
ย ๋ฉ์๋๋ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค.- ์ฆ ํด๋น ํด๋์ค๊ฐ ๋จ์ํ ์ฐฝ๊ตฌ๊ฐ ๋๋ ๊ฒ์ด๋ค.
Main
ย ํด๋์ค
1
2
3
4
5
6
7
import pagemaker.PageMaker;
public class Main {
public static void main(String[] args) {
PageMaker.makeWelcomePage("name@example.com", "welcome.txt");
}
}
- ์์์ ์ธ๊ธํ๋ฏย
makeWelcomePage
ย ๋ฉ์๋๋ง ์คํํ๋ฉดยPageMaker
ย ํด๋์ค๊ฐ ๋ณต์กํ ๋ก์ง์ ๋๋งก์ ์ํํ๋ค.
Facade
ย ํจํด์ ๋ฑ์ฅ์ธ๋ฌผ
PageMaker
ย ํด๋์ค
- ๋์ ์์ค์ ๋จ์ ์ธํฐํ์ด์คย
API
๋ฅผ ์ ๊ณตํ๋ ๋จ์ ์ฐฝ๊ตฌ ์ญํ ์ ํ๋ค. - ์ฆย
Facade
ย ์ ๋ฉด ์ญํ ์ ๋งก์ ์ํํ๋ค.
Database
,ย HtmlWriter
ย ํด๋์ค
- ์ ๋ฉด ์ญํ ์ธ์ ๋ง์ ํด๋์ค๋ค์ ๊ฐ์์ ์ผ์ ์ํํ๋ค.ย
- ์ ๋ง์ ํด๋์ค๋ค์์ย
Facade
๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
Main
ย ํด๋์ค
- ํด๋น ํจํด์ ์ด์ฉํ๋ย
Client
ย ์๋ขฐ์ธ ์ญํ ์ ํ๋ค.
์ฑ ์์ ์ ๊ณตํ๋ ํํธ
Facade
์ ์ญํ ์ ๋ฌด์์ธ๊ฐ?
- ์ ๋ฉด ์ญํ ์ ๋ณต์กํ ๊ฒ์ ๋จ์ํ๊ฒ ๋ณด์ฌ์ค๋ค.
- ์ฆ ํ๋ก๊ทธ๋๋จธ๋ก ํ์ฌ๊ธ ๋ด๋ถ ๋์์ ์์ํ์ง ์์๋ ๋๊ฒ๋ ํด์ค๋ค.
- ํด๋น ํจํด์ ํต์ฌ์ ์ธํฐํ์ด์คย
API
ย ์๋ฅผ ์ค์ด๋ ๊ฒ์ด๋ค.ย - ํด๋์ค์ ๋ฉ์๋๊ฐ ๋ง์ด ๋ณด์ด๋ฉด ํ๋ก๊ทธ๋๋จธ๋ ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ์ง ๋ง์ค์ด๊ฒ ๋๊ณ , ํธ์ถ ์์๋ ์ฃผ์ํด์ผ ํ๋ค.
- ์ธํฐํ์ด์คย
API
์ ์๊ฐ ์ ๋ค๋ ๊ฒ์ ์ธ๋ถ์์ ๊ฒฐํฉ์ด ๋์จํ๋ค๊ณ ๋ ํ ์ ์๋ค. - ๊ฒฐํฉ์ด ๋์จํด์ง์๋ก ๋ถํ ์ฌ์ฌ์ฉ์ด ์ฌ์์ง๋ค.
- ํด๋์ค๋ฅผ ์ค๊ณํ ๋๋ ์ด๋ค ๋ฉ์๋๋ฅผย
public
์ผ๋ก ํ ์ง ์ ์๊ฐํด์ผ ํ๋ค. - ํด๋์ค๋ฅผ ์ธ๋ถ์ ๋ง์ด ๋ ธ์ถ์ํฌ์๋ก ๋ด๋ถ๋ฅผ ์์ ํ๊ธฐ ํ๋ค์ด์ง๋ค.
์ฌ๊ท์ ์ธย Facade
ย ํจํด์ ์ ์ฉ
- ์ ๋ฉด ์ญํ ์ ๋งก์ ํด๋์ค๋ฅผ ๋ชจ์ ์งํฉ์ ๋ง๋ค์ด ์๋ก์ด ์ ๋ฉด ์ญํ ์ ๋ง๋ค ์ ์๋ค.
- ์ฆย
Facade
ย ํจํด์ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ด๋ค. - ๋ง์ ํด๋์ค์ ํจํค์ง๋ฅผ ๊ฐ์ง ๋งค์ฐ ํฐ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ, ์์์์์ ํด๋น ํจํด์ ์ ์ฉํ๋ฉด ์์คํ ์ด ๋ ํธ๋ฆฌํด์ง๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐย Facade
๋ฅผ ๋ง๋ค์ง ์๋ ์ด์
- ๋ณต์กํ ๋ด๋ถ๋ฅผ ์์งํ ํ๋ก๊ทธ๋๋จธ๋ ํด๋น ํจํด์ ์ด์ฉํ์ง ์์ ์ ์๋ค.
- ์คํ๋ ค ๋ฌด์์ ์ค์ ํผํ๊ธฐ๋ ํ๋ค.
- ์๋ จ๋ ํ๋ก๊ทธ๋๋จธ์ ๋จธ๋ฆฟ์์๋ ์์คํ ๋ด์ฉ์ด ๋ชจ๋ ๋ค์ด ์์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ โ์๋ ์ฒโ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํ๋ค.
- ์ด๋ค ํ๋ก๊ทธ๋๋จธ๊ฐ โ์ด ํด๋์ค๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ด์ชฝ์ ๋จผ์ ํธ์ถํด์ผ์งโ๋ผ๊ณ ๋งํ๋ค๋ฉด ํด๋น ํจํด์ ๋์ ํ ํ์๊ฐ ์์์ ์์ฌํ๋ค.
- ๋ช ํํ๊ฒ ์ธ์ด๋ก ํํํ ์ ์๋ ๋ ธํ์ฐ๋ ํ๋ก๊ทธ๋๋จธ์ ๋จธ๋ฆฟ์์ด ์๋๋ผ ์ฝ๋๋ก ํํํด๋์ด์ผ ํ๋ค.
This post is licensed under CC BY 4.0 by the author.