12.1 ๋์์ธ ํจํด์ ๊ธฐ๋ณธ
12.1.1 ๋์์ธ ํจํด์ด๋?
์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ์์ฑ๋๋ ๊ฒ์ '๋ชฉ์ '๊ณผ '๊ฐ๋ฐ์'์ ๋ฐ๋ผ ์ฒ์ฐจ๋ง๋ณ์ด๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ ๊ฐ๊ฐ์ ๋ถํ๋จ์๋ก ์ดํด๋ณด๋ฉด ํ๋ก๊ทธ๋จ๋ง๋ค ๋น์ทํ ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
์๋ฅผ ๋ค์ด, '์ด๋ค ์ํ๊ฐ ๋ฐ๋์์ ๋ ๋ฐ์ํ๋ ํด๋์ค๊ตฐ ๋ง๋ค๊ธฐ'
'๋ค๋ฅธ ํ์ด ๋ง๋ ๋ถํ๊ณผ์ ์ค๊ฐ๋ฅผ ํ๋ ํด๋์ค ๋ง๋ค๊ธฐ',
'์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๋ฅผ ํด๋์ค๋ก ํํํ๊ธฐ'์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
์ด๋ฐ ๋น์ทํ ๋ชฉ์ ์ ๋ํด ํด๋์ค ๊ตฌ์กฐ์ ๋ชจ๋ฒ์ฌ๋ก๋ฅผ ํจํด์ผ๋ก ์ ๋ฆฌํ ๊ฒ์ด ๋์์ธ ํจํด์ด๋ค.
์ด ์ค ๊ฐ์ฅ ์ ๋ช ํ ๊ฒ์ด 'GoF ๋์์ธ ํจํด'์ด๋ฉฐ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋์์ด๋๋ ๋์์ธ ํจํด 23๊ฐ์ง๋ฅผ ์๊ฐํ๋ค.
23์ข ๋ฅ์ ํจํด์ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋ถ๋ฅ๋์ด ์๋ค.
- ๊ฐ์ฒด์ '์์ฑ'์ ๊ดํ ํจํด
- ํ๋ก๊ทธ๋จ์ '๊ตฌ์กฐ'์ ๊ดํ ํจํด
- ๊ฐ์ฒด์ 'ํ๋'์ ๊ดํ ํจํด
๋์์ธ ํจํด์ ์ฌ์ฉํ๋ฉด ์ข์์
1. ์ฌ์ฌ์ฉ์ฑ์ด ๋๊ณ ์ ์ฐ์ฑ ์๋ ์ค๊ณ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ณ ์๋ค์ด ์ ์ค๊ณํด๋ ํจํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ ์ฉํ๋ค.
2. ์์ฌ ์ํต์ด ์ฌ์์ง๋ค.
์์ฃผ ์ฌ์ฉํ๋ ํน์ ์ค๊ณ๋ฅผ ์ค๋ช ํ ๋ ๋ค๋ฅธ ๊ธฐ์ ์์๊ฒ ์ด๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ๋ง์ ๋ถ๊ฐ์ค๋ช ์ ํด์ผํ์ง๋ง 'ํจํด'์ ์๊ณ ์๋ค๋ฉด ์ด๋ฅผ ํตํด ์ํต์ด ๊ฐ๋ฅํ๋ค.
12.2 ์์ฑ์ ๊ดํ ํจํด
- ์์ฑ์ ๊ดํ ๋์์ธ ํจํด
AbstractFactory - ๊ด๋ จ๋ ์ผ๋ จ์ ์ธ์คํด์ค๋ฅผ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ ์ ๊ณต.
Builder - ๋ณตํฉํ๋ ์ธ์คํด์ค ์์ฑ ๊ณผ์ ์ ์ํํ๋ค.
Singleton - ํน์ ํด๋์ค์ ๋ํด ์ธ์คํด์ค๊ฐ ํ๋์์ ๋ณด์ฅ.
12.2.1 AbstractFactory ํจํด - ์ผ๋ จ์ ์ธ์คํด์ค๊ตฐ ๋ชจ์์ ์์ฑํ๊ธฐ
์ค์ ํ์ผ์ ๊ธฐ์ฌ๋ ์ ๋ณด์ ๋ฐ๋ผ DBMS๋ฅผ ์์๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์๋ ํ๋ก๊ทธ๋จ์ ์๊ฐํด๋ณด์. DBMS์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ํ๋ก๊ทธ๋จ์์ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ฒ ๋๋ค. ์ด ๊ณผ์ ์ DBMS ๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ DBMS๋ง๋ค ์ฐ๊ด๋ ์ธ์คํด์ค๋ฅผ ํ๊บผ๋ฒ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ๋งค์ฐ ํธํ ๊ฒ์ด๋ค.
AbstractFactory ํจํด์ ์ธ์คํด์ค์ ์์ฑ์ ์ ๋ฌธ์ผ๋ก ์ค์ํ๋ ํด๋์ค(Factory)๋ฅผ ์ค๋นํ์ฌ ์ผ๊ด์ฑ์ ์ ์งํด์ผํ๋ ์ธ์คํด์ค๋ค์ ์์ฑํ๊ธฐ ์ํ ํจํด์ด๋ค.
- Factory.java
public interface Factory {
Connection getConnection();
Configuration getConfiguration();
}
DBMS๊ฐ ์์ฑํด์ผํ๋ ํด๋์ค๋ฅผ ๋ฉ์๋๋ก ์ ์ํด๋์๋ค.
- createProduct() ์ ๋ํ ์ ์ (์ปค๋ฅ์ , ์ค์ ๋ฑ)
public abstract class Configuration {
// ์์์ ์ฒ๋ฆฌ
}
public abstract class Connection {
// ์์์ ์ฒ๋ฆฌ
}
- ConcreteFactory (๊ตฌ์ฒด์ ์ธ ํฉํ ๋ฆฌ์ ๋ํ ๊ตฌํ)
// PostgreSQL์ ์์ฑํ๋ ํด๋์ค
public class PostgreSQLFactory implements Factory{
@Override
public Connection getConnection() {
return new PostgreSQLConnection();
}
@Override
public Configuration getConfiguration() {
return new POstgreSQLConfiguration();
}
}
// MySQL์ ์์ฑํ๋ ํด๋์ค
public class MySQLFactory implements Factory {
@Override
public Connection getConnection() {
return new MySQLConnection();
}
@Override
public Configuration getConfiguration() {
return new MySQLConfiguration();
}
}
- ์์ฑํด์ผํ๋ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ค
public class MySQLConfiguration extends Configuration {
//MySQL ์ค์ ์ ๋ณด์ ๋ก๋ฉ ์ฒ๋ฆฌ
}
public class MySQLConnection extends Connection {
// MySQL์ ์ปค๋ฅ์
์ฒ๋ฆฌ
}
public class POstgreSQLConfiguration extends Configuration {
// PostgreSQL์ ์ค์ ์ ๋ณด์ ๋ก๋ฉ ์ฒ๋ฆฌ
}
public class PostgreSQLConnection extends Connection {
// PostgreSQL ์ปค๋ฅ์
์ฒ๋ฆฌ
}
- SampleMain.java
public class SampleMain {
public static void main(String[] args) {
String env = "PostgreSQL";
Factory factory = createFactory(env);
Connection connection = factory.getConnection();
Configuration configuration = factory.getConfiguration();
}
private static Factory createFactory(String env) {
switch (env) {
case "PostgreSQL":
return new PostgreSQLFactory();
case "MySQL":
return new MySQLFactory();
default:
throw new IllegalArgumentException();
}
}
}
๋ฉ์ธ ๋ฉ์๋์์๋ "์ค์ ๊ฐ"์ ๋ฐ๋ผ ๊ฐ๊ฐ์ DBMS์ ๋์๋๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๋ฐํ๊ฐ์ ๊ณตํต์ ์ถ์์ ์ธ ํด๋์ค๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ ๋ด์ฉ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์ปค๋ฅ์ ์ ๋ณด์ ์ค์ ์ ๋ณด๋ฅผ ์ทจ๋ํ ์ ์๋ค.
AbstractFactory ํจํด์ ๊ด๋ จ๋ ์ผ๋ จ์ ์ธ์คํด์ค๋ค์ ๋ชจ์์ ์์ฑํ๋ ๊ฒฝ์ฐ์ ์๋ ฅ์ ๋ฐํํ๋ค. ํ๊ฒฝ์ด๋ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฒ๋ฆฌ ํจํด์ ์ ํํ์ฌ ์คํํ๋ ๊ตฌ์กฐ๋ฅผ ์คํํ ๋ ํ๋ ์์ํฌ์ ์ด์ฉ์๊ฐ ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ ๋ด์ฉ์ ์์ํ์ง ์๊ณ ํธ์ถํ ์ ์๋ ์ ์ด ์ฅ์ ์ด๋ค.
12.2.2 Builder ํจํด - ๋ณตํฉํ๋ ์ธ์คํด์ค ์์ฑ ๊ณผ์ ์ ์ํํ๋ค.
์์ฑ์ ํ๋ฆ์ ๊ณตํตํํ๊ธฐ ์ํ ์๋จ์ด 'Builder ํจํด'์ด๋ค. ๋ณต์กํ ์์ฐ ๊ณผ์ ์ด ํ์ํ ์ธ์คํด์ค์ ๋ํด ๊ทธ ์์ฑ๊ณผ์ ์ ์ํํจ์ผ๋ก์จ ๋์ผ๊ณผ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ ๋ด๋ถ ํ์์ ์ธ์คํด์ค๋ฅผ ์ป๊ธฐ ์ํ ํจํด์ด๋ค.
- Builder ์ธํฐํ์ด์ค
public interface Builder {
void createHeader();
void createContents();
void createFooter();
Page getResult();
}
- Builder ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ Director ํด๋์ค - ์ฒ๋ฆฌ์ ๊ณผ์ ์ ๊ตฌํํด๋ .
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Page construct() {
builder.createHeader();
builder.createContents();
builder.createFooter();
return builder.getResult();
}
}
- Page
public class TopPage extends Page{
// ๋งจ ์ ํ์ด์ง
}
public class Page {
private String header;
private String contents;
private String footer;
// getter, setter ์๋ต.
}
- ๋น๋๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ์ง์ ๋ํ ์ค์ ์ฒ๋ฆฌ -> TopPageBuilder
public class TopPageBuilder implements Builder{
private TopPage page;
public TopPageBuilder() {
this.page = new TopPage();
}
@Override
public void createHeader() {
this.page.setHeader("TOP Header");
}
@Override
public void createContents() {
this.page.setContents("TOP Contents");
}
@Override
public void createFooter() {
this.page.setFooter("TOP Footer");
}
@Override
public Page getResult() {
return this.page;
}
}
- SampleMain.java
public class SampleMain {
public static void main(String[] args) {
Builder builder = new TopPageBuilder();
Director director = new Director(builder);
Page page = director.construct();
}
}
๋๋ ํฐ์ ๊ตฌ์ฒด์ ์ผ๋ก ๊ตฌํ๋์ด์ง ๋น๋์ ์ธํฐํ์ด์ค ์ฐธ์กฐ๋ฅผ ์ธ์๋ก ๋๊ฒจ์ค๋ค. ๋๋ ํฐ๋ ์ด๋ฅผ ํตํด ๋ฌธ์๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ด๋ป๊ฒ ๊ตฌํ๋ Builder๋ฅผ ๋๊ฒจ์ฃผ๋๋์ ๋ฐ๋ผ Page์ ๋ด์ฉ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
๋น๋ ํจํด์ ์ด์ฉํ๋ฉด ์ด์ฉ์๊ฐ ์์ฑ ์ฒ๋ฆฌ์ ํ๋ฆ์ ์์ํ์ง ์๊ณ (Director์ฒ๋ฆฌ) ๊ฐ๋ณ ์ฒ๋ฆฌ(Builder ๊ตฌํ)์๋ง ์ฃผ๋ชฉํ์ฌ ๊ตฌํํ ์ ์๋ ๊ฒ์ด ์ฅ์ ์ด๋ค.
12.2.3 Singleton ํจํด - ํน์ ํด๋์ค์ ๋ํด ์ธ์คํด์ค๊ฐ ํ๋์์ ๋ณด์ฅํ๋ค.
์์คํ ์ ์ฒด์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ค์ ์ ๋ณด๋ฅผ ๋ชจ์์ ๋ณด๊ดํ๋ ํด๋์ค๊ฐ ์๋ค๊ณ ํ์. ์์คํ ์์ ๋ณ๊ฒฝ๋ ์ค์ ๋ด์ฉ๋ ๋ณด์กดํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ค์ ์ ๋ณด๋ฅผ ๋ณด๊ดํ ํด๋์ค๊ฐ ์ฌ๋ฟ์ด ์๊ฒ ๋๋ค๋ฉด '์ผ๊ด์ฑ์ด ์๊ฒ ๋๋ค.' ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ์์คํ ์ด ํญ์ ๋์ผํ ํ๋์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋๋ก ํ๋ค๋ฉด ์ฐ๋ฆฌ์ ๋ชฉ์ ์ ๋ฌ์ฑํ ์ ์๋ค.
์ด๋ฅผ ์คํํ๊ธฐ ์ํ ์๋จ์ด ๋ฐ๋ก Singletonํจํด์ด๋ค. (ํน์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์ ์ผํ ์กด์ฌ์์ ๋ณด์ฅํ๋ ๊ฒ)
public class Configure {
private static Configure instance = new Configure();
private Configure() {
// ์ค์ ์ ๋ณด๋ฅผ ์ฝ์ด๋ค์ด๋ ์ฒ๋ฆฌ
}
public static Configure getInstance() {
return instance;
}
}
public class SampleMain {
public static void main(String[] args) {
Configure configure = Configure.getInstance();
}
}
getInstnace() ์คํํฑ ๋ฉ์๋๋ฅผ ํตํด Configure๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด ๊ฐ์ฒด๋ ์์คํ ์์ ์ฌ์ฉํ๋ ์ ์ผํ Configure ๊ฐ์ฒด์ด๋ค.
๋จ, Singleton ํจํด์ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ์์ ์ด ๋์์ ์ธ์คํด์ค๋ฅผ ์กฐ์ํด๋ ๋ฌด๊ฒฐ์ฑ์ ์์ํ์ง ์๋๋ก ์ธ์คํด์ค์ ๋ค์ค ์ ์์ ์์ํ ๋ฐฐํ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ค์ํด์ผ ํ๋ค๋ ์ ์ ๊ธฐ์ตํด๋์.
'๐์ฝ์ ์ฑ ์ ๋ฆฌ > ์๋ฐ ๋ง์คํฐ๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฐ ๋ง์คํฐ๋ถ] 12์ฅ : ๋์์ธํจํด ์ฆ๊ธฐ๊ธฐ - ํ๋ (0) | 2021.10.02 |
---|---|
[์๋ฐ ๋ง์คํฐ๋ถ] 12์ฅ : ๋์์ธํจํด ์ฆ๊ธฐ๊ธฐ - ๊ตฌ์กฐ (0) | 2021.10.02 |
[์๋ฐ ๋ง์คํฐ๋ถ] 10์ฅ ๊ฐ์ฒด์งํฅ ์ฆ๊ธฐ๊ธฐ (0) | 2021.09.15 |
[์๋ฐ ๋ง์คํฐ๋ถ] 9์ฅ ๋ ์ง ์ฒ๋ฆฌ ๊ณต๋ตํ๊ธฐ (0) | 2021.09.14 |
[์๋ฐ ๋ง์คํฐ๋ถ] 6์ฅ ์์ธ ๊ณต๋ตํ๊ธฐ (0) | 2021.09.12 |