'분류 전체보기'에 해당되는 글 1583건

  1. 2022.01.24 [Gradle] configurations 를 이용한 log4j dependency 반영
  2. 2022.01.06 [GIT] branch/tag 운영 전략.
  3. 2021.12.30 [Elasticsearch] TotalHits.Relation 알아보기.
  4. 2021.12.30 [Bash] jq -r raw output (no quote)
  5. 2021.12.07 [Nginx] 설치 하기.
  6. 2021.12.07 [Elasticsearch] LLRC + Springboot 성능 튜닝 팁
  7. 2021.11.30 [Spring] bean name conflict resolve.
  8. 2021.11.30 [Spring] @Autowired vs @RequiredArgsConstructor
  9. 2021.11.29 [MySQL] group_concat 사용 시 순서 지정.
  10. 2021.11.25 [Java] Snake to Camel 변환

[Gradle] configurations 를 이용한 log4j dependency 반영

ITWeb/개발일반 2022. 1. 24. 11:40

최근에 발생한 log4j 보안 이슈로 인해서 patch 작업이 필요 했었는데요.

build.gradle 에서 configurations 를 이용해서 쉽게 적용 할 수 있는 방법인데 기억하기 위해 이것도 기록해 봅니다.

 

관련 보안 내용은 아래 링크 참고 하시면 됩니다.

Log4j – Apache Log4j Security Vulnerabilities

 

Log4j – Apache Log4j Security Vulnerabilities

<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apa

logging.apache.org

build.gradle)

configuration {
  all {
  	resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    	if ( details.requested.group == 'org.apache.logging.log4j' ) {
        	details.useVersion '2.17.1'
        }
    }
  }
  
  compileOnly {
    extendsFrom annotationProccessor
  }
}

 

:

[GIT] branch/tag 운영 전략.

ITWeb/개발일반 2022. 1. 6. 12:12

브랜치로 운영 할 지 태그로 운영 할 지 결정해서 사용 하시면 됩니다.

태그의 경우는 수정이 안되기 때문에 배포 전략으로는 적합해 보입니다.

 

간단하게 branch/tag 운영 전략으로 Step 정리만 기록 합니다.

 

Step 1)

master 에서 dev 브랜치 생성

 

Step 2)

dev 브랜치로 dev, qa 환경까지 기능 테스트

 

Step 3)

qa 환경까지 검증이 완료 되었다면,

master 에서 merge 브랜치 생성

 

Step 4)

merge 브랜치에 dev 브랜치 머지

 

Step 5)

merge 브랜치를 qa에 배포

 

Step 6)

qa 배포 후 문제 없을 경우,

 

Step 7)

merge 브랜치를 master 로 머지

 

Step 8)

master 브랜치에서 release branch or tag 를 생성

 

Step 9)

release branch or tag 로 prod 배포

merge, dev 브랜치 삭제

 

브랜치 생성 및 삭제)

$ git checkout -b 브랜치명

$ git push origin 브랜치명

 

$ git branch -d 브랜치명

$ git push origin --delete 브랜치명

 

태그 생성 및 삭제)

$ git tag 태그명

$ git push origin 태그명

 

$ git tag -d 태그명

$ git push origin :태그명

 

 

:

[Elasticsearch] TotalHits.Relation 알아보기.

Elastic/Elasticsearch 2021. 12. 30. 16:45

Elasticsearch 에서 질의 후 매칭된 문서의 수를 알아 내는 방법은 두 가지가 있습니다.

 

1. track_total_hits

2. _count API

 

여기서 WAS 의 에러로그 발생에 대한 알람을 구성 할 경우 어떤걸 사용 하면 좋을까요?

 

1. track_total_hits

false

true

numeric

이와 같이 값을 설정 할 수 있는데요.

false 이면 total hits 값을 구할 수 없습니다.

true 이면 total hits 값을 구할 수 있습니다.

특정 값을 넣게 되면 그 값 보다 작거나, 같은 값을 구할 수 있으며, relation 을 통해서 실제 매칭 문서의 규모를 파악 할 수 있습니다.

 

2. _count API

기본적으로 non-scoring API 이며, 어떤 데이터도 요청 하지 않기 때문에 빠릅니다.

 

Lucene Core 에 TotalHits.Relation 이 들어 있습니다.

  public enum Relation {
    /**
     * The total hit count is equal to {@link TotalHits#value}.
     */
    EQUAL_TO,
    /**
     * The total hit count is greater than or equal to {@link TotalHits#value}.
     */
    GREATER_THAN_OR_EQUAL_TO
  }

보시는 것 처럼 eq 아니면 gte 가 리턴 됩니다.

그래서 특정 수치 이상을 점검 하기 위해서는 relation:gte 로 조건을 잡으셔야 합니다.

 

그냥 위에서 처럼 1,2 번을 놓고 보면 _count API 를 사용하는게 일반적입니다.

