[도서] RxJava를 활용한 리액티브 프로그래밍

왜?

보통은 개발을 하다가 필요하다고 생각되는 기능을 검색하거나
기술블로그를 보면서 재밌어 보이거나 필요해 보이는 것들을 찾아서 공부하는데
RxJava는 별로 필요성이 안 느껴져서 관심을 갖지 않았다.

그냥 Reactive 프로그래밍을 가능하게 해주는 프레임워크?로
GUI프로그래밍 할 때나 사용하겠지 … 하고 말았었다.
개인적으로는 웹개발을 하면서는 쓰레드나 Callback 지옥을 경험해본 일이 없어서..
여러 시스템에 연동하는 복잡한 서비스를 만드는 경우에는 사용하면 좋으려나

— 좀 다른 얘기지만 저번에 어느 회사 면접볼 때 Observer Pattern 얘기가 나왔을 때 눈똥그래져서 물어보시던데.. RxJava를 아는지 체크 해 본려고 했던건가

키워드 및 요약정보

자바와 안드로이드를 위한 리액티브 프로그래밍 구현체
함수형 프로그래밍의 영향
비동기 이벤트 기반 프로그램 – 스트림 방식
서버에도 적용

Rx(ReactiveExtension) 함수형프로그래밍에 영향을 받았지만 FRP(Functinoal Reactive Programming)은 아니다.
Observable/Observer<T>
Producer
Subscription/Subscriber<T>


포기.. 무슨 클래스 메서드 하나하나 다 설명을 해놨는데
안그래도 텍스트로 소스보면 몇배나 더 걸리는데 하나하나 보려면 한달은 걸리겠다.
그래서
1~2단원 앞쪽 개념설명과 인덱스만 훑어보고 넘어간다.
중요한 부분만 뽑아서 보고싶은데 편집이 불친절해서 골라먹기도 힘들게 돼 있다.
아예 필요없는 책이라고는 못하겠는데 좀 어려운 것 같다.
RxJava Getting Started같은 문서나 보고 그냥 쓰다가
필요성이 느껴질 때 다시 봐야겠다.

Docker Volume 중첩해서 셋팅하는 경우 발생하는 문제 확인

초기 디렉토리 구조 생성

➜  $ tree
 .
 ├── test1
 │   ├── test1
 └── test2
     └── test2
$ cat test1/test1
test1 file
$ cat test2/test2
test2 file

도커에서 볼륨을 셋팅하고 실행

$ docker run --rm -it \
-v $(pwd)/test1:/test \
-v $(pwd)/test2:/test/kkk \
-v $(pwd)/test2/test2:/test/test2file \
-v $(pwd)/test1/test1:/test/test1file \
-v $(pwd)/test2:/test/kkk1 \
alpine sh

도커 실행 후 HOST에서 봤을 때 변경된 파일구조

$ tree
 .
 ├── test1
 │   ├── kkk
 │   ├── kkk1
 │   ├── test1
 │   ├── test1file
 │   └── test2file
 └── test2
     └── test2

도커 실행 후 Container 내부에서 변경된 파일구조

# tree
 .
 ├── kkk
 │   └── test2
 ├── kkk1
 │   └── test2
 ├── test1
 ├── test1file
 └── test2file

volume 마운트 시켰는데 파일이 복사돼버림

중복된 마운트를 할 경우 생각과 다르게 동작할 가능성

마이크로서비스 아키텍처 구축 대용량 시스템의 효율적인 분산 설계 기법, 한빛미디어

몇달쯤 전에 처음 볼 때는 뭐 당연한걸 책으로 써놨네~ 하면서 대충 훑어보고 말았는데
최근 MSA 관련 작업을 하면서 다시 보게 됐다.

다시 보니까 전에 못 보던 부분도 보이고 전체적인 흐름도 잘 정리되서 좋았다.

MSA 관련기술

DevOps 관련 플로우

  • 빌드시 유닛테스트
  • CI/CD
    • pull request 하면서 유닛테스트
    • 통과시 container build
      – 이미지에 로깅 툴을 넣어서배포
    • stg(staging) 배포
  • 통합테스트(수동?또는자동)
  • prd(production) 배포

예전에 제대로 모르고 넘어간 요소들

API GW(zuul), CircuitBreaker(hystrix), ServiceDiscovery(eureka), ClientLoadbalancer(ribbon)

