2022-04-01 @이영훈
Flyweight 패턴
객체들 간에 오브젝트 공유를 통한 메모리 사용을 최소화하는 패턴입니다.
이번에 디자인 패턴을 다시 공부할 때 복잡한(?) 다이어그램을 보면서 공부하기보다 유즈케이스와 코드 사례를 보면서 이런식으로 작성하면 코드 품질이 올라가겠다라고 코드와 사례 중심으로 공부했습니다. 제가 공부하면서 느낀바와 비슷해서 남깁니다.
Flyweight 패턴의 구조에 복잡한 단어가 있어서 쉽게 이해하기가 어렵습니다
디자인 패턴을 공부하는 이유는 이해하기 쉬운 구조를 만들기 위함이지
남들이 못하는 걸 나만하기 위함이 아닙니다 (좋은 코드 패턴이 아닐 뿐더러 유지보수가 용이하지 않습니다)
공부를 하면서 패턴의 코드, 클래스의 구조에 집착하기 보다는
Flyweight의 핵심인 object 공유를 통한 메모리 사용 감소에 집중한다면,
유즈케이스에 따라 나만의 클래스 구조와 함수를 만들어서 활용할 수 있습니다.
암호화폐와 암호화폐 거래소 예제
암호화폐 거래소마다 많은 암호화폐 목록을 가지고 있습니다. 이 때 암호화폐 목록이 매우 큰 용량을 차지 한다면 암호화폐 거래소 인스턴스를 몇 개 만들지 못할 것입니다. 그래서 암호화폐 목록을 공통으로 관리하고 암호화폐 거래소 인스턴스들이 공통의 암호화폐 목록을 공유한다면 문제를 해결할 수 있습니다.
< 암호화폐 거래소마다 각각의 암호화폐 목록을 가지는 경우 그림 >
< 암호화폐 거래소들이 암호화폐 목록을 공유하는 경우 그림 >
암호화폐와 암호화폐 거래소 예제 코드 작성
암화화폐 클래스입니다. 백서(white paper)가 100MB, 암호화폐 썸네일 이미지가 10MB로 암호화폐 하나 당 대략 110MB라고 가정하겠습니다. 그래서 100개의 암호화폐 목록을 만들면 11GB의 크기가 됩니다.
Macbook M1 16인치 기본형의 메모리가 16GB이므로 2개의 암호화폐 목록을 만들면 메모리가 감당하지 못합니다. 그래서 코인 목록을 하나 만들어서 모든 거래소가 공유하면 됩니다.
public class CryptoCurrency {
private final String code;
private final String name;
private final Double usd;
private final String whitePaperPdf; // 100MB
private final String thumbnail; // 10MB
// 코인 하나 당 약 110MB -> 100개의 코인이 있다고 가정하면 -> 11GB
// Macbook M1 16인치 기본형 모델의 메모리가 16GB
// 각 거래소마다 100개의 코인을 따로 가지고 있으면 메모리 사용 용량이 계속 늘어납니다.
// 💡 거래소마다 코인 목록을 각각 가지지 않고,
// 코인 목록을 하나 만들어서 모든 거래소가 공유하면 됩니다.
public CryptoCurrency(String code, String name, Double usd, String whitePaperPdf, String thumbnail) {
this.code = code;
this.name = name;
this.usd = usd;
this.whitePaperPdf = whitePaperPdf;
this.thumbnail = thumbnail;
}
}
Java
복사
암호화폐 목록 테이블 클래스를 만듭니다
public class CryptoCurrencyTable {
List<CryptoCurrency> cryptoCurrencyList = new ArrayList<>();
public void addCryptoCurrency(CryptoCurrency cryptoCurrency) {
cryptoCurrencyList.add(cryptoCurrency);
}
}
Java
복사
암호화폐 거래소 클래스입니다.
각 거래소마다 암호화폐 목록을 따로 관리하지 않고 하나의 암호화폐 목록 테이블을 공유하여 메모리 사용량을 줄입니다.
public class CryptoCurrencyExchange {
private final String exchangeCode; // 거래소코드
private final String name;
// ❌ 각 거래소마다 암호화폐 목록을 따로 관리하지 않고
// private List<CryptoCurrency> cryptoCurrencyList;
// ⭕️ 암호화폐 목록 테이블을 만들어 "공유"하여 메모리 사용량을 줄입니다
private final CryptoCurrencyTable cryptoCurrencyTable;
public CryptoCurrencyExchange(String exchangeCode, String name, CryptoCurrencyTable cryptoCurrencyTable) {
this.exchangeCode = exchangeCode;
this.name = name;
this.cryptoCurrencyTable = cryptoCurrencyTable;
}
public CryptoCurrencyTable getCryptoCurrencyTable() {
return cryptoCurrencyTable;
}
}
Java
복사
암호화폐와 암호화폐 거래소 예제 코드 실행
public class FlyweightApplication {
public static void main(String[] args) {
// 📖 암호화폐 거래소들과 공유할 하나의 암호화페 목록 테이블을 만듭니다
CryptoCurrencyTable cryptoCurrencyTable = new CryptoCurrencyTable();
CryptoCurrency bitcoin = new CryptoCurrency("BTC", "비트코인", 50_000.0, "비트코인백서내용내용.....", "0xab07ab8d7.....");
CryptoCurrency neo = new CryptoCurrency("NEO", "네오", 50_000.0, "네오코인백서백서내용.....", "0xab07ab8d7.....");
CryptoCurrency ethereum = new CryptoCurrency("ETH", "이더리움", 50_000.0, "이더리움백서내용내용.....", "0xab07ab8d7.....");
cryptoCurrencyTable.addCryptoCurrency(bitcoin);
cryptoCurrencyTable.addCryptoCurrency(neo);
cryptoCurrencyTable.addCryptoCurrency(ethereum);
// 🎉 암호화폐 목록 테이블을 거래소끼리 공유하여 메모리 사용량을 줄인다
CryptoCurrencyExchange binance = new CryptoCurrencyExchange("US_BIN", "바이낸스", cryptoCurrencyTable);
CryptoCurrencyExchange upbit = new CryptoCurrencyExchange("KR_UPB", "업비트", cryptoCurrencyTable);
CryptoCurrencyExchange bithumb = new CryptoCurrencyExchange("KR_BIT", "빗썸", cryptoCurrencyTable);
// ✅ 같은 암호화폐 목록 테이블을 사용하는 지 확인합니다
if (binance.getCryptoCurrencyTable() == upbit.getCryptoCurrencyTable()) {
System.out.println("암호화폐 테이블을 공유합니다");
} else {
System.out.println("거래소마다 암호화폐 테이블을 따로 사용합니다");
}
}
}
Java
복사