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

홍혁준님의 프로필 이미지

작성한 질문수

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

테스트하기 어려운 영역을 분리하기

실제 비즈니스에서 createOrder() 오버로딩에 관한 질문

작성

·

64

0

  • 학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!

  • 먼저 유사한 질문이 있었는지 검색해 보세요.

  • 서로 예의를 지키며 존중하는 문화를 만들어가요.

     

안녕하세요! 강의를 듣는 중에 createOrder() 메소드에 관한 궁금한 점이 생겨 질문드립니다.

좋은 예시와 설명으로 테스트를 어렵게 코드들을 외부로 빼서 테스트를 쉽게할 수 있게 하는 점을 잘 이해했습니다.

그런데 강의에서 파라미터 주입으로 변경한 createOrder(LocalDateTime ) 메소드는 사실상 다른 비즈니스 클래스에서 사용한다고 했을 때 모두 LocalDateTime.now()을 파라미터로 사용할 것으로 생각됩니다.

그래서 저렇게 파라미터로 뺀 경우 createOrder() 메소드를 사용하는 다른 비즈니스 클래스에선 불필요한 코드 반복이 발생할 수 있을 것 같고 또 개발자가 LocalDateTime.now() 대신 잘못된 값을 넣을 수 있게 되니 잠재적으로 예기치 못한 동작을 유도할 수도 있을 것 같다는 생각이 드는데 이런 부분들은 어떻게 생각하시는지 궁금합니다..!

답변 2

1

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

안녕하세요, 홍혁준 님!

만약 외부에서 사용하는 곳이 많고, 매번 now()를 넣어주는 것이 번거롭게 느껴진다면, 저는 메서드 오버로딩을 활용할 것 같아요.

public Order createOrder() {
    return createOrder(LocalDateTime.now());
}

public void createOrder(LocalDateTime requestedDateTime) {
    ...
}

사용하는 쪽의 편의를 위해 두 개의 메서드를 모두 public으로 열어놓는 대신, 외부에서 시간 데이터가 주어지지 않으면 기본값을 사용하도록 하는 방법입니다.
이러면 핵심 로직에 대한 테스트도 가능하면서, 사용하는 쪽은 보다 덜 번거롭게 사용할 수 있습니다.

도움이 되셨기를 바랍니다.
감사합니다 🙂

0

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

홍혁준님, 질문하신 createOrder() 메소드에 LocalDateTime 파라미터를 추가하는 것에 대한 고민과 특정 상황에서의 코드 반복 및 잠재적 오류 가능성에 대한 우려에 대해 유사한 상황에서 지식공유자님의 기존 답변을 참고할 수 있는 링크를 찾았습니다.

  1. 테스트를 위하여, OrderService의 createOrder의 파라미터로 registerDateTime을 추가한 측면

    • 이 질문에서는 테스트를 위해 OrderServicecreateOrder 메소드에 registerDateTime 파라미터를 추가하는 것에 대한 고민이 구체적으로 표현되어 있습니다. 지식공유자께서는 테스트하기 어렵게 만드는 요인들을 분리하여 테스트 가능한 구조를 만드는 것이 유익하다는 설명과 더불어 다른 대안에 대해서도 논의하였습니다.
  2. 테스트를 위한 메소드를 작성해도 괜찮은건가요?

    • 이 질문에서는 비슷하게 LocalDateTime 파라미터를 추가하면서 발생할 수 있는 문제와 함께 그에 대한 해결책을 설명하고 있습니다.

홍혁준님이 우려하시는 코드 반복과 잘못된 값에 대한 입력 문제에 대해서는, 특정 상황에서는 LocalDateTime.now()를 직접 사용하지 않고, 이를 주입하는 방식으로 유연함을 확보할 수 있다는 점이 있습니다. 하지만 이 방식은 프로덕션 코드에서도 일관성을 유지하면서 테스트하기 쉬운 형태를 만들어 낸다는 것에 큰 장점이 있습니다.

결론적으로, 이러한 접근 방법은 테스트 용이성을 높이지만, 항상 그에 따른 트레이드오프가 존재합니다. 코드 반복을 줄이기 위해서는 LocalDateTime을 주입하는 대신 서비스에서 값을 생성하도록 하거나, 잘못된 값 입력을 방지하기 위해 더욱 명확한 문서화와 코드 리뷰를 통해 관리할 수 있습니다.

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