- multipartResolver를 bean으로 등록 CommonsMultipartResolver를 활용하여 파일 업로드 기능 구현
- Ajax 호출로 파일 데이터를 전송
[문제점]
- 기존에 사용하던 ajax 공통 호출 함수는 header를 각 호출 장소에서 설정하도록 작성
- 파일 업로드를 위해 Content-Type에multipart/form-data를 설정하여 호출했으나 오류발생
[해결방식]
- 기본적인 Ajax 코드로 테스트하여 정상적인 기능 확인
- setRequestHeader를 제거한 뒤 기존의 ajax 공통 함수 호출 테스트
[원인]
- multipart/form-data로 데이터 전송 시 jquery에서는 contentType을 false로 설정하여 작성되는 글들을 확인
- 왜 contentType을 multipart/form-data로 설정하면 안되는지 검색
[데이터 전송 실패일 때 Request Header]
[데이터 전송 성공일 때 Request Header]
* Content-Type을 확인해보면 boundary의 유무 차이 확인할 수 있다. * multipart/form-data를 사용할 때는 Ajax 호출 시 contentType을 설정하지 않아야 정상적으로 multipart/form-data; boundary ...로 파일 이 전송된다.
[2020-02-17 16:03:17.193] DEBUG [o.s.w.s.DispatcherServlet.initMultipartResolver:515] - Unable to locate MultipartResolver with name 'multipartResolver': no multipart request handling provided
[내용]
- 파일업로드 기능 구현중에 테스트 프로젝트를 만들어 파일 업로드 기능을 구현한 뒤 부스트코스에 적용할 때 위와 같은 오류 발생
[원인]
- WebMvcContextConfiguration 클래스에 multipartResolver bean으로 등록할 때 multiPartResolver 메서드로 등록
바쁘다는 핑계로 프로젝트를 뒤로 미루다가 다시 하려니 생각이 잘 안나고.. 리펙토링 해야 할 부분도 많고, 답도 안나오고... 몇 개월전에 『테스트 주도 개발(Test-Driven Development: By Example)』이란 책을 읽고, 내게 부족한 부분을 채워줄 수 있을 것 같아서 흉내내 보았다.
이 글을 쓰는 시점은 PJT 4까지 완료하고 5개월이 지나고 PJT 5를 다시 시작하려한다.
- 목표 1. src/test/java 폴더에 class 파일 만들기 2. 테스트 클래스에 Annotation 적용하기 3. @Test Annotation을 적용한 테스트 메서드 만들기 4. Controller에 @Mockito 적용하여 API 테스트 작성
- 기존 테스트 코드
기존에도 소스 내에 print()만 안찍었지 비슷한 수준의 테스트 클래스를 작성하여 흉내만 냈었다.
- 카테고리 (/api/categories) 결과 값
위와 같은 자바 클래스를 Repository, Service까지는 대충 적용 되는 것처럼 보인다. 물론 테스트 코드에 대한 개념과 깊이가 없어 데이터를 출력해보는 것 이상의 정보는 보이지 않는다.
여기서부터가 문제인데 웹 프로젝트에서 request 값이 정상적으로 요청이 들어와 Service Layer, Repository Layer의 함수를 호출하는 것은
단순하게 함수를 호출하여 결과 값이 내가 만든 결과 값이 나오는지 확인이 가능하다.
Controller도 기존에 만들었던 똑같은 테스트 방식으로 파라미터 넣고 호출하도록 했었다.
하지만 Controller의 목적은 Model과 View간에 상호 동작을 관리 하는 것이다.
즉, View에서 request한 값을 받아 Model에 전해주고, Model의 결과 값을 View에 전달해주는 것
지금처럼 테스트 하면 View에서 request한 값을 받을 수 있는 방법이 없다.
그래서 적용한 것이 Mockito이다.
- dependency 추가
spring-test, junit은 기존에 쓰고 있었고, mockito-all만 새로추가
- Controller 테스트 코드
- Mockito 적용 전 참고해야할 설정
web.xml에 설정되어 있는 servlet 설정
AnnotationConfigWebApplicationContext - DispatcherServlet에게 annotation 기반의 자바 설정 로드 WebMvcContextConfiguration - 자바 베이스 스프링 설정