오늘은 Deploy-gate의 정책 구조를 분석하면서 객체지향의 상속과 다형성을 살펴봤다.
기본 정책 클래스는 추상 클래스로 정의되어 있다.
public abstract class ApprovalPolicy {
public abstract ApprovalLevel getSupportedLevel();
public abstract ApprovalResult evaluate(
Deployer deployer,
StackPolicy stackPolicy
);
}
그리고 실제 정책은 이를 상속한다.
ApprovalPolicy
├── NoApprovalPolicy
├── SingleApproverPolicy
└── DualApproverPolicy
승인이 필요하지 않은 정책이다.
Claim 존재
→ ALLOWED
Claim 없음
→ DENIED
승인자가 한 명 필요한 정책이다.
Claim 없음
→ DENIED
Claim 있음
→ PENDING
→ 승인자 1명 필요
두 명의 승인이 필요한 정책이다.
Claim 없음
→ DENIED
Claim 있음
→ PENDING
→ 승인자 2명 필요
만약 모든 정책을 Service에 넣었다면 다음과 같은 코드가 계속 커졌을 것이다.
if NONE
else if SINGLE
else if DUAL
else if ...
현재 구조에서는 새로운 정책이 추가되더라도 ApprovalPolicy를 구현하는 새로운 클래스를 추가하면 된다.
이번 코드를 통해 정책마다 달라지는 로직을 별도의 객체로 분리하면 기존 코드의 수정 범위를 줄이고 기능 확장이 쉬워진다는 것을 이해했다.
단순히 "상속을 사용했다"가 아니라, 변경되는 부분을 별도의 정책 객체로 분리했다는 관점에서 이해하는 것이 중요하다고 느꼈다.