개발 풀 사이클

Songss·2025년 3월 24일
0

개발지식

목록 보기
13/16

강의 전체 흐름

  • 소프트웨어 개발 프로세스 (다룰 내용)
  • 웹서비스 아키텍처
  • 백엔드와 프론트엔드 연동

소프트웨어 개발은 코드를 작성하는 것 뿐만 아니라
시스템 설계도, 데이터베이스 설계도를 통해서 결과물을 산출하는 것 자체를 얘기함
건축에 비유를 할 수 있다. 주택을 짓기 위해 여러 사람들의 참여가 필요하고
고려해야 될 사항들이 많이 필요하다.

소프트웨어를 기획, 설계, 구현, 테스트하고 유지보수하는 일련의 단계로 구성

중요성

  • 품질 향상
  • 일정 준수
  • 의사 소통 촉진
  • 생산성 향상
  • 고객 만족도 향상

일반적으로 요구사항 수집 및 분석, 시스템 설계, 구현, 테스트, 배포, 유지보수 순으로 진행하게 된다.


요구사항 수집 및 분석

  • 요구사항 수집
    - 시장 조사, 이해 관계자 정보 수집
  • 요구사항 분류
    - 기능적 요구사항, 비기능적 요구사항으로 분류 (기능적 : 소프트웨어가 할 것들) , (비기능적 : 시스템의 성능, 보안, 사용성 등)
  • 요구사항 분석 : 검토 후 모호한 부분을 파악해 보고 비용, 시간등을 고려해서 우선순위를 정함
  • 문서화 : 명확하고 구체적인 문서를 작성, 제약조건도 상세하게
  • 요구사항 검증 및 확인 : 이해관계자들의 최종 검토가 필요

보통은 기확자, 개발자, 디자이너가 모여서 요구사항을 논의 후 상세 기획서를 만들어 우선순위를 정하는 경우가 많았다고 한다.


시스템 설계

  • 상위 설계
    - 시스템 아키텍처 설계
    - 모듈화
    - 데이터 설계
    - 인터페이스 설계
  • 하위 설계
    - 데이터베이스 설계
    - 클래스 설계
    - 알고리즘 설계
    - 에러 처리 및 로깅 방식

핵심 설계 원칙

  • 모듈화 : 독립적이고 분리된 모듈로 설계 , 특정기능을 가지고 다른 모듈과 상호작용하게 함 (테스트도 용이하게!)
  • 캡슐화 : 모듈내부의 데이터와 구현 기능을 외부로 부터 숨겨서 사용되도록 함
  • 재사용성 : 범용적이고 모듈화된 컴포넌트를 생성해서 다른 프로젝트에서 사용될 수 있게 한다.
  • 확장성 : 향후 요구사항이 변경되어도 유연하게 변경될 수 있도록 만든다.
  • 응집도와 결합도 : 응집도 : 모듈 내부의 요소들이 얼마나 관련성 있는지 ? 낮은 결합도 : 모듈의 독립성을 높혀준다.
  • 단순성 : 복잡성을 낮춰 디버깅이 용이하게 만들어야 한다.

소프트웨어 아키텍처

  • MVC 패턴 : 스피링, 장고 등이 사용한다고 한다.
    모델 : 애플리케이션의 데이터와 비즈니스 로직을 처리함. 후 컨트롤러에 전달
    모델은 뷰와 직접 상호작용하지 않는다.
    뷰 : 컨트롤러부터 받은 데이터로 사용자에게 랜더링을 해준다.
    컨트롤러 : 사용자에게 요청을 받아 모델, 뷰에게 데이터를 전달해준다.
    -> 컨트롤러, 모델, 뷰가 독립적으로 위해서 유지보수가 쉽고 확장성이 좋다.

  • 모놀리식 아키텍처 : 애플리케이션의 모든 구성요소가 하나의 큰 단위로 개발됨
    하나의 코드베이스에 통함되어 있고 같은 기술스택으로 구성되어 있음
    장점 : 간단한 개발 및 배포 / 쉬운 디버깅 / 용이한 테스트
    단점 : 개발 속도 저하 / 배포 어려움 / 확장성 제한 / 신뢰성 / 기술 채택의 장벽
  • 마이크로서비스 아키텍처 : 작고 독립적인 단위로 개발, 각각 독립적으로 개발, 배포, 운영된다.
    장점 : 높은 안정성 / 높은 확장성 / 배포 용이성 / 기술적 유연성
    단점 : 복잡성 증가 / 네트워크 오버헤드 / 디버깅과 모니터링이 어려움 / 배포 복잡성

