[ 스프링 / Spring ] 4.x Controller Dto파라미터 매핑 안되는 현상 처리
백엔드/Spring

[ 스프링 / Spring ] 4.x Controller Dto파라미터 매핑 안되는 현상 처리

작업을 하던 중 해결하는데 시간이 걸려 적게 되었다.

 

1. 문제


기존 시스템 컨트롤러 - > 새 시스템 컨트롤러에 이관하는 작업을 진행했다.

 

화면상에 form태그(post)로 해당 컨트롤러에 값을 전달한다.

dateFrom, dateTo라는 두개의 값을 전달하는데 컨트롤러에 해당 dto에는 값이 매핑되지 않는 현상이 발생하였다.

 

기존 시스템에서는 dto에 값이 매핑이 됐고, 새 시스템에는 dto에 값이 매핑되지 않았다.

두 시스템은 같은 소스를 옮겨놓은 상태여서 소스는 동일했다.

 

2. 작업 과정


아래와 같이 문제들이 될만한 요소를 생각해 봤다.

<문제가 될 요소들>
1. 필터(Filter), 인터셉터(interceptor)에서 문제 발생
2. 설정(Config) 관련 문제

 

2.1. 필터(Filter)인터셉터(interceptor)에서 문제 발생

디버거를 통해 다른 프로세스를 확인해봤지만, 동일했고 사용하고있는 Filter와 Interceptor소스에도 문제가 없었다.

이상한 점은 filter, Interceptor를 사용하는 부분에 HttpServletRequest에 값을 확인해봤는데 존재 하지 않았다.

 

2.2. 설정(Config) 관련 문제

AbstractAnnotationConfigDispatcherServletInitializer을 상속받은 클래스를 비교해봤다.

두 클래스에 설정에는 큰 차이가 없었고, 난항에 빠지게 되었다. 

 

2.3. 이 외의 문제 (CommonsMultipartResolver)

form태그(POST) 방식으로 전달하지 않고, 아래와 같이 GET방식으로 주소를 입력해봤다.

http://127.0.0.1:8080/[관련 매핑 주소]?dateFrom=1111

-> 값이 정상적으로 매핑이 됐다. 

그렇다면 POST방식(Multipart)에 문제가 있다는 생각이 들었다.

그래서 form태그에 enctype="multipart/form-data" 부분을 제거하고 처리해보니 정상적으로 값이 전달 됐다.

 

서로의 설정 차이를 비교해 본 결과

@Configuration
@EnableWebMvc
@ComponentScan
public class MvcServletConfig extends WebMvcConfigurationSupport {

...

	@Bean
	public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        return resolver;
	}
 }

CommonsMultipartResolver를 @Bean으로 구현을 해야 multipart를 사용할 수 있다.

 

 

3. 마무리


내가 설정을 잘 모르는 것이 문제지만, 회사에 Spring 버전이 낮아 처리가 쉽지 않은 것 같다.

문제를 추론하기보다는 다음에는 이런 기록들을 통해 빠른 시간안에 해결하는 것을 목표로 해야겠다.

 

 

 

 

 


참고 사항

Spring boot에서는 multipart를 기본 지원하는 것 같다.

 

<application.yml>

spring.servlet.multipart.enabled: 멀티파트 업로드 지원여부 (default: true)

spring.servlet.multipart.file-size-threshold: 파일이 메모리에 기록되는 임계값 (default: 0B)

spring.servlet.multipart.location: 업로드된 파일의 임시 저장 공간

spring.servlet.multipart.max-file-size: 파일의 최대 사이즈 (default: 1MB)

spring.servlet.multipart.max-request-size: 요청의 최대 사이즈 (default: 10MB)

 

spring:
  servlet:
    multipart:
      file-size-threshold: 1MB
      location: C:/Temp
      max-file-size: 100MB
      max-request-size: 100MB

 

 

참고 블로그: https://gofnrk.tistory.com/36

 

Spring Boot 파일 업로드 MultipartFile

Spring의 MultipartFile 인터페이스를 이용하여 파일 업로드하는 방법에 대해서 알아볼게요. 파일을 리스트로 여러 개 업로드하면 컨트롤러에서 받을 수 있도록 할거에요. 간단하게 말해서 다중 업로

gofnrk.tistory.com