Whitelabel Error Page (400 Bad Request)
Spring Boot에서 DB 연결할 때 로컬 MySql만 사용해봤었는데 최근에 H2 DB 사용법을 배워서 적용해보고있었다.
DB 연결은 잘 됐는데 H2 콘솔에 접속하자 Whitelabel Error Page가 발생했다.
빌드 콘솔에 에러가 안보여서 구글링 해보니 대부분 설정 파일 오타 문제를 해결한 과정이 검색됐다.
설정 파일을 몇번이나 확인하고 설정도 추가해봤지만 변하는게 없어서 H2 버전도 다운그레이드 하고 이것저것,,,, 했지만 안됨😱
그러다가 Gradle 싱크 맞추는 아이콘이 떠서 싱크 맞추고 h2 콘솔에 재접속 해봤더니 에러 메세지가 바뀌었다.
해당 에러는 JwtFilter에서 토큰을 검증할 때 토큰이 없는 경우 반환되도록 설정한 메세지다.
필터에 url이 /h2-console로 시작할 경우 doFilter를 호출하도록 코드를 추가하고 테스트해보니 바로 정상 접속이 됐다.
if (url.startsWith("/h2-console")) {
chain.doFilter(request, response);
return;
}
해결하려고 시간을 많이 썼는데 막상 해결하니 별거 아니라서 너무 허무하다,,
결론:
Gradle 싱크 안 맞았던 것도 문제였고, JWT 인증 필터에서 H2 콘솔 요청을 그냥 통과시키니까 해결됨
spring boot에서 active profile 선택하기
if (url.startsWith("/h2-console")) {
chain.doFilter(request, response);
return;
}
필터에서 직접 예외 처리를 하는 방식은 부담스럽고, 일반 사용자도 접근할 수 있다는 점이 우려되었다.
H2를 개발용 DB로만 사용할 예정이지만, 안전한 접근 관리가 필요하다고 판단하여 Active Profile을 선택할 수 있도록 구성했다.
시도
application.yml에 `spring.profiles.active: dev`로 설정했다.
그리고 JwtFilter 클래스에서 `@Value`로 설정한 값을 불러오니 `null`로 읽혔다.
해결
IntelliJ의 Run/Debug Configuration에서 `-Dspring.profiles.active=dev`를 추가했다.
`-Dspring.profiles.active=`
JVM(Java System Property) 옵션으로 실행할 때 Spring에게 어떤 프로파일을 활성화할지 알려주는 설정이다.
spring.profiles.active가 null이었던 원인
JVM 실행 옵션에 -Dspring.profiles.active=dev가 없었기 때문이다.
application.yml에 설정된 spring.profiles.active: dev가 있어도, IntelliJ에서 실행할 때 이 값이 무시되거나 기본값이 적용될 가능성이 있다.
-Dspring.profiles.active=dev 옵션을 추가하니 JVM이 실행될 때 확실하게 dev 프로파일이 활성화 된다.
`@Values("${spring.profiles.active:}")`와 `System.getProperty("spring.profiles.active")` 차이
위 캡쳐를 보면 `@Value`로 가져온 값은 null이고, `System.getProperty`로 가져온 값은 정상적인 것을 확인할 수 있다.
`@Value`는 Spring의 환경 속성을 통해 값을 주입하는데,
JwtFilter는 Spring 관리 Bean(`@Component` 등)이 아니므로 주입되지 않는다.
필터(Filter)는 서블릿 컨테이너(Tomcat)에서 관리하는 객체라서 Spring이 의존성 주입을 자동으로 수행하지 않는다.
반면, `System.getProperty`는 JVM 시스템 속성을 직접 조회한다.
실행 시 `-Dspring.profiles.active=dev`와 같이 JVM 옵션으로 설정된 값을 가져오기 때문에 값을 정상적으로 가져온 것이다.
따라서 `System.getProperty`로 profile 설정을 가져오도록 했다.
결론
INFO 26276 --- [expert] [ restartedMain] org.example.expert.ExpertApplication : The following 1 profile is active: "dev"
애플리케이션을 실행할 때 profile이 "dev"로 설정되고
JwtFilter에서 profile이 "dev"인 경우 Jwt 검증을 하지 않도록 했다.
String profile = System.getProperty("spring.profiles.active");
if ("dev".equals(profile) && url.startsWith("/h2-console")) {
chain.doFilter(request, response);
return;
}
'Java Study > Frameworks' 카테고리의 다른 글
Windows 개발 환경에서 AWS 활용 과제 | Spring Boot v3.3.3 & Gradle 8.12 (0) | 2025.03.21 |
---|---|
Spring Security를 활용한 JWT 인증 | Stateless하게 제대로 적용하기! (0) | 2025.03.21 |
H2 데이터베이스 설치 방법 | Server / In-memory / Embedded Mode❔ (0) | 2025.03.10 |
Spring Security를 활용한 JWT 인증 적용해보기 🖥️🔑 (0) | 2025.02.27 |
Interceptor와 AOP 개념 정리 및 API 로깅 예시 ✍️ (0) | 2025.02.26 |