넷플릭스쪽이 관련 인프라가 잘 돼 있어서 spring쪽 개발자는 그걸 참고하면 편하다.

MSA적용실패사례 – MSA vs Monolith

예전에 O2O 서비스를 만들 때도 SOA를 시도했다가 실패했는데
모놀리스형태로 만들어야 할 규모의 서비스를 무리하게 분할한게 원인이었다.

처음에 사용자별로 서비스를 나눈 것 까지는 좋았다.

  • 사용자ROLE별로 구분된 웹서버
    • 일반사용자
    • 관리자
    • 사장님
  • 인증서버
  • APP api서버

그런데 여기서 일부 기능을 떼서 서비스 지역정보, 메일문자전송, 다국어관리, … 이렇게 넣다보니 일이 너무 많아졌다.

DevOps도 처음 적용해서 여기저기 오류 터지는데 서비스 개발까지 하려니 죽어났다.

MSA 적용 실패요인

인력부족, 기술부족, 자금부족

MSA를 제대로 이해하고 있고 관련기술을 구성할만한 사람이 있어야된다.
연구하면서 진행하려면 서비스 개발 이외에 최소 서너명이 더 있어야 하지 않을까

서비스 변화

MSA는 서비스 목표가 확실해진 이후에 해야되는 것 같다. 전체적인 서비스 구조는 고정 되어 있고 기능을 추가하기 좋다는거지 서비스의 큰 흐름이 변하는 경우에는 절대로 쓰면 안된다.

초기 스타트업은 서비스 하다가 버리고 다시 시작하기도 하고 메인 기능이 막 바뀌고 추가되고 하니까 MSA에 적합하지 않다.

~

개발자라면 한번쯤 보는게 좋을 것 같다.

요즘 대부분 서비스가 MSA화 되어가고 있고 이정도 속도면 10년안에 국가프로젝트도 MSA적용이 일반화될 것 같으니까

자바9 모듈프로그래밍, 한빛미디어

자바9의 모듈화(jigsaw) 개념을 중심만 다뤘다.

간단하다
소스루트에다가 module-info.java파일을 생성해서
module{}을 정의하고
requires, exports.. 외 몇가지 구문으로 정의하는것.

typescript같은 언어에서 export 선언한 것만 접근할 수 있는것처럼

 

이 책의 내용은 이게 전부다. 모듈화에만 집중해놔서
자세한 정보는 : http://openjdk.java.net/projects/jigsaw/quick-start

실전적용

라이브러리 개발의 경우에는 캡슐화에 신경쓰려면 세부적인 설정을 해야겠지만
일반적인 서비스모듈 개발에는 현재와 별 차이는 없을 것 같다.
maven/gradle에서 좀 더 신경쓸게 생기겠지만

gradle의 한개 모듈마다 module-info.java를 한개씩 갖게 된다.
jar파일 한개당 한개의 module이라고 생각하면 된다.

기타 책들

가장 빨리 만나는 코어 자바9: 자바9으로 배우는 모던 자바, 길벗
도 같이 봤는데.. 이건 두꺼우면서 쓸데없는 내용이 잔뜩 있고
막상 중요한 부분은 짧게 설명이 돼 있어서 제대로 보지 않았다.

자바9에서 변하는 점

구조적으로 큰 변화인지는 모르겠지만 개발하는 입장에서는 코드상에 큰 변화는 없다.

gradle에 mysql.jar을 가져와서 ide에서는 com.mysql.Driver이 검색되는데 프로젝트에서는 빨간불이 뜨는 상황은 좀 더 자주 보게 되겠지만.

어차피 지금도 gradle 모듈로 프로젝트 나눠서 개발하는 사람은 거의 변화를 못 느끼지 않을까

~

어차피 금방 보니까 한번 보면 좋지 않을까

혹시 다른내용이 있나 싶어서 꼼꼼히 읽다가 몇시간 지났는데 별거 없으니 그냥 훑어보면 될 것 같다. 아니 그냥 공식도큐먼트랑 블로그만 몇 개 봐도 되려나

Kotlin in Action : 코틀린 컴파일러 개발자가 직접 알려주는 코틀린 언어 핵심

이 책은 좀 마음에 든다. 그래도 돈이 없어서 사진 않겠다.

