티스토리 뷰

사실 내가 마이그레이션 한 Web  Spring Web MVC는 변경이 "거의" 없긴 했다. 

아예 없지는 않았다. 요약하면 아래와 같다. 

 

 

  • 프라퍼티 변경
  • 확장자 매핑 제거
  • ErrorController 변경

 

 

프라퍼티 변경

  사실 프라퍼티를 변경하는 것은 크게 어렵지 않다. 왜냐하면, Intellij IDE에서 감지해서 바꾸라고 알려주기 때문이다. 

 

spring.resources.*   → spring.web.resources.*

 

삭제된 프라퍼티도 있었다.

 

 

확장자 매핑 제거

기존에 아래처럼 excel을 다운로드 받는데 사용하던 코드가 있었다. 

 

 

@Controller
public class UserController {
    

    @GetMapping("/excel.xls")
    public String getExcel() {
        return "excelView";
    }
}
package com.jongui.jdk17sample;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractXlsView;

import java.util.Map;

@Component("excelView")
public class CustomExcelView extends AbstractXlsView {
    @Override
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
        /**
         * excel 구현
         */
    }
}

 

위 코드를 위해 아래 프라퍼티가 추가되었다.

spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.contentnegotiation.media-types.xls=application/vnd.ms-excel

 

 

위 코드는 요청받은 URL이 *.xls로 끝나는 경우에 일반적인 타임리프 페이지가 아닌 Excel 처리 페이지로 이동시켜주는 코드였다. 

spring boot 3.2.2로 올리자 이 코드가 더이상 동작하지 않았다. "excelView"를 매핑해주지 못하고 있었다. 

 

원인은 확장자 매핑이 spring webmvc 5.3에서 제거된 것이 원인이었다.(Spring boot 3의 변경사항이 아니다. )

 

Mapping Requests :: Spring Framework

A reflected file download (RFD) attack is similar to XSS in that it relies on request input (for example, a query parameter and a URI variable) being reflected in the response. However, instead of inserting JavaScript into HTML, an RFD attack relies on the

docs.spring.io

 

https://www.baeldung.com/spring-mvc-content-negotiation-json-xml

약간의 배경지식을 설명하자면, spring boot에서는 기본적으로 ContentNegotiationManager  를 통해 어떤 ViewResolver를 사용할지 결정한다. 기존에 사용하던 방식은 URL에 들어있는 파일 확장자를 추출해서 xls가 들어가 있으면 excel 쪽 ViewResolver를 쓰도록 하는 설정이었다. 보통 아무 설정이 없는 경우엔 ThymeleafViewResolver 객체를 통해 resources/templates 내의 타임리프 파일들을 매핑해준다. 

 

아래 URL에 어떻게 대응할지 정리가 되어있다.

Accept 헤더를 사용하는 방법과 query string을 활용하는 방법을 추천해주고 있다. 

 

https://www.baeldung.com/spring-mvc-content-negotiation-json-xml

 

다만 위 링크에서 소개해주는 방식은 요청을 수정해야 하는 부분이라 내가 좀 쓰기가 곤란했다.  그래서 아예 컨텐츠 협상을 하지 않도록   ModelAndView 객에다가 사용할 View를 강제로  지정하는 방식을 사용했다. 

@Controller
public class UserController {


    @Autowired
    private CustomExcelView excelView;
    @GetMapping("/excel")
    public ModelAndView getExcel() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setView(excelView);
        return modelAndView;
    }

}

 

 

 

에러 컨트롤러 삭제

 

구버전 스프링에서는 ErrorController 인터페이스를 구현해 Error 처리할 경로까지 지정해주었다. 

package org.springframework.boot.web.servlet.error;

@FunctionalInterface
public interface ErrorController {
    String getErrorPath();
}

 

더이상 위 코드는 사용이 불가능하다. 이제 아래 코드를 상속받으면 BasicErrorController가 비활성되도록 변경되었다. 

package org.springframework.boot.web.servlet.error;

import org.springframework.stereotype.Controller;

/**
* Marker interface used to identify a {@link Controller @Controller} that should be used
* to render errors.
*
* @author Phillip Webb
* @author Scott Frederick
* @since 2.0.0
*/
public interface ErrorController {

}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함