강의 전체 흐름
- 소프트웨어 개발 프로세스 (다룰 내용)
- 웹서비스 아키텍처
- 백엔드와 프론트엔드 연동
소프트웨어 개발은 코드를 작성하는 것 뿐만 아니라
시스템 설계도, 데이터베이스 설계도를 통해서 결과물을 산출하는 것 자체를 얘기함
건축에 비유를 할 수 있다. 주택을 짓기 위해 여러 사람들의 참여가 필요하고
고려해야 될 사항들이 많이 필요하다.
소프트웨어를 기획, 설계, 구현, 테스트하고 유지보수하는 일련의 단계로 구성
중요성
- 품질 향상
- 일정 준수
- 의사 소통 촉진
- 생산성 향상
- 고객 만족도 향상
일반적으로 요구사항 수집 및 분석, 시스템 설계, 구현, 테스트, 배포, 유지보수 순으로 진행하게 된다.
요구사항 수집 및 분석
- 요구사항 수집
- 시장 조사, 이해 관계자 정보 수집
- 요구사항 분류
- 기능적 요구사항, 비기능적 요구사항으로 분류 (기능적 : 소프트웨어가 할 것들) , (비기능적 : 시스템의 성능, 보안, 사용성 등)
- 요구사항 분석 : 검토 후 모호한 부분을 파악해 보고 비용, 시간등을 고려해서 우선순위를 정함
- 문서화 : 명확하고 구체적인 문서를 작성, 제약조건도 상세하게
- 요구사항 검증 및 확인 : 이해관계자들의 최종 검토가 필요
보통은 기확자, 개발자, 디자이너가 모여서 요구사항을 논의 후 상세 기획서를 만들어 우선순위를 정하는 경우가 많았다고 한다.
시스템 설계
- 상위 설계
- 시스템 아키텍처 설계
- 모듈화
- 데이터 설계
- 인터페이스 설계
- 하위 설계
- 데이터베이스 설계
- 클래스 설계
- 알고리즘 설계
- 에러 처리 및 로깅 방식
핵심 설계 원칙
- 모듈화 : 독립적이고 분리된 모듈로 설계 , 특정기능을 가지고 다른 모듈과 상호작용하게 함 (테스트도 용이하게!)
- 캡슐화 : 모듈내부의 데이터와 구현 기능을 외부로 부터 숨겨서 사용되도록 함
- 재사용성 : 범용적이고 모듈화된 컴포넌트를 생성해서 다른 프로젝트에서 사용될 수 있게 한다.
- 확장성 : 향후 요구사항이 변경되어도 유연하게 변경될 수 있도록 만든다.
- 응집도와 결합도 : 응집도 : 모듈 내부의 요소들이 얼마나 관련성 있는지 ? 낮은 결합도 : 모듈의 독립성을 높혀준다.
- 단순성 : 복잡성을 낮춰 디버깅이 용이하게 만들어야 한다.
소프트웨어 아키텍처

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