Post

โ›“๏ธ 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.