애플리케이션의 품질과 안정성을 높이기 위해 사전에 결함을 찾아내고 수정하기 위한 행위
주로 특정 모듈(컴포넌트)이 사양에 잘 동작하는지 자동화된 테스트로 검증
테스트 코드를 작성할때 테스트 단위를 나누는 것이 중요하다. 모듈이 큰 범위로 결합되어있다면 넓은 범위로 검증을 진행해야한다. 예를 들어 쇼핑몰 메인 페이지에서 상품 display, 필터 검색과같은 기능을 하나의 컴포넌트에 전부 몰아넣었다고 했을때, 테스트 해야하는 범위또한 넓어지게 된다.
소프트웨어 공학에서 정의하는 결합도(coupling)은 어떤 모듈이 다른 모듈에 의존하는 정도를 뜻한다. 결합도가 낮고 독립성이 높은 모듈은 수정을 진행한다고 해도 다른 모듈의 영향이 미치지 않기 때문에 버그가 발생할 확률이 낮다
고양이 발톱 깎기 vs 고양이 갈비뼈 빼내기
발톱은 고양이라는 모듈과 독립성이 높기 때문에 수정을 해도 고양이에게 영향이 크지 않지만, 갈비뼈같이 서로 다른 부위들과 결합된 모듈을 건드리게되면 고양이가 큰일날 수 있는 확률이 높아지게된다.
결합도가 높아지게 된다면,
테스트할 내용이 많기 때문에 테스트 복잡도가 상승한다 -> 특정 기능만 따로 검증하기가 어려워진다 (다른 곳에서 영향 유무를 파악해야함) -> 여러 테스트 코드를 계속 수정해야함 -> 개발 비용이 증가
개발자는 이런 문제를 줄이기 위해
제공해야하는 기능을 구현할 때 컴포넌트를 나누게 된다 -> 자연스럽게 결합도 감소 -> 개발 비용이 감소
리팩토링 : 결과의 변경 없이 코드의 구조를 재조정하는 것으로 코드의 가독성을 높이고, 복잡성을 줄이며, 개발자 간의 협업을 용이하게 하는 것이 목적
넓은 리펙토링의 범위를 가지고 있다면 문제 발견시 원인을 찾기가 어렵다.
배가 아파요 vs 오늘 저녁에 빙수를 먹고 난 다음부터 아랫쪽 배를 눌렀을때 찌르는 듯한 통증과 함께 꿀렁이는 소리가 나요
이 두개의 설명중 의사가 증상의 원인을 파악하기 쉬운쪽은 바로 후자일 것이다. 따라서 이걸 개발 방향으로 생각한다면, 상세한(좁은) 범위에서 발생하는 문제임을 구별할 수 있게 된다면, 문제의 해결 방안도 쉽게 알 수 있다는 것이다.
장난감부터 크게는 가구까지, 모든 상품에는 그에 따른 설명서가 존재하기 마련. 좋은 설명서는 곧 사용자가 쉽게 제품의 내용을 이해할 수 있게되며, 이는 곧 조립의 효율 상승으로 이어진다. 뿐만 아니라 문제가 발생했을 때 어떤 곳을 유지보수 해야할지도 알 수 있게 된다.