• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

web.xml -> dispatcherServlet 질문

24.03.22 12:32 작성 조회수 135

1

 안녕하세요.

강의에서 조금 벗어난 주제일 수도 있는데, 기존 레거시 프로젝트를 스프링부트로 전환하는 작업을 하고 있는데, web.xml의 .do를 spring boot에서 어떻게 사용할 수 있는지 너무너무 궁금합니다.

현재 아래와 같이 변경해 봤는데 전혀 작동을 안 합니다 ㅠㅠ


@Configuration
@RequiredArgsConstructor
public class ServletConfig {

    private final DispatcherServlet dispatcherServlet;

    @PostConstruct
    public void init() {
        dispatcherServlet.setThreadContextInheritable(true);

    }

    @Bean
    public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() {

        ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(dispatcherServlet, "/", "*.do");
        registration.setLoadOnStartup(-1);
        registration.setName(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME);
        
        return registration;
    }

    @Bean
    public DispatcherServletPath dispatcherServletPath() {
        return () -> "/";
    }

}

spring 4 버전의 web.xml 에서 url-mapping을 / , *.do 로 설정 해 놨는데, 프로젝트에서 @RequestMapping을 사용할땐 .do를 따로 적지 않아도 .do 요청을 알아서 매핑해 주던데, 이 부분도 정확히 어떤 원리로 동작하는지 모르겠습니다 ㅠㅠ

ex) login.do --> @RequestMapping("/login")

.do 설정을 2주째 보고 있는데 진척이 없네요 .....

답변 1

답변을 작성해보세요.

0

위의 코드는 DispatcherServlet으로 보내는 패턴을 정의한 것입니다.
이건 그냥 / 로 등록해서 전체가 다 가게 하면 됩니다. *.do 와 같은 건 개별 컨트롤러에서 설정할 문제이지 저렇게 DispatcherServlet에 걸어주는 방식을 쓰지 않습니다.
부트에서 왜 ServletConfig을 넣으셨는지도 이해가 안 됩니다. 실제로 이런식으로 사용하지 않습니다.

그리고 뭐가 안 된다는 것인지도 모르겠네요. 저도 부트에서 이런식의 설정을 해서 써본적은 한번도 없습니다.

강의와 무관한 내용인데다 제가 테스트 해볼 수 있는 문제를 재현한 샘플 프로젝트를 공유해주신 것도 아니어서 더 이상 도움을 드리기는 어려울 것 같습니다.

부트의 레퍼런스에 샘플로 나오 방법이 아니라면, 아마도 부트를 쓰는한 지원하게 만드는 방법이 없을 수도 있습니다. 부트는 자신만의 방법을 고집하는 아주 일방적인 기술이라서요. 기존에 하던 방식을 가져올 거라면 부트를 쓸 이유가 없습니다.

밤의멜로디님의 프로필

밤의멜로디

2024.03.22

안녕하세요. 토비님.

레거시 스프링을 스프링부트로 전환하는 작업을 하던 도중에 생긴 의문을 여쭤보고 싶었습니다.

web.xml 을 사용하는 프로젝트에서 url-pattern을 *.do 를 지정하게 되면 *.do 요청만을 dispatcherServlet으로 보내는 기존 스프링의 방식을 유지하면서 스프링부트로 전환하려 하는 내용이라서 샘플 프로젝트가 필요할거라 생각하지 못했습니다.

DispatcherServlet 강의라서 동작 방식과 연관이 있을거라 생각해서 질문 드렸습니다.

제가 말을 너무 두서 없이 작성하고, 전달을 잘못 드린것 같습니다.

혹시라도 심기를 불편하게 해 드렸다면 진심으로 사과 드리도록 하겠습니다.

