본문 바로가기

Java

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..
SpringBoot JSP를 Jar에 넣기 Jar에 JSP를 넣기 SpringBoot에서 기본 View는 타임리프타임리프는 src/main/resources/templates에 만들면 특별한 설정없이 자동으로 View를 찾음 JSP는 jar로 묶을 때 src/main/webapp/WEB-INF/jsp에 위치하다보니 jar에 포함되지 않았음 해결 방법은?src/main/resources/META-INF/resources/WEB-INF/jsp에 JSP파일을 두면 jar에 포함되고 view도 잘 찾는다. 참고 - http://hillert.blogspot.kr/2016/03/spring-boot-with-jsp-in-executable-jar.html
SpringBoot JSP View 설정하기 JSP의 위치 src/main/webapp/WEB-INF/jsp 기존 SpringBoot는 src/main/resources/teamplates에 타임리프가 들어가면 간단하게 조회된다. 그렇다면 JSP는 위치가 다른데 어떻게? 1. gradle, maven이면 디펜던시를 추가해야한다. gradle의 경우compile("javax.servlet:jstl")compile("org.apache.tomcat.embed:tomcat-embed-jasper")- 필요하다면 버전을 추가한다, 필자의 경우 springboot 플러그인으로 알아서 버전을 찾아준다. maven의 경우javax.servletjstlorg.apache.tomcat.embedtomcat-embed-jasper- maven도 마찬가지로 버전이 필..
[Encoding] Server.xml과 URIEncoding설정 개발을 하다가 자바단 코드도 이상없고, 화면 코드도 이상없는데알파 환경은 정상적으로 수행되고 로컬 환경은 검색 질의가 깨져서 나타나는 경우가 있었다. 열심히 애플리케이션 단에서 디버깅을 해봐도 답을 찾을 수 없었고..피들러도 정상적으로 데이터가 디버깅되었음. 문제는 서버단에 있었다. Tomcat의 Server.xml을 보면 커넥터 설정이 있었음.기본적으로 URIEncoding 설정이 되어 있지 않음.- 디볼트 값은 : ISO-8859-1 (https://tomcat.apache.org/tomcat-6.0-doc/config/http.html) 모든 charset이 UTF-8로 설정되어 있었기 때문에 커넥터의 인코딩을 수정할 필요가 있었음 UTF-8로 설정했더니 해결되었다! 뿌듯..