Search

ํ”„๋ก์‹œ ํŒจํ„ด

ํ”„๋ก์‹œ ํŒจํ„ด (Proxy Pattern)

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

์ฃผ์š” ๋ชฉ์ 

โ€ข
์‹ค์ œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ์–ด ๋ฐ ๋ณด์•ˆ ๊ฐ•ํ™”
โ€ข
๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ง€์—ฐ(lazy initialization)
โ€ข
์›๊ฒฉ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋กœ์ปฌ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
โ€ข
๊ฐ์ฒด ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋กœ๊น…์ด๋‚˜ ์บ์‹ฑ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

ํŠน์ง•

โ€ข
ํ”„๋ก์‹œ์™€ ์‹ค์ œ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
โ€ข
ํด๋ผ์ด์–ธํŠธ๋Š” ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์‹ค์ œ ๊ฐ์ฒด์— ์ ‘๊ทผ
โ€ข
์‹ค์ œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋น„์šฉ์ด ํฐ ๊ฒฝ์šฐ ํšจ๊ณผ์ 
โ€ข
๋ณด์•ˆ, ์บ์‹ฑ, ๋กœ๊น… ๋“ฑ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ์šฉ์ด

์˜ˆ์‹œ ์ฝ”๋“œ

// Subject ์ธํ„ฐํŽ˜์ด์Šค interface Image { void display(); } // RealSubject ํด๋ž˜์Šค class RealImage implements Image { private String filename; public RealImage(String filename) { this.filename = filename; loadFromDisk(); } private void loadFromDisk() { System.out.println("Loading " + filename); } public void display() { System.out.println("Displaying " + filename); } } // Proxy ํด๋ž˜์Šค class ProxyImage implements Image { private RealImage realImage; private String filename; public ProxyImage(String filename) { this.filename = filename; } public void display() { if (realImage == null) { realImage = new RealImage(filename); } realImage.display(); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ ์„ค๋ช…

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