인프런 커뮤니티 질문&답변
프로덕션 환경과 테스트 환경 Config를 다르게 가져가는 방법
해결된 질문
작성
·
149
·
수정됨
0
안녕하세요 선생님,
현재 프로젝트에서 프로덕션에서 사용하는 SecurityConfig클래스와 테스트에서 사용하는 SecurityConfig를 다르게 가져가려 합니다.
이유는 프로덕션 환경에서는 jwt필터 같이 커스텀 필터들을 적용해야하고, 테스트 환경에서는 해당 필터들을 거치지 않도록 해서 테스트를 더 편하게 하기 위함입니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean("prodSecurityFilterChain")
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {...}
...
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
...
}@TestConfiguration
@EnableWebSecurity
public class TestSecurityConfig {
@Bean("testSecurityFilterChain")
public SecurityFilterChain testSecurityFilterChain(HttpSecurity http) throws Exception {...}
//필터 없음
}위 처럼 작성하였습니다.
컨트롤러 테스트 시
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class InterfaceTest {
@LocalServerPort
private int port;
@BeforeEach
void setUp() {
RestAssured.port = port;
}
}위의 클래스를 상속받아서 테스트를 구현합니다.
제 의도는 테스트 시에는 @TestConfiguration이 주어진 SecurityConfig를 기반으로 설정이 될거고
TestSecurityConfig에는 jwt필터가 없으니, 테스트 코드에서는 필터를 거치지 않고 잘 수행이 될거다 였으나, 실제 Security 디버그를 보면
2024-12-11 10:17:32 [Test worker] DEBUG org.springframework.security.web.DefaultSecurityFilterChain - Will secure any request with filters: DisableEncodeUrlFilter, WebAsyncManagerIntegrationFilter, SecurityContextHolderFilter, HeaderWriterFilter, CorsFilter, LogoutFilter, BlackListCheckFilter, JwtAuthenticationFilter, RequestCacheAwareFilter, SecurityContextHolderAwareRequestFilter, AnonymousAuthenticationFilter, SessionManagementFilter, ExceptionTranslationFilter, AuthorizationFilter로 JwtAuthenticationFilter가 있으며, 인증처리가 안되었다는 401에러를 뱉고있습니다.
질문 드립니다.
1. 프로덕션 환경과 테스트 환경 Config구분시 별도의 설정이 더 필요할까요? 자료들을 더 찾아보아도 다른 방법이 없어서 질문드립니다.
2. 혹시 Config를 구분하는것이 아예 불가능한것일까요??
아니라면, 실무에서도 위와 같은 구조가 자주 사용되는지 등 궁금합니다.
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
싸누바님,
프로덕션 환경과 테스트 환경에서 SecurityConfig를 다르게 사용하는 방법에 대해 설명드리겠습니다.
- 프로덕션과 테스트 환경의 Config 구분을 위해서는, Spring Profile을 활용하여 환경에 따라 다른 설정을 로드하는 방법을 사용할 수 있습니다. 이미
@ActiveProfiles("test")를 사용하고 계시므로 적절하게 테스트 환경에서TestSecurityConfig를 로드할 수 있도록 설정을 해야 합니다.
이를 위해 두 가지 방법을 고려해볼 수 있습니다:
Profile-specific Configurations:
application.properties나@Profile을 사용하여 환경에 맞는 빈이 로드되도록 설정합니다. 예를 들어,@Profile("prod")와@Profile("test")를 사용해 SecurityConfig에 프로파일을 명시해줄 수 있습니다.@Primary 어노테이션: 테스트 환경에서 사용하고자 하는 빈을
@Primary로 선언하여 해당 Bean이 우선적으로 사용되도록 합니다.
- Spring Boot에서는 환경에 따라 설정을 다르게 가져가는 것이 가능합니다. 실무에서도 테스트 환경과 프로덕션 환경을 구분하여 각 환경에 맞는 SecurityConfig를 다르게 적용하는 방식이 자주 사용됩니다. 특히 테스트 환경에서는 JWT 필터와 같은 무거운 인증 체계를 생략하여 단위 테스트에 집중할 수 있도록 합니다.
위 문제를 해결하기 위해서는 SecurityConfig에 @Profile("prod")를 추가하고, TestSecurityConfig에 @Profile("test")를 추가하여 각 환경에서 필요한 구성을 명확히 지정하는 것이 좋습니다. 이렇게 하면 @ActiveProfiles("test")를 통해 테스트 환경에서는 TestSecurityConfig만 로드되도록 할 수 있습니다.
도움이 되셨기를 바랍니다.
이미지 출처 및 정보를 확인하려면 여기를 참고하세요.





