✅ 1. 서비스 계층에서 Strategy 패턴 적용 (검증/승인 flow 분리)

예: “자산관리위원회 제출 → 검증 → 승인/반려” 단계가 프로세스별로 다르면 공통 인터페이스를 만들고 전략으로 분기.

public interface ValidateStrategy {
    void validate(AssetRequest req);
}

public class PurchaseValidate implements ValidateStrategy {
    public void validate(AssetRequest req) { /* 구매 전용 검증 */ }
}

public class DisposeValidate implements ValidateStrategy {
    public void validate(AssetRequest req) { /* 불용 전용 검증 */ }
}

Service에서 주입해서 사용:

validateStrategy.validate(request);

효과

if/else 분기 제거

기획 변경 때 검증 단계만 교체 가능



---

✅ 2. VO/DTO 조립에서 Builder 패턴

Informix/MariaDB 테이블이 컬럼 많고 optional 많은 경우, Setter 난무하는 걸 Builder로 정리.

AssetVO vo = AssetVO.builder()
    .asetNo("A2024001")
    .deptCd("D001")
    .introAmt(1500000)
    .residualAmt(500000)
    .build();

효과

DTO 생성 시 가독성 증가

필수/옵션 분리 쉬움

유지보수 시 필드 추가 부담 ↓



---

✅ 3. 상태 관리에 State 패턴

위원회 안건 상태: 등록 → 검증중 → 승인대기 → 승인 → 반려 → 종료

public interface AmcState {
    void next(AmcContext ctx);
    void reject(AmcContext ctx);
}

각 State 객체가 로직을 갖고 CLI/SVC에서 상태전이만 호출:

ctx.next();  // 내부에서 자동으로 다음 상태로 이동

효과

상태 조건 분기 if (status == 3) 제거

상태 추가/변경 편함

approval flow 재사용성 증가



---

✅ 4. DB 접근 계층에서 Repository + Template Method 패턴

MyBatis/Informix 쓰는 구조에서 공통 CRUD Template을 추상화하는 패턴.

public abstract class BaseRepository<T> {

    protected abstract String getNamespace();

    public T selectOne(String id, Object param) {
        return sqlSession.selectOne(getNamespace() + "." + id, param);
    }

    public void insert(String id, Object param) {
        sqlSession.insert(getNamespace() + "." + id, param);
    }
}

각 DAO가 namespace만 override.

효과

DAO 중복 코드 제거

공통 예외 핸들링, 로깅 중앙화

테이블별 insert/select 최소화



---

✅ 5. Factory 패턴으로 코드 생성/문서 생성기 같은 모듈 관리

예: "자산 불용 보고서 PDF" / "일반 구매요청 PDF" 타입별로 다른 포맷

public interface ReportGenerator {
    byte[] generate(Object data);
}

public class DisposeReportGenerator implements ReportGenerator {}
public class PurchaseReportGenerator implements ReportGenerator {}

Factory:

public class ReportFactory {
    public static ReportGenerator get(String type) {
        switch(type) {
            case "DISPOSE": return new DisposeReportGenerator();
            case "PURCHASE": return new PurchaseReportGenerator();
            default: throw new IllegalArgumentException();
        }
    }
}


---

🟦 실제 SI에서 자주 쓰는 OOP/패턴 리스트

Service/DAO 계층 분리 (SRP)

응집도/결합도 기준으로 Domain 객체 분리

Enum 활용해 코드 상수 대체

정책/검증/계산 모듈에 Strategy

상태 흐름에 State

객체 생성에 Factory/Builder

반복동작에 Template Method

캐시/싱글턴으로 공통정보 유지

인터셉터/필터에 Chain of Responsibility



---

LIST

+ Recent posts