서론
이번에 진행하고 있는 프로젝트에서 전자정부 4.0과 버전을 맞추기 위해 SpringBoot 2.4.5 버전으로 업그레이드 했다.
프로퍼티 작성법이 변경되는 것말고는 크게 이슈가 없을 줄 알았는데, 몇가지 자잘한 문제들이 생겼다.
몰랐던 내용도 있고 해서 글로 정리해본다.
1. Default Servlet Registration
Spring Boot 2.4 will no longer register the DefaultServlet provided by your servlet container. In most applications, it isn’t used since the Spring MVC’s DispatcherServlet is the only servlet that’s required.
You can set server.servlet.register-default-servlet to true if you find you still need the default servlet.
스프링부트 2.4부터 DefaultServlet을 기본으로 등록해주지 않는다는 내용이다.
DefaultServlet은 서블릿 컨테이너에 있는 서블릿에서 처리되지 못한 요청을 처리해주는 서블릿이다. 보통 정적파일을 처리해주는 서블릿이다.
아마 WAS에는 보통 스태틱 자원을 url로 요청받을 필요가 없기도 하고, 스프링이 defaultServlet url("/")을 대신하면서 내부에서 다양한 ResourceHandler를 제공해주기 때문에 기본설정에서 제외된 듯하다.
내가 하는 프로젝트에는 설정으로 아래와 같이 설정돼있었다.
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); //<mvc:default-servlet-handler/>
}
스프링 부트 버전업 이후 발생한 에러는 아래와 같다.
Unable to locate the default servlet for serving static content. Please set the 'defaultServletName' property explicitly.
defaultServlet이 없으니 못찾아서 발생한 에러다.
WAS들은 위의 설정을 제거했고, 웹서버에만 server.servlet.register-default-servlet = true로 설정해 defaultServlet을 사용하도록 했다.
위에서 잠깐 언급했듯이, 스프링에서 정적자원을 처리하게 할수도 있다. 글을 쓰면서 몇몇 글을 읽다보니, 캐시와 관련된 설정을 어플리케이션 레벨에서 변경해 성능을 늘릴 수 있다고 한다. 문제만 없다면 추후에 웹서버 설정을 변경해볼만한듯하다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
}
}
2. Dialect 명시적 선언
Cannot determine a dialect for org.springframework.jdbc.core.JdbcTemplate@7fe083b1. Please provide a Dialect.
spring-data-jdbc의 AbstractJdbcConfiguration가 자동으로 방언을 찾았지만, 무슨 이유에선지 업그레이드 후 OralceDialect를 찾지 못한다는 에러메시지를 반환했다.
@Configuration
public class DatasourceConfigure extends AbstractJdbcConfiguration {
@Override
public Dialect jdbcDialect(NamedParameterJdbcOperations operations) {
return OracleDialect.INSTANCE;
}
}
위와 같이 클래스를 상속받고 방언을 명시적으로 선언해 해결했다.
3. maven-resources-plugin 3.2.0 인코딩
빌드도구로 maven을 쓰고 있었는데, 스프링부트 버전업 후 mvn clean시 아래와 같은 오류가 발생했다.
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project sprinttool: Input length = 1 -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
스프링부트 2.4.x로 업그레이드하면서 maven-resources-plugin 도 3.1.0에서 3.2.0으로 업그레이드 된 것이다.
찾아보니 소스파일의 인코딩이 올바르지 않아 생긴 문제라 해서 인코딩을 설정하는 여러 방식을 해봤지만 해결하지 못했다. 찝찝하긴 하지만 3.1.0으로 강제로 다운그레이드해서 해결했다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
4. property 작성법 변경
기존의 spring profile을 그룹핑하는 방법은 아래와 같았다.
spring.profiles: dev
spring:
profiles:
include:
- tomcat-jndi
- window-path
---
spring.profiles: prd
...
설정 active profile을 정의하고 spring.profiles.include에 설정 모듈을 작성하는 식이었다. 기존의 프로파일 설정방식을 유지하려면 spring.config.use-legacy-processing=true 을 선언하면 되지만, 새로 만드는 프로젝튼데 벌써 레거시가 생기면 되나 싶어서 새로운 방식으로 바꿨다.
// path.yml
spring.config.activate.on-profile: dev
excel:
template: C:\dev-file-path
---
spring.config.activate.on-profile: linux
excel:
template: /path/prd-file-path
// application.yml
spring:
config:
import: classpath:path.yml
profiles:
group:
dev: tomcat-jndi, path-dev
prd: jeus-jndi, path-prd
---
spring.config.activate.on-profile: tomcat-jndi
jndi:
name: tomcat
---
spring.config.activate.on-profile: jeus-jndi
jndi:
name: jeus
---
spring.config.activate.on-profile: dev
jndi:
name: override
...
@SpringBootTest(classes = {TestProperty.class, Test2Property.class})
@EnableConfigurationProperties
@ActiveProfiles("dev")
class TestPropertyTest {
@Autowired
TestProperty testProperty;
@Autowired
Test2Property test2Property;
@Test
@DisplayName("프로퍼티테스트")
void test1() {
Assertions.assertThat(testProperty.getName()).isEqualTo("override");
Assertions.assertThat(test2Property.getTemplate()).isEqualTo("C:\\dev-file-path");
}
}
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes
'Backend > Java' 카테고리의 다른 글
공통 lib -> spring-boot-starter로 바꾸기(1) (0) | 2023.02.13 |
---|---|
Session은 Controller까지만 (0) | 2022.10.09 |
UUID, 정말 안전할까? (2) | 2021.11.06 |
Tika로 파일 MIME 타입 검사 (0) | 2021.07.24 |
YAML) @PropertySource에서 EnvironmentPostProcessor까지 (0) | 2021.07.03 |