티스토리 뷰
사실 내가 마이그레이션 한 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.media-types.xls=application/vnd.ms-excel
위 코드는 요청받은 URL이 *.xls로 끝나는 경우에 일반적인 타임리프 페이지가 아닌 Excel 처리 페이지로 이동시켜주는 코드였다.
spring boot 3.2.2로 올리자 이 코드가 더이상 동작하지 않았다. "excelView"를 매핑해주지 못하고 있었다.
원인은 확장자 매핑이 spring webmvc 5.3에서 제거된 것이 원인이었다.(Spring boot 3의 변경사항이 아니다. )
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가 비활성되도록 변경되었다.
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 {
}
'개발 > 스프링' 카테고리의 다른 글
spring boot 3.2.2 전환기(4) - 타임리프 변경사항 (0) | 2024.03.25 |
---|---|
spring boot 3.2.2 전환기(3)- Spring Security 변경 (0) | 2024.03.25 |
Spring boot 3.2.2 전환기(1) - 버전 변경 (1) | 2024.03.23 |
코드 내에서 타임리프 파싱하기 (0) | 2022.06.12 |
spring jpa - pessimistic write lock (0) | 2022.02.22 |
- Total
- Today
- Yesterday
- Request
- 탈세
- java
- k베뉴
- 광군제
- 오블완
- JPA
- Java17
- 한국교통안전공단
- ORM
- springboot3
- 부가가치세
- tomcat
- 포상금
- Azure
- 홈택스
- ouath2
- 현금영수증
- n+1
- Thymeleaf
- 알리익스프레스
- 전세사기
- 티스토리챌린지
- springboot
- Spring
- 토스페이
- 공익제보단
- 알리
- 안전신문고
- 이륜차
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |