📚FOS Study
홈카테고리
홈카테고리

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agents 페이지로 이동
    • BMAD Method — AI 에이전트로 애자일 개발하는 방법론
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • Claude Code 멀티 에이전트 — Teams
    • 멀티모달 LLM (Multimodal Large Language Model)
  • architecture 페이지로 이동
    • 캐시 설계 전략 총정리
    • 디자인 패턴
    • 분산 트랜잭션
  • css 페이지로 이동
    • FlexBox 페이지로 이동
  • database 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • redis 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • 커넥션 풀 크기는 얼마나 조정해야할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • monitoring 페이지로 이동
  • go 페이지로 이동
    • Go 언어 기본 학습
  • http 페이지로 이동
    • HTTP Connection Pool
  • interview 페이지로 이동
    • 210812 페이지로 이동
    • 뱅크샐러드 AI Native Server Engineer
    • CJ 올리브영 지원 문항
    • CJ 올리브영 커머스플랫폼유닛 Back-End 개발 지원 자료
    • 마이리얼트립 - Platform Solutions실 회원주문개발 Product Engineer
    • NHN 서비스개발센터 AI서비스개발팀
    • nhn gameenvil console backend 직무 인터뷰 준비
    • 면접을 대비해봅시다
    • Tossplace Node.js Developer
    • 토스플레이스 Node.js 백엔드 컬처핏
  • java 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • OpenTelemetry 란 무엇인가?
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • Data_Structures_and_Algorithms 페이지로 이동
    • Heap 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node.js
    • npm vs pnpm 선택기준은 무엇인가요?
    • `setImmediate()`
  • kafka 페이지로 이동
    • Kafka 기본
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • 메시지 전송 신뢰성
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • network 페이지로 이동
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • react 페이지로 이동
    • JSX 페이지로 이동
    • VirtualDOM 페이지로 이동
    • v16 페이지로 이동
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • the-future-company 페이지로 이동
📚FOS Study

개발 학습 기록을 정리하는 블로그입니다.

바로가기

  • 홈
  • 카테고리

소셜

  • GitHub
  • Source Repository

© 2025 FOS Study. Built with Next.js & Tailwind CSS

목록으로 돌아가기
🏗️architecture

디자인 패턴

약 2분
2026년 1월 30일
2026년 3월 24일 수정
GitHub에서 보기

디자인 패턴

소프트웨어 설계 과정에서 반복적으로 발생하는 문제들에 대해 검증된 해결책을 정형화한 모범 사례라고 정의할 수 있다.

전략 패턴 (Strategy Pattern)

실행 중에 알고리즘을 선택할 수 있게 하는 패턴

  • 알고리즘을 선택한다?
    • 특정 기능을 수행하는 여러 가지 방식 중 상황에 맞는 하나를 런타임에 동적으로 결정한다
    • 실제 처리 로직을 인터페이스 뒤로 숨기고 클라이언트가 필요한 로직을 선택해 사용할 수 있게 만드는 것

핵심 구조

객체가 할 수 있는 행위들을 각각 전략(Strategy)이라는 클래스로 캡슐화하고, 이들을 인터페이스를 통해 추상화한다.

  • Strategy (인터페이스) : 모든 지원하는 알고리즘에 공통적인 인터페이스를 정의한다.
  • ConcreteStrategy (구현체) : 실제 알고리즘을 구현한 클래스들이다.
  • Context (문맥) : Strategy를 사용하는 역할을 하며, 필요애 따라 전략 객체를 교체할 수 있다.

예시

결제 시스템에서 결제 수단(카드, 네이버페이, 카카오페이)에 따라 결제 로직이 달라지는 경우를 생각해보자.

  • PaymentStrategy를 인터페이스를 정의한다
  • CardPayment, NaverPayPayment, KakaoPayPayment 등의 실제 전략 구현체들을 정의한다.
  • PaymentService 는, 런타임에 실제 구현체들을 사용해서 결제를 처리한다.

장단점

  • OCP(개방-폐쇄 원칙) 준수 : 새로운 결제 수단이 추가되어도 기존 PaymentService 코드를 수정할 필요 없이, 새로운 PaymentStrategy 구현체만 추가하면 된다.

언제 사용하면 좋을까?

  • 유사한 행위들이 데이터만 다른게 아니라 로직 자체가 다를 때
  • 하나의 클래스 안에 if-else 분기가 너무 많아져 가독성을 해칠 때
  • 런타임 중에 객체의 알고리즘을 동적으로 변경해야 할 때

실제 사례

  • 임베딩 메타데이터 구성 방식 개선 — Blocklist에서 Allowlist로: DocumentType별 메타데이터 구성 로직을 EmbeddingMetadataProvider 인터페이스로 분리. Spring DI의 자동 수집과 결합해 새 타입 추가 시 기존 코드 수정 없이 확장
  • Confluence 벡터 색인 배치: 스페이스별 메타데이터 포맷 차이를 ConfluenceDocumentMetadataProvider 인터페이스로 추상화
architecture 카테고리의 다른 글 보기수정 제안하기

댓글

댓글을 불러오는 중...
목차
  • 디자인 패턴
  • 전략 패턴 (Strategy Pattern)
  • 핵심 구조
  • 예시
  • 장단점
  • 언제 사용하면 좋을까?
  • 실제 사례