✅ 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
---
'Developer > Spring & Backend' 카테고리의 다른 글
| 함수 선언식과 함수 표현식의 차이점에 대해서 설명해주세요. (0) | 2025.11.14 |
|---|---|
| DB Replication에 대해서 설명해주세요. (0) | 2025.11.14 |
| ES6에 대해서 아는 대로 설명해 주세요. (0) | 2025.11.13 |
| 트랜잭션의 응답 시간이 길어졌는지에 대해서는 어떻게 확인할 수 있는지 설명해주세요. (0) | 2025.11.13 |
| Record를 DTO로 사용하는 이유가 뭔가요? (0) | 2025.11.13 |
