Post

정보처리기사(필기) 📝 01. 소프트웨어 설계

정보처리기사(필기) 📝 01. 소프트웨어 설계

💡 소프트웨어 생명 주기 (Software Life Cycle, SLC)

✅ 소프트웨어 개발의 전 과정(요구 분석 → 설계 → 구현 → 테스트 → 유지보수)을 정의하는 개념.

1) 소프트웨어 개발 방법론

Image

  • 폭포수 모델(Waterfall Model)
    • 단계: 요구사항 분석 → 설계 → 구현 → 테스트 → 유지보수
    • 장점: 프로젝트 진행 과정을 세분화하여 관리가 용이
    • 단점: 단계가 끝나면 되돌리기 어렵고 중요한 문제점이 뒤에서 발생

Image

  • 프로토타이핑 모델(Prototype Model)
    • 고객의 요구를 반영한 프로토타입(시제품)을 먼저 제작하여 점진적으로 완성하는 모델
    • 장점: 사용자의 피드백을 즉시 반영 가능
    • 단점: 프로토타입 개발 비용 증가 가능

Image

  • 나선형 모델(Spiral Model)
    • 단계: 계획 → 위험 분석 → 개발 → 평가 단계를 반복
    • 장점: 대규모 프로젝트에서 유리, 위험을 사전에 파악 가능
    • 단점: 비용과 시간이 많이 듦

Image

  • 애자일(Agile) 개발 방법론
    • 고객과의 지속적인 소통을 통해 유연하고 빠르게 개발
    • 대표적인 방법론: XP(eXtreme Programming), 스크럼(Scrum), 칸반(Kanban)
    • 📝 eXtreme Programming - 수시로 발생하는 고객의 요구사항에 유연하게 대응하기 위해 고객의 참여와 개발 과정의 반복을 극대화하여 개발 생산성을 향상하는 방법.

💡 요구사항 분석

✅  사용자의 요구를 분석하여 시스템이 수행해야 할 기능과 제약사항을 정의하는 과정.

1) 요구사항의 유형

  • 기능적 요구사항 (Functional Requirements)
    • 시스템이 수행해야 할 기능과 동작 정의
    • 예: 로그인 기능, 회원가입 기능, 결제 기능
  • 비기능적 요구사항 (Non-Functional Requirements)
    • 성능, 보안, 유지보수성 등 시스템의 품질과 관련된 요구사항
    • 예: 응답 시간 1초 이내, 동시 사용자 1천 명 지원

2) 요구사항 분석 기법

  • 인터뷰(Interview): 사용자와 1:1 면담을 통해 요구사항 도출
  • 설문조사(Questionnaire): 다수의 사용자에게 설문하여 요구사항을 수집
  • 워크숍(Workshop): 사용자와 개발자가 함께 보여 요구사항을 논의
  • 관찰(Observation): 사용자의 실제 업무 수행을 관찰하여 요구사항을 파악

💡 소프트웨어 아키텍처 (Software Architecture)

✅ 소프트웨어의 구조와 구성 요소 간의 관계를 정의하는 과정.

1) 주요 소프트웨어 아키텍처 스타일

Image

  • 계층형(Layered) 아키텍처
    • 소프트웨어 개발에서 가장 일반적으로 사용되는 아키텍처로, 시스템을 여러 개의 계층으로 나누어 설계한다.
    • 가장 일반적인 계층형 아키텍처는 4-tier 아키텍처(Presentation, Business, Persistence, Database)이다.
    • 소통은 자신에게 인접한 하위 계층에 요청을 보내는 방식으로 진행된다. 자신보다 상위 계층이나, 인접하지 않은 계층에는 요청하지 못한다. 핵심은 단방향 의존성이다. 하위 계층은 인터페이스만 제공하고 요청을 받을 뿐, 상위 계층을 몰라야 한다.
    • 예: MVC(Model-View-Controller) 패턴
  • 클라이언트-서버(Client-Server) 아키텍처
    • 클라이언트(사용자 인터페이스)와 서버(데이터 처리)를 분리
    • 예: 웹 애플리케이션

Image

  • 마이크로서비스(Microservices) 아키텍처
    • 독립적인 서비스들이 상호작용하여 하나의 시스템(대규모 애플리케이션)을 구성
    • 예: Netflix, Amazon 등이 사용

💡 소프트웨어 설계 기법

✅ 소프트웨어를 체계적으로 설계하기 위한 기법.

1) 기능적 분할 (Functional Decomposition)

  • 프로그램을 여러 개의 작은 기능(모듈)으로 나누어 설계
  • 예: 큰 프로그램을 여러 개의 함수로 분리

2) 자료 중심 설계 (Data-Centered Design)

  • 데이터 구조를 중심으로 설계하여 데이터의 일관성과 무결성을 유지