핵심 설계 원칙은 시스템의 품질을 높히고 유지보수를 높혀야하는 것이 중요함!


구현

설계 단계에서 구축한 것을 실제로 만드는 것.

주요 활동

  • 코딩 : 일관성과 유지보수를 쉽게하기 위해서 표준 코딩 규칙(변수,함수,들여쓰기 등등)을 정하는 것이 좋다
  • 통합 : 개별적으로 만들어진 모듈, 구성요소를 전체 시스템이 원활하게 돌아가게 끔 하는 것
  • 단위 테스트 : 예상대로 작용하는지에 대해서 코딩과 함께 단위테스트를 진행 (버그 식별하기에 좋음)
  • 코드 리뷰 : 코드 품질 향상시킬 수 있음 , PR 기능을 화용
  • 리팩토링 : 내부구조를 개선 (가독성을 높히거나 복잡성을 줄임) + 테스트 코드가 필요함
  • 성능 최적화 : 코드를 최적화하는 작업 -> 자원을 효율적으로 사용하기 위함 (알고리즘, 쿼리문 등)
  • 보안 구현 : 취약점을 찾아 보안 점검을 함
  • 문서화 : API설계 문서, 시스템 설계 문서 등을 작성
  • 버전관리 : 소스코드의 버전을 관리함 , 변경사항을 추적하기에 용이함 (브랜치 사용)

표준 코딩 규칙을 정하고 개발자들간에 코드 리뷰, 테스트와 리팩토링을 하는게 매우 중요


테스트

테스트를 통해서 소프트웨어의 개발을 찾아 수정할 수 있다. (코드 안정성 높히고 비용 절감)

주요 활동

  • 테스트 계획 수립 (목표, 전략 정의 , 정의와 방법론 등을 설정)
  • 테스트 케이스 및 시나리오 작성 (테스트케이스 작성 : 항목, 입력 값, 예상 조건 등)
  • 테스트 환경 설정
  • 테스트 실행 (실행하고 결과를 기록 -> 버그 및 이슈 확인)
  • 결함 관리 (이슈 관리 툴이 필요함 : jira,트렐로 등)
  • 테스트 결과의 평가 및 보고

종류

  • 단위 테스트 : 함수, 메소드 등 가장 작은 단위를 테스트 (구현 단계에서)
  • 통합 테스트 : 여러 모듈을 통합하는 과정에서 오류를 찾는 테스트 (모듈간에 상호작용이 정상적으로 진행되는가)
  • 시스템 테스트 : 전체 시스템이 사용자 요구 사항에 완벽히 충족되는 지
  • 인수 테스트 : 사용자가 직접 테스트하여 요구 사항에 완벽히 충족되는 지 (사용자 시나리오 작성하에)
  • 회귀 테스트 : 소프트웨어 변경, 수정으로 인해서 기존 기능에 영향이 있는지 (이전에 테스트 코드를 베이스하여)
  • 성능 테스트 : 응답 시간, 처리량 등을 테스트 (가상 사용자 수를 늘려서 점진적 부하 측정)
  • 보안 테스트 : 보안 취약점을 식별함

테스트 자동화

  • 대표적 프레임 워크
    JUnit , Selenium , Cypress , JMeter

배포

