본문 바로가기
Java/스프링 부트

Spring boot) Spring + React 연동 빌드 배포 시 URL mapping (feat. ErrorController 사용 시 문제점)

by 하이방가루 2024. 1. 31.
728x90
반응형

결론부터 얘기하자면 View Controller 추가 설정을 통해서 연동하면 된다.

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/{spring:[a-zA-Z0-9-_]+}")
                .setViewName("forward:/");
        registry.addViewController("/**/{spring:[a-zA-Z0-9-_]+}")
                .setViewName("forward:/");
    }
}

참조 :

https://stackoverflow.com/questions/39331929/spring-catch-all-route-for-index-html

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html 

 

굳이 글로 남기는 이유

구글링을 하다보면 다음과 같이 ErrorController의 구현체를 만들어 연동하라고 간단히 적힌 글들이 많았다.

@Controller
public class WebController implements ErrorController {
    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping(value = {"/", "/error"})
    public String index(HttpServletRequest request) {
        // log.error(request.getMethod());
        return "index";
    }
}

 

ErrorController의 구현체를 이용하여 react의 URL을 매핑할 경우,

DispatcherServlet에서 매핑할 url을 찾지 못하여 not found error를 발생시키고

이 때 ErrorController에 오버라이딩된 getErrorPath에서 에러를 가로채서 "index.html"이 전달되고

index.html에서 react가 dom을 생성하게 된다.

 

따라서, ErrorController의 구현체를 이용하여 react의 URL을 매핑하면 실제 배포 시 특정 페이지로 이동하게 될 경우

페이지 정보를 받아 오는데 http status code가 404인 것을 확인할 수 있다.

 

하지만 not found error만이 아니라 서비스 로직에서 에러를 발생시켜서 spring 프레임워크에서 에러를 처리하게 할 경우에도 ErrorController가 에러를 가로채서 처리해서 문제가 된다.

ErrorController를 이용한 연동에서 로그인 실패 시

 

위 사진과 같이 로그인 실패시 서비스 로직에서 에러를 던지는데

이것을 ErrorController의 getErrorPath 메서드가 가로채서 '/error' 로 redirect되고

ErrorController의 index 메서드에서 처리되어 index.html을 반환하게 되는데

(여기부터는 추측) View Resolver 에서 응답을 처리하면서 Get 메서드가 아니여서 http status code 405 (Method Not Allowed )로 응답이 오는 것 같다.

 

하지만 View Controller 추가 설정을 사용할 경우

서버 시작 시 다음과 같은 로그가 추가된다.

2024-01-31 14:32:57.585  INFO 27380 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/{spring:\w+}] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]
2024-01-31 14:32:57.585  INFO 27380 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/{spring:\w+}] onto handler of type [class org.springframework.web.servlet.mvc.ParameterizableViewController]

 

로그 내용을 보면 알겠지만 DispatcherServlet에 매핑할 url이 추가되어

커스텀 컨트롤러에 매핑되지 않을 경우 바로 Template Resolver에서 처리하게 된다.

따라서 특정 페이지로 이동시

 

바로 index.html로 보내지게 되어 react에서 dom을 생성하기 때문에 http status code 200으로 보내지게 된다.

 

또한 서비스 로직에서 에러를 던질 경우에 spring 프레임워크에서 에러를 처리하게 할 경우에도 정상적으로 spring 프레임워크에서 처리하게 된다.

ViewController 추가 설정을 이용한 연동에서 로그인 실패 시

 

대신에 Get을 제외한 메서드로 요청시 커스텀 컨트롤러에 매핑되지 않을 경우 http status code 405 (Method Not Allowed )로 응답이 온다.

 

추가적으로 보충해야 할 점이나 틀린 부분이 있다면 부담없이 댓글로 알려주시면 감사하겠습니다 ^^

728x90
반응형

댓글