[개발 일기] 2025.03.21 - 외부에서의 주입이 테스트 코드에 용이한 이유

2025. 3. 21. 13:24·개발 일기

💡 개요

 

많은 개발 서적에서 공통적으로 설명하는 개념이 있다.

 

외부에서 인자나 의존을 주입하면 테스트 코드를 작성할 때 더 편하다!

 

 

왜 그럴까? 한번 정리해 보자.

 

 

 

📕 외부 주입과 테스트 코드의 관계

 

🚫 내부에서 직접 객체를 생성하는 경우

 

내부에서 직접 객체를 생성하면 해당 객체가 다른 객체와 강하게 결합된다. 즉, 특정 구현 방식에 종속되며 테스트가 어려워진다.

 

 

또한, 테스트 코드를 작성할 때 우리는 성공하는 케이스뿐만 아니라 실패하는 케이스도 고려해야 한다.

 

 

하지만 내부에서 객체를 직접 생성하면 해당 객체는 일반적으로 성공하는 데이터를 기준으로 설계되기 때문에, 실패하는 케이스를 만들기가 어렵다.

 

 

✅ 외부에서 의존성을 주입하는 경우

 

반면, 외부에서 의존성을 주입하면 테스트 대상만 따로 검증할 수 있다. 이는 테스트의 유연성과 독립성을 보장해 준다.

 

 

예를 들어, Mock 객체를 활용하여 다양한 경우를 쉽게 테스트할 수 있다. 또한, 실패하는 케이스를 직접 주입함으로써 예외 상황을 보다 쉽게 테스트할 수 있다.

 

 

 

🖥️ 예시 코드

 

❌ 내부에서 직접 객체를 생성하는 경우

class MemberService {
    private final MemberRepository memberRepository;

    public MemberService() {
        this.memberRepository = new MemberRepository(); // 내부에서 직접 생성
    }

    public boolean isValidMember(String memberId) {
        return memberRepository.existsById(memberId);
    }
}

 

위 코드에서 MemberRepository는 MemberService 내부에서 직접 생성되었기 때문에 테스트할 때 원하는 데이터(예: 실패하는 데이터)를 주입할 수 없다.

 

 

더군다나 MemberRepository 구현체와의 결합도도 높아진다.

 

 

 

✅ 외부에서 주입하는 경우 (의존성 주입 활용)

class MemberService {
    private final MemberRepository memberRepository;
    
    // 의존성 주입
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public boolean isValidMember(String memberId) {
        return memberRepository.existsById(memberId);
    }
}

 

MemberService 입장에선 외부, 즉 MemberService를 의존하고 있는 클래스에게 전달받은 객체를 주입한다.

 

 

이렇게 되면 MemberServiceTest에서도 memberService와, memberRepository에 전달된 memberRepository를 동일하게 사용할 수 있다.

 

@SpringBootTest
class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    
    ...   
}

'개발 일기' 카테고리의 다른 글

[개발 일기] 2025.03.23 - 무중단 배포  (0) 2025.03.23
[개발 일기] 2025.03.22 - 스케줄링 기법  (0) 2025.03.22
[개발 일기] 2025.03.20 - 에러 로그를 찍어도 되나? (Feat : 시큐어 코딩)  (0) 2025.03.20
[개발 일기] 2025.03.19 - @Valid  (0) 2025.03.19
[개발 일기] 2025.03.18 - MultipartFile와 Setter의 관계  (0) 2025.03.18
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.03.23 - 무중단 배포
  • [개발 일기] 2025.03.22 - 스케줄링 기법
  • [개발 일기] 2025.03.20 - 에러 로그를 찍어도 되나? (Feat : 시큐어 코딩)
  • [개발 일기] 2025.03.19 - @Valid
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.03.21 - 외부에서의 주입이 테스트 코드에 용이한 이유
상단으로

티스토리툴바