Software Engineering 소프트웨어 공학은 설계 원칙과 프로세스 모델을 기반으로 안정적이고 유지보수 가능한 시스템을 만드는 분야이다. 요구사항 정의 단계에서부터, 구조 설계 (아키텍처), 구현, 검증 (테스트), 배포, 유지보수까지 전 과정을 체계화한다. SOLID, SoC, DRY 등의 설계 원칙과 애자일, DevOps, CI/CD, Secure‑by‑Design 등의 방법론을 통해 품질 및 효율을 높인다. 실무에서는 조직규모, 도메인, 기술스택에 따라 프로젝트 특성에 맞는 전략이 요구된다.
핵심 개념 분류 개념 정확한 유형 설명 및 근거 기초 개념 소프트웨어 생명주기 (SDLC) 모델 / 프로세스 계획 → 폐기의 전 과정 (Waterfall, Agile 등은 모델) 요구사항 엔지니어링 활동 (Activity) 요구사항 분석, 명세, 검증, 관리 과정 소프트웨어 아키텍처 개념 / 설계 산출물 시스템 구조의 상위 수준 표현 품질 보증 (Quality Assurance) 프로세스 / 활동 품질 보장을 위한 테스트 및 검토 활동 심화 개념 모듈화 (Modularity) 설계 기법 / 원리 기능을 독립 모듈로 분리 추상화 (Abstraction) 설계 원리 (Design Principle) 복잡성 관리 기법 캡슐화 (Encapsulation) 객체지향 설계 원칙 정보 은닉을 통한 안정성 확보 의존성 관리 설계 기법 / 원리 모듈 간 결합도 최소화 설계 원칙 SOLID 객체지향 설계 원칙 (OOP Principles) 5 가지 핵심 원칙 (Robert C. Martin) SoC (Separation of Concerns) 설계 원리 (Architectural Principle) 관심사 분리를 통한 유지보수성 향상 KISS 설계 원리 (Heuristic Design Principle) 단순한 설계 지향 DRY 설계 원리 (Heuristic Design Principle) 중복 최소화 Secure-by-Design 보안 설계 전략 설계 단계에서 보안 내재화 생명주기 모델 Waterfall 생명주기 모델 (프로세스) 단계별 순차적 개발, 각 단계가 명확히 구분 [5]. Agile 생명주기 모델/방법론 반복적, 점진적, 협업 강조, 변화에 유연 [5]. DevOps 생명주기 모델/방법론 개발과 운영 통합, 자동화 및 협업 강조 [5]. Spiral 생명주기 모델 (프로세스) 위험 분석과 반복적 개발 결합 [5]. 프로세스 모델 DevOps 문화 + 자동화 프로세스 개발과 운영의 통합 접근 방식 품질 속성 ISO/IEC 25010 품질 속성 모델 (Quality Model) 기능성, 신뢰성, 보안성 등 8 대 속성 아키텍처 스타일 계층형 (Layered) 아키텍처 스타일 (Architecture Style) 표현 구조에 기반한 통신 방식 정의 이벤트 기반 (Event-driven) 아키텍처 스타일 (Architecture Style) 비동기 이벤트 흐름 중심 구조 마이크로서비스 (Microservices) 아키텍처 스타일 (Architecture Style) 독립 배포 가능한 서비스 단위 구성 아키텍처 패턴 클린 아키텍처 (Clean Architecture) 아키텍처 패턴 (Architecture Pattern) 의존성 역전 및 계층 분리 명확 도구 및 자동화 Git, CI/CD, 테스트 자동화, ASE 도구 / 자동화 기술 개발 및 품질 보증 자동화 지원 도구 협업 방법론 애자일 (Scrum, Kanban) 협업 방법론 / 개발 방법론 반복적 개발과 빠른 피드백 중심 방식 DevOps 협업 문화 / 프로세스 통합 프레임워크 자동화 기반의 개발–운영 연계 플랫폼 엔지니어링 운영 전략 / 엔지니어링 접근법 개발자 생산성 향상을 위한 내부 플랫폼 운영 품질 속성 기능성 (Functionality) 품질 속성 요구사항에 맞는 기능 제공 신뢰성 (Reliability) 품질 속성 오류 없이 안정적으로 동작 사용성 (Usability) 품질 속성 사용자가 쉽게 사용할 수 있음 유지보수성 (Maintainability) 품질 속성 변경, 수정, 확장이 용이함 효율성 (Efficiency) 품질 속성 자원 활용 및 성능 최적화 보안 (Security) 품질 속성/설계 원칙 외부 위협으로부터 안전하게 보호 이식성 (Portability) 품질 속성 다양한 환경에서 실행 가능 배경 초기 소프트웨어 개발:
1960 년대 이전까지는 소프트웨어 개발이 비체계적이고, 예산 초과, 일정 지연, 품질 저하 등 문제가 많았음. 소프트웨어 위기:
1960~70 년대, 소프트웨어의 복잡성 증가로 인해 소프트웨어 위기 (Software Crisis) 가 발생. 소프트웨어 공학 등장:
1968 년 NATO 소프트웨어 공학 회의에서 ’ 소프트웨어 공학 ’ 개념이 공식화됨. 현대:
SDLC, Agile, DevOps 등 다양한 방법론과 도구가 발전하며 효율적이고 신뢰성 높은 소프트웨어 개발이 가능해짐. 소프트웨어 위기 (Software Crisis) 란 1960 년대 후반부터 본격적으로 대두된 용어로, 소프트웨어 개발 및 유지보수 과정에서 발생하는 일련의 심각한 관리상 문제를 의미한다. 이는 컴퓨터 하드웨어의 성능이 빠르게 발전하고, 소프트웨어의 규모와 복잡성이 급격히 증가함에 따라 기존의 개발 방법론과 도구들이 부적합해지면서 나타난 현상이다.
소프트웨어 위기의 대표적인 증상은 다음과 같다: - 프로젝트 일정 및 예산 초과: 개발이 예정보다 오래 걸리고, 비용이 증가함. - 소프트웨어 품질 저하: 버그와 결함이 많아지고, 사용자 요구를 충족시키지 못함. - 유지보수의 어려움: 설계가 변경에 유연하지 못해 유지보수 비용이 증가함. - 프로젝트 관리의 어려움: 코드 관리와 프로젝트 통제가 힘들어짐. - 소프트웨어의 미전달: 최종적으로 소프트웨어가 고객에게 전달되지 못하는 경우도 발생
오늘날에는 ‘모던 소프트웨어 위기 (Modern Software Crisis)’ 혹은 ‘소프트웨어 난제 (Software Complexity Problem)’ 이라는 형태로 지속되고 있다.
...