반응형

Java NanoTime To Seconds


보통 특정 메서드를 실행하거나 로직을 수행할 때 시간이 얼마나 걸리는지 측정(성능측정)하기 위해서 nanotime을 자주사용한다.

long start = System.nanoTime();


하지만 나노타임(nanotime)은 우리가 보고 판단하기에는 너무 어렵다...초로 바꿔보자...


자바에서 nanotime을 second(초)로 변환하는 방법은 두 가지이다.


1. TimeUnit.SECONDS.convert(nanotime, TimeUnit.NANOSECONDS을 이용하는 방법


이 방법은 진짜 딱 초단위 까지만 나오게 된다. 11.035초의 시간이 걸렸더라도 딱 11초만 표기된다.


2.((double) nanotime) / 1000000000; 을 사용하는 방법


이 방법은 11.33599 형태로 double형 단위에 맞는 초단위로 표기된다.



반응형
반응형


maven으로 빌드시 정상적으로 동작하지 않는 test케이스들로 인해 실패하는 경우가 많다.


테스트케이스를 작성한지 오래됬거나 변경된 정보들로 인해 성공못하는 경우가 빈번하다.


물론 가장 좋은 케이스는 테스트케이스들도 같이 꾸준히 관리를 해주는 것이지만


그게 쉬운일이던가???....


무튼 이런 경우 보통 jenkins 등 ci 툴에서도 빌드시 skip test 명령어를 명시적으로 넣어주곤 한다.


방법은 세 가지다.


첫 번째, 메이븐 빌드 실행 커맨드 라인에 다음과 같이 실행


package -Dmaven.test.skip=true


두 번째, 메이븐 빌드 실행 커맨드 라인에 다음과 같이 실행

package -DskipTests


세 번째, 커맨드 라인에 명령어를 명시적으로 주어서 사용하고 싶지 않은 경우 (pom.xml plugin 추가)

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <skipTests>true</skipTests>
  </configuration>
</plugin>


위와 같이 세 가지 방법으로 사용할 수 있고 나의 경우는 두 번째 방법을 스프링 부트내에서 자주 사용해 packing하곤 한다.





반응형

'Programming > Maven' 카테고리의 다른 글

리눅스 환경에서 mave으로 빌드하기(mvn package)  (1) 2018.05.09
MAVEN과 ANT 비교  (0) 2017.05.10
반응형


웹 작업을 할 때 jsp내의 문구라던지 구조를 변경하고 확인해야하는데 실시간으로 반영이 안되면 무척이나 성가시지요...


빌드다시해줘야하고.....시간은 시간대로 잡아먹고...


SpringBoot를 쓰고 계신다면 application.properties에 다음과 같이 추가해 주세요.


server.jsp-servlet.init-parameters.development=true


추가 이후에는 어플리케이션 재시작 없이 바로 웹에 반영되는 것을 확인할수 있다.

반응형
반응형


다른 도메인 내부에 쿠키 생성하기 (이게 가능해???)


최근 쿠키매칭시스템 설계를 위해 광고 프로세스 전반에 대한 내용을 학습중 우리 도메인 쿠키 내부에 


다른 도메인 쿠키값들이 박혀있는 걸 발견하였다.


뭐야 이거 어떻게 박는거야? 크로스도메인 이슈 때문에 당연히 안될거라고 생각했었는데 심지어 여러 도메인들 쿠키값들이 박혀있었다....


위의 캡쳐화면을 보면 cloud.toast.com 페이지에 들어갔는데 toast.com쿠키 내부를 보면 .toast.com말고도 여러 도메인들의 


쿠키값들이 설정되어있는 것을 보았다.


어떻게 이게 가능하단 말인가????


근데 가능하다는거....실제로 구현을 해보고서도 좀 신기하긴했다...




방법은 다음과 같다. 


해당 페이지의 html에 다른 도메인을 호출하는 호출하는 태그를 심는다. 이 때 태그는 <img>, <a> 태그가 가능하다.


다음을 보자.


local.media.com(내가 호스트에 등록해 띄운 페이지) 도메인의 페이지 내부에는 다음과 같은 태그를 박았다.


이렇게 박았을 경우 페이지가 렌더링되는 시점에 해당 도메인의 서버에 요청이 가게 된다.


요청을 받은 해당 도메인의 서버에서 요청을 받아 내부에서 쿠키를 생성하면 다른 도메인 쿠키 내부에 본인들의 쿠키값을 설정할 수 있는 것이다.


local.toast.com:8082/dsp/request 컨트롤러에서 요청을 쿠키를 만들어주게 되면




내가 생성한 쿠키 값이 박히는걸 볼 수 있다.


만약 다른 도메인의 iframe을 박아 렌더링 하게 된다면 해당 도메인의 쿠키가 하나 더 생기게 된다.


iframe으로 local.doubleclick.com:8080/adx/request를 요청해보자


이번에는 local.media.com쿠키 내부에 값이 생성되는게 아니고 별도의 local.doubleclick.com쿠키가 생성된 것을 볼 수 있다.


물론 어떻게 쿠키를 심든간에 httpServletRequest로 request를 받아 cookie를 얻어오게되도 본인 


서브도메인에 일치하는 쿠키값만 받아올 수 있다!!!(당연당연)


반응형
반응형

스프링부트(Springboot) 사용시 java.lang.IllegalArgumentException: An invalid domain Error 해결하기


스프링에서 쿠키에 setDomain을 할 경우 현재 서버의 도메인 및 상위 도메인 외에 다른 도메인을 셋팅하게 되면 에러가 발생한다.


서버 도메인이 test.com인데 다음과 같이 쿠키에 setDomain을 하게되면


cookie.setDomain(".toast.com");


다음과 같은 에러가 발생한다.


java.lang.IllegalArgumentException: An invalid domain [.toast.com] was specified for this cookie

at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:183)

