💡 개요
많은 개발 서적에서 공통적으로 설명하는 개념이 있다.
외부에서 인자나 의존을 주입하면 테스트 코드를 작성할 때 더 편하다!
왜 그럴까? 한번 정리해 보자.
📕 외부 주입과 테스트 코드의 관계
🚫 내부에서 직접 객체를 생성하는 경우
내부에서 직접 객체를 생성하면 해당 객체가 다른 객체와 강하게 결합된다. 즉, 특정 구현 방식에 종속되며 테스트가 어려워진다.
또한, 테스트 코드를 작성할 때 우리는 성공하는 케이스뿐만 아니라 실패하는 케이스도 고려해야 한다.
하지만 내부에서 객체를 직접 생성하면 해당 객체는 일반적으로 성공하는 데이터를 기준으로 설계되기 때문에, 실패하는 케이스를 만들기가 어렵다.
✅ 외부에서 의존성을 주입하는 경우
반면, 외부에서 의존성을 주입하면 테스트 대상만 따로 검증할 수 있다. 이는 테스트의 유연성과 독립성을 보장해 준다.
예를 들어, 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 |