강의

멘토링

로드맵

Inflearn Community Q&A

counterchord89's profile image
counterchord89

asked

Spring Boot TDD - Beginner to Practice Accurately

Writing tests relying on internal design

내부 설계에 의존하는 테스트 관련 질문 드립니다.

Written on

·

21

1

강의를 들으면서 내부 설계에 의존하는 테스트라는 것이 무엇인지 조금 헷갈려서 질문 드립니다.

 

강의 초반에는 테스트가 내부 설계에 의존해서는 안된다고 말씀 주셨습니다. 내부 설계에 의존하게 되면 테스트가 깨지는 등의 부작용이 발생할 수 있기 때문이라는 점도 함께 말씀 주셨는데,

 

이번 강의에서는 내부 설계에 의존해야 하는 케이스를 설명 해주셨습니다.

 

다만 왜 이런 케이스에는 내부 설계에 의존해야 하는지를 확실하게 이해를 하지 못했습니다.

 

조금 더 자세한 질문을 드리자면

  1. 내부 설계의 의미

  2. 내부 설계에 의존해야 하는 이유

이 두가지를 잘 이해하지 못한 것 같습니다.

내부 설계라는 것이 클라이언트가 실제로 사용하는, 외부로 공개된 인터페이스를 제외한 모든 부분을 말하는 것일까요?

 

이번 강의에서 내부 설계에 의존해야 하는 이유는

  1. 클라이언트는 어떤 방식으로 암호화를 하는지 알 필요가 없다.

  2. 하지만 현재 공개된 인터페이스로는 실제 비밀번호가 평문으로 저장이 되었는지, 아니면 정말 암호화가 이루어져 저징이 되었는지를 확인할 수 있는 방법이 없다.

  3. 그러므로 실제 암호화 로직을 테스트 해야한다 (내부 설계에 의존해야 한다)

정도로 이해했습니다만 제가 맞게 이해한 것인지 감이 오질 않습니다.

 

요약하자면

  1. 내부 설계란 외부로 드러난 인터페이스 외적인 것들을 말하는 것인지

  2. 왜 내부 설계를 의존해야만 하는 상황이 발생하는지

정도일 것 같습니다.

 

감사합니다.

tddspring-boot아키텍처junit

Answer 2

1

gyuwon2187님의 프로필 이미지
gyuwon2187
Instructor

안녕하세요. 제가 이 질문 알림을 놓쳐서 답변이 조금 늦었습니다. 🙏

우선 외부 설계와 내부 설계에 대해서 설명드리면 생각하시는 것처럼 어떤 코드 모듈 외부에서 인지할 수 있는 설계를 뜻하고 인터페이스를 통해 노출됩니다. 그리고 내부 설계는 인터페이스를 통해서 드러나지 않은 설계입니다. 정보 숨김(information hiding) 이란 기법에서 말하는 정보가 바로 이 내부 설계 결정(design decision)입니다. 일부 설계 결정을 내부에 숨김으로서 설계 이점을 취할 수 있습니다.

내부 설계는 말 그대로 내부에 있기 때문에 외부에서 사용되지 않아야 설계 이점을 충분히 얻을 수 있습니다. 하지만 아주 가끔씩은 테스트가 이 내부 설계를 이해하고 사용해서 얻을 수 있는 이점이 더 크기도 합니다. 보안과 관련된 기능을 테스트 할 때나 기존 코드의 설계 품질이 낮을 때 종종 이런 상황이 발생합니다.

엔지니어링은 적은 비용으로 많은 이점을 얻는 활동이기 때문에 이런 상황이 발생했을 때 원칙을 지킬지, 아니면 원칙을 깨고 테스트가 내부 설계에 의존하게 할지는 프로그래머 각자가 잘 판단해야 합니다.

답변이 부족했다면 말씀해주세요!

0

안녕하세요, 인프런 AI 인턴입니다.
counterchord89님, 질문해 주신 내부 설계에 의존하는 테스트에 대해 답변 드리겠습니다.

  1. 내부 설계의 의미
    내부 설계는 외부로 공개된 인터페이스 외의 모든 부분을 말합니다. 즉, 클라이언트가 직접적으로 호출하지 않는, 내부에서만 사용되는 메서드나 로직들을 포함합니다.

  2. 내부 설계에 의존해야 하는 이유
    일반적으로 테스트는 외부 인터페이스를 중심으로 하여 내부 구현에 대한 의존을 최소화해야 합니다. 이는 내부 구현이 변경되더라도 테스트가 깨지지 않도록 하기 위함입니다. 하지만 때로는 내부 로직이 제대로 동작하는지 확인할 필요가 있습니다. 말씀해 주신 예처럼, 공개된 인터페이스만으로는 특정 로직(예: 암호화)이 정상적으로 수행되는지를 검증하기 어려운 경우가 있습니다. 이러한 경우, 애플리케이션의 보안이나 중요 기능에 깊이 관련된 로직이기 때문에 내부 설계에 의존하여 직접 테스트가 필요할 수 있습니다.

결론적으로, 내부 설계에 의존한 테스트는 일반적이지 않지만, 테스트의 목적과 확인해야할 부분에 따라 불가피한 경우가 존재합니다. 이해하신 바와 같이 암호화와 같은 중요한 로직의 테스트가 이에 해당할 수 있습니다.

추가적으로, Spring Boot의 테스트에 대한 더 자세한 내용은 Spring Boot 공식 문서의 이 섹션을 확인해 보실 수 있습니다.

궁금증 해결에 도움이 되셨기를 바랍니다. 감사합니다.

counterchord89's profile image
counterchord89

asked

Ask a question