가상의 은행에 있는 계좌에서 돈을 인출하는 로직을 실습한다.
위의 그림이 현금 인출의 전체 프로세스이다.
모든 프로세스를 구현하지는 않고, 간단하게 Servicing Order 부분을 직접 구현할 것이다.
Servicing Order를 간단히 설명하자면 아래와 같은 작업을 수행한다.
1) 현금 출금 요청을 받고
2) 사용자 인증 로직을 수행하고
3) 인증된 사용자에 대해 요청한 현금을 제공
실습은 설계(design) → 개발 → CI/CD → 테스트 순서로 진행된다.
ISW Solution Layer는 크게 3가지로 구성되어있다.
실습을 하기 위해서는 먼저 ISW Solution Layer의 구성을 이해해야 한다.
맞는지 모르겠으나, 내가 이해한 Solution Layer를 Spring Layer와 비교하여 정리해봤다.
ISW layer : Spring layer
API ~ Domain는 Spring의 개념과 거의 1:1로 매핑할 수 있을 정도로 유사한 것 같다.
Integration은 클러스터 내의 다른 서비스를 호출하고 응답값을 받아서 서비스 로직을 수행하는 역할을 한다. 다른 서비스와의 연계/통합을 고려해서 명칭을 Integration이라 붙인 것 같다.
MSA는 DDD 원칙에따라 데이터를 잘게 쪼개는 것을 기본으로 한다.
따라서 Entity 설계가 가장 핵심이고 가장 먼저 이루어져야 하는 작업이다.
일단, 프로젝트 생성을 한다.
아래처럼 프로젝트 생성
acronym : 뒤에 붙는 숫자는 본인 접속계정 숫자
package name : java package name
RDBMS 사용할 것
gitlab에서 내가 만든 프로젝트 생성 된 것 확인
깃과 바로 연동된다는 것을 확인할 수 있음 → 소스코드로 프로젝트 관리할 수 있다는 의미
isw workspace 에서 프로젝트 생성 된 것 확인
Domain에 Entity가 포함되어 있으므로 Domain 설계부터 진행한다.
Commands
Command 유형
설계 작업을 모두 마치면 오른쪽 상단에 있는 commit/push 버튼을 눌러서 푸시함
이렇게 개발자와 함께 협업을 하는 것임. 설계 > 개발 > 설계 수정 > 개발… 반복
그리고 gitlab 접속해서 변경된 사항 확인해보기
Domain 다음으로는 요청을 받는 부분인 API를 설계한다.
Path
Operation
Schema
Request
Response
Schema 생성
POST 버튼을 클릭하면 상세 설정 가능
성공인 경우 201, 실패인 경우 500 설정
documentaion 탭에서 시각적으로 확인할 수도 있음
API 설계가 완료되었으면, 다른 서비스와의 연계를 위해 Integration을 설계한다.
이미 다른 서비스 개발이 완료되었고, swagger가 존재한다면 swagger json 파일을 import해서 더 쉽게 Integration을 생성할 수도 있다.
다만 그렇다고 하더라도 properties 등록, service 등록, service input output 설정 단계는 수행해야한다.
dev binding : 다른 서버의 서비스 호출할 경우
local lookup : 동일한 k8s 내의 서비스 호출할 경우
개발은 실제 로직이 수행되는 순서대로 진행한다.
api → domain → integration
개발 소스코드는 제공이 되었고, 학생들이 한 줄씩 입력하면서 설명을 듣고 로직을 이해하는 방식으로 진행되었다. 그렇기 때문에 개발 부분을 크게 다루지는 않겠다.
cli 로그인 설정
어제는 했어도 gitpod 다시뜨면서 초기화되니까 또 해줘야 함
npx k5 setup --file cli-config.json
내 프로젝트 clone 받아오기
k5 clone -s isw-enablement-project/SVCORD09 -p "gitlab.com"
클론 받아오면 자동으로 마지막에 빌드까지 수행함
gitpod /workspace/isw-enablement (main) $ npx k5 clone -s isw-enablement-project/SVCORD09 -p "gitlab.com"
========= Cloning Solution to filesystem =================================================
--------- > GIT CLONE --------------------------------------------------------------------
--------- > Authenticating ---------------------------------------------------------------
--------- > Cloning Solution from Solution Git Repository --------------------------------
[SUCCESS] Cloned git repository to /workspace/isw-enablement/SVCORD09
--------- > checking solution type -------------------------------------------------------
--------- > Fetching generated code ------------------------------------------------------
[SUCCESS] Pulled generated files
--------- > Writing generated code -------------------------------------------------------
[SUCCESS] 13 files added, 0 changed, 0 removed
--------- >> Looking for stub files to create --------------------------------------------
[ADDED] New stub file: .//svcord09-application/src/main/java/com/isw/svcord09/api/v1/WithddrawalApiV1Provider.java
[ADDED] New stub file: .//svcord09-application/src/main/java/com/isw/svcord09/domain/svcord/service/WithdrawalDomainService.java
[ADDED] New stub file: .//svcord09-application/src/main/java/com/isw/svcord09/integration/partylife/service/LoginExcute.java
[ADDED] New stub file: .//svcord09-application/src/main/java/com/isw/svcord09/integration/partylife/service/RetrieveLogin.java
[ADDED] New stub file: .//svcord09-application/src/main/java/com/isw/svcord09/integration/paymord/service/PaymentOrder.java
[ADDED] New stub file: .//svcord09-application/src/main/java/com/isw/svcord09/domain/svcord/command/Svcord01Command.java
[ADDED] New stub file: .//svcord09-application/src/main/java/com/isw/svcord09/SVCORD09Application.java
[ADDED] New stub file: .//svcord09-application/src/main/filtered/application.yaml
[ADDED] New stub file: .//svcord09-application/pom.xml
...
[INFO] --- compiler:3.10.1:compile (default-compile) @ svcord09-application ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 132 source files to /workspace/isw-enablement/SVCORD09/svcord09-application/target/classes
[INFO] /workspace/isw-enablement/SVCORD09/svcord09-application/src/main/generated/com/isw/svcord09/sdk/api/config/SecurityAutoConfiguration.java: /workspace/isw-enablement/SVCORD09/svcord09-application/src/main/generated/com/isw/svcord09/sdk/api/config/SecurityAutoConfiguration.java uses or overrides a deprecated API.
[INFO] /workspace/isw-enablement/SVCORD09/svcord09-application/src/main/generated/com/isw/svcord09/sdk/api/config/SecurityAutoConfiguration.java: Recompile with -Xlint:deprecation for details.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.089 s
[INFO] Finished at: 2023-06-08T05:43:56Z
[INFO] ------------------------------------------------------------------------
[SUCCESS] No compile errors
[INFO] Successfully cloned Solution into: /workspace/isw-enablement/SVCORD09
solution.yml : 메타데이터 보관. 나중에 isw workspace가 지워져도 이 파일로 복구 가능
@Autowired
로 호출하여 사용한다.실제 사용한다면 디자인 하는 부분이 오래 걸리고 개발자체는 짧게 가져갈 수 있음
맨 처음 아키텍쳐를 구성하는 것이 핵심일듯..
컴파일 및 메이븐 인스톨 실행하여 체크
# solution.yml 파일이 존재하는 경로에서 실행
npx k5 compile
# 일반 maven처럼 pom.xml 경로에서 실행
mvn clean install
commit push 하여 변경사항 반영
npx k5 push -m "commit message"
개발이 완료되었으면 이제 배포할 차례이다.
ISW는 CI/CD Pipeline 템플릿을 보유하고 있어서 용도에 맞게 사용자가 골라 사용할 수 있다.
파이프라인 종류
deploy pipeline
release pipeline
파이프라인 생성
튜토리얼이기 때문에 Deploy Pipeline을 선택
education-dev 라는 타겟에 배포하도록 설정
파이프라인 생성 및 실행 결과
파이프라인 Name을 클릭하면 Openshift 콘솔 화면으로 넘어간다.
이곳에서 내 파이프라인의 상태, 로그를 확인해볼 수 있다.
ISW에서 미리 템플릿으로 만들어둔 Deploy Pipeline의 상세 task를 확인할 수 있다.
ArgoCD로 배포된다고 하는데, 여기 직원분들도 상세한 내용은 확인이 불가능했다.
파이프라인이 정상적으로 완료되면 swagger에 접속하여 기능을 테스트한다.
solution Hub 접속 > 배포한 타겟 project 상세 정보 > Solution Envoy 접속> 내 pod 확인 > Swagger 접속
swagger 확인
request
reponse
504로 에러 발생하지만, 교육용 Openshift의 네트워크가 느려서 타임아웃이 발생한 것이었다.
실제 DB 테이블을 조회해보면, 내 아이디에 붙은 숫자 만큼의 돈을(인출 요청한 9원) 정상적으로 인출 신청한 것을 확인할 수 있었다.
✔️ 맨 처음 배포했을 때는 request body 설정에 오류가 있어서, api가 정상 작동하지 않았다.
확인해보니 WithdrawalBodySchema 스키마를 구성하는 property 중 하나의 타입을 잘못 선택해서 발생한 오류였다.
API 설정에 들어가서 문제가 되던 String 타입의 “customerReference” property를 제거하고 Object 타입으로 재생성하여 스키마에 포함시켰다.
이후 commit/push & 재배포하여 swagger 상에서 api가 정상 작동하는 것을 확인했다.
이렇게 의도치 않게 트러블 슈팅 실습도 하게 되었다…
MSA는 복잡해서 한 번에 모니터링 하기 어렵다.
ISW 운영 중 모니터링에 어려움이 느껴지면 Instana 도입을 고려 할 수 있다.
Instana agent를 설치하여 관찰 대상을 자동 감지하고 대상 모니터링하는데, infra부터 app까지 상세하게 모니터링 가능하다고 한다.
이 사이트에 접속하면 데모 버전의 Instana를 사용해볼 수 있다.