개발자
프로젝트 중 외부에 노출되면 안되는 값이 있어 환경변수로 설정한 후 @Value 어노테이션을 사용해서 값을 사용했습니다. 테스트 코드를 작성하며 통합테스트를 진행하기엔 자원소모가 크다 생각하여 유닛테스트로 테스트 코드를 작성했습니다. 그런데 유닛테스트에서는 @Value에 의존성주입이 안되서 해결방법을 찾고있습니다. 제가 찾아본 해결 방법으로는 1. @SpringBootTest 사용 2. Reflection 사용 3. 생성자를 통한 주입 이렇게 3가지 방법이 있는데 2,3번 모두 테스트코드 내에서 직접 값을 입력해줘야해서 환경변수로 값을 보호하는 이점이 사라진다고 생각이 들었습니다. 이런 상황에선 어떻게 하는게 좋을까요? 환경변수가 들어가는 값을 테스트 할때 유닛테스트를 사용하는 접근방식부터 잘못된걸까요..? 현업에선 이런 민감한 정보를 어떻게 처리하는지 궁금합니다!
답변 1
인기 답변
안녕하세요! 실제로 말씀하신 3가지의 케이스 모두 현업에서 상황에 맞게 쓰고 있는 방식입니다. 1. @SpringBootTest 를 사용하는 케이스 - 설정값이 의도한대로 @Value 를 선언한 필드에 적용이 되는지 확인할 수 있다. 2. Reflection 사용 - 생성자가 아닌 Field Injection 으로 적용되었을 때 사용하는 방법 - Spring 에서 제공하는 ReflectionTestUtils 를 통해 사용합니다 3. 생성자 혹은 setter 사용 - Field Injection 이 아닌 생성자나 setter 를 사용할 경우 유닛테스트를 진행하시는 것이기 때문에 테스트코드 내에서 직접 값을 입력해주는게 크게 문제가 된다고 생각하지는 않습니다. 오히려 환경변수 값이 내가 의도한 값으로 들어왔을 때 의도한대로 동작하는지를 확인할 수 있어서 다양한 환경변수 값을 주입해보며 정상적으로 동작하는지 확인해보시면 좋을것 같습니다. 저의 짧은 지식이 조금이나마 도움이 되시길 바랍니다.
이희수
작성자
세종대학교 데이터사이언스 • 2024년 06월 28일
실제 환경변수 값이 아니라 테스트 코드안에서 지정한 값으로 변수를 지정하여 테스트를 할 수있는건데 제가 생각을 잘못했네요… 친절한 답변 정말 감사드립니다!!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 06월 24일
당신이 @Value 어노테이션을 사용해 주입하고자 하는 값들은 환경 변수에 의존적인 것 같습니다. 이런 경우, 통합 테스트(@SpringBootTest 사용)를 통해 테스트를 진행하는 것이 가장 안전한 방법일 수 있습니다. 그러나, 당신이 언급했듯이 자원 소모가 크다는 단점이 있습니다. 그렇기에 적절한 방식을 선택하는 것은 상황에 따라 다릅니다. 1번째 방법: @SpringBootTest 를 사용하여 실제 환경과 동일한 조건에서 애플리케이션을 실행하면, @Value 주입도 문제없게 진행됩니다. 하지만, 버튼 클릭 한 번으로 전체 스프링 어플리케이션이 구동되므로 실행 시간이 많이 소요됩니다. 2번째 방법: Reflection 를 사용하여 private 필드 값을 할당할 수 있지만, 이 방법은 코드의 가독성을 해치며 리팩토링 등으로 인해 위험이 발생할 수 있습니다. 3번째 방법: 생성자를 통해 값을 주입받는 것은 `@Value`를 대체할 수 있는 좋은 방법입니다. 따라서 이 기능에 의존하지 않아도 되며, 테스팅 역시 상대적으로 수월해집니다. 또 다른 방법으로는 @TestPropertySource 어노테이션을 사용하여 테스트 시에만 적용되는 프로퍼티 파일을 지정하는 것입니다. 이 방법은 환경 변수를 직접 수정하지 않고도 원하는 값을 주입할 수 있게 해줍니다. 위의 각 방법은 장단점이 있으므로, 상황에 따라 가장 적합한 방법을 선택해야 합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!