
저번주에 이어서 오늘은 전략 패턴에 대해서 공부하고 정리해보려고 한다
Strategy 패턴은 알고리즘 군(algorithm family)을 정의하고, 각각을 캡슐화하여 교체 가능하게 만드는 패턴이다.
즉, 동일한 문제를 해결하는 다양한 방법을 객체로 만들고 필요할 때 교체해서 사용할 수 있게 하는 것이 목적이다.
1. 알고리즘의 캡슐화
각각의 알고리즘을 별도 클래스(또는 람다)로 분리한다.
코드가 한곳에 집중되지 않아 가독성, 재사용성 증가.
2. 런타임 교체 가능성
전략은 Context가 보유하고 있으므로, 실행 도중 setStrategy() - 같은 방식으로 자유롭게 교체할 수 있다.
설정 파일, 팩토리, DI(스프링) 등으로 주입하면 실행 전후 모두 유연하게 바꿔 쓸 수 있다.
3. 구성(composition) 우선 — 상속 대체
4. 조건문(분기) 감소
5. OCP(Open–Closed Principle) 친화
Strategy (인터페이스): 알고리즘의 공통 계약(메서드 시그니처).
ConcreteStrategy: 구체 알고리즘 구현체들.
Context: Strategy를 보유하고 클라이언트에 행위를 제공. 전략 변경/주입 지점.
Client: Context에 전략을 설정하거나 Context를 통해 동작을 요청.
알고리즘을 캡슐화하여 코드 재사용성 증가
런타임에 행위를 쉽게 변경 가능
새로운 전략 추가 시 기존 코드 수정 없이 확장 가능
if-else 분기문 감소 → 코드 가독성 향상
전략 클래스가 많아질 수 있음 → 복잡도 증가
단순한 경우에는 오히려 코드가 길어질 수 있음
동일한 역할(동일 시그니처)을 다양한 방식으로 처리해야 할 때.
런타임에 동작을 바꿔야 하거나 사용자가 선택 가능한 옵션이 있을 때.
(두 가지 경우의 공통 코드)
ex) 동일한 이벤트를 다양하게 처리
ex) 사용자가 런타임에서 이벤트 결정
if/else 분기가 지저분하게 늘어날 때(특히 분기마다 다른 알고리즘을 호출할 경우).
- 전략패턴을 사용하지 않는 경우
전략패턴을 사용하지 않으면 if/else문이 지저분하게 늘어서고 각 경우안에서 정의해야할 사항이 많아지면 가독성이 떨어짐
- 전략패턴을 사용하는 경우
코드의 가독성이 올라가고 코드간 결합도는 떨어지고 응집도는 올라감
새로운 방식이 추가되어도 기존 코드의 변화가 없음 (결합도 낮음)
🔹오늘의 나는 무엇을 잘했는지
요즘은 스프링에 이어 스프링 부트를 나가고 있지만 지난주에 이어 전략 패턴 공부를 포기하지 않고 이어오고있다
🔹어떤 문제를 겪었고, 어떻게 해결할지
스프링 부트로 넘어가면서 수 많은 기능들이 굉장히 간결하게 표현되는데 이 내부적인 동작을 이해하는데 좀 힘들었다. 처음부터 끝까지 큰 그림을 그리려고하기 보다는 부분적으로 큰 그림을 그리며 내부 플로우와 설정과정을 이해하려고 노력했다.
🔹오늘 배운 것 (학습)
스프링 부트에서 어노테이션으로 주입해주는 패터에 대해서 학습했다. 내부적으로 굉장히 많은 코드들이 돌아가고 있지만 결국에는 이전 기술을 더 간단하게 사용할 수 있게 한다는 점에서 앞선 수업이 도움이 되었다.
🔹좋았던 점
지금을 잘 사용하지 않지만 현재 사용하는 기술을 이해하는데 필요한 내용을 직접 실습하면서 단계별로 학습하는 것이 나에게 굉장히 잘 맞는 공부 방법이었고 이해력을 높이는데 도움이되었다.
🔹나만의 팁 or 복습 방법
프로젝트를 처음부터 끝까지 파서 기능을 하나하나 구현해나가면 도움이 된다. 시간이 많이 걸리고 중간중간 빠뜨리는 설정들이 있기때문에 에러가 많이 발생하지만 그만큼 나에게 도움이된다😊