Spring MVC
-
웹 애플리케이션을 작성하다 보면 파일을 업로드 하거나 다운로드 하는 일은 매우 빈번한 일이다. 이번 포스트에서는 SpringBoot를 이용해서 file을 upload 및 다운로드하는 방법에 대해 알아보자. 프로젝트 구성 pom.xml 이번 프로젝트는 다음의 환경에서 테스트 되었다. application.yml file upload와 관련된 설정은 하단의 spring.servlet.multipart 관련 부분이다. 내용은 주석을 참고한다. server: port: 9090 servlet: encoding: force-response: true spring: datasource: driver-class-name: org.h2.Driver password: '' url: jdbc:h2:~/spring-test..
[SpringBoot]file upload /download 처리웹 애플리케이션을 작성하다 보면 파일을 업로드 하거나 다운로드 하는 일은 매우 빈번한 일이다. 이번 포스트에서는 SpringBoot를 이용해서 file을 upload 및 다운로드하는 방법에 대해 알아보자. 프로젝트 구성 pom.xml 이번 프로젝트는 다음의 환경에서 테스트 되었다. application.yml file upload와 관련된 설정은 하단의 spring.servlet.multipart 관련 부분이다. 내용은 주석을 참고한다. server: port: 9090 servlet: encoding: force-response: true spring: datasource: driver-class-name: org.h2.Driver password: '' url: jdbc:h2:~/spring-test..
2021.05.06 -
RestTemplate가끔 REST API를 자바 영역에서 사용해야 할 경우가 있다. ajax로 처리해야 하는데 서비스를 제공하는 서버에서 cross origin에서의 접근을 허용하지 않는 경우가 대표적이다. 이런 경우는 자바 영역에서 일반 요청 형태로 REST 서비스를 호출해서 정보를 받고 이를 다시 ajax로 얻어와야 한다.자바 영역에서 REST 서비스를 편리하게 사용하기 위해 RestTemplate을 사용할 수 있다. 빈 등록RestTemplate은 스프링에서 제공해주는 기본 템플릿이다. 이를 사용하기 위해서는 아래와 같이 빈을 생성해 볼 수 있다.@Beanpublic RestTemplate restTemplate() { return new RestTemplate();} ..
03. RestTemplateRestTemplate가끔 REST API를 자바 영역에서 사용해야 할 경우가 있다. ajax로 처리해야 하는데 서비스를 제공하는 서버에서 cross origin에서의 접근을 허용하지 않는 경우가 대표적이다. 이런 경우는 자바 영역에서 일반 요청 형태로 REST 서비스를 호출해서 정보를 받고 이를 다시 ajax로 얻어와야 한다.자바 영역에서 REST 서비스를 편리하게 사용하기 위해 RestTemplate을 사용할 수 있다. 빈 등록RestTemplate은 스프링에서 제공해주는 기본 템플릿이다. 이를 사용하기 위해서는 아래와 같이 빈을 생성해 볼 수 있다.@Beanpublic RestTemplate restTemplate() { return new RestTemplate();} ..
2020.07.14 -
REST를 위한 단위 테스트 RestController의 단위 테스트에는 com.jayway.jsonpath가 주로 사용된다. https://goodteacher.tistory.com/495 [junit] jupiter 9. Rest Controller Test 이번 포스트에서는 @RestController에 대한 단위테스트에 대해서 살펴보자. REST를 위한 단위 테스트 RestController의 단위 테스트에는 com.jayway.jsonpath가 주로 사용된다. 관련 문서는 https://github.com/json-pat goodteacher.tistory.com 테스트 해보기 전체 국가 조회 다음은 전체 국가 정보를 가져오는 get : /api/countries에 대한 단위 테스트 예이다. 테..
02. REST를 위한 단위 테스트REST를 위한 단위 테스트 RestController의 단위 테스트에는 com.jayway.jsonpath가 주로 사용된다. https://goodteacher.tistory.com/495 [junit] jupiter 9. Rest Controller Test 이번 포스트에서는 @RestController에 대한 단위테스트에 대해서 살펴보자. REST를 위한 단위 테스트 RestController의 단위 테스트에는 com.jayway.jsonpath가 주로 사용된다. 관련 문서는 https://github.com/json-pat goodteacher.tistory.com 테스트 해보기 전체 국가 조회 다음은 전체 국가 정보를 가져오는 get : /api/countries에 대한 단위 테스트 예이다. 테..
2020.07.13 -
REST REST란 Representational State Transfer의 약자로 하나의 URI는 하나의 고유한 리소스와 연결되며 이 리소스를 GET/POST/PUT/DELETE 등 HTTP 메서드로 제어하자는 개념이다. Representational은 웹 상의 상태를 표현할 수 있는 어떤 자원을 의미하고 이 자원의 상태(State) 즉 데이터를 전송(Transfer)하는 것으로 해석해 볼 수 있다. 특히 서버에 접근하는 클라이언트의 종류가 단순히 브라우저를 넘어 스마트폰, 다른 서비스 등으로 다양해지면서 화면에 대한 관심은 없고 데이터, 비즈니스 로직에만 관심 있는 경우가 많은데 이때 사용되는 것이 REST이다. 자바나 C와 같은 언어에서 어떤 기능을 제공하는 것을 API라고 하듯이 REST 형태로..
01.RestREST REST란 Representational State Transfer의 약자로 하나의 URI는 하나의 고유한 리소스와 연결되며 이 리소스를 GET/POST/PUT/DELETE 등 HTTP 메서드로 제어하자는 개념이다. Representational은 웹 상의 상태를 표현할 수 있는 어떤 자원을 의미하고 이 자원의 상태(State) 즉 데이터를 전송(Transfer)하는 것으로 해석해 볼 수 있다. 특히 서버에 접근하는 클라이언트의 종류가 단순히 브라우저를 넘어 스마트폰, 다른 서비스 등으로 다양해지면서 화면에 대한 관심은 없고 데이터, 비즈니스 로직에만 관심 있는 경우가 많은데 이때 사용되는 것이 REST이다. 자바나 C와 같은 언어에서 어떤 기능을 제공하는 것을 API라고 하듯이 REST 형태로..
2020.07.10 -
post /mod의 문제점 페이지 흐름과 관련해서 기존의 post /mod의 문제점에 대해 살펴보자. post로 요청된 /mod가 성공적으로 동작되면 index.html로 연결된다. @PostMapping("/mod") public String doModEmp(Model model, @ModelAttribute("emp") @Valid Employee emp, BindingResult result) { if (result.hasErrors()) { List globalErrors = result.getGlobalErrors(); for (ObjectError ge : globalErrors) { if (ge.getCode().equals(MyPasswordEquals.class.getSimpleName(..
08. Redirection과 flash scopepost /mod의 문제점 페이지 흐름과 관련해서 기존의 post /mod의 문제점에 대해 살펴보자. post로 요청된 /mod가 성공적으로 동작되면 index.html로 연결된다. @PostMapping("/mod") public String doModEmp(Model model, @ModelAttribute("emp") @Valid Employee emp, BindingResult result) { if (result.hasErrors()) { List globalErrors = result.getGlobalErrors(); for (ObjectError ge : globalErrors) { if (ge.getCode().equals(MyPasswordEquals.class.getSimpleName(..
2020.07.09 -
파라미터와 validation validation은 화면에서 넘어온 데이터가 원하는 형식에 적합한가를 나타내는 것으로 앞서 살펴본 formatting과는 다르다. 포메팅이 원본 데이터를 가독성 좋은 문자열로 보이도록 처리하거나 그 문자를 다시 원본 데이터로 형 변환하기 위한 과정이라면 validation은 원하는 형태로 작성되었는가만 본다. 예를 들어 비밀번호의 복잡성이나 필수 입력 항목의 작성 여부, 값의 범위등을 확인하는 것이 validation이다. 클라이언트 단에서의 validation vs 서버 단에서의 validation 일반적으로 validation은 클라이언트 단에서 java script를 이용해서 처리하는 것으로 오해하기 쉽다. 하지만 일단 javascript를 통과한 패킷을 해커가 조작..
07. 파라미터와 validation파라미터와 validation validation은 화면에서 넘어온 데이터가 원하는 형식에 적합한가를 나타내는 것으로 앞서 살펴본 formatting과는 다르다. 포메팅이 원본 데이터를 가독성 좋은 문자열로 보이도록 처리하거나 그 문자를 다시 원본 데이터로 형 변환하기 위한 과정이라면 validation은 원하는 형태로 작성되었는가만 본다. 예를 들어 비밀번호의 복잡성이나 필수 입력 항목의 작성 여부, 값의 범위등을 확인하는 것이 validation이다. 클라이언트 단에서의 validation vs 서버 단에서의 validation 일반적으로 validation은 클라이언트 단에서 java script를 이용해서 처리하는 것으로 오해하기 쉽다. 하지만 일단 javascript를 통과한 패킷을 해커가 조작..
2020.07.08 -
파라미터의 formatting 화면에서 전달된 파라미터가 HTTP 를 통해 서버로 전송될 때는 언제나 문자열이다. 이제까지 똑똑한 @Controller는 적절한 자바 데이터 타입으로 형 변환 후 전달해줬다. @RequestMapping("/add") public String add(@RequestParam Double a, @RequestParam Integer b, Model model) { String message = String.format("%3.1f와 %d의 합은 %3.1f입니다.", a, b, a + b); model.addAttribute("message", message); return "index"; } 하지만 Controller는 인공지능이 아니니 조금만 복잡해지면 값에 대한 bind..
06. 파라미터의 formatting파라미터의 formatting 화면에서 전달된 파라미터가 HTTP 를 통해 서버로 전송될 때는 언제나 문자열이다. 이제까지 똑똑한 @Controller는 적절한 자바 데이터 타입으로 형 변환 후 전달해줬다. @RequestMapping("/add") public String add(@RequestParam Double a, @RequestParam Integer b, Model model) { String message = String.format("%3.1f와 %d의 합은 %3.1f입니다.", a, b, a + b); model.addAttribute("message", message); return "index"; } 하지만 Controller는 인공지능이 아니니 조금만 복잡해지면 값에 대한 bind..
2020.07.07 -
Handler Interceptor Handler Interceptor는 말 그대로 handler(Controller)로 가는 요청을 가로채는 녀석으로 Servlet의 Filter와 유사한 녀석이다. 주요 역할은 여러 컨트롤러에서 공통적으로 사용되는 기능을 정의하는데 예를 들어 여러 컨트롤러에서 사용되는 공통적인 model attribute를 설정하거나 request에 대한 검사, response header 설정 등 무궁무진하다. HandlerInterceptor interface Handler Interceptor를 만들기 위해서는 org.springframework.web.servlet.HandlerInterceptor를 구현한다. 이 인터페이스에는 3개의 주요 메서드가 있는데 preHandle, ..
05. Handler InterceptorHandler Interceptor Handler Interceptor는 말 그대로 handler(Controller)로 가는 요청을 가로채는 녀석으로 Servlet의 Filter와 유사한 녀석이다. 주요 역할은 여러 컨트롤러에서 공통적으로 사용되는 기능을 정의하는데 예를 들어 여러 컨트롤러에서 사용되는 공통적인 model attribute를 설정하거나 request에 대한 검사, response header 설정 등 무궁무진하다. HandlerInterceptor interface Handler Interceptor를 만들기 위해서는 org.springframework.web.servlet.HandlerInterceptor를 구현한다. 이 인터페이스에는 3개의 주요 메서드가 있는데 preHandle, ..
2020.07.03