질문의 의도는 아래 web.xml 에서 작동하던 부분을 어떻게 하면 그대로 유지하면서 스프링 부트로 변경이 가능할지였습니다. (DispatcherServlet 매핑 질문이라 생각했습니다)

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
	<param-value>classpath:servlet-context.xml</param-value>
    </init-param>
    <init-param>
        <param-name>threadContextInheritable</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

굳이 다시 적은 이유는 정말로 강의에 조금 벗어날 수는 있는데 전혀 무관한 내용은 아니란 것을 전달 드리고 싶었습니다.

 

심기를 불편하게 해 드릴 의도는 전혀 없었다는 말씀을 드리며 다시 한번 진심으로 사죄의 말씀을 드리겠습니다.

 

 

어이구. 무슨 말씀이십니까. 질문하셨다고 제가 불편할리가 없지요. 그런 건 걱정하지 않으셔도 됩니다. 사과하실 필요 없습니다.

 

단지 질문을 주셨을 때 이걸 제가 해결할 수 있으려면
- 아주 직관적으로 제가 문제를 해결할 수 있는 방법을 알고 있는 것이거나, 이게 강의에 나온 예제에 대한 것이면 바로 답을 드릴 수 있죠
- 아니면 문제가 재현되는 코드를 깃헙 등에 공유해주시면 받아서 해결해드리면 됩니다

 

스프링부트에서 DispatcherServlet은 / 에 매핑되어있고요. 부트 자체에서 이걸 변경하는 프로퍼티는 본 적이 없습니다. 따라서 부트를 쓴다면 말씀하신 *.do만 매핑하는 건 원래 안 되는 것입니다.

하지만 제가 부트의 기본 자동구성을 오버라이드 하는 방법을 알려드렸으니 권장드릴 수는 없지만 해보실 수는 있겠죠.

 

그런데 다시 보여주신 매핑을 보니 /와 *.do를 둘 다 매핑하셨는데 / 는 루트 아래 모든 걸 다 매핑하는 것이거든요. 따라서 *.do 매핑은 의미가 없지 않을까요? 이미 xxx.do까지 포함해서 다 매핑을 걸었는데 거기에 확장자를 더 한다고 추가 매핑되지 않을테니까요. 그래서 원래 쓰신 xml의 매핑이 맞는 건가 의문이었습니다. 그냥 / 없이 *.do만 쓰는 거라면 모르지만요.

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

 

현재 아래와 같이 변경해 봤는데 전혀 작동을 안 합니다 ㅠㅠ

라고 하셨는데 이건 어떻게 작동을 안 하는 것인지를 잘 모르겠습니다. 기대한 게 뭐였는데 어떻게 작동을 안 하는지를 설명해주셔야죠. 서버가 뜨다가 에러가 나는 건지, .do를 매핑했는데 매핑이 안 되는 건지, *.do 외에도 매핑이 된다는 것인지 등이요.

아무튼 부트는 / 아래 모든 걸 다 매핑하니 기존의 xml과 다를 바 없긴 하고, *.do도 알아서 매핑 될 겁니다.

강의에 소개한 방법을 따라 스프링부트의 자동구성을 이리저리 바꿔보는 걸 해보고 싶으시다면 좀 더 다르게 매핑하는 걸로 테스트 해보시면 좋겠습니다. 어쨌든 부트를 쓰면서 실무에서 이렇게 바꾸시는 건 절대 추천드릴 수 없습니다. 부트의 기본 자동구성은 매우 정밀하게 설계되어있고 계속 바뀌기도 해서, 단순한 것을 제외하면 재구성해서 쓰시는 건 좋지 못합니다.


스프링부트로 넘어오면 부트가 만들어준 자동구성을 따라서 부트 스타일로 개발을 하시는 것이 좋습니다.

 

그래도 끝까지 뭔가 실험을 해보고 싶으시다면 문제가 되는 상황이 재현되는 예제를 만들어서 GitHub에 올려주세요. 제가 당장은 아니더라도 시간이 나면 받아서 확인해보고 설명드릴게요.