소프트웨어 공학의 정의와 개발과정
소프트웨어 공학은 인류의 이익을 위해서 소프트웨어와 관련된 원리, 지식, 도구등을 활용하여 새로운 제품, 도구등을 만드는 것
폭포수 모델(WaterFall Model)

- 계획, 요구사항 분석, 설계, 구현(프로그래밍), 시험, 유지보수의 순서로 시스템의 개발되는 전통적인 방법론
- 개념 정립에서 구현까지 하향식 접근방법을 사용하여 높은 추상화 단계에서 낮은 추상화 단계로 이동하는 모델
장점
- 프로젝트 진행과정을 세분화하기 때문에 큰 프로젝트의 진척과 인력 관리가 용이
- 개발 방법론의 초기 모델로서 많은 수행과 검증을 거쳐왔고, 대규모 시스템 구축에 있어 경험 축적
- man/month 기반의 비용산정과 일정산정의 용이
단점
- 고객이 원하는 요구사항을 초기에 구체화 하기 어려움
- 오류발견과 수정이 순환적으로 발생하므로, 순차적 개발이 현실적으로 어려움
- 시스템 구축이 후반부에 가서야 완료 되는 경우엔, 시스템 문제점 파악 어려움
- man/month 기반의 비용산정의 불합리성과 일정산정의 부정확함
대표적 폭포수 모델인 WBS(Work Breakdwon Structure) 예시

애자일(Agile)

개발자들이 좋은 것을 빠르고 낭비없이 만들기 위해 경량화된 가벼운 개발방법론
애자일 방법론 중 하나로 스크럼(SCRUM) 방식이 널리 사용

- 스크럼 개발 방법론이란 특정 이슈를 bottom up방식을 통해 발행하여 문제를 공유하고 문제를 짧은 스탭을 통해 해결해 나가는 과정
- PO, PM(PL), 기획자, 개발자, 디자이너 등이 스크럼의 참여자
- 일반적으로 개발팀에서 scrum회의라 하면 우선순위별로 발행된 이슈에 대해 논의하고, 스프린트 별로 진척 상황을 회고 하는 것.
- 스크럼을 위한 툴로서 아틀라시안사의 JIRA라는 툴을 많이 사용
애자일 방법론의 작은단위의 기능개발
모놀리식 아키텍처

- 단일 대규모 애플리케이션
- 애플리케이션의 모든 기능이 하나의 큰 시스템으로 구축되는 방식
- 통합된 개발 접근
- 애플리케이션의 모든 구성 요소가 하나의 코드베이스에 통합되어 있으며, 이로 인해 소스코드가 서로 영향을 받고 배포 및 테스트가 복잡하고 어려워짐
- 관리 및 유지보수의 복잡성
- 상호 영향도
- 하나의 모듈을 수정할 때, 이를 참조하거나 영향을 받는 모든 모듈들도 영향을 받을 수 밖에 없는 구조
- SW아키텍처의 복잡도와 배포의 어려움
- 소스코드의 영향도로 인해, 배포도 팀마다 불가능하고 전체 배포 시간을 정하여 모든 소스코드를 한꺼번에 반영.
- 일반적으로 새벽시간이나 DB작업 등 복잡한 작업의 경우엔 새벽에 진행. 심지어 변경의 규모가 큰 작업일 경우 명절 등 공휴일을 정해 배포
- 시스템 구성의 복잡성
MSA(MicroService Architecture)

- 모놀리식에서 문제의 원인이었던 서비스들간의 의존성이 약화되거나 제거돼 느슨한 결합(loosely coupled) 상태로 구성
- 서비스는 저마다 데이터베이스를 가지며, 각 서비스마다 더 적합한 기술이 사용
- 서비스의 수정이 발생하여도 다른 서비스로의 영향이 없거나 적기 때문에, 독립적인 개발 및 배포가 가능
- 특정 이벤트로 대량의 트래픽이 몰릴 경우, 해당 서비스에만 컴퓨팅 리소스를 더 투입하는 스케일 아웃 전략을 적용
MSA의 통신방식

- API기반 통신
- API는 주로 동기적 처리를 위한 용도
- 주문서비스에서 회원정보가 필요할 때, 회원 ID를 가지고 회원 서비스를 호출하여 정보를 조회
- 이벤트 기반 통신 (queue) → publisher / subscriber
- 비동기 또는 독립적 처리를 위한 용도
- 주문이 발생하면(신규 주문 이벤트가 발생하면) 주문 정보를 가진 메시지를 발행하고, 재고 서비스나 앱 푸시 서비스에서 해당 메시지를 구독하여 후속 처리