핵심 인사이트 (3줄 요약)
- 메모리 최적화(Memory Optimization): 다수의 작은 객체가 반복 생성될 때, 공통 속성(Intrinsic State)을 공유하여 메모리 낭비를 방지함.
- 상태 분리(State Separation): 변경되지 않는 '내부 상태'는 공유하고, 호출 시마다 바뀌는 '외부 상태'는 외부에서 주입받아 처리함.
- 성능 향상: 객체 생성 비용을 줄이고 캐싱을 활용하여 대규모 데이터 처리 시스템의 응답성을 개선함.
Ⅰ. 개요 (Context & Background)
대규모 게임이나 워드프로세서와 같이 수천 개의 유사한 객체(예: 글자, 나뭇잎, 총알 등)를 화면에 그려야 하는 경우, 모든 객체를 개별적으로 인스턴스화하면 메모리 부족(OOM) 문제가 발생할 수 있다. **플라이웨이트 패턴(Flyweight Pattern)**은 '객체를 최대한 가볍게(Flyweight)' 유지하기 위해 공유 가능한 정보를 풀(Pool)에 저장하고 재사용함으로써 자원을 효율적으로 관리하는 구조 패턴이다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
[ Client ] ----> [ Flyweight Factory ]
| (Check Pool)
+------+------+
| |
[ Flyweight A ] [ Flyweight B ] (Shared / Intrinsic)
| |
+-------+-------------+-------+
| External Input (Extrinsic) |
+-----------------------------+
Bilingual ASCII Diagram:
+-------------------+ +---------------------------+
| Client | ----> | Flyweight Factory |
| (객체 요청자) | | (공유 객체 관리 팩토리) |
+-------------------+ +-------------+-------------+
|
+-------------------------+-------------------------+
| |
+---------------v---------------+ +---------------v---------------+
| Shared Flyweight (A) | | Shared Flyweight (B) |
| (내부 상태: 색상, 이미지 등) | | (Intrinsic State: Constants) |
+-------------------------------+ +-------------------------------+
^ ^
| (External Injection) |
+-------+-------+ +-------+-------+
| External State| | External State|
| (좌표, 크기) | | (Coordinates) |
+---------------+ +---------------+
- Intrinsic State(내부 상태): 객체 내부에 저장되어 공유 가능한 고정 데이터 (예: 폰트 종류).
- Extrinsic State(외부 상태): 상황에 따라 변하며 공유 불가능한 데이터 (예: 글자의 위치 좌표).
- Flyweight Factory: 기존에 생성된 객체가 있는지 확인하여 있으면 반환하고, 없으면 새로 생성하여 풀에 저장함.
Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)
| 비교 항목 | 플라이웨이트 (Flyweight) | 싱글톤 (Singleton) | 프로토타입 (Prototype) |
|---|---|---|---|
| 핵심 목적 | 다수 객체의 메모리 공유 | 단 하나의 유일 객체 보장 | 기존 객체 복제를 통한 생성 |
| 객체 수 | 여러 종류의 공유 객체 존재 | 오직 하나만 존재 | 필요할 때마다 복제 생성 |
| 상태 관리 | 내부/외부 상태 엄격히 분리 | 상태를 가질 수 있음 | 복제 후 상태 변경 가능 |
Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)
기술사적 판단: 플라이웨이트 패턴은 **자원 제약 환경(Resource-Constrained Environment)**에서의 시스템 안정성 확보를 위한 핵심 기술이다.
- Java String Pool: 자바의
String리터럴 상수가 내부적으로 이 패턴을 사용하여 중복 문자열 메모리를 절약함. - Connection Pooling: DB 커넥션 풀이나 스레드 풀(Thread Pool)의 기본 사상이 플라이웨이트의 '객체 재사용' 원리에 기반함.
- 가이드라인: 외부 상태를 너무 많이 전달해야 하는 경우 계산 오버헤드가 발생할 수 있으므로, 메모리 절약과 연산 비용 간의 **트레이드오프(Trade-off)**를 신중히 검토해야 함.
Ⅴ. 기대효과 및 결론 (Future & Standard)
클라우드 네이티브 환경에서 마이크로서비스가 증가함에 따라 개별 서비스의 경량화가 중요해지고 있다. 플라이웨이트 패턴은 데이터 중심의 아키텍처에서 불필요한 객체 생성을 막아 시스템의 전체적인 **풋프린트(Footprint)**를 줄이는 데 기여한다. 미래의 엣지 컴퓨팅이나 IoT 기기와 같은 저전력 환경에서 이 패턴은 더욱 강력한 설계 표준이 될 것이다.
📌 관련 개념 맵 (Knowledge Graph)
- 상위 개념: GoF 구조 패턴 (Structural Patterns)
- 연관 개념: 캐싱(Caching), 내부 상태/외부 상태, 팩토리 패턴, 메모리 릭(Memory Leak) 방지
👶 어린이를 위한 3줄 비유 설명
- 숲을 그릴 때 나무 1,000그루를 다 따로 그리는 대신, 나무 모양 도장 하나를 만들어서 위치만 바꿔가며 찍는 것과 같아요.
- 도서관에서 책을 읽고 싶을 때 모두가 책을 사는 게 아니라, 공용 서재에 있는 책을 돌려가며 읽는 것과 같아요.
- 레고 블록은 모양은 똑같지만, 어디에 꽂느냐에 따라 성이 되기도 하고 비행기가 되기도 하는 것과 같아요.