at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:125)

at org.apache.catalina.connector.Response.generateCookieString(Response.java:989)

at org.apache.catalina.connector.Response.addCookie(Response.java:937)

at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)

at com.nhnent.demonaid.cms.CookieMatchingServiceController.getAdRequestFromMedia(CookieMatchingServiceController.java:80)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220)

.

.

.



[ 원인 ] 


tomcat8 버전 이상에서는 Cookie Header를 파싱하는 기본 CookieProcessor가 RFC6265를 기반으로 하고 다음과 같은 속성을 같는다.

5.2.3.  The Domain Attribute

   If the attribute-name case-insensitively matches the string "Domain",
   the user agent MUST process the cookie-av as follows.

   If the attribute-value is empty, the behavior is undefined.  However,
   the user agent SHOULD ignore the cookie-av entirely.

   If the first character of the attribute-value string is %x2E ("."):

      Let cookie-domain be the attribute-value without the leading %x2E
      (".") character.

   Otherwise:

      Let cookie-domain be the entire attribute-value.

   Convert the cookie-domain to lower case.

   Append an attribute to the cookie-attribute-list with an attribute-
   name of Domain and an attribute-value of cookie-domain.


Domain값 맨 앞자리에 "."을 붙일 경우 "."을 제거하고 파싱하게 된다.


[ 해결 ]

SpringBoot를 사용하고 있는 경우(Embedded Tomcat) 다음과 같은 설정을 해주면 된다. 스프링부트 자바 config클래스에 넣어주면 된다.




[ reference ]

https://jistol.github.io/java/2017/08/30/tomcat8-invalid-domain/

http://hyunc87.tistory.com/34

반응형
반응형

[ MAC ] mac에 nvm, npm, bower설치하기


웹 패키지 관리를 위해 bower를 설치해볼까 했더니 npm(Node Package Modules)으로 설치하는게 가장 간단해 보여 nvm(Node Version Manager)과 npm을 먼저 깔고 npm으로 설치해보았다.


