[Software Dev] 기초적인 소프트웨어 개발 분석부터 운영까지
우리가 일상에서 사용하는 서비스들은 도깨비 방망이로 한 순간에 뚝딱 만들어서 제공되는건 아닐터이다. 웹 애플리케이션도 일종의 서비스, 혹은 상품으로 볼 수 있으니 분명 어떠한 과정을 거칠 것이다.
그렇다면 웹 애플리케이션과 같은 소프트웨어 개발은 어떤 과정을 거쳐서 제작할 수 있을까?
필자는 크게 6단계로 나눠서 소프트웨어 개발 사이클을 정리할 수 있을 것 같다.
1. 분석 - 무엇을 만들어야하지?
소비자의 니즈를 분석하는 단계이다.
“무엇이 필요한가”, “왜 필요한가”, “누가 필요로하는가”, “도입이 가능한가”, “비용은 얼마나 드는가”, “도입된다면 뭐가 좋은가” 등등 막무가내로 하자! 느낌이 아닌 왜 필요한지, 정말로 필요한지를 생각할 수 있는 중요한 단계이다.
정보 수집, 조사, 분석 하여 “무엇이 필요한가”에 집중하여 도입할 기능을 구상 하는 단계이다.
쇼핑몰 사이트를 예로 들자면 “사용자가 원하는 상품만 추가하여 개인화된 상품 리스트”를 사용자가 필요로하고 있다.(사실 장바구니임)
1.1. 기능 도입 분석
기술적으로 구현이 가능한지, 불가능한지, 도입하는 데 필요한 비용은 얼마나 드는지, 당장 도입해야 하는 기능인지, 사용하는 등을 분석한다.
장바구니 기능은 쇼핑몰을 사용하는 모든 사용자에게 편리하고 개인화된 리스트를 제공함으로써 곧 상품 결제 까지 이어질 수 있는 필수 기능이니 시간과 비용을 감안하더라도 우선적으로 도입되어야 한다.
기술적으로도 구현이 어려운 것은 아니긴 하나 사용자화된 리스트 정보를 어디에 보관하고 관리할지, 기간을 얼마나 걸리는지 등 구체적이진 않더라도 대체적인 건 함께 의논하면서 분석하는 게 좋은 방향이라 생각한다.
이는 곧 기획자 혼자 구상,분석,계획,설계 하는데 한계가 있다는 의미이니 도입 시 함께 움직여야 할 부서와 함께 논의하자.
1.2. 기능 분석
기능이 어디서 어떻게 액션 트리거를 하고, 트리거된 액션은 어떤 기능을 수행해야 하는지를 상세하게 분석하는 단계이다.
기능 상세
- 상품을 장바구니 리스트에 추가할 수 있어야한다.
- 추가된 항목들을 일괄적으로 열람할 수 있어야한다.
분석
- 상품 상세 페이지 혹은 리스트에 “장바구니 추가” 기능을 구동시킬 수 있는 버튼이 필요하다.
- “장바구니 추가” 버튼 클릭 시 사용자 장바구니에 해당 상품이 추가된다.
- 메뉴바 우상단에 “장바구니 열람” 버튼이 필요하며, 이를 클릭할 시 사용자가 추가한 아이템이 노출된다.
도입되어야하는 기능을 리스트화 시키는 방법을 추천한다.
1.2.1. 사용자 경험(User eXperience; UX)
리스트에 추가만하여 열람하는 기능만 있다면 사용자는 불편함을 느낄 수 있다. 이를 개선하기 위해 장바구니를 이용하면서 사용자에게 편리함을 제공해줄 수 있는 기능을 추가해야한다.
- 추가된 상품 목록 삭제 / 수정
- 결제
- 비슷한 상품 추천.
등등 기본 기능에서 파생되어 사용자에게 편리를 줄 수 있는 기능 또한 고려해보자.
1.3. 계획 수립.
도입되는 비용, 기간, 등을 고려하여 일정 기간동안 몇 명의 인력으로 해당 기능을 도입할지 상세히 계획하는 단계이다.
2. 설계 - 서비스를 어떻게 제공할까?
분석 단계에서 산출된 사항들을 구현하기 위해 설계를 하는 단계이다.
가장 큰 맥락으로 어떻게 서비스를 제공할 것인지를 고려해봐야한다.
- 서비스가 구동되는 환경
- 웹, 앱(네이티브, 모바일, 하이브리드)...
- 네트워크
- 직접 네트워크 인프라를 구축하여 외부로 라우팅할 것인지, 클라우드 서비스를 이용할 것인지
- L4 스위치를 통한 로드밸런싱.
- 이중화.
- 보안
- OAuth2, 토큰 기반 인증, 암호화, 로그인, 인증/인가, 세션 관리…
- 기술 스택
- backend(API): Java, Spring Boot
- Frontend: React.js, Next,js, TypeScript
- DB: Mongo DB, JPA
- Container: Docker, k8s
- …
- 서비스 제공 방식
- PaaS, SaaS, IaaS
이후 기능이 실행되기 위해 모듈, 클래스를 어떻게 구성할 것이며, 어떤 알고리즘으로 기능을 실행하는지, API 사용 시 서버와 앱이 교환하는 데이터와 인터페이스, 컨텐츠 타입을 어떻게 할 것인지, UI/UX 디자인 등을 설계한다.
분석/설계 단계는 산출물이 도출되는 과정이라고 할 수 있다.
산출물로는
- 구조 파악
- 시스템 구성도
- 인터페이스 정의서
- 화면 구성 파악
- 와이어 프레임 및 화면 정의서
- 기능 파악
- 기능 명세서
- 플로우 차트
- 유스케이스 다이어그램
- 요구사항 파악
- 요구사항정의서
- 진행 추적
- WBS(Work Breakdown Structure;업무 분업 구조)
등등 프로젝트 진행에 정확한 목표를 설정하고, 구체적인 구조 파악을 위해 지속적으로 참고할 수 있는 산출물들을 작성한다.
3. 개발 - 기능을 구현하자.
기능 구현을 위한 배경이 다 준비 되었다면 실질적으로 개발을 진행할 수 있게된다. 개발 언어는 Java/Spring Boot, React.js, Next.js DB는 MongoDB, 클라우드는 AWS, CI/CD는 Jenkins 등등 사전에 정의된 환경에서 개발을 진행하자.
이때 PMO(Project Management Office),PM(Project Manaager), PL(Project Leader), PE(Project Engineer) 등 각자 롤을 맡아서 역할과 책임을 정리하도록 하자.
어떤 업무를 해야하는지 지시해주는 사람과, 지시 받은 업무를 실직적으로 시행하는 사람, 코드 리뷰, 아키텍쳐 모델링 등 효율적인 시스템 개발을 위해서 실무자를 리드하는 등의 역할이 있어야지 기간내에 웰메이딩한 소프트웨어 개발이 가능할 것이다.
짧은 스프린트로 사이클을 돌리는 에자일 방식과, 한 단계를 완벽하게 끝내고 개발을 진행하는 Water Fall 개발 방법론에 따른 개발 방식을 미리 선정하여 이에 맞는 개발 사이클을 돌릴 수 있도록하자.
현재는 많은 기업들이 요구사항을 유연하게 대처할 수 있는 에자일 방식을 선호한다.
Git,SVN과 같은 Version Control을 통하여 소스 내용을 공유하고 리뷰, 수정, Merge하여 하나의 소프트웨어를 완성해나가자.
4. 테스트 - 기능이 예상하는대로 잘 작동이되나?
의도한 대로 동작이 수행되는지 지속적으로 테스트하며 오류를 잡아내는 단게이다. 개발과 병행하여 수행하는 TDD(Test Driven Development)와 같은 개발 프로세스를 통해 지속적으로 오류가 있는지 확인하도록하자.
사전에 예방할 수 있는 오류가 있는지, 사람이 찾지 못하는 오류가 있는지 등을 고려해볼 수 있으며, 작은 단위로 수행하는 단위(Unit) 테스트와 도메인 혹은 기능 별로 수행하는 End to End, 전체적인 사이클을 돌면서 모든 단위를 수행하는 Integration 테스트 등을 수행하자.
IDE, 개발 언어 등에 따른 서드파티 테스트 툴 또한 있으니 간편하게 테스트를 진행할 수 있겠다.
여기서는 테스트가 제대로 수행 되었는지 문서로 정리하는 테스트 계획서, 결함 보고서, 테스트 요약 보고서 등을 작성하여 산출물로 작성하면 도움이 될 것이다.
5. 배포 - 소비자가 사용할 수 있도록 하자.
이제 실직적으로 사용자에게 서비스를 제공하는 단계이다.
로컬에서만 개발한다면 협업사, 고객사에게 보여줄 수 없으니 개발서버, 스테이징, 운영 서버 등으로 나뉘어진 섭서에 소스를 반영하여 진행 상황에 맞게 결과물을 공유할 수 있다.
Java/Spring boot의 경우는 JAR,WAR의 형식으로 Build하여 최적화된 형태로 서버에 로드하여 구동하는 방법이 있다.
직접 서버에 접근하여 FTP와 같은 프로토콜을 이용하여 개발자가 올릴 수도 있지만, Jenkins, GitLab, CircleCI 등과 같이 파이프라인에 걸쳐 CI/DI(지속적인통합/지속적인전달)의 속도와 효율성을 추구하도록 배포를 간편히 도와주는 툴을 사용할 수도 있다.
아키텍쳐 전체를 전체를 배포하는 전통적인 Monolithic Architecture방식과, 모듈단위로 분리하여 자체적으로 구동이 가능한 단위로 분리하여 배포하는 MSA(MicroService Architecture) 등의 방식을 사용할 수 있게된다.
이렇게 라우팅 설정이되어있는 서버에 소스를 배포하였다면 사용자들은 URL 등을 통한 접근 방법으로 해당 서비스를 이용할 수 있게된다.
6. 운영 - 사용하는데 불편함이 없도록 하자.
더 나은 서비스를 제공하기 위한 유지보수 단계이다.
마냥 배포만한다고 끝나는 것이 아닌 지속적인 모니터링을 통하여 사용자가 불편해 할 수 있는 부분을 개선해줄 수 있다.
기능면에서는 발견하지 오류, 간편한 사용을 위한 개선, 최적화를, 성능면에서는 과도한 사용으로 트래픽이 몰리지 않는지, 메모리 사용량 등을 점검하여 기민하게 대응하여 사용자의 서비스 사용 만족도를 올릴 수가 있다.
기획과 분석이 가장 중요한 첫 단추라면 운영은 이를 잘 포장할 수 있는 마지막 단추라 생각한다.
마지막 단추가 풀려버리면 역순으로 하나씩 단추가 풀려버릴 수 있으니 힘들게 만든 서비스를 유지하기 위해서 절대로 간과해서는 안되는 부분이다.
기업에서도 프로젝트 개발 계약과 별도로 유지보수 계약을 맺으니 꽤 중요한 부분이다.
ref.
https://blog.naver.com/uxstory01/221503684552
https://devcompass.co.kr/%EC%95%B1-%EC%A0%9C%EC%9E%91/