그러나 대상 문서의 규모가 넓고 많을 경우 track_total_hits 에 특정 임계 값을 넣어서 질의 하는게 더 빠를 수 있습니다.

 

:

[Bash] jq -r raw output (no quote)

ITWeb/개발일반 2021. 12. 30. 16:25

이런 것도 기억력 도움을 위해서 그냥 한 줄 남겨 봅니다.

 

$ jq .hits.total.relation 하면 

Output)

"eq"

이렇게 나오는데 저는 저 quotation 이 싫습니다.

 

그래서 아래 옵션 주고 하시면 됩니다.

 

$ jq -r .hits.total.relation

Output)

eq

 

:

[Nginx] 설치 하기.

ITWeb/개발일반 2021. 12. 7. 09:28

docker 를 이용해서 쉽게 구성이 가능 하지만 소스 내려 받아서 빌드 해서 설치 하는 것도 필요해서 정리해 봅니다.

필요한 모듈은 추가적으로 구성이 가능 하니까 필요에 따라 설치 하세요.

 

- 사전 준비 환경

$ wget https://nginx.org/download/nginx-1.20.2.tar.gz
$ wget http://zlib.net/zlib-1.2.11.tar.gz
$ wget --no-check-certificate http://www.openssl.org/source/openssl-1.1.1l.tar.gz
$ wget --no-check-certificate http://www.openssl.org/source/openssl-3.0.0.tar.gz
$ wget https://github.com/openresty/headers-more-nginx-module/archive/refs/tags/v0.33.tar.gz
$ wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.1.18.tar.gz


- 설치 인스턴스 전송

$ scp nginx-1.20.2.tar.gz $TARGET:/home/user/download/
$ scp zlib-1.2.11.tar.gz $TARGET:/home/user/download/
$ scp openssl-1.1.1l.tar.gz $TARGET:/home/user/download/
$ scp openssl-3.0.0.tar.gz $TARGET:/home/user/download/
$ scp v0.33.tar.gz $TARGET:/home/user/download/headers-more-nginx-module-0.33.tar.gz
$ scp v0.1.18.tar.gz $TARGET:/home/user/download/nginx-module-vts-0.1.18


- 설치 인스턴스에서 실행

$ yum install gcc gcc-c++
$ mkdir /home/user/apps/nginx
$ cd download
$ tar -xvzf nginx-1.20.2.tar.gz
$ tar -xvzf zlib-1.2.11.tar.gz
$ tar -xvzf openssl-1.1.1l.tar.gz
$ tar -xvzf openssl-3.0.0.tar.gz
$ tar -xvzf headers-more-nginx-module-0.33.tar.gz
$ tar -xvzf nginx-module-vts-0.1.18.tar.gz

$ cd nginx-1.20.2
$ ./configure --prefix=/home/user/apps/nginx --with-http_stub_status_module 
--with-http_ssl_module --with-http_v2_module --with-http_secure_link_module 
--with-http_realip_module --with-stream --with-mail --with-mail_ssl_module 
--with-openssl-opt=enable-tlsext --with-openssl=/home/user/download/openssl-1.1.1l 
--add-module=/home/user/download/headers-more-nginx-module-0.33 
--add-module=/home/user/download/nginx-module-vts-0.1.18
$ make
에러발생
***** Unsupported options: enable-tlsext
이 에러는 삭제된 옵션 이기 때문에 발생 합니다. (openssl 0.9.8j 이후 부터는 기본 활성화 되어 있습니다.)

$ ./configure --prefix=/home/user/apps/nginx --with-http_stub_status_module 
--with-http_ssl_module --with-http_v2_module --with-http_secure_link_module 
--with-http_realip_module --with-stream --with-mail --with-mail_ssl_module 
--with-openssl=/home/user/download/openssl-1.1.1l 
--add-module=/home/user/download/headers-more-nginx-module-0.33 
--add-module=/home/user/download/nginx-module-vts-0.1.18
$ make
$ make install

 

:

[Elasticsearch] LLRC + Springboot 성능 튜닝 팁

Elastic/Elasticsearch 2021. 12. 7. 09:14

대부분의 성능 이슈는 서버 엔진 보다는 클라이언트 단에서 사용을 잘 못 하는 경우가 많이 있습니다.

 

Low Level Rest Client 와 Springboot 조합으로 API 개발 시 튜닝 요소를 조금 정리 합니다.

나중에 또 기억 못할 것 같으니...

 

RestClientBuilder 에 보면 아래와 같이 기본 설정이 되어 있습니다.

public static final int DEFAULT_MAX_CONN_PER_ROUTE = 10;
public static final int DEFAULT_MAX_CONN_TOTAL = 30;

이 기본 값으로 그냥 사용하게 되면 너무 리소스를 제한적으로 사용하기 때문에 성능이 제대로 나오지 않게 됩니다.

