IBM ISW 교육 - 2,3 일차

zuckerfrei·2023년 6월 9일
0

IBM ISW

목록 보기
2/2

1. 실습 개요

가상의 은행에 있는 계좌에서 돈을 인출하는 로직을 실습한다.
위의 그림이 현금 인출의 전체 프로세스이다.
모든 프로세스를 구현하지는 않고, 간단하게 Servicing Order 부분을 직접 구현할 것이다.

Servicing Order를 간단히 설명하자면 아래와 같은 작업을 수행한다.

1) 현금 출금 요청을 받고
2) 사용자 인증 로직을 수행하고
3) 인증된 사용자에 대해 요청한 현금을 제공

실습은 설계(design) → 개발 → CI/CD → 테스트 순서로 진행된다.


2. ISW Solution Layer

ISW Solution Layer는 크게 3가지로 구성되어있다.
실습을 하기 위해서는 먼저 ISW Solution Layer의 구성을 이해해야 한다.

맞는지 모르겠으나, 내가 이해한 Solution Layer를 Spring Layer와 비교하여 정리해봤다.

ISW layer : Spring layer

  • API : Controller
  • Domain
    • Entity : Entity
    • Command : Repository
    • Service : Service
  • Integration : ?

API ~ Domain는 Spring의 개념과 거의 1:1로 매핑할 수 있을 정도로 유사한 것 같다.
Integration은 클러스터 내의 다른 서비스를 호출하고 응답값을 받아서 서비스 로직을 수행하는 역할을 한다. 다른 서비스와의 연계/통합을 고려해서 명칭을 Integration이라 붙인 것 같다.


3. 설계 실습

MSA는 DDD 원칙에따라 데이터를 잘게 쪼개는 것을 기본으로 한다.
따라서 Entity 설계가 가장 핵심이고 가장 먼저 이루어져야 하는 작업이다.

3-1. 프로젝트 생성

일단, 프로젝트 생성을 한다.

  • create project from scratch
  • DDD Service Project Java srping boot

아래처럼 프로젝트 생성

acronym : 뒤에 붙는 숫자는 본인 접속계정 숫자
package name : java package name
RDBMS 사용할 것

gitlab에서 내가 만든 프로젝트 생성 된 것 확인

깃과 바로 연동된다는 것을 확인할 수 있음 → 소스코드로 프로젝트 관리할 수 있다는 의미

isw workspace 에서 프로젝트 생성 된 것 확인

3-2 Domain - Entity 설계

Domain에 Entity가 포함되어 있으므로 Domain 설계부터 진행한다.

  • Entity
    • Properties로 구성된 개체로 솔루션 디자이너에서 Domain을 표현하는데 사용합니다.
  • Properties
    • 값 또는 범위에 대한 변수 및 필드값을 의미
    • Text, Integer, Date …
  • Entity 유형
    - Root Entity
    - Entity
    - External Entity

  1. Entity 생성
  2. 각 entity에 property 만들기
    association : 0.1 → 필수x, 1 → 필수
  3. entity에 properties 생성 완료된 모습

3-3 Domain - Command 설계

  • Commands

    • Root Entity 라이프사이클에 포함되며 서비스에 비즈니스 로직으로 사용됩니다.
    • 새 인스턴스를 만들거나 기존 인스턴스를 조작하는데 사용되며 오직 Root Entity만 Commands를 가질 수 있습니다.
    • 모든 커맨드는 Input값을 정의할 수 있으며 Output을 가지지 않습니다.
  • Command 유형

    • Factory Commands : Root Entity의 새로운 인스턴스를(데이터베이스) 생성할때 사용하는 Commands
    • Instance Commands : 기존 인스턴스의(데이터베이스) 현재 상태를 조작하는데 사용합니다.
  1. 커맨드 생성
  2. input 값 세팅
  3. property 추가하기

