Programming/JPA ⁄Spring

<!DOCTYPE html> 에 Uncaught SyntaxError: Unexpected token '<' 뜰때 해결하기

📝 작성 : 2021.05.27  ⏱ 수정 : 
반응형


 

Controller에서 일정 패턴으로 URL을 맵핑 시키고 있었습니다. PathVariable을 적극적으로 이용해서 심플한 url 패턴을 만들어보자! 해서 localhost/project이름/로그인사용자닉네임/사용모듈 ...

으로 depth 구조를 만들어서 Controller에서도 정규식을 이용해 맵핑을 시키고 있었는데요.

기여코 이 에러를 또 다시 마주하고야 말았습니다.

 

결론부터 말씀드리자면, .css 나 .js 같은 파일들 마저 Controller 가 잡아서 제멋대로 html 데이터로 응답을 하다 보니 해당 에러가 발생 한 것 입니다. 이걸 힌트로 해결 할 수 있는 분들은 해결 하시면 되고, 저와 같은 문제인 분들은 아래 이어질 해결 방법을 따라가시면 됩니다.


servlet-context.xml에 mvc로 아래 코드 넣고 resources 폴더에 모든 정적 자원 집어 넣어서 한동안 문제가 없었는데 URL Depth가 겹치니 귀신같이 또 잡아 갔습니다.

		<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
		<resources location="/resources/" mapping="/resources/**" cache-period="0"></resources>

 

이제와서 생각해보니 resources 안에 모든 정적 자원을 넣었다고 해결되었던 게 아니고 , resources 폴더의 하위에 모든 정적 자원을 옮기면서 Depth 구조가 한단계 더 들어가서 해결된 것 처럼 보였던 것 뿐이었습니다. 

@Controller
@RequestMapping("{manager_nick:^(?:(?!admin$|resources$|view$|restapi$).)*$}/{project_title:^(?:(?!new$|overview$|help$|setting$|activity$).)*$}")
public class ProjectUrlMapper {

위에 있는 컨트롤러가 .css .js 요청을 잡아가는 범인이었는데요, 위와 같이 정규식으로 예외 문장에 resources 를 추가함으로써 해결했습니다.

 

정적자원(.css , .js 등) 은 아에 컨트롤러에서 매핑해가지 않도록 하거나, 정적 자원 처리에 우선순위를 두는 방법을 생각해보았는데 안타깝게도 그런 설정은 찾을 수 없었습니다. 혹시 이에 대해 아는 분 계시면 말씀해주세요!


+ 추가로 선생님에게 여쭈어 봐서 정적자원에 대한 우선순위를 높여 보았는데요

WebMvcConfigurationSupport

RequestMappingHandlerMapping은 위와 같이 강제로 mapping.setOrder(0)이 되어 있습니다. 하지만 bean 등록 순서를 이용해서 

	<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"
			p:order="1"
		/>
		<annotation-driven validator="validator"/>

		<beans:bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"
			p:validationMessageSource-ref="messageSource"
		/>

		<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
		<resources location="/resources/" mapping="/resources/**" cache-period="0" order="0"></resources>

RequestMappingHandlerMapping을 먼저 생성 한 뒤에 annotation-driven 을 하게 되면,

이미 우선순위 1로 bean이 등록 되어 있기 때문에 자동으로 생성 하지도 않고 setOrder(0)이 일어나지 않습니다.

그러고 resources는 order 0으로 등록 되어 있기 때문에 front controller 를 거치기 전에 정적 자원을 먼저 처리하게 됩니다.

정규식에서 resources를 제외하던 내용을 없애도 잘 작동 하는 것을 확인 할 수 있었습니다.

하지만 혹시나 mapping. 으로 이어지는 자동 설정들이 안될수도 있기 때문에 혹시 나중에 문제가 생기면 꼭 기억하고 있어야 한다고 하셨습니다. 인터셉터는  일단 문제 없습니다.

이상입니다.

 

반응형