@Mock 어노테이션과 @Autowired 어노테이션은 각기 다른 목적으로 사용되며, 테스트할 대상과 테스트의 맥락에 따라 적합한 어노테이션을 선택하는 것이 중요하다.
여기서 서비스 테스트와 컨트롤러 테스트의 차이점을 고려할 때 각각에 사용되는 어노테이션의 목적이 좀 더 명확해진다.
@Mock 어노테이션
- 목적: @Mock은 Mockito 프레임워크에서 제공하는 어노테이션으로, 지정된 클래스의 모의 객체(mock object)를 생성한다. 이 모의 객체는 실제 객체의 동작을 흉내 내지만, 실제 코드를 실행하지는 않으므로 외부 시스템이나 데이터베이스 호출 없이 테스트를 진행할 수 있다.
- 사용하는 곳: 주로 서비스 계층(Service Layer)의 테스트에 사용된다. 서비스 계층은 데이터 접근 계층(DAO/Repository) 또는 다른 서비스와의 상호작용을 포함할 수 있으며, 이러한 의존성들을 모의 객체로 대체함으로써 테스트가 해당 서비스 로직에만 집중할 수 있도록 한다.
- 장점: 테스트의 범위를 서비스 로직에만 한정짓고, 실행 속도가 빠르며, 외부 요소의 영향을 받지 않는다.
@Autowired 어노테이션
- 목적: @Autowired는 Spring 프레임워크의 어노테이션으로, 의존성 주입(Dependency Injection)을 자동으로 처리한다. 이를 통해 스프링 컨테이너가 관리하는 빈(bean)들이 필요한 곳에 자동으로 주입된다.
- 사용하는 곳: 주로 컨트롤러 계층(Controller Layer)의 테스트에 사용된다. 컨트롤러는 종종 여러 서비스나 컴포넌트와 상호작용하고, 스프링의 빈으로 등록된 실제 객체들을 사용해야 할 필요가 있기 때문이다.
- 장점: 실제 스프링 어플리케이션의 구성을 그대로 사용하여, 전체 스프링 어플리케이션 컨텍스트 또는 웹 어플리케이션 컨텍스트 내에서 컨트롤러의 실제 동작을 테스트할 수 있다. 이는 컨트롤러의 엔드포인트를 통합 테스트하는 데 특히 유용하다.
다른 어노테이션 사용의 이유
- 격리 vs. 통합: 서비스 계층은 그 자체로 독립적인 로직을 테스트하기 위해 격리된 환경에서의 테스트가 더 적합하며, 이를 위해 @Mock을 사용한다. 반면, 컨트롤러는 외부 요청을 처리하고 응답을 반환하는 역할을 수행하므로, 전체 스프링 컨텍스트와의 통합된 방식으로 테스트하는 것이 더 적합하며, 이를 위해 @Autowired가 사용된다.
- 속도와 복잡성: @Mock을 사용하는 서비스 테스트는 일반적으로 더 빠르고 간단하다. 반면, @Autowired를 사용하는 컨트롤러 테스트는 설정이 더 복잡하고 실행 속도가 느릴 수 있지만, 애플리케이션의 실제 동작 환경을 더 잘 반영한다.
이러한 차이점들은 테스트의 목적과 필요에 따라 선택되며, 각 테스트의 정확성과 효율성을 최대화하는 데 중요한 역할을 한다.
'Spring' 카테고리의 다른 글
[SpringRestDocs] Unresolved directive in index.adoc-... (0) | 2024.12.10 |
---|---|
[Spring] 세션 기반 인증 VS JWT 기반 인증 (0) | 2024.11.26 |
[Spring MVC]예외 처리와 오류 페이지 (1) | 2023.11.27 |
[Spring MVC] 로그인 처리(2) - 필터, 인터셉트 (1) | 2023.10.23 |
[Spring MVC] 로그인 처리 (1) - 쿠키, 세션 (1) | 2023.10.10 |