본문 바로가기
JAVA

[JAVA] TDD란?

by doodoom 2023. 4. 9.

0. 이 글을 쓰게된 이유

우아한테크코스 레벨1을 거치며 tdd에 대해서 배우고 적용하며 학습했다. tdd를 직접 적용해보며 느꼈던 장점과 단점, tdd에 대한 설명을 통한 메타인지 효과를 얻고자 이 글을 쓰게 되었다.

1. tdd란?

tdd는 소프트웨어 개발 방법론 중 하나로, 테스트를 먼저 작성한 후 그에 맞는 프로덕션 코드를 작성하는 개발 방법론이다. tdd의 핵심은 테스트 코드를 먼저 작성하는 것이다. 이는 개발자가 자신이 작성한 코드에 대해서 빠르게 테스트하면서 안정적이고 예측 가능한 코드를 만들 수 있게해준다.

2. tdd의 장점

tdd를 사용하면 어떤 장점이 있을까? 내가 직접 느낀 장점은 다음과 같다.

2.1 코드 품질 향상

tdd를 적용하게되면 테스트 코드를 먼저 작성하고 테스트에 통과하는 코드를 짜기 때문에 테스트에 통과하는 안정적인 코드를 짤 수 있게된다. 그리고 테스트가 이미 작성되어있기 때문에 프로덕션 코드를 짤 때 빠르게 테스트 할 수 있게있다. 결과적으로 코드의 품질이 올라가고 변화에 좀 더 효과적으로 대응할 수 있다.

2.2 테스트를 통한 문서화

개발자가 테스트 케이스를 작성하고, 그에 맞게 코드를 작성하는 과정에서 각각의 코드의 동작과 목적이 뚜렷하게 드러난다. 즉, 각각의 테스트 케이스는 해당 코드가 어떤 동작을 하는지 명확하게 설명하고 있고, 코드가 변경될 때마다 테스트도 같이 수정된다. 이 과정에서 코드와 테스트 케이스가 항상 일치하도록 유지되므로, 코드의 동작과 목적을 이해하기 쉽고, 유지보수 하기 용이해진다.
tdd를 적용하게되면 테스트를 먼저 작성하기 때문에 요구사항에 대한 문서화가 자연스럽게 이루어진다. 이렇게 작성된 테스트 케이스는 요구사항을 충족하는지 여부를 검증하는 중요한 문서 역할을 하게 되며, 이를 통해 코드의 정확성을 보장할 수 있다.

2.3 좀 더 꼼꼼한 테스트 작성 가능

프로덕션 코드를 먼저 작성하고 테스트 코드를 짜게되면 개인적으로 내 코드에 맞는 테스트를 짜게되는 경향이 있었다. tdd를 적용하니 테스트 작성 시에 다양한 테스트 케이스에 대해서 생각할 수 있게되어 꼼꼼하게 테스트 코드를 작성할 수 있었다.

2.4 개발 효율 향상

처음 어플리케이션을 생성하는 단계에서는 tdd가 개발 효율을 올려준다고 생각하지는 않는다. tdd를 적용하게되면 테스트 코드도 많아지는 경향이 있고, 프로덕션 코드를 수정하면 테스트 코드도 수정해야하는 경우가 많아서 그냥 프로덕션부터 짜는 것보다 느리다고 생각한다.
하지만 코드를 수정하거나 디버깅을 하는 시간은 현저히 줄어든다. tdd를 사용하면 초기부터 작은 단위의 테스트 코드를 짜게 되기 때문에 그만큼 품질 좋은 코드가 나오는 덕이다.

3. tdd의 단점

3.1 tdd의 숙련도

tdd를 도입하려면 사전에 충분한 학습과 연습이 필요하다. 갑자기 tdd를 도입하면 그 장점을 살리지 못하고 오히려 개발 효율이 떨어질 것이다.

3.2 초기 개발 비용

tdd를 도입하면 유지 보수가 아닌 처음 어플리케이션을 개발할 때 비용(시간)이 증가하게 된다. 만약 개발 기간이 굉장히 짧을 경우 시간이 부족할 수 있다.

4. tdd 굳이 해야할까?

그렇다면 tdd를 모든 상황에서 꼭 해야할까? 그렇지는 않다고 생각한다.
빠르게 개발해야하고 배포해야하는 상황에서 tdd를 적용하다보면 효율이 떨어진다. 그럴 때에는 프로덕션 코드부터 작성하는 것이 나은 방법일 수 있다.
하지만 tdd를 적용하면 시간 대비 비용이 더 커지지 않고 일정하게 유지된다. 즉, 개발 초기 비용은 더 들 수 있으나 비용이 점진적으로 늘지않아 시간이 지날 수록 tdd가 유리한 경우가 대부분이다.
각자의 상황에 따라서 유동적으로 사용한다면 tdd를 효과적으로 사용할 수 있을 것 같다.

'JAVA' 카테고리의 다른 글

[JAVA] 불변 클래스  (0) 2023.03.24
[Java] 객체 지향 vs 성능  (0) 2023.03.09
[JAVA] 객체 안의 public api 선정 기준  (0) 2023.02.28
[JAVA] Reflection  (1) 2022.10.06
[JAVA] equals와 hashcode  (0) 2022.09.28