스택큐힙리스트

CLI Todo 앱으로 배우는 GoF 생성 패턴 5종 완전 활용 본문

개발

CLI Todo 앱으로 배우는 GoF 생성 패턴 5종 완전 활용

스택큐힙리스트 2025. 7. 15. 00:10
반응형

왜 생성 패턴인가?

Todo 앱처럼 단순한 프로그램도 시간이 지나면 기능·저장소·UI가 늘어나면서 ‘객체를 누가, 언제, 어떻게 만들까?’가 중요해집니다. 생성 패턴은 이 고민을 설계 단계에서 지워 줍니다. Naver D2·Velog 인기 글에서도 “객체 생성을 설계에 녹여 두면 리팩터링이 압도적으로 쉽다”는 점이 강조되죠.


1) Singleton – 전역 인스턴스 하나면 충분할 때

  • 어디에? Todo 목록을 메모리에 캐싱하는 TaskRepository.
  • 핵심: private constructor + static getInstance()로 하나만 유지해 DB 연결·캐시 동기화를 간소화.
public class TaskRepository {
    private static final TaskRepository INSTANCE = new TaskRepository();
    private TaskRepository() {}
    public static TaskRepository getInstance() { return INSTANCE; }
}

⚠️ 테스트 격리엔 DI 컨테이너가 대안 — JUnit에서 Mock 교체가 어려울 수 있음.


2) Factory Method – 역할에 따라 세부 클래스를 숨기기

  • 어디에? 명령 파싱 결과로 다양한 Command 객체(Add, List, Done 등) 생성.
  • 핵심: CommandFactory가 입력 문자열을 해석해 구체 클래스를 반환 → main()은 공통 인터페이스만 다룸.
public interface Command { void execute(); }
public class CommandFactory {
    public static Command of(String arg){
        return switch (arg) {
            case "add"  -> new AddCommand();
            case "list" -> new ListCommand();
            default     -> new HelpCommand();
        };
    }
}

3) Abstract Factory – 환경에 따라 제품군 교체

  • 어디에? 저장 방식이 파일 → DB → REST API로 바뀔 때.
  • 핵심: StorageFactory가 TaskRepository, UserRepository 등 호환되는 세트를 한 번에 공급.
public interface StorageFactory {
    TaskRepository taskRepo();
    UserRepository userRepo();
}
  • 이득: 로컬·테스트·프로덕션 환경을 new FileStorageFactory() / new JdbcStorageFactory()로 스위치만 바꿔 교체.

4) Builder – 복잡한 객체를 단계별로 조립

  • 어디에? Task 생성 시 선택 옵션(마감일, 우선순위, 태그)이 많을 때.
  • 핵심: 가독성불변 객체를 동시에 잡기.
Task task = Task.builder("블로그 글쓰기")
                .due("2025-07-20")
                .priority(1)
                .tag("writing")
                .build();
  • Lombok @Builder를 쓰면 코드가 더욱 간결해져, Velog·Inflearn 강의에서도 ‘Dto → Entity’ 매핑에 단골 예시로 등장합니다.

5) Prototype – 복사로 빠르게 새 인스턴스 만들기

  • 어디에? 반복 작업용 템플릿 Task(매주 회의, 매일 스탠드업) 생성.
  • 핵심: clone() 또는 copy-constructor로 원본 속성을 복제 후 날짜만 수정.
Task daily = templateTask.clone().shiftDueDate(1);
  • 값 객체(Value Object)라면 깊은 복사에 유의: 하위 컬렉션도 새로 만들어야 데이터 충돌을 막습니다.

정리

CLI Todo 앱 하나로도 다섯 가지 생성 패턴을 전부 체험할 수 있습니다.

  1. Singleton : 전역 캐시·DB 세션 공유
  2. Factory Method : 입력 유형별 Command 캡슐화
  3. Abstract Factory : 저장소 제품군 스위치
  4. Builder : 파라미터 많은 도메인 모델
  5. Prototype : 템플릿 객체 복제

패턴을 적용해 두면, 기능 추가나 인프라 전환에도 OCP(개방-폐쇄) 를 만족하며 코드를 뜯어고칠 일이 확 줄어듭니다. 지금 프로젝트에 한 패턴만이라도 시도해 보세요—리팩터링 때 진가를 체감합니다!

반응형
Comments