3) 객체지향 설계 (Object-Oriented Design)

  • 객체(Object)와 클래스(Class)를 이용하여 시스템을 설계

💡 디자인 패턴 (Design Patterns)

✅ 소프트웨어 설계에서 반복적으로 사용되는 해결 방법.

1) 생성 패턴 (Creational Patterns)

  • 싱글톤(Singleton) 패턴
    • 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근 지점을 제공하는 생성 디자인 패턴.
  • 팩토리 메서드(Factory Method) 패턴
    • 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공(캡슐화!!)하지만, 자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴.

2) 구조 패턴 (Structural Patterns)

  • 어댑터(Adapter) 패턴
    • 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 한다.
  • 데코레이터(Decorator) 패턴
    • 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해 주는 패턴. 즉, 기본 기능에 추가할 수 있는 종류의 부가 기능에서 파생되는 다양한 조합을 동적으로 구현할 수 있는 패턴이다.

3) 행동 패턴 (Behavioral Patterns)

Image

  • 옵저버(Observer) 패턴
    • 객체의 상태 변화를 관찰하는 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴.

Image

  • 전략 패턴 (strategy pattern)
    • 특정 계열의 알고리즘(자전거, 버스, 택시)을 정의하고 각 알고리즘을 캡슐화한다.
    • 이 알고리즘들을 해당 계열 안에서 상호 교체(자전거 타고 가려다가 택시로 작전 변경)가 가능하게 만든다.

💡 UML (Unified Modeling Language)

✅ 소프트웨어 설계를 시각적으로 표현하는 방법.

1) 구조 다이어그램 (정적 다이어그램)

시스템의 구조 및 관계를 표현하는 다이어그램

  • 클래스 다이어그램 (Class Diagram)
    • 객체지향 설계에서 가장 중요한 다이어그램
    • 클래스(속성, 메서드)와 클래스 간의 관계(연관, 상속, 집합 등) 표현
    1
    
      [학생] ------- (등록한다) ------- [수업]
    
  • 객체 다이어그램 (Object Diagram)
    • 클래스 다이어그램의 구체적인 인스턴스를 표현
    • 객체 간의 관계를 실질적으로 보여줌
  • 컴포넌트 다이어그램 (Component Diagram)
    • 시스템의 모듈, 라이브러리, 컴포넌트 등을 표현
    • 프론트엔드, 백엔드, 데이터베이스 간의 관계
  • 배치 다이어그램 (Deployment Diagram)
    • 시스템이 실제 어떤 하드웨어 환경에서 배포되는지 표현
    • 서버, 클라이언트, 데이터베이스 배포 구조
  • 패키지 다이어그램 (Package Diagram)
    • 클래스나 컴포넌트를 패키지 단위로 묶어서 표현
  • 복합 구조 다이어그램 (Composite Structure Diagram)
    • 클래스 내부의 구조나 구성 요소 간 관계를 표현

2) 행위 다이어그램 (동적 다이어그램)

시스템의 동작과 상호작용을 표현하는 다이어그램

  • 유스케이스 다이어그램 (Use Case Diagram)
    • 사용자(액터)와 시스템 간의 기능 및 관계를 표현
    • 로그인, 회원가입, 결제 기능
  • 시퀀스 다이어그램 (Sequence Diagram)
    • 객체 간의 메시지 전달 흐름을 시간 순서대로 표현
    • 로그인 과정에서 사용자 → 서버 → DB → 응답 흐름
  • 커뮤니케이션 다이어그램 (Communication Diagram)
    • 시퀀스 다이어그램과 유사하지만, 객체 간의 관계와 메시지 흐름을 강조
  • 활동 다이어그램 (Activity Diagram)
    • 프로그램의 로직이나 워크플로우(흐름) 표현
    • 회원가입 → 이메일 인증 → 로그인
  • 상태 다이어그램 (State Diagram, State Machine Diagram)
    • 객체의 상태 변화를 표현
    • 버튼 (대기 상태 → 클릭됨 → 실행됨)
  • 타이밍 다이어그램 (Timing Diagram)
    • 시간 흐름에 따른 객체의 상태 변화를 표현
다이어그램 유형주요 목적예제
클래스 다이어그램클래스 간 관계 정의학생 - 수업 관계
객체 다이어그램객체 인스턴스 표현특정 학생 객체
컴포넌트 다이어그램시스템 모듈 구성프론트엔드 ↔ 백엔드 ↔ DB
배치 다이어그램하드웨어 배포 표현웹 서버 ↔ DB 서버
유스케이스 다이어그램사용자와 시스템 관계회원가입, 로그인
시퀀스 다이어그램메시지 흐름로그인 과정
활동 다이어그램업무 흐름결제 프로세스
상태 다이어그램상태 변화버튼 클릭 이벤트
This post is licensed under CC BY 4.0 by the author.