해결된 질문
작성
·
502
1
안녕하세요. 테스트 환경 통합 강의를 보다가 궁금한 점이 생겨서 질문하게 되었습니다!
강사님께서는 테스트 환경 통합을 위하여 테스트 클래스에서 테스트 환경 추상 클래스(IntegrationTestSupport, ControllerTestSupport)를 상속하는 방식을 사용하셨습니다.
ControllerTest에서는 MockMvc, ObjectMapper, @MockBean 처리할 Service들을 protected 필드로 넘겨줄 필요가 있어서 추상 클래스를 사용하는 방식에 대해 되게 좋다고 생각했는데요!
Service와 Repository 테스트의 경우에는 그런 공통된 필드들이 필요하지 않기 때문에 추상 클래스가 아닌 커스텀 어노테이션을 생성하여 구성하여도 되지 않을까? 싶어서 질문드리게 되었습니다!
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ActiveProfiles("test")
@SpringBootTest
public @interface IntegrationServiceTest {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ActiveProfiles("test")
@Transactional
@SpringBootTest
public @interface RepositoryTest {
}
제가 생각한 코드는 위와 같습니다!
제가 생각했을 때의 어노테이션으로 테스트 환경을 관리하였을 때의 장점은 자바에서는 다중 상속이 안되기 때문에 조금 더 유연하다고 생각했습니다!
강사님께서는 커스텀 어노테이션을 사용하여서 테스트 환경을 통합하는 방식에 대하여 어떻게 생각하시는지 궁금합니다!
(강의 너무 유익하게 잘 듣고 있습니다! 새해 복 많이 받으시구 내년에도 화이팅입니다ㅎㅎ)
답변 2
3
안녕하세요, 박종윤 님! :)
해당 방식도 좋습니다!
현재 제가 소개한 방식에서는 사실상 Service와 Repository 테스트를 하나의 환경에서 수행하는 것을 목적으로 하고 있기 때문에, 범용적인 이름을 지어 같은 어노테이션을 사용하면 좋을 것 같네요. ㅎㅎ
감사합니다. :)
1
안녕하세요, 인프런 AI 인턴입니다.
박종윤님, 테스트 환경 통합과 관련하여 커스텀 어노테이션 도입에 대한 질문 감사드립니다.
제시해주신 커스텀 어노테이션을 사용하는 방식은 실제로 테스트 코드의 가독성을 높이고, 공통적인 구성 요소를 테스트별로 재사용하는 데 효과적인 방법입니다. 특히 Java에서는 클래스의 다중 상속이 제한되기 때문에 어노테이션을 통해 유연하게 테스트 환경을 설정할 수 있는 장점이 있죠.
@IntegrationServiceTest
와 @RepositoryTest
어노테이션을 만들어 @SpringBootTest
와 함께 @Transactional
이나 @ActiveProfiles("test")
등을 선언함으로써 필요한 테스트 구성을 쉽게 재사용할 수 있습니다. 이렇게 함으로써 테스트 코드에서 반복되는 설정을 줄일 수 있어, 더 깔끔하고 직관적인 테스트 구조를 만들 수 있습니다.
다만, 추상 클래스를 상속하는 방식도 특정한 상황에서는 여전히 유용할 수 있습니다. 예를 들어, 여러 테스트에서 공유되는 비즈니스 로직이나 컴포넌트를 추상 클래스 내에 메서드로 정의하여 상속함으로써 코드 중복을 줄이고 일관성을 유지할 수 있기 때문입니다.
강사님의 의견도 중요하겠지만, 실제로 프로젝트에서 어떤 패턴이 더 효과적인지는 팀의 상황과 프로젝트의 요구 사항에 따라 달라질 수 있으므로, 두 방식의 장단점을 이해하고 적절한 상황에 맞춰 사용하는 것이 중요합니다.
박종윤님, 강의에 대한 긍정적인 피드백과 함께 열정을 담은 메시지도 감사드립니다! 계속해서 유익한 공부가 되시길 바랍니다. 새해 복 많이 받으시고 올해도 화이팅하세요!