Java Optional에 대한 생각

분류없음 2018.09.04 13:12 posted by dev.bistro

모던 랭귀지 중에서 현업에서 써봤거나,  대충은 해봤던 언어는 Java Scala Groovy Kotlin Swift python go... 이중에서 Go는 원래 태생이 그래서 제외한다면 제일 구닥다리는 Java.

그 중에 Optional에 대한 사용은 항상 고민이 된다.


http://blog.joda.org/2015/08/java-se-8-optional-pragmatic-approach.html

https://stackoverflow.com/questions/31922866/why-should-java-8s-optional-not-be-used-in-arguments


1. Optional로 인스턴스 변수를 사용하지 말 것

2. null로 내부 private scope 클래스의 데이터 유무를 나타낸다. (첨언 : 자바에는 Null이 있어서 내부적으로 null이 Optional.empty를 표현할 수 있다. 이렇게 하고, 외부로 노출하는 getMethod에는 null이 아닌 empty를 보여주면 된다)

3. getter에는 사용

4. set메소드, 생성자에서는 사용하지 말 것

5. 다른 로직에서 Optional 에 따른 비즈니스 로직이 있을 때에는 사용



즉 Class 내에서 private variable로 Optional을 가지지 말라

장점으로는 

1. 이 객체는 Application 내에서 자주 사용될것이고 그 life-cycle동안 길것이다. 그에 반헤 Getter만 Optional이라면 그 라이프 사이클은 훨씬 짧아진다. GC에 대해 이로울 것이고

2. Optional 이 있다면 Serializable  할수 없다. (jackson-modules-java8도 결국엔 Optional.empty를 null로 만든다.)

3. setter나 생성자에서 Optional을 사용하는 것 자체가 경험에 비추어 유용하지 않았다. 



단점으로는 이렇게 생성되는 Class가  beans가 아니라는 것이다 (private variable + getter + setter로 이루어진) 

일부 IDE에서 문제가 발생할 수도 있으니 확인해봐야한다. 하지만 이런식으로 된다면 사용하는 쪽에서 null에

te 고민을 없앨 수 있다. 혹시나 Optional.get()을 호출하고 있다면 뭔가 이상하다고 생각할 것




TAG Java, Optional

현재 업무에서 메지시의 상태는 하나의 필드로 정의하고 있다.  예를 들어 결제 요청이 들어오면 APPROVAL_REQUESTED:type 을 정의하여 payment topic에 적재하고 이 후 저 메시지를 컨슘하여 결제가 완료된다면 '동일한 토픽에' APPROVAL_COMPLETED:type 으로 하나의 메시지를 추가한다.

즉, APPROVAL_REQUESTED 상태는 APPROVAL_COMPLETED or APPROVAL_FAILED 상태로 변경 가능하다.

각각은 Kafka에 의해 Header에 event time이 기록되어 있지만, 별개로 actBy라는 timestamp 필드도 추가하였다.  REQUESTED 상태에서 COMPLETED 상태로 변경되기까지의 시간을 어떻게 측정할 것인가?


무난한 방법으로 하나의 Streams Application을 작성할 수도 있고, KSQL을 통해서 볼 수도 있다. 또는 COMPLTED 메시지가 기록될 때 프로그램적으로 기록 할수도 있고... 내가 선택한 방법은 기존에 모니터링을 위해 사용중인 logstash의 plugin 이다.


https://www.elastic.co/guide/en/logstash/current/plugins-filters-elapsed.html

하나의 필드를 기준으로 2개의 message 사이이 시간을 측정해서 소요시간을 측정하는 것이다.

2번째 메시지에 elapsed_time 필드를 add_field 줄수도 있고, 원본 이벤트는 그대로 나둔채 하나의 추가 이벤트를 발행해서 elasticsearch에 기록 할 수 있다. (이 경우에는 elapsed_match 라는 tag를 가진 document이다) 이 설정은 new_event_on_match 를 통해서 설정 가능하다.


개인적으로 셋팅한 내용은 아래와 같다.

   elapsed {

      start_tag => "APPROVAL_REQUESTED"

      end_tag => "APPROVAL_COMPLETED"

      unique_id_field => "id"

      timeout => 10

      new_event_on_match => false

    }


기준이 되는 필드는 'id' 이고  동일한 ID를 가진 이벤트의 APPROVAL_REQUESTED,  APPROVAL_COMPLETED 사이의 시간을  APPROVAL_COMPLETED tag를 가지는 메시지에 elapsed_time 필드로 기록 해준다. 만약 10초 이내에  동일한 id를 가지는 APPROVAL_COMPLETED 메시지를 수신하지 못한다면 elapsed_expired_error 태그를 가지는 메시지를 발행한다.


이를 통해서 손쉽게 


1카프카 주문 메시지 발행 - 2컨슘 - 3Remote API호출 - 4주문 요청 결과 메시지 발행  

1~4단계의 소요 시간을 측정 할 수 있다.



(물론 이것은 카프카 메시지 간의 소요시간이지, 그 외 측정구간은 또 다른 방법을 이용 했다)

npm -g 인스톨 폴더 변경

분류없음 2018.07.27 16:04 posted by dev.bistro


사내 시스템은 특정 계정으로만 관리된다. 이 계정의 home directory 에 npm package를 설치 하는 방법이다.


1. .bashrc 설정

NPM_PACKAGES="$HOME/.npm-packages"
PATH="$NPM_PACKAGES/bin:$PATH"
unset MANPATH
MANPATH="$NPM_PACKAGES/share/man:$(manpath)"
NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"

2. 커맨드라인에서 다음의 명령을 수행

$) mkdir -p "$NPM_PACKAGES"
$) echo "prefix = $NPM_PACKAGES" >> ~/.npmrc

참고1. https://stackoverflow.com/questions/10081293/install-npm-into-home-directory-with-distribution-nodejs-package-ubuntu

참고2. https://github.com/sindresorhus/guides/blob/master/npm-global-without-sudo.md



티스토리 툴바