개념설명과 예시가 잘 나와있고 번역도 걸리는거 없이 자연스럽게 읽힌다.
책의 수준은 자바를 어느정도 알아야 제대로 볼 수 있을 것 같다.
람다까지는 어느정도 할 줄 알아야…

본인쨩은 자바도 할 줄 알고 코틀린도 튜토리얼보면서 대강 익힌 후에 책을 봐서 좀 더 편하게 본것같기도 하다.

자바 특징

자바를 소개하는 책에는 자바가 간결하고 쉽다고 했지만… 그건 C,C++하던 사람들 얘기고
본인쨩은 C#을 먼저 하고 자바를 시작해서 그런지
처음에 자바 문법 극혐스러웠다. 

코틀린 써본 느낌

코틀린은 완성된 자바같다.
자바의 혐오스러운 부분을 배제해서 간결하고 직관적이다.

자바와의 호환성을 유지하기 위해 많은 부분을 희생한 것 같다.
자바코드 가져올 때 null타입 체크를 포기한거나 …
그런거나…또 뭐가 있더라
패키지 구조에서 인터널 스코프, sealed도 뭔가 문제가 있었던 것같은데, immutableCollection이 바이트코드에선 퍼블릭이라거나

몇 가지 문제 때문에 코틀린에서 만든 라이브러리를 자바에서 쓰면 좀 불편할 것 같다.

자바도 8에서 람다, 9에서 모듈을 적용하면서 열심히 따라오고는 있는데
자바19정도 되면 코틀린처럼 변하지 않을까

no-java kotlin 버전???

레거시 지원도 좋지만 가끔은 과감하게 포기하면서 발전 해 가면 좋겠다.

창업공간 이용/방문 후기

위워크 강남점

위치 : 강남역 6번출구 홍우빌딩. 삼성전자 주변. 현대블랙스튜디오 앞건물
특징 : 미국식 소비문화를 지향해서 1회용품사용을 엄청나게 많이 한다
서비스 : 매주월요일 아침 먹을걸 준다. 청소서비스. 택배. 명절이나 무슨날이면 뭐 챙겨주고 행사도 있고 그렇다.
커뮤니티 : 옆 회사 사람들하고 인사도 안함

이전 직장 다니면서 1년정도 썼는데 창렬한 가성비지만 환경이 나쁘지는 않다.

중소형공유사무실0

위치 : 2호선 어딘가
특징 : 친하게 지내려면 무한히 친할 수 있다
서비스 : 청소.
커뮤니티 : 하기나름

개인적으로 사업을 시작하려고 하는데 사무실 따로 얻기는 부담스러워서 들어가게 됐는데… 사무환경이 나쁘는 않은데 물관리가 전혀 안된다.
영업사원 아저씨 맨날 전화질하고 (다른 어떤 사무실은 아줌마일 수도 있겠지) 시끄럽게 군다. 휴대폰은 항상 벨소리 최고음량

오피스19

위치 : 관악구 낙성대역과 서울대역 사이
특징 : 관리자가 없는거나 마찬가지
서비스 : 식빵과 잼 제공. 토스터. 드립커피. 카페에서모닝커피제공. 
사무실 청소 서비스 없음
커뮤니티 : 없음

1층은 카페고 2층 일부와 3층전체가 공유사무실로 사용되고 있는데
방음이 전혀 안된다.
운이 좋게 옆 사무실에 조용한 사람이 쓰고 있다면 모를까 재수없게 걸리면 못 쓴다. 소음에 민감한 사람은 사무실 오래 못 쓰고 나가는 것 같다.
아랫층에 식당과 지하에 강당이 있는데 여기서 행사가 있으면 그 소음이 사무실까지 들린다.
렙실은 입주자 이외에 일반인에게도 임대되는데 이 사람들은 엄청 시끄럽게 군다.
가장 큰문제는 관리인이 관리를 안한다는 것

(방문)중소형공유사무실1

서울대입구역 인근

우리 외주 맡길 것 있는데 좀 봐달랜다.
그럼 사무실 돈 안내고 써도 되나?
이런 애들이 많다. 돈도 받으면서 외주도 주겠다는? 미친건가?
값은 제대로 쳐주긴할건가

(방문) 패스트파이브

교대역 인근

시설은 깔끔하고 좋다. 위워크에 비해 소규모로 두층을 쓰고 있었다.
시리얼 제공

