본문 바로가기

Java/Spring

StreamingResponseBody 사용시 주의점 파일 다운로드 API 기능을 개발하는 과정에서 삽질한 경험를 공유드립니다 ㅎ 목적​Streaming 형태의 Response로 제공하고 싶었습니다.그래서 구글링해보니 Spring에선 아래 3가지 Response를 제공합니다.​참고 : Spring 4.2 이상- ResponseBodyEmitter- SseEmitter- StreamingResponseBody​이 중 StreamingResponseBody는 비정형화된 Byte 응답을 Streaming형태로 줄 때 사용합니다.StreamingResponseBody를 이용해 Controller와 Service는 아래와 같이 구현했습니다.​Controller @GetMapping("/sample") public StreamingResponseBody downloa..
[Spring] Stream 형태로 Response 응답 주기 (feat. MyBatis, Observer) 환경 Spring Version : 4.2 이상 MySQL + MyBatis 문서 Http Stream Return은 총 3가지가 있는듯하다. (Spring 4.2부터) - ResponseBodyEmitter : https://docs.spring.io/autorepo/docs/spring-framework/4.3.5.RELEASE/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.html - SseEmitter : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/mvc/meth..
[Spring] 기본 생성자가 없는 객체 바인딩시키기 참고) Bean 설정이 아닙니다. Controller에서 매핑된 URL로 메서드가 실행되는데요~ 이 경우 파라메터에 모델을 선언했다면 URL queryString에 있는 프로퍼티 값이 모델 멤버(setter)와 동일하다면 자동으로 Binding됩니다. public class Foo { private int id; public void setId(int id) { this.id = id; } public int getid() { return this.id; } } @Controller public class FooController { @RequestMapping("/foo") public String getFooView(Foo fooModel) { return "foo"; } } - 인자가 없는 기본 생..
RestTemplate Encoding RestTemplate을 이용해 getForObject를 하다보면 http call이 잘된다. 하지만.. http://foo.com?bar=car&fooUrl=http://paramater?go=go&key=key fooUrl을 그대로 전송하면 문제가 발생할 수 있으니 인코딩이 필요하다. 그런데 URL 쿼리스트링에 Encoding을 하게되면 문제가 발생한다. getForObject에 Url을 String 타입으로 주게되면 내부적으로 또 Encoding을 하는 듯하다. 그렇다면...? 방법은 URI 객체 사용이다. // Spring 내장 Utils 사용 String encodeFooUrl = UriUtils.encode("http://paramater?go=go&key=key", "UTF-8") URI u..
브라우저에서 PUT, DELETE method 요청하기 Restful한 URL을 만들고 API를 작성하기위해 method를 다양하게 사용하려고 노력하고 있을텐데요 Html의 form은 get과 post만 지원하기 때문에 put, delete를 사용하기에 한계가 있습니다. Spring에서 꼼수(?)를 제공하는데요. 직접 Spring이 제공하는 form을 써서 넘기셔도 되고 jQuery의 ajax를 쓴다면 input hidden을 이용할 수 있습니다. 필터 설정(java) @Bean public FilterRegistrationBean httpMethodFilter() { FilterRegistrationBean filter = new FilterRegistrationBean(); filter.setFilter(new HiddenHttpMethodFilter()..
[SpringBoot] Address already in use: JVM_Bind 간혹 Window환경에서 SpringBoot를 이용해 개발하다보면 서버 시작이 안될때가 있다. Address already in use: JVM_Bind - 에러로그 전체를 찍지 못했는데, 자세히 살펴보면 port번호도 함께 적혀있을 것이다. 이 경우 윈도우 cmd 창을 열어서 명령어를 수행한다. netstat -o -a 현재 사용 중인 port 정보를 알 수 있다. 목록에서 문제가 발생한 port를 찾고 가장 왼쪽의 PID를 기억하자 명령어를 이용해서 PID를 죽여도 되고 작업관리자 > 프로세스 > PID 정렬을 통해 찾아 종료시키면 된다. 다시 수행하면 정상 동작이 된다.
Spring Endpoint Health 설정 구글에 Spring Endpoint라고 검색하면 많은 설정 정보들이 존재하는데 이번에 사용할 기능은 health check만 설정하도록 해본다. application.properties # springboot에서 제공하는 기능 - 서버 정보를 알수 있음 # http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html endpoints.enabled=false endpoints.health.enabled=true # health 체크시 여러가지 응답 정보가 가는데, status 정보만 노출하도록 설정 endpoints.health.sensitive=true build.gradle compile("or..
ControllerAdvice ControllerAdvice 어노테이션은 웹서버에서 예외가 발생했을 때 상위에서 Catch하여 처리할 수 있게해주는 기능이다. URL 포맷에 대해 예외를 잡는다고 가정했을 때... @ControllerAdvice public class ExceptionController { @ExceptionHandler(MalformedURLException.class) @ResponseBody public String malformedURLException(MalformedURLException e) { String message = "URL을 확인해주세요!"; logger.error("### {}", message, e); return message; } - 이런식으로 Exception을 Catch하고 안내 문구..
SpringBoot 신규 프로젝트 생성하기 개발환경 - OS : Windows 7 64bit- 툴 : STS 3.7.2- JDK : 1.8 Gradle 프로젝트를 생성하기 위해이클립스(STS)에 Gradle 플러그인을 설치합니다. STS기준으로 Dashboard 화면에서 IDE EXTENSIONS를 클릭합니다. Gradle로 검색해서 플러그인을 설치합니다. 이제 신규 프로젝트를 생성해봅니다. 기본 프로젝트가 성공적으로 생성되었습니다. gradle이 정상적으로 수행되는지 테스트를 해봅니다.우선 build.gradle 파일을 살펴봅니다. JDK는 1.8을 사용할껀데 gradle 파일안의 sourceCompatibility가 1.5로 되어 있습니다.JDK 버전을 수정합니다. AS-ISsourceCompatibility = 1.5 TO-BEsourceC..
SpringBoot Profile(환경별 설정 파일 구별) 개발용, 알파용, 리얼용 설정 파일이 다 다를텐데 어떻게 환경별로 파일을 구별할지 고민이었는데생각보다 간단하였다. 읽기 전에... - 이 설정은 war가 아닌 jar 배포 기준입니다! 1. application.properties 기본적으로 환경에 구애받지 않는 application.properties는 공통 설정이 들어가면 된다. 환경별로 구별할려면?application-{env}.properties 형태로 만들면 된다. 예)application-local.propertiesapplication-dev.propertiesapplication-alpha.propertiesapplication-beta.propertiesapplication-real.propertiesapplication-productio..