공부/Computer Science

[CS 면접 대비 공부] 소프트웨어 공학

남쪽마을밤송이 2022. 8. 6. 21:52

 TDD(Test Driven Development) 

  • TDD : 테스트 주도 개발, "테스트가 개발을 이끌어 나간다"
  • 우리는 보통 개발할 때, 설계(디자인)를 한 후 코드 개발과 테스트 과정을 거치게 된다.

  • 하지만 TDD는 기존 방법과는 다르게, 테스트케이스를 먼저 작성한 이후에 실제 코드를 개발하는 리팩토링 절차를 밟는다.

  • 반복적인 "검토"와 "고쳐쓰기"를 통해 좋은 글이 완성된다. 이런 방법을 소프트웨어에 적용한 것이 TDD 방식이다.
    • 소프트웨어 또한 반복적인 테스트와 수정을 통해 고품질의 소프트웨어를 탄생시킬 수 있다.
  • 장점
    • 작업과 동시에 테스트를 진행하면서 실시간으로 오류 파악이 가능함 (시스템 결함 방지)
    • 짧은 개발 주기를 통해 고객의 요구사항을 빠르게 수용 가능. 피드백이 가능하고 진행 상황 파악이 쉬움
    • 자동화 도구를 이용한 TDD 테스트케이스를 단위 테스트로 사용이 가능함
    • 개발자가 기대하는 앱의 동작에 관한 문서를 테스트가 제공해 줌
  • 단점
    • 기존 개발 프로세스에 테스트케이스 설계가 추가되므로 생산 비용 증가
    • 테스트의 방향성, 프로젝트 성격에 따른 테스트 프레임워크 선택 등 추가로 고려할 부분의 증가
  • 필요성
    • TDD를 활용하면, 처음 시작하는 단계에서 테스트케이스를 설계하기 위한 초기 비용이 확실히 더 들게 된다. 하지만 개발 과정에 있어서 "초기 비용"보다 "유지보수 비용"이 더 클 수 있다는 것을 명심하자.
    • 또한 안전성이 필요한 소프트웨어 프로젝트에서는 개발 초기 단계부터 확실하게 다져놓고 가는 것이 중요하다.

 

 마이크로서비스 아키텍처(MSA) 

  • MSA는 소프트웨어 개발 기법 중 하나로, 어플리케이션 단위를 "목적"으로 나누는 것이 핵심이다.

Monolithic vs MSA

  • MSA가 도입되기 전, Monolithic 아키텍처 방식으로 개발이 이루어졌다.
  • Monolithic의 사전적 정의에 맞게 "한 덩어리"에 해당하는 구조로 이루어져 있었고 모든 기능을 하나의 어플리케이션에서 비즈니스 로직을 구성해 운영한다.
  • 따라서 개발을 하거나 환경설정이 간단한 장점이 있어 작은 사이즈의 프로젝트에서는 유리하지만, 시스템이 점점 확장되거나 큰 프로젝트에서는 단점들이 존재한다.
    • 빌드 / 테스트 시간의 증가 : 하나를 수정해도 시스템 전체를 빌드해야 함. 즉, 유지보수가 힘들어진다.
    • 작은 문제가 시스템 전체에 문제를 일으킴 : 만약 하나의 서비스 부분에 트래픽 문제로 서버가 다운되면, 모든 서비스 이용이 불가능할 것이다.
    • 확장성에 불리 : 서비스마다 이용률이 다를 수 있다. 하나의 서비스를 확장하기 위해 전체 프로젝트를 확정해야 한다.
  • MSA는 좀 더 세분화시킨 아키텍처라고 말할 수 있다. 한꺼번에 비즈니스 로직을 구성하던 Monolithic 방식과는 다르게 기능(목적)별로 컴포넌트를 나누고 조합할 수 있도록 구축한다.

  • MSA에서 각 컴포넌트는 API를 통해 다른 서비스와 통신을 하는데, 모든 서비스는 각각 독립된 서버로 운영하고 배포하기 때문에 서로 의존성이 없다. 하나의 서비스에 문제가 생겨도 다른 서비스에는 영향을 끼치지 않으며, 서비스별로 부분적인 확장이 가능한 장점이 있다.

  • 장점
    • 서비스 별로 개발팀이 꾸려지면 다른 팀과 의존 업싱 팀 내에서 피드백을 빠르게 할 수 있고, 비교적 유연하게 운영이 가능할 것이다.
  • 단점
    • MSA는 서비스 별로 호출할 때 API로 통신하므로 속도가 느리다. Monolithic 방식은 하나의 프로세스 내에서 진행되기 때문에 MSA보다 훨씬 빠를 것이다.
    • 서비스 별로 통신에 맞는 데이터로 맞추는 과정이 필요하기도 하다.
    • 또 MSA는 DB 또한 개별적으로 운영되기 때문에 트랜잭션으로 묶기 힘든 점도 있다.
  • 따라서 서비스 별로 분리를 하면서 얻을 수 있는 장점도 있지만, 그만큼 체계적으로 준비돼 있지 않으면 MSA로 인해 오히려 프로젝트 성능이 떨어질 수도 있다는 점을 알고 있어야 한다. 정답이 정해져 있는 것이 아니라 프로젝트의 목적, 현재 상황에 맞는 아키텍처 방식이 무엇인지 설계할 때부터 잘 고민해서 선택해야 한다.

 

참고

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Software%20Engineering/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4%20%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98(MSA).md