인프런 커뮤니티 질문&답변

PrivilegeEscalate님의 프로필 이미지
PrivilegeEscalate

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

TDD: Test Driven Development

TDD 를 적용하면 구현하려는 기능에 필요한 객체들을 설계하고 들어가야 하는건가요?

작성

·

76

·

수정됨

0

안녕하세요 강사님. 요즘 질문을 많이해서 대단히 죄송하게 생각하고 있습니다! 우선 질문 계기를 들어보시죠.

 

[질문을 하게 된 이유]

처음에 최소한으로 돌아가는 쓰레기 코드를 만들었고, 리팩토링으로 객체를 쪼개며 단위 테스트를 작성하고 있었습니다. 근데 갑자기 이런 고민이 들더군요. "TDD 를 적용하려면 어떻게 해야하지?"

 

하지만 아무리 생각을 해봐도 TDD 를 적용하려면 "쓰레기를 만들고, 여러 객체들로 쪼개 개선해나가는" 형태의 개발방식에은 사용할 수 없다는 결론에 도달하게 되었습니다.

 

애초에 TDD 를 적용하려면 "처음부터 구현하려는 기능에 필요한 객체들을 생각하고 만들어나가야 하는건가?" 아니 이러면 너무 피곤하지 않나? 라는 생각이 들었습니다.

 

[본격적인 질문]

[질문 1]

처음부터 돌아가는 쓰레기 코드(하나의 클래스에 몰빵) 를 만들고, 리팩토링을 통해 여러 객체로 책임을 분산시키는 형태의 개발 방식은 애초에 TDD 를 적용할 수 없는 것인가요? (TDD 를 적용하면 애초에 스파게티 코드가 나올 수 없는건가요?)

 

[질문 2]

TDD 가 애초에 구현하려는 기능에 필요한 객체들을 처음부터 설계하고 들어가는 방식인건가요?

 

[질문 3]

TDD 를 적용하려면 구현하는 기능에 필요한 도메인 지식들을 완벽하게 숙지하고 들어가야 코드를 수정하는 일이 별로 없을거라고 생각됩니다. 그렇지 않으면 "일단 쓰레기 구현 -> 리팩토링 -> 테스트" 개발 방식보다 시간이 훨씬 오래 걸릴거라고 생각하는데.. 강사님 생각은 어떠신지 궁금합니다.

 

[질문 4]

TDD 를 적용하면 코드 품질이 좋을 수 밖에 없는 이유가 [질문 2] 때문인가요?

 

(한국말 너무 어렵습니다..)

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, PrivilegeEscalate 님!

 

[질문 1]

처음부터 돌아가는 쓰레기 코드(하나의 클래스에 몰빵) 를 만들고, 리팩토링을 통해 여러 객체로 책임을 분산시키는 형태의 개발 방식은 애초에 TDD 를 적용할 수 없는 것인가요? (TDD 를 적용하면 애초에 스파게티 코드가 나올 수 없는건가요?)

가정하신 상황이 중간 단계가 없이 조금 극단적인 것 같긴 한데요 ㅎㅎ
TDD는, 아니 테스트는, input과 output만 있으면 테스트를 작성할 수 있습니다.
쓰레기 코드를 작성했다면 그 쓰레기 코드의 input, output을 가지고 테스트를 작성해 볼 수도 있지 않을까요? (어렵겠지만)
하지만 조금 현실적으로 생각하면, 쓰레기 코드를 만들더라도, 객체로 책임을 쪼개면서 그 객체가 가지는 input/output 을 가지고 그 부분에 TDD를 적용하면 되지 않을까요?
또 TDD를 사용한다고 스파게티 코드가 나오지 않는 것도 아닙니다. 만능이 아니라 하나의 도구일 뿐이에요.

[질문 2]

TDD 가 애초에 구현하려는 기능에 필요한 객체들을 처음부터 설계하고 들어가는 방식인건가요?

TDD는 첫 설계를 이야기 하는 것이 아니라, 테스팅을 통한 안정적이고 지속 가능한 설계의 변화 과정에 가깝습니다.
처음부터 설계하는 것과는 무관합니다.

[질문 3]

