[JavaDoc] 만들기

 - 해당 프로젝트 오른쪽 클릭 > Export > Javadoc

 

next > next 이후 Encoding 파라미터 설정 

 

프로젝트 경로 내에 doc 폴더로 생성

 

index.html 실행 시 화면

 - Packages, Classes, 등등 javadocs로 프로젝트 구성을 볼 수 있다.

Javadoc에 적용되는 주석 상태

 - 기본적으로 설정되어 있는 author는 적용

 - date를 생성하여 적용해봤지만 문서에는 적용이 안됨

 - 해당 클래스나 메서드에 설명은 /** .. */ 주석의 맨 위에 작성해야 나옴

 - 주석은 계속 수정이 필요. 

 

Javadoc 주석(/** .. */) 내에 작성한 내용이 수정되지 않는 것을 원하는 경우 <pre> ... </pre>안에 작성

 

 

 * 주석도 활용할 수 있는 형식으로 작성하도록 하자

[이미지 다운로드 시 브라우저 내에 Console 오류]

 - 다운로드 구현 시 파일 다운로드는 정상적으로 되는데 브라우저 내에 콘솔에 오류가 뜸

https://stackoverflow.com/questions/6587393/resource-interpreted-as-document-but-transferred-with-mime-type-application-zip

 

Resource interpreted as Document but transferred with MIME type application/zip

With Chrome 12.0.742.112, if I redirect with the following headers: HTTP/1.1 302 Found Location: http://0.0.0.0:3000/files/download.zip Content-Type: text/html; charset=utf-8 Cache-Control: no-ca...

stackoverflow.com

 

[해결방안 1]

HTML5의 경우 <a> 태그 내에 download 속성을 추가

 * 단 chrome외에 브라우저는 정상작동이 되지 않음

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

[현상]

Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Current request is not a multipart request

 

[기존 업로드 구현 방식]

 - 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 ...로 파일 이 전송된다.

 

https://repacat.tistory.com/38

 

[파일업로드] Ajax 방식

파일업로드 Ajax 방식의 핵심은 FormData 라는 브라우저에서 지원하는 클래스이다. FormData 는

과 같은 효과를 가져다주는 key/value 가 저장되는 객체이다. 태그처럼 데이터를 처리할 수 있게 해..

 

repacat.tistory.com

 

[오류 내용 확인]

