메이븐 (Maven)에서 버전 상수를 다음과 같이 properties로 정의해서 사용한다.


<properties>

<org.springframework-version>4.0.3.RELEASE</org.springframework-version>

...

</properties>


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${org.springframework-version}</version>

</dependency>


Gradle에서는 다음과 같이 사용한다.


ext {

    springVersion='4.0.3.RELEASE'

}


dependencies {

    compile (

        [group: 'org.springframework', name: 'spring-context', version: springVersion],

        ...

    )

    ...

}


group, name, version을 합쳐서 다음과 같이 사용할 수도 있다.


compile "org.springframework:spring-context:${springVersion}"


홑 따옴표 (', single quote)가 아닌 쌍 따옴표 (", double quotes)임에 유의한다.


Reference:

http://www.gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html

Posted by izeye

메이븐 프로젝트 상속은 언제 사용될까?


다른 프로젝트의 클래스 (Class)를 참조하려면, 디펜던시 (Dependency)를 추가하면 된다.


하지만 프로젝트 설정을 상속하려면 어떻게 해야할까?


이 경우 프로젝트 상속이 사용된다.


Reference:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html

Posted by izeye

Gradle에 메이븐 (Maven) 레파지토리 (Repository)를 다음과 같이 설정할 수 있다.


repositories {

    mavenCentral()

}


추가로 mavenLocal()을 사용할 수 있는데


이는 메이븐 로컬 (Local) 레파지토리 (.m2/repository)에 있는 경우 참조할 수 있도록 한다.


Gradle 자체적으로도 캐시 (Cache)하기 때문에 처음을 제외하면 성능적인 차이는 없다.


Gradle 자체 캐시 위치는 다음과 같다.


.gradle/caches/modules-2/files-2.1


Reference:

http://forums.gradle.org/gradle/topics/gradle_fails_to_download_dependencies_if_not_present_in_mavenlocal

Posted by izeye

메이븐 version 요소에 SNAPSHOT 문자열을 포함하면,


주기적으로 스냅샷이 최신인지 확인하고 아닌 경우 가져온다.


하지만 여기에서 말하는 주기적이 디폴트 (Default)로 빌드 (Build) 시마다는 아니고 daily이다.


repository -> snapshots -> updatePolicy 요소 값을 always로 설정해줘야 빌드 시마다 확인한다.


Reference:

http://stackoverflow.com/questions/5901378/what-exactly-is-a-maven-snapshot-and-why-do-we-need-it

Posted by izeye

Gradle에 디펜던시는 build.gradle 파일에 다음과 같이 추가할 수 있다.


dependencies {

    compile group: 'commons-collections', name: 'commons-collections', version: '3.2'

    compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.3'

    testCompile group: 'junit', name: 'junit', version: '4.+'

}


이클립스 (Eclipse)에서 메이븐 (Maven) 디펜던시를 추가하면 바로 Maven Dependencies 항목에 나타나는 것처럼


Gradle Dependencies 항목에 나타날 것을 기대했다면 당황할 수 있다.


다음과 같이 해야만 Gradel Dependencies 항목에 나타난다.


Gradle -> Refresh Dependences

Posted by izeye

Java VisualVM으로 프로파일링하기 위해 Sampler를 사용하거나, Profiler를 사용할 수 있다.


Profiler는 직접 프로파일링을 위한 코드를 넣는 방식이라 성능에 영향을 많이 주고,


JIT (Just-in-time) 컴파일 (Compilation)에도 영향을 줘서 실행 코드가 바뀔 수도 있다.


Profiler는 로컬에서만 사용할 수 있다.


Sampler는 샘플링 (Sampling)하는 방식으로 정확도가 떨어지지만, 성능에는 크게 영향을 주지 않는다.


물론 샘플링 주기 (Frequency)에 따라 다르겠지만.


Sampler는 인라인 (Inline) 코드에 대한 측정이 불가능하다.


References:

http://stackoverflow.com/questions/14626475/visualvm-and-self-time

http://stackoverflow.com/questions/8130277/why-visualvm-sampler-does-not-provide-full-information-about-cpu-load-method-ti

Posted by izeye

HttpComponent 내의 HttpClient를 직접 사용할 수 있지만, 설정이 번거롭다.


HttpComponent 내의 Fluent HC를 사용하면, 간단히 요청을 보낼 수 있다.


다음과 같이 디펜던시 (Dependency)를 추가한다.


<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>fluent-hc</artifactId>

<version>${org.apache.httpcomponents-version}</version>

</dependency>


다음과 같이 Fluent API를 사용한다.


try {

HttpResponse httpResponse = Request.Get(uri)

.addHeader("Connection", "close").execute()

.returnResponse();

int statusCode = httpResponse.getStatusLine().getStatusCode();

if (statusCode != 200) {

throw new LoadGenerationFailureException("Response code was "

+ statusCode + ".");

}

} catch (ClientProtocolException e) {

e.printStackTrace();

throw new RuntimeException(e);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException(e);

}


Reference:

http://hc.apache.org/httpcomponents-client-ga/quickstart.html

Posted by izeye

톰캣 최소, 최대 쓰레드 개수 설정은 conf/server.xml의 Connector 요소 (Element)에 한다.


최소 쓰레드 개수 설정은 minSpareThreads 속성 (Attribute)을 사용하는데 설정하지 않으면 10개이다.


최대 쓰레드 개수 설정은 maxThreads 속성을 사용하는데 설정하지 않으면 200개이다.


Reference:

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html

Posted by izeye

톰캣 성능 테스트 (Performance Test) 중에 TIME_WAIT이 많이 발생하여


close 시 RST 패킷을 보내도록 SO_LINGER 값을 0으로 설정하는 방법을 찾아보니 다음과 같았다.


    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" connectionLinger="0"/>


권장하는 방법은 아니지만 달리 대안을 찾지 못했다.


어떤 부작용 (Side Effect)이 있으려나?


참고로 TIME_WAIT 개수는 다음과 같이 확인 가능하다.


netstat | grep TIME_WAIT | wc -l


References:

http://stackoverflow.com/questions/3757289/tcp-option-so-linger-zero-when-its-required

http://tomcat.apache.org/tomcat-6.0-doc/config/http.html


Posted by izeye

톰캣을 웹으로 배포하기 위해 conf/tomcat-users.xml에 다음과 같이 사용자를 추가한다.


<role rolename="manager-gui"/>

<user username="izeye" password="1234" roles="manager-gui"/>


http://localhost:8080/manager 페이지를 연다.


애플리케이션 (Application)이 이미 배포된 상태라면,


Applications에서 해당 애플리케이션의 Undeploy 버튼을 누른다.


WAR file to deploy에서 파일 선택 후 Deploy 버튼을 누른다.

Posted by izeye