3-4 Domain - Service 설계

  1. Service 생성
  1. service 의 input, output 설정
  1. service에 property 추가하기
    이미 존재하는 property면 골라서 선택하고, 없으면 새로 만들기
  1. service input output 모두 추가한 상태

commit/push

설계 작업을 모두 마치면 오른쪽 상단에 있는 commit/push 버튼을 눌러서 푸시함
이렇게 개발자와 함께 협업을 하는 것임. 설계 > 개발 > 설계 수정 > 개발… 반복

그리고 gitlab 접속해서 변경된 사항 확인해보기

3-5 API 설계

Domain 다음으로는 요청을 받는 부분인 API를 설계한다.

  • Path

    • 정의된 API의 Endpoint
  • Operation

    • 생성된 PATH에 POST, GET, PUT, DELETE의 Operation을 생성하고 정의
  • Schema

    • 다른 구성요소(Request, Response)등에서 사용 할 수 있는 데이터 유형
    • String, Boolean, Number …
    • 스키마를 생성하고, 스키마에서 사용할 property를 생성해주면 나중에 request 또는 response 에서 선택하여 이런 스키마 모양대로 input, output 을 사용한다.
  • Request

    • POST, PUT에 사용되는 Operation들에 Input값으로 사용
    • 각 Operation마다 한개의 Request를 사용
  • Response

    • 각 Operation에서 Output값으로 정의
    • 각 Operation마다 성공 및 에러상황에 최소 한개 이상의 Response를 사용
      • 예시) 성공 201, 에러 504 등등 각각 1개씩 Response 설정 가능
  • Schema 생성

  • schema property 추가
    예시) CustomerReference schema
  • operation 설정

POST 버튼을 클릭하면 상세 설정 가능
성공인 경우 201, 실패인 경우 500 설정

documentaion 탭에서 시각적으로 확인할 수도 있음


3-6 Integration 설계

API 설계가 완료되었으면, 다른 서비스와의 연계를 위해 Integration을 설계한다.
이미 다른 서비스 개발이 완료되었고, swagger가 존재한다면 swagger json 파일을 import해서 더 쉽게 Integration을 생성할 수도 있다.
다만 그렇다고 하더라도 properties 등록, service 등록, service input output 설정 단계는 수행해야한다.

  • 링크 접속해서 각각 swagger api json 파일을 다운받음


  • 받은 json을 import 해줌 > add api depends

dev binding : 다른 서버의 서비스 호출할 경우
local lookup : 동일한 k8s 내의 서비스 호출할 경우

  • integration property 추가, service 생성, input output 설정

4. 개발 실습

개발은 실제 로직이 수행되는 순서대로 진행한다.
api → domain → integration

개발 소스코드는 제공이 되었고, 학생들이 한 줄씩 입력하면서 설명을 듣고 로직을 이해하는 방식으로 진행되었다. 그렇기 때문에 개발 부분을 크게 다루지는 않겠다.

개발 소스코드 세팅

  1. gitpod 접속
  2. extension 2가지 설치

  1. cli 로그인 설정

    어제는 했어도 gitpod 다시뜨면서 초기화되니까 또 해줘야 함

    npx k5 setup --file cli-config.json
  1. 내 프로젝트 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가 지워져도 이 파일로 복구 가능


4-1 api 개발

  • API Provider는 Service를 호출 하여 해당 endpoint에 맞는 동작을 지원한다.
  • 각 클래스에서 사용하는 서비스를 @Autowired 로 호출하여 사용한다.
  • Service를 호출할 때 넘겨주는 Input Parameter를 생성하는데 entitybuilder를 사용하여 Entity 객체를 생성하고 파라미터를 담는 그릇으로 사용한다.
  • API 외에도 ISW 전체에서 Entitybuilder를 통해 객체를 생성한다.
  • Builder 패턴과 유사하게 개발한다고 느꼈다.
  • Service 호출은 execute() 함수를 사용한다.

4-2 domain 개발

