๐ก ํผ์ฌ๋ ํจํด์ด๋?
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ, ํ๋ ์์ํฌ์ ๋ํ, ๋๋ ๋ค๋ฅธ ํด๋์ค๋ค์ ๋ณต์กํ ์งํฉ์ ๋ํ ๋จ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ ํด๋์ค์ ๋ฉ์๋๋ค์ด ์ด๋ค ๋ชฉ์ ์ ๋์์ธ์ง ์ดํดํ๊ธฐ ์ด๋ ค์ ๋ฐ๋ก ๊ฐ์ ธ๋ค ์ฐ๊ธฐ์๋ ๋์ด๋๊ฐ ๋์ ๋, ์ด์ ๋ํ ์ ์ ํ ๋ค์ด๋ฐ๊ณผ ์ ๋ฆฌ๋ฅผ ํตํด ์ฌ์ฉ์๋ก ํ์ฌ๊ธ ์ฝ๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฃฐ ์ ์๋๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
โญ ํผ์ฌ๋๋ ์์ง์ด๋ ๋ถ๋ถ์ด ๋ง์ด ํฌํจ๋ ๋ณต์กํ ํ์ ์์คํ ์ ๋ํ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํด๋์ค์ ๋๋ค.
๐ก ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋ณธ ํผ์ฌ๋ ํจํด
- ํผ์ฌ๋ ํจํด์ ์ฌ์ฉํ๋ฉด ํ์ ์์คํ ๊ธฐ๋ฅ๋ค์ ํน์ ๋ถ๋ถ์ ํธ๋ฆฌํ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ํ, ํผ์ฌ๋๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ด๋๋ก ๋ณด๋ด์ผ ํ๋์ง์ ์์ง์ด๋ ๋ชจ๋ ๋ถํ์ ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง๋ฅผ ์๊ณ ์์ต๋๋ค.
- ์ถ๊ฐ์ ์ธ ํผ์ฌ๋ ํด๋์ค๋ฅผ ์์ฑํ์ฌ ํ๋์ ํผ์ฌ๋๋ฅผ ๊ด๋ จ ์๋ ๊ธฐ๋ฅ๋ค๋ก ์ค์ผ์์ผ ๋ณต์กํ ๊ตฌ์กฐ๋ก ๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ํ์ ์์คํ ํด๋์ค๋ ์์ญ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ ํด๋์ค๋ค๋ก, ํผ์ฌ๋์ ์กด์ฌ๋ฅผ ์ธ์ํ์ง ๋ชปํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ํ์ ์์คํ ๊ฐ์ฒด๋ค์ ์ง์ ํธ์ถํ๋ ๋์ ํผ์ฌ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํผ์ฌ๋ ํจํด์ ์ ๋ต ํจํด์ด๋ ํฉํ ๋ฆฌ ํจํด๊ณผ ๊ฐ์ ์ฌํ ๋ค๋ฅธ ๋์์ธ ํจํด๊ณผ๋ ๋ค๋ฅด๊ฒํด๋์ค ๊ตฌ์กฐ๊ฐ ์ ํํ ๋์ง ์์ ํจํด์ ๋๋ค. ๋ฐ๋์ ํด๋์ค ์์น๋ ์ด๋ป๊ณ ์ด๋ค ํ์์ผ๋ก ์์์ ํด์ผ๋๊ณ ์ด๋ฐ๊ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฅ ํผ์ฌ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์ ์ ํ ๊ธฐ๋ฅ ์ง์ฝํ๋ง ํด์ฃผ๋ฉด ๊ทธ๊ฒ ๋์์ธ ํจํด์ด ๋๋ ๊ฒ์ ๋๋ค. (ํจํด์ด๋ผ๊ธฐ ๋ณด๋จ ๋ ผ๋ฆฌ์ ๊ฐ๊น์ต๋๋ค.)
๐ก ์ฌ๊ท์ ์ธ ํผ์ฌ๋ ํจํด
์ฌ๊ท์ ์ธ ํผ์ฌ๋๋, ์ถ๊ฐ์ ์ธ ์ฌ๋ ํด๋์ค๋ฅผ ๋งํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ํด๋์ค, ๋ค์์ ํจํค์ง๋ฅผ ํฌํจํ๊ณ ์๋ ํฐ ์์คํ ์ ์์ ์์๋ง๋ค ํผ์ฌ๋ ํจํด์ ์ฌ๊ธฐ ์ ๊ธฐ ์ ์ฉํ๊ณ ๋ค์ ๊ทธ ํผ์ฌ๋๋ฅผ ํฉ์น ํผ์ฌ๋๋ฅผ ๋ง๋๋ ์์ผ๋ก, ํผ์ฌ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ตฌ์ฑํ๋ฉด ์์คํ ์ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
[์์ ์ฝ๋]
class VideoFile
// …
class OggCompressionCodec
// …
class MPEG4CompressionCodec
// …
class CodecFactory
// …
class BitrateReader
// …
class AudioMixer
// …
// ํผ์ฌ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด ํ๋ ์์ํฌ์ ๋ณต์ก์ฑ์ ๊ฐ๋จํ ์ธํฐํ์ด์ค ๋ค์ ์จ๊ธธ ์ ์์ต๋๋ค.
public class VideoConversionFacade {
public File convertVideo(String fileName, String format) {
System.out.println("VideoConversionFacade: conversion started.");
VideoFile file = new VideoFile(fileName);
Codec sourceCodec = CodecFactory.extract(file);
Codec destinationCodec;
if (format.equals("mp4")) {
destinationCodec = new MPEG4CompressionCodec();
} else {
destinationCodec = new OggCompressionCodec();
}
VideoFile buffer = BitrateReader.read(file, sourceCodec);
VideoFile intermediateResult = BitrateReader.convert(buffer, destinationCodec);
File result = (new AudioMixer()).fix(intermediateResult);
System.out.println("VideoConversionFacade: conversion completed.");
return result;
}
}
// ์ ํ๋ฆฌ์ผ์ด์
ํด๋์ค๋ค์ ๋ณต์กํ ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ์๋ง์ ํด๋์ค์ ์์กดํ์ง ์์ต๋๋ค. ๋ํ ํ๋ ์์ํฌ์ ์ ํ์ ๊ฒฐ์ ํ ๊ฒฝ์ฐ์๋ ํผ์ฌ๋ ํด๋์ค๋ง ๋ค์ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
public class Demo {
public static void main(String[] args) {
VideoConversionFacade converter = new VideoConversionFacade();
File mp4Video = converter.convertVideo("youtubevideo.ogg", "mp4");
// ...
}
}
๐ก ๋ง๋ฌด๋ฆฌ
ํผ์ฌ๋ ํจํด์
- ์์คํ ์ด ๋๋ฌด ๋ณต์กํ ๋
- ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ณต์กํ ์์คํ ์ ์ ๊ทผํ๋๋ก ํ๊ณ ์ถ์ ๋
- ์์คํ ์ ์ฌ์ฉํ๊ณ ์๋ ์ธ๋ถ์ ๊ฒฐํฉ๋๊ฐ ๋๋ฌด ๋์ ์์กด์ฑ์ ๋ฎ์ถ๊ธฐ ์ํ ๋
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ณต์ก์ฑ์ ์ค์ด๊ณ ์์กด์ฑ์ ํ ๊ณณ์ผ๋ก ๋ชจ์ ์ ์์ด ์ข์ ๋ฐ๋ฉด, ํผ์ฌ๋๊ฐ ์ฑ์ ๋ชจ๋ ํด๋์ค์ ๊ฒฐํฉ๋ ‘์ ’ ๊ฐ์ฒด๊ฐ ๋ ์ ์๊ณ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๊ณต์๊ฐ ๋ ๋ง์ด ๋ค ์ ์์ต๋๋ค.