개발이 완료된 소프트웨어를 실제 사용자가 사용할 수 있도록 운영환경에 설치하고 운영하는 단계
주요 활동

  • 릴리스 준비 : 소프트웨어가 배포 준비가 되었는지 최종적으로 확인
  • 배포 계획 수립 : 일정 정하고 리스크관리 계획, 롤백 계획 등을 정함
  • 배포 환경 구성 : 소프트웨어를 운영할 환경을 구성 (디비 설치, 하드웨어 준비, 클라우드 서비스 준비 등)
  • 소프트웨어 배포 : 필요한 설정 파일과 환경 변수를 준비 (기술의 변화로 인해서 지속적으로 변경됨)
  • 테스트 및 검증 : 배포 후 배포된 소프트웨어가 정상적으로 움직이는지
  • 문서화 및 교육 : 새로운 소프트웨어에 대한 사용 가이드와 메뉴얼 제공 , 문제점 대응 준비
  • 운영 및 모니터링 : SW의 성능을 모니터링 , 필요한 경우 최적화 작업 수행

웹 애플리케이션 배포 방식

  • 파일 복사 : 웹서버 특정 디렉토리에 파일들을 붙혀넣는다. (Capistrano, Ansible, Puppet)
  • 가상 서버 이미지 생성 : EC2 인스턴스 생성 후 필요한 SW, 웹 애플리케이션을 설치 -> 해당 인스턴스를 AMI로 변환하여서 템플릿으로 변경 (EC2 오토스케일 사용하면 좋음)
  • 컨테이너 이미지 생성 : 도커와 같은 컨테이너 기술을 사용하여 애플리케이션을 패키징하여 배포 (실행환경 일관성 보장)

배포 전략

  • 롤링 업데이트 : 서버를 1개씩 차례대로 업데이트 하는 방식 , (전체 시스템 업데이트하는데 오래 걸림)
  • 블루-그린 배포 : 2개의 동일한 환경을 준비해서 차등적으로 업데이트 (롤백 용이, 버전 중복되는 시간이 없음)
  • 카나리 배포 : 소수의 사용자에게 배포 후 이상이 없을시 전체 배포해버림

지속적 통합

  • 소스코드 변경 : 자신의 로컬환경에서 코드 작성, 수정 후 테스트
  • 코드 통합 : 중앙 저장소에 Push
  • 자동화된 빌드
  • 테스트 실행 : 단위, 통합, 정적 통합 분석 또한 진행
  • 결과 보고

지속적 배포

  • CI프로세스를 통해 빌드 및 테스트
  • 자동 배포
  • 성능과 안정성 모니터링
  • 문제 발생 시 rollback

도구 : 젠킨스, Circle Ci, Teamcity, Github Action

모니터링 및 로깅, (서비스 초기 구축하면 좋음)

  • 모니터링 도구 (반드시 필요) :
    - SaaS: New Relic, Datadog
    - 클라우드 : AWS Cloudwatch
    - 오픈소스 : 프롬테우스, 그라파나, 자빅스
  • 에러 모니터링 (반드시 필요) :
    - Sentry, Rollbar
  • 로깅 :
    - 클라우드 : AWS CloudWatch Logs
    • 오픈소스 : Loki

배포는 중요 !


유지보수

소프트웨어를 지속적으로 개선, 변화하는 시장에 대응하기 위한 단계

  • 버그 수정 : Jira와 같은 이슈 관리 시스템을 사용하면 좋음
  • 성능 최적화 : 응답시간이 느려지는 현상 등을 파악하고 성능을 최적화해야한다.
  • 기능 개선 및 추가 : 사용자 피드백에 따라 기능 개선과 새로운 기능을 추가(개발)한다.
  • 기술 부채 관리 : 기술 부채란 ? 급한 일정으로 인해 빵구가 나는 부분을 말함. 그래서 레거시,아키텍처들을 개선해야 됨
  • 운영 환경 관리 : 디비, 운영체제를 관리
  • 보안 업데이트 : 운영체제, 라이브러리에서 보안 취약점이 발견되면 지속적으로 시스템 보안 유지해야됨

0개의 댓글