[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 메서드로 등록

 

[해결책]

 - multipartResolver 메서드로 수정

 

참고

https://www.baeldung.com/spring-file-upload

 

Uploading Files with Spring MVC | Baeldung

In this article, we focus multipart (file upload) support in Spring MVC web applications.

www.baeldung.com

 

[사전 정보]

 - View에서 파일을 선택할 수 있는 방법

 - 썸네일 이미지를 어떻게 보여줄 것인가

 - 파일을 업로드 할 때 서버에서 해야할 것들, 필요한 라이브러리

 

[파일 업로드 프로토타입 만들기]

 - 파일 선택 후 submit할 때, 파일 업로드가 될 수 있도록 프로토타입을 만듦

 - 일반적으로는 화면에 썸네일 이미지를 노출하기 위해서 비동기로 파일 업로드 한 뒤, 응답 값으로 이미지 경로를 받아 처리한다고 한다.

 - 하지만 여기서는 파일 선택 시 script를 이용하여 createObjectURL를 활용하여 썸네일 이미지를 노출하도록 한다.

파일 업로드 HTML 폼 작성

 

파일 업로드 핸들링 JS 작성

 

파일 업로드 Controller

 

[이미지 파일 외부 경로 설정 방법]

 1. 톰캣 사용할 경우 Server.xml 내에 <Context> 태그 사용하여 프로젝트 외부 폴더를 읽을 수 있도록 하기

 2. addResourceHandlers()에 registry에서 프로젝트 외부 파일 경로를 읽을 수 있도록 하기

 3. 이미지 호출 URL에 대한 Controller를 만들어 사용

 

 

[파일 다운로드 프로토타입 만들기]

 - View 구성

  1. href를 이용하여 '/naver/download?fileName=${파일명 }' url로 controller 호출

 - Controller

 1. 파일명, 파일 전체 경로, 파일 타입, 파일 용량 등을 response에 설정

 2. OutputStream을 통해 파일 쓰기

 

[프로젝트에 적용해야 할 부분]

 - 파일 업로드 시 DB에 파일 경로 저장

 - 업로드 시 thumbnail은 JS 사용

 - 업로드 후 내용 볼 때 섬네일 이미지는 한줄평 이미지의 id 값으로 이미지 호출 controller를 활용하여 thumbnail 출력

 - 다운로드 시 한줄평 이미지의 id 값으로 경로를 가져와 다운로드 작성

[BoostCourse] 테스트 코드 만들기

 * 더 정리가 필요

이 글은 테스트 코드 없이 손으로 그림그려가면서 코딩하는 부족한 날 위한 글

 

 - 사전내용

바쁘다는 핑계로 프로젝트를 뒤로 미루다가 다시 하려니 생각이 잘 안나고.. 리펙토링 해야 할 부분도 많고, 답도 안나오고...
몇 개월전에 『테스트 주도 개발(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 - 자바 베이스 스프링 설정

 

 

 - 상단 어노테이션 설정

@RunWith docs

 - 스프링 테스트를 Junit으로 돌리기 위한 어노테이션 

 

@ContextConfiguration docs

 - ApplicationConfig.class, WebMvcContextConfiguration.class를 spring context의 빈 설정 파일로 사용

 * contextConfigLocation로 사용하고 있는 클래스인 WebMvcContextConfiguration 클래스를 @ContextConfiguration에 추가 안하면 Dispatcher가 URL를 매핑할 controller를 찾지못한다.

 

@WebAppConfiguration docs

 - 테스트할 DI 컨테이너를 웹 어플리케이션 전용 DI 컨테이너로 처리

 

위에 내용이 설정되어야 Test 클래스에서 스프링 MVC 동작을 재현할 수 있다.

 

 - MockMvc 선언

  • MockitoAnnotations.iniMocks()
    • @Mock, @Spy, @Captor, @InjectMocks이설정된 객체를 초기화 해준다.
  • MockMvc
    • MockMvc로 초기화된 DispatcherServlet 인스턴스를 반환한다.
  • MockMvcBuilders.webAppContextSetup(WebApplicationContext context)
    • DisplatcherServlet은 스프링 MVC기반 구조와 응용프로그램 컨트롤러를 찾아 ServletContext로 설정된 Context를 사용하도록 한다.
  • MockMvcBuilders.standaloneSetup(Object... controllers)
    • 하나 이상의 @Controller 인스턴스를 등록하거나 스프링 MVC 인프라를 프로그래밍적인 설정을 통해 MockMvc를 빌드한다.

 

 

 - Mock 객체 선언

  • @Mock
    • 테스트에 필요한 객체를 신속하게 생성할 수 있다.
    • 반복적인 모의 생성 코드를 최소하 하도록 한다.
    • 테스트 클래스를 읽기 쉽게 만든다.
    • 필드 이름이 Mock을 식별하는데 사용되어 확인된 오류를 읽기 쉽게 만들어준다.
  • @InjectMock
    • class의 인스턴스를 생성하고 @Mock(또는 @Spy) Annotation으로 생성된 mock instance를 class의 instance에 주입한다.
    • 이 mock instance를 초기화하고 주입하려 @RunWit(MockitoJunitRunner.class) 또는 MockitoAnnotations.init(this)를 사용해야 한다. 

 

 - 테스트에 필요한 static factory 메서드

static factory 메서드 설명
MockMvcRequestBuilders  요청 데이터를 설정할 때 사용할 static 메서드
MockMvcResultMatchers 
실행 결과를 검증할 때 사용할 static 메서드
MockMvcResultHandlers 
실행 결과를 로그 등으로 출력할 때 사용할 static 메서드

 

 - Mockito로 카테고리 API(get: /api/categories) 테스트 코드

 

 

 - Mockito로 카테고리 API(get: /api/categories) 테스트 결과 값

 

 

 - Mockito로 예약 API(get: /api/reservations) 테스트코드

 

 

 - Mockito로 예약 API(get: /api/reservations) 테스트 결과 값

 

 

 - 데이터 결과 값을 Json Viewer를 통해 데이터 확인

 

참고 사이트

 - MockMvc

 - MockitoAnnotations.init()

 - MockitoAnnotations.initMocks() vs @RunWith(MockitoJunitRunner.class)

 - JsonViewer

 

[부스트코스] 웹 프로그래밍 프로젝트 시 느낀 필요한 개념


[JS]

 - JS 버전별 차이

 - JS 변수 타입

 - JS 매커니즘

 - polyfill

 - 함수형 자바스크립트

 - Bubbling & Capturing

 - Templating

 - 비동기 통신으로 요청한 데이터를 재사용할 방법

 - 그 외 등등..

 - JS Debug (https://developers.google.com/web/tools/chrome-devtools/javascript/?hl=ko)

 - 배열의 함수형 메소드 (map, filter, reduce)

 - 객체형 자바스크립트

 - jQuery

 - handlebar

 - Clean Code

 - Carousel Slide ** (이해는 되는데.. 구현이 어설픔)


 * 이제 부터 알아가야 함...


[Spring Framework]

 - Spring Config (XML, Java)

 - Spring Layered Architecture

 - AOP

 - Design Pattern (Singleton)

 - Front Controller (DispatcherServlet)

 - XML Config -> Java Config (https://www.luckyryan.com/2013/02/07/migrate-spring-mvc-servlet-xml-to-java-config/)

 - 설정의 분리

 - MessageConvertor


+ Recent posts