메이븐 (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

댓글을 달아 주세요