4-2-1 service 개발

  • API layer로 부터 호출 되어, 해당 endpoint에 대한 실제 동작을 정의한다.
  • API, Service 등등 다 같은 방식으로 개발하기 때문에 개발 표준화 하기는 편함

실제 사용한다면 디자인 하는 부분이 오래 걸리고 개발자체는 짧게 가져갈 수 있음

맨 처음 아키텍쳐를 구성하는 것이 핵심일듯..

4-2-2 Command 로직 개발

  • DB에 저장되어 잇는 데이터의 Creation, update, delete의 방법을 정의한다.
  • JPA가 기본적으로 설정되어 있어 ORM 을 사용 가능하게 한다. 그래서 repository 역할과 유사하다고 느꼈다.

4-3 Integration 개발

  • 전달 받은 데이터를 이용하여 다른 서비스를 호출 하고, 받은 결과를 Service로 전달한다.
  • MSA에서는 다른 서비스를 http 방식으로 호출하는 것이 일반적인데, ISW도 마찬가지다.
    • 그러나 http 호출 로직이 내부에 감춰져 있어 개발자 입장에서 훨씬 쉽게 느껴진다고 한다.
    • 단지 http header과 파라미터만 생성하여 호출에 사용했다.

4-4 DB connection 및 환경변수

  • Spring Boot와 동일하게 application.yml에 DB connection 정보를 추가한다.
    • 기존에 Operation 환경을 구성한 경험이 있다면 친숙하게 설정할 수 있어서 좋다.
  • 또 extension-values.yaml 이라는 파일로 환경변수(secret, configmap 등)를 주입할 수 있다.

4-5 compile & commit

컴파일 및 메이븐 인스톨 실행하여 체크

# solution.yml 파일이 존재하는 경로에서 실행
npx k5 compile

# 일반 maven처럼 pom.xml 경로에서 실행
mvn clean install

commit push 하여 변경사항 반영

npx k5 push -m "commit message"

5. 배포 실습

개발이 완료되었으면 이제 배포할 차례이다.
ISW는 CI/CD Pipeline 템플릿을 보유하고 있어서 용도에 맞게 사용자가 골라 사용할 수 있다.

  • 파이프라인 종류

    • deploy pipeline

      • 끝까지 한 번에 배포하는 파이프라인
      • 마지막으로 도커라이징해서 배포하는 것까지 수행
    • release pipeline

      • 최종단계인 Deploy 앞단인 helm chart release까지 수행
      • 자동 배포가 아닌 마지막에 수동으로 검수하기 위해, 한 번 대기하는 지점까지의 파이프라인
  • 파이프라인 생성
    튜토리얼이기 때문에 Deploy Pipeline을 선택
    education-dev 라는 타겟에 배포하도록 설정

파이프라인 생성 및 실행 결과

파이프라인 Name을 클릭하면 Openshift 콘솔 화면으로 넘어간다.

이곳에서 내 파이프라인의 상태, 로그를 확인해볼 수 있다.

ISW에서 미리 템플릿으로 만들어둔 Deploy Pipeline의 상세 task를 확인할 수 있다.

ArgoCD로 배포된다고 하는데, 여기 직원분들도 상세한 내용은 확인이 불가능했다.


6. 테스트

파이프라인이 정상적으로 완료되면 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가 정상 작동하는 것을 확인했다.
이렇게 의도치 않게 트러블 슈팅 실습도 하게 되었다…


7. ISW모니터링툴 Instana

MSA는 복잡해서 한 번에 모니터링 하기 어렵다.
ISW 운영 중 모니터링에 어려움이 느껴지면 Instana 도입을 고려 할 수 있다.
Instana agent를 설치하여 관찰 대상을 자동 감지하고 대상 모니터링하는데, infra부터 app까지 상세하게 모니터링 가능하다고 한다.
이 사이트에 접속하면 데모 버전의 Instana를 사용해볼 수 있다.

profile
무설탕 음료를 좋아합니다

0개의 댓글