(방문) 가산 아파트형공장 소호사무실

딱 봐도 방음 전혀 안되게 생겨서 그냥 나왔다.

~ 결론

돈 많이 주고 위워크, 패스트파이브 쓰던가 입지 괜찮은 단독사무실 이용

안 그러면 월세보다 더 귀한 본인의 인건비가 날라간다.

(예제로 배우는 프로그래밍) 루아

이 책을 다 봤지만 메인함수 작성하는 방법을 아직 모른다.

인터넷의 1시간만에 루아 마스터하기~ 문서같은 느낌이었다

그래도 루아 언어 자체가 간단하기 때문에 그정도면 충분할 것 같다.

메인함수 작성법이나 system.in 하는방법은 따로 찾아보면 되니까

nginx에서 사용할 수 있다고 해서 보게 됐는데 생각보다 간단해서 쉽게 접근해볼 수 있을 것 같다.

Error:

에러로그

mvn test 실행시 ..라기보단 메이븐 빌드 자체가 안되는데

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project sb-tools-core: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :sb-tools-core

원인

모름

영문을 모르겠네.. 의존성 문제 아닌 것 같은게 노트북에서는 잘되니까

둘다 ubuntu 18.04, openjdk1.8, sdkman 이용 환경설치

노트북은 i5 8th. ram 8G sdd512 ubuntu 18.04 lenovo ideapad 320s

문제의 테스크탑은 amd ryzen 2700x? ram 32g 128ssd ubuntu 18.04

하드웨어 사양을 왜 썼냐면… 멀티코어 때문에 생기는 문제가 아닌가 싶어서

해결

못함

MSA 에서 GW의 역할 아키텍처

Microservice-Architecture-API-Gateway-Consideration.pdf 에서 보고
https://www.globallogic.com/wp-content/uploads/2017/08/Microservice-Architecture-API-Gateway-Considerations.pdf

구조

PDF에서 그림참고
client가 oauth2로 auth server에서 accesstoken을 얻어서 gw에 접근.
gw에서는 auth server에 accesstoken 검증받고 jwt토큰발급
jwt토큰이용 내부 MS에 접근

내가 생각하고 있던 jwt의 용법과 조금 달라서… 잘못알고 있었다고 봐야될까
외부의 앱에서도 jwt토큰을 사용하려고 했는데.. 시간제한걸고 해서
생각 해보니 이렇게 하면 access token하고 다를게 없는 것 같다.
이 문서에 있는 방법이 더 좋아보인다. jwt는 신뢰할 수 있는 서버간 통신용
배포시점에서 api 버전별로 jwt 토큰 secret을 공유해줘야할 것 같다.

DDOS방어

  • 접근횟수 제어: 세번이상때리는놈 막아버린다던가
  • 커넥션 제한: 서비스 종류에따라 다르겠지만 api를 100개씩 호출하는거 금지
  • 느린커넥션 제한: 소켓 열어놓고 안닫고 도망가는 경우가 많은데 이런거 강제종류 30초
  • IPBlockList/WhiteList
  • 요청 거부: User-Agent 헤더 들고오는놈, referret 헤더 들고오는놈, header에 값 잔뜩 달고오는놈 

Secure Communication

내부 rest api도 https사용
private 서브넷 이용
안될경우 token인증??

서비스 등록과 서비스 찾기

Service Registry

MS instance가 실행될 때 자동등록. eureka

Service Discovery

api gateway에서 eureka에 접근해서 찾기
ribbon으로 부하조절

Orchestration

MS가 MS를 요청하는 경우를 말하는건가?
바로 요청할지 GW를 거칠지? 그림은 좀 다른데?

  1. Client – GW – MS – MS
    1. Client – GW- MS – GW – MS
  2. Client – GW -MS

1번은 내부에서 내부를 중복호출하는경우. 1-1도 같은구조로 봐야할 것 같다
2번은 1단계 호출만 존재

Monitoring

MSA는 모니터링이 없으면 오류가 어디서 났는지 알기 힘들다.
각 서비스별 로그수집, 헬스체크가 필수

Health Monitoring

서버 죽었나 살았나

Traffic and Data Monitoring

데이터 네트워크 사용량??

Load Balancing and Scaling

API GW로 L.B.를 달아준다. 끝?
롤링배포하라구?

High Availablility and Failover

stateless – nosession