1. nvm설치 

> curl https://raw.githubusercontent.com/creationix/nvm/v0.30.2/install.sh | bash

명령을 실행하니 "Profile not found" 가 뜨며 정상적으로 설치되지 않았다.

보아하니 경로를 지정할 profile파일이 필요한데 로컬환경에 해당 파일이 없어서 정상적으로 설치가 되지 않았다.


그래서 vi로 ~/.bash_profile을 하나 만든 후 다시 시도


> nvm --version을 해보면 정상적으로 설치되었는지 확인할 수 있다.




2. npm 설치

nvm이 설치되었다면 다음 명령으로 손쉽게 npm을 설치할 수 있다.

nvm install stable


설치가 정상적으로 되었는지 확인하려면 "npm -v"명령을 내려보자


정상적으로 설치된 것을 확인할 수 있다.


3. bower설치 

npm까지 설치가 완료되었다면 bower도 손쉽게 설치가 가능하다.


> npm install -g bower 

로 설치하면 된다.



bower는 프론트 개발에 필요한 라이브러리들을 손쉽게 관리해주는 패키지 관리도구라고 생각하면 이해하기 편하다(마치 백엔드의 maven, gradle과 같은).


아직 사용하는데 익숙하지는 않지만 손쉽게 프론트엔드 라이브러리들을 관리해주는 유용한 도구인만큼 자주사용해보도록 해야겠다.


반응형
반응형


스프링프로젝트에서 디버깅 모드를 실행하려고 했는데 다음과 같은 에러가 발생했다.


ERROR: transport error 202: gethostbyname: unknown host

ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)

JDWP exit error AGENT_ERROR_TRANSPORT_INIT(197): No transports initialized [debugInit.c:750]



일단 이런문제가 발생한다면 host파일을 체크해보도록 하자.



host파일에 로컬호스트가 주석처리되어 있다면 다음과 같은 문제가 발생할 수 있다.


확인해본 결과 역시나 '127.0.0.1 localhost' 에 주석처리가 되어있었다.


주석을 풀고 다시 실행시키면 정상작동한다!


반응형
반응형

안만져본 툴들에서 기본적으로 데이터를 내가 원하는 방식으로 select해오는 것도 쉽지 않구나...


정리가 잘되있는것 같아서 공유


1. [ 엘라스틱서치 쿼리 DSL 기초 ]

https://bakyeono.net/post/2016-08-20-elasticsearch-querydsl-basic.html



2.  [ 엘라스틱서치 검색을 해보자 ] 

https://iju707.gitbooks.io/elasticsearch/content/_executing_searches.html



! 위의 문서에서는 GET 방식으로 조회하였으나, curl에서 GET의 Body를 지원하지만 실제 REST/HTTP 스펙상 GET은


Body를 사용하지 않는 것이 많기 때문에 POST로 사용할 것을 권장한다.




반응형
반응형


파이썬 스크립트로 간단히 api를 만들어 사용하고자 스크립트 작성 후 실행시켰더니 다음과 같은 문제가 발생했다.


ImportError: No module named requests


문제는 api요청을 위해 'import requests'를 하는데 request module을 import하는 부분에서 발생하였다.


import requests 
URL = ‘http://google.com'
response = requests.get(URL) 

response.status_code response.text



해당 모듈이 설치되어 있지 않아서 문제가 발생하는 것이다.


그래서 'pip install requests'를 때려줬는데 mac에 pip도 설치가 되어있지않은 걸 발견~pip부터 설치 후 설치해 주었다.


[ mac에 pip설치 및 requests 모듈 설치 ]

> sudo easy_install pip

설치 후 

> pip 

로 확인 후 requests 모듈 설치

> sudo pip install requests



성공적으로 설치되고 나서 다시 실행하니 성공적으로 api요청을 할 수 있었다 :)





반응형

+ Recent posts