TDD 를 적용하려면 구현하는 기능에 필요한 도메인 지식들을 완벽하게 숙지하고 들어가야 코드를 수정하는 일이 별로 없을거라고 생각됩니다. 그렇지 않으면 "일단 쓰레기 구현 -> 리팩토링 -> 테스트" 개발 방식보다 시간이 훨씬 오래 걸릴거라고 생각하는데.. 강사님 생각은 어떠신지 궁금합니다.

일단, '도메인 지식을 완벽하게 숙지하고 개발할 수 있는 사람'은 아무도 없어요 ㅎㅎ
제 다른 강의인 Readable Code에서도 이야기하지만, 도메인 지식은 처음부터 알고 들어가는 것이 아니라, 이미 있지만 감춰진 지식을 '발견'하는 것입니다.

일단 만들면서 도메인 지식을 쌓아가고, 발견해보고, 더 좋은 설계가 생각나면 과감히 기존 코드를 버리거나 변경하면서 소프트웨어를 개선시킬 수 있습니다.
TDD는 그 과정에서 도움을 주는 하나의 도구일 뿐이에요.

[질문 4]

TDD 를 적용하면 코드 품질이 좋을 수 밖에 없는 이유가 [질문 2] 때문인가요?

앞서 말씀 드렸듯, TDD를 사용한다고 하더라도 잘못 사용하면 품질이 나쁠 수도 있습니다.

너무 어렵게 생각하지 마시고, 눈 앞에 놓인 도메인과 객체에 집중해서 작은 단위부터 TDD를 적용해 보세요.

감사합니다. 🙂

감사합니다!

0

안녕하세요, PrivilegeEscalate님, 인프런 AI 인턴입니다.

TDD(Test-Driven Development) 관련하여 궁금해하시는 부분에 대해 답변드리겠습니다.

질문 1: 처음에는 하나의 클래스에 코드를 모두 몰아넣은 후, 리팩토링을 통해 여러 객체로 분산시키는 방식은 TDD와는 다소 차이가 있습니다. TDD의 기본 원칙은 작은 테스트 케이스를 먼저 작성하고 이를 통과시키기 위한 최소한의 코드를 작성하는 것이며, 그 후에 리팩토링을 진행하는 것이죠. 따라서 처음에 “돌아가는 쓰레기 코드”를 만들고 나중에 리팩토링하는 방식이 아닌, “테스트가 실패하는 상태를 만들고” 이를 통과시키는 작은 코드부터 시작하는 접근이 TDD에서는 이상적입니다. 하지만 TDD도 결국은 개발의 한 방법론이므로, 유연하게 접근할 필요가 있습니다.

질문 2: TDD에서는 처음부터 모든 객체를 설계할 필요는 없습니다. 오히려 작은 단위부터 시작하여 테스트를 통해 필요한 객체와 기능을 점진적으로 파악해 나가게 됩니다. 이것은 TDD의 가장 큰 장점 중 하나로, 미리 다 설계하지 않더라도 테스트를 통해 점진적으로 시스템을 구축할 수 있다는 점입니다.

질문 3: TDD가 코드 품질을 높이는 이유는, 지속적으로 테스트를 통해 코드가 요구사항을 만족하는지 확인하기 때문입니다. [질문 2]에서 말씀드린 것처럼, 처음부터 객체를 설계해 나가는 것보다는, 작은 테스트 케이스로 시작하여 필요한 객체나 구조를 테스터를 통해 지속적으로 개선해 나가는 과정이 코드 품질을 높이는 데 기여합니다. 테스트가 이를 지속적으로 확인하고, 리팩토링을 통해 코드가 개선되기 때문에 결과적으로 코드 품질이 좋아지는 것입니다.

TDD는 여러분의 코드를 지속적으로 테스트하고 유지보수 가능하게 만들 수 있는 방법을 제공하며, 이는 자동적으로 코드 품질 향상으로 이어질 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

유사한 질문 및 답변 확인하기
- 현업에서도 TDD를 적극 활용하시는지 궁금합니다.

현업에서 TDD를 사용하시나요?
- TDD의 장점과 활용방식에 대해 더 알아보세요.

PrivilegeEscalate님의 프로필 이미지
PrivilegeEscalate

작성한 질문수

질문하기