[CS-011][실무] 자주 쓰는 코드 설계 패턴 고르기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[CS-011][실무] 자주 쓰는 코드 설계 패턴 고르기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 97회 작성일 26-09-05 08:32

본문

[이번 수업]
설계 패턴은 자주 반복되는 코드 구조 문제에 붙인 공통 이름입니다. 전략, 팩토리, 관찰자, 어댑터 패턴이 어떤 변화를 다루는지 배우고, 작은 함수로 충분한 상황과 구조를 나눌 상황을 구별합니다. 패턴을 많이 넣는 것이 목표가 아니라 바뀌는 부분을 안전하게 분리하는 것이 목표입니다.

[선수지식]
CS-003의 함수, CS-009의 객체지향과 함수형 사고, PY-008의 클래스와 타입 힌트를 알고 있으면 좋습니다.

[학습목표]
1. 네 가지 패턴이 해결하는 변화의 종류를 설명합니다.
2. 조건문, 함수 주입, 객체 분리 중 가장 단순한 구조를 선택합니다.
3. 새 동작을 추가할 때 기존 코드와 테스트에 미치는 영향을 판단합니다.

[핵심개념]
전략 패턴은 계산 방법이 바뀔 때 동작을 함수나 객체로 전달합니다. 결제 금액에 적용할 할인 규칙처럼 입력과 출력은 같고 알고리즘만 달라지는 경우에 맞습니다. 팩토리 패턴은 객체를 만드는 규칙이 복잡하거나 종류별 초기화가 다를 때 생성을 한곳에 모읍니다. 관찰자 패턴은 한 상태 변화가 여러 구독자에게 알려져야 할 때 이벤트와 처리기를 분리합니다. 어댑터 패턴은 기존 기능을 바꾸기 어렵지만 호출 방식이 서로 다를 때 한쪽 인터페이스를 다른 쪽에 맞춥니다. 인터페이스는 서로 약속한 함수 이름과 입력·출력 모양입니다.

선택 전에 “무엇이 자주 바뀌는가?”를 묻습니다. 계산 규칙이면 전략, 생성 과정이면 팩토리, 변화 알림이면 관찰자, 외부 형식 차이면 어댑터를 검토합니다. 변화가 하나뿐이고 앞으로도 고정이라면 조건문이나 짧은 함수가 더 읽기 쉽습니다. 반대로 같은 조건문이 여러 파일에 반복되고 새 종류를 넣을 때 기존 코드를 계속 고쳐야 한다면 분리할 신호입니다. 패턴을 적용한 뒤에는 호출자가 구체적인 구현보다 작은 계약에 의존하는지, 새 종류를 추가하는 수정 범위가 줄었는지 확인합니다.

Python의 Callable은 호출 가능한 함수의 입력과 반환 형태를 나타낼 수 있습니다. Protocol은 특정 메서드를 가진 객체라는 구조적 계약을 표현하고, abc 모듈은 추상 기반 클래스를 정의하는 도구를 제공합니다. 이 도구들은 패턴 그 자체가 아니라 구현 사이의 약속을 명확히 하는 수단입니다.

[따라하기]
할인 계산이 바뀌는 부분만 함수로 전달하는 전략 패턴의 최소 예제입니다. strategy_demo.py로 저장하세요.

from collections.abc import Callable

PriceRule = Callable[[int], int]

def regular(price: int) -> int:
    return price

def ten_percent_off(price: int) -> int:
    return price * 90 // 100

def checkout(price: int, rule: PriceRule) -> int:
    if price < 0:
        raise ValueError("price must be non-negative")
    return rule(price)

print(checkout(10_000, regular))
print(checkout(10_000, ten_percent_off))

macOS와 Linux에서는 python3 strategy_demo.py, Windows PowerShell에서는 py strategy_demo.py를 실행합니다. 예상 결과는 첫 줄 10000, 둘째 줄 9000입니다. checkout은 할인 함수의 내부를 모르며 같은 입력·출력 계약만 사용합니다. 새 규칙을 별도 함수로 만들면 checkout을 수정하지 않고 추가할 수 있습니다.

[흔한 실수]
클래스 하나와 경우 하나뿐인데 팩토리와 추상 계층부터 만들면 읽을 코드만 늘어납니다. 패턴 이름에 코드를 억지로 맞추거나, 서로 다른 입력·출력을 가진 함수를 같은 전략으로 묶지 마세요. 관찰자 처리 순서를 암묵적으로 기대하면 결과가 불안정해질 수 있습니다. 어댑터 안에 업무 규칙까지 넣으면 변환 책임과 계산 책임이 섞입니다.

[보안 주의]
실습은 본인 소유의 로컬 환경에서 예제 값으로만 진행합니다. 사용자 입력을 eval로 실행하거나 문자열로 받은 모듈·클래스를 임의로 불러와 전략이나 팩토리를 만들지 마세요. 허용한 이름과 구현을 딕셔너리로 연결하고 입력 범위와 반환값을 검증합니다. 이벤트에는 비밀번호·토큰·개인정보를 담지 말고, 처리기 실패가 다른 처리기나 안전 동작을 막지 않는지 시험하세요.

[직접 해볼 과제]
정액 1,000원을 빼되 결과가 0보다 작아지지 않는 fixed_discount 함수를 추가하세요. checkout 코드는 바꾸지 말고 800원과 5,000원을 입력해 예상값과 실제값을 기록합니다. 이어서 이 예제를 팩토리로 바꿀 필요가 있는지 현재 요구사항을 근거로 한 문장으로 판단하세요.

[확인문제]
1. 계산 방법만 바뀌고 입력·출력이 같을 때 어떤 패턴을 먼저 검토하나요?
2. 객체 생성 과정을 한곳에 모으는 패턴은 무엇인가요?
3. 패턴을 적용하지 않고 짧은 함수로 유지하는 편이 나은 경우는 언제인가요?

[다음 학습]
다음 차례인 TOOL-011에서 README와 기술 문서로 설계 의도와 사용법을 전달합니다. CS 트랙에서는 CS-012에서 작은 문제를 설계하고 구현하는 종합 실습으로 이어집니다.

[공식 참고 자료]
Python Callable 타입 문서
https://docs.python.org/3/library/typing.html#typing.Callable
Python abc 추상 기반 클래스 문서
https://docs.python.org/3/library/abc.html
PEP 544 Protocol 명세
https://peps.python.org/pep-0544/
Node.js 이벤트 문서
https://nodejs.org/api/events.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
2,099
어제
5,103
최대
16,772
전체
773,153
Copyright © 소유하신 도메인. All rights reserved.