해당 값을 적절하게 튜닝을 하셔야 하는데 모든 케이스에 다 적용 가능한 부분은 아니지만 그래도 가늠 할 수 있는 기준 정도로는 사용이 가능 할 것 같아 공유 합니다.

분석 결과는 Core 1 개당 setMaxConnPerRoute 설정 시 25 개씩이 최적 값으로 보입니다.
4 core 짜리면 4 x 25 = setMaxConnPerRoute(100)

 

아래는 실제 코드 내부에 작성 되어 있는 코멘트를 보여 드리기 위해 캡쳐 했습니다.

HttpAsyncClientBuilder httpClientBuilder = HttpAsyncClientBuilder.create().setDefaultRequestConfig(requestConfigBuilder.build())
  //default settings for connection pooling may be too constraining
  .setMaxConnPerRoute(DEFAULT_MAX_CONN_PER_ROUTE).setMaxConnTotal(DEFAULT_MAX_CONN_TOTAL)

 

코드에서도 동일하게 기본 설정은 너무 제한적일 수 있다고 되어 있습니다.

 

Embedded Tomcat 에서의 기본 Max Connection 은 8192 개 입니다.

Tomcat 과 HttpClient 그리고 Elasitcsearch 에 대한 각각의 Connection, Thread Count 를 잘 조정 하셔야 성능을 최적화 할 수 있습니다.

 

추가적으로 Connection 과 Route 의 비율은 10:1 정도가 적절해 보입니다.

 

아래는 Tomcat 기본 설정 내용입니다.

- Embedded Tocmat 의 설정 중
    acceptCount 는 기본 100 개 이며 이 설정은 maxConnection 에 다다랐을 때 OS 레벨에서 큐잉 하게 되는 값 입니다.
    maxConnections 는 기본 8192 개 이며 NIO/NIO2 를 사용 하며, -1 로 설정 시 카운팅 하지 않습니다. (unlimited)
    maxThreads 는 기본 200 개 이며 connection 당 생성 가능한 최대 thread 수 입니다.
    BIO 일 경우 maxConnections 와 maxThreads 값은 같아야 합니다.


정답은 없으나 시스템 리소스 상황에 맞춰서 최적 값을 찾아 내는게 제일 중요 합니다.
위에 설정 방식이나 값이 최적 값이 아니며 상황에 맞춘 최적 값이고 다른 환경에서는 튜닝 포인트가 된다고 보는게 좋을 것 같습니다.

시스템의 ulimit 설정을 꼭 확인 하고 사용하는 stack 의 default 값도 꼭 확인 하고 사용 합시다.

성능 최적화를 위해 함께 살펴 봐야 하는 소스 코드는 

Java NIO, Executor
Tomcat Connector
Http Client (Components)
Elasticsearch RestClient

 

:

[Spring] bean name conflict resolve.

ITWeb/개발일반 2021. 11. 30. 12:17

간단하게는 명시적으로 선언을 해주시면 됩니다.

 

서로 다른 패키지에 같은 이름의 class 가 존재 할 경우 발생 할 수 있습니다.

이런 경우 아래와 같이 선언해 주시면 됩니다.

 

@RestController("cat.RestHealthController")

@Service("cat.service.HealthService")

 

@RestController("cluster.RestHealthController")

@Service("cluster.service.HealthService")

 

:

[Spring] @Autowired vs @RequiredArgsConstructor

ITWeb/개발일반 2021. 11. 30. 10:36

Spring DI 선언에 사용 합니다.

 

[Spring Autowired Annotation]

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html

 

[Lombok RequiredArgsConstructor Annotation]

https://projectlombok.org/api/lombok/RequiredArgsConstructor.html

 

:

[MySQL] group_concat 사용 시 순서 지정.

ITWeb/개발일반 2021. 11. 29. 18:28

참고문서)

https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat

 

group by 를 이용해서 특정 컬럼의 value 를 concat 할 경우 해당 테이블의 특정 컬럼으로 순서를 맞춰 줘야 할 경우가 있습니다.

group_concat 함수 내부에 order by 를 이용해서 적용 하시면 됩니다.

 

이렇게 하지 않았을 경우 순서에 대해 보장이 된다고 간혹 착각 할 수 있느데 주의 해서 사용하시기 바랍니다.

 

:

[Java] Snake to Camel 변환

ITWeb/개발일반 2021. 11. 25. 16:46

query parameter 로 넘어온 변수가 snake 로 작성 되어 있어서 이걸 camel 로 받도록 해주고 싶을 때 사용 하면 됩니다.

 

- jackson-databind 패키지에 포함 되어 있습니다.

- domain, model 클래스에 아래와 같이 선언 합니다.

// GET /_cluster/settings?flat_settings=true&master_timeout=30s


@Data
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class SettingsModel {
	private String flatSettings;
    private String masterTimeout;
}

참고용으로 기록 합니다.

 

: