MSA를 공부하다보면, 서비스간에 REST Api로 통신한다고 나와있다.

여기서 말하는 REST의 정의는 무엇인지 찾아보고, 구현해보려한다

 


REST

자원자원에대한 주소를 지정하는 방법에 대한 아키텍쳐이다.

REST 아키텍쳐를 따르는 시스템을 Restful, API 통신을 Rest Api 라고도 한다.

 

 


특징 6가지

1) Uniform (유니폼 인터페이스)
2) Stateless (무상태성)
3) Cacheable (캐시 가능)
4) Self-descriptiveness (자체 표현 구조)
5) Client - Server 구조
6) 계층형 구조

 

1) 유니폼 인터페이스

 

URI로 지정된 리소스에 대해, 통일된 인터페이스로 수행되는 것을 의미한다.

 

나같은 경우는 통일된 (Uniform) 인터페이스라는 표현의 이해가 어려웠는데,

클라이언트의 환경 ( 플랫폼 / 프로그래밍 언어 )에 종속되지 않는 느슨한 결합 ( Loosly Coupling ) 아키텍쳐가 더 이해하기 쉬웠다.

 

 

2) 무 상태성

 

서버단에서 상태 정보(컨텍스트)를 저장하지 않음을 의미한다.

 

세션이나 쿠키같은 정보를 저장하지않고, Request에 대해 들어온 요청대로 수행하기만한다.

요청에 대해 History 고려 및 정보 저장이 필요없으므로, 구현이 간단해진다는 장점이 있다.

 

 

3) 캐시 가능

 

HTTP 메소드를 사용하기에, 기존 캐시 기능을 그대로 사용할 수 있다.

 

Last-Modified 혹은 E-tag를 사용하여 데이터 갱신유무를 파악하고, 변화가 없으면 클라이언트의 자체 캐시값을 활용한다

 

※ HTTP Cash 프로세스
- 리퀘스트 헤더에 Last Modified를 포함하거나, E-tag를 사용하여 보낸다 ( E-tag가 우선됨 )

1) Last Modified 값을 If-modified-Since 헤더에 포함시켜, 서버측의 시간과 비교한다.
2) E-tag 값을 If-None-Match 에 포함시켜, 서버측의 값과 비교한다
=> 값이 같다면 304 Not Modified 리턴코드를 응답하고, 클라이언트는 가지고있는 캐시값을 사용한다.

 

4) 자체 표현 구조

 

리퀘스트만 보고도 무슨 내용인지 직관적으로 파악이 가능해야한다.

 

예를들어, GET http://localhost/customer/123 라는 리퀘스트가 있다고 하자.

단번에 회원중에 키값(회원ID)가 123인 사람을 조회하는 GET 메소드 라는것을 알 수 있다.

 

 

5) 클라이언트 - 서버구조

 

API를 통해 요청하고, 인증이나 컨텍스트 정보를 직접 관리하는 Client 와

접근가능하도록 API를 제공하는 Server 역할로 나누어 독립적인 개발이 가능하도록 한다.

 

 

6. 계층형 구조

 

클라이언트 입장에서는 Api를 통해 서버로 요청하지만,

서버 내부적으로 다양한 계층을 지닐수 있다.

 

스위치 , WEB 서버등을 통해 사용자 인증, SSL, 로드밸런싱 등을 구현할 수 있으며

Apache Reverse Proxy나 HA Proxy 등을 통해 Host 분리없이 구현할 수 있다.

 


구현 가이드

 

1. 자원에 대한 행위는 CRUD를 사용한다.

 

Create - [HTTP Post] 해당 리소스를 생성한다.
Read   - [HTTP Get] 해당 리소스를 조회한다.
Update - [HTTP Put] 해당 리소스를 수정한다.
Delete  - [HTTP DELETE] 해당 리소스를 삭제한다.

 

2. URI는 정보를 표현해야한다. ( 명사형 )

 

1번과도 연관된 내용이다.

동사는 CRUD로 제한하고, 나머지 자원에 대한 정보는 모두 명사로 표시한다.

 

 

3. /로 리소스 계층을 식별한다

 

ex ) GET http://localhost/customer/123

      마지막에 /는 혼동을 줄수있기에 넣지 않는다.

 

 

4. 모든 경로에는 소문자를 사용한다.

 

대소문자에 따라 리소스를 다르게 인식하기 때문에, 대문자는 사용하지 않는다.

 

 

5. 하이픈 ( - )을 통한 가독성 

 

언더바 ( _ )는 환경에 따라 보기 힘들수도 있기때문에,

URI 내의 가독성을 높이고 싶으면 하이픈을 사용한다.

 

ex) GET http://localhost/vip-customer/123 ( O )
    GET http://localhost/vip_customer/123  ( X )


※ HTTP Response Code

 

Rest Api를 통해 리퀘스트에 단순 응답만 하는것이 아닌

다양한 Response Code 들을 통해, 처리결과를 좀더 정확하게 회신주어야한다.

 

대표적인 값은 

2xx (성공): 요청을 성공적으로 받았으며 인식했고 수용하였다
 - 200 : 클라이언트 요청을 정상적으로 수행함
 - 201 : 서버가 요청한 리소스 생성작업을 성공함

3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요하다
 - 301 : 사용자가 요청한 페이지에 대해 URI가 변경되었다.

4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없다
 - 400 : 사용자가 요청이 어떤것인지 인식하지 못했을 때
 - 401 : 사용자의 권한이 부족하거나 인증이 완료되지 않음
 - 403 : 금지된 리소스에 사용자가 접근할 때
 - 404 : 존재하지 않는 리소스를 요청했을 때
 - 405 : 잘못된 메소드로 서버에 요청했을 때

5xx (서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했다
 - 500 : 내부 서버오류로 인해 요청 수행 불가

 

https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

 

HTTP 상태 코드 - 위키백과, 우리 모두의 백과사전

아래는 HTTP(하이퍼텍스트 전송 프로토콜) 응답 상태 코드의 목록이다. IANA가 현재 공식 HTTP 상태 코드 레지스트리를 관리하고 있다. 모든 HTTP 응답 코드는 5개의 클래스(분류)로 구분된다. 상태 코

ko.wikipedia.org

 

 

[참조]

https://meetup.toast.com/posts/92

'IT > 아키텍처' 카테고리의 다른 글

MSA ( MicroService Architecture )  (0) 2021.07.13
Monolithic  (0) 2021.07.03

MSA란?

 

MSA에 대한 공식적인 정의는 찾을 수 없었다.

그래서 나름대로 MSA의 특징이라고 생각되는 것을 적어보았다.

- 서비스가 작게 나뉘어져있어야하고, 개별 서비스는 독립적인 배포가 가능해야한다.
- API를 통해 각 서비스간 통신한다.
- 각 서비스간 영향도가 최소화 되어야한다.
  ※ DB조차도 중앙관리 될 필요가 없으며, 개별 서비스가 DB를 소유한채 API를 통해서만 데이터를 가져온다.

장점

앞서 작성했던 Monolithic의 단점이, MSA의 장점이 될 수 있다.

( 2021.07.03 - [IT/아키텍처] - Monolithic )

 

다른 서비스들에 영향을 끼치지 않음

  - 독립적인 서비스 구성으로, 배포 실패나 장애 발생시에 시스템 전체에 영향을 끼치지 않는다.

 

요구사항의 빠른 반영이 가능하다

 - 다른팀의 개발을 기다릴 필요없이, 빠르게 개발 및 테스트를 진행할 수 있고, CI/CD가 가능하다.

  ※ CI ( Continuous Integration ) : 지속적 통합으로, 코드의 변경사항이 형상관리 시스템에 계속 반영되어 품질을 유지
                                             개발 / 테스트 / 병합 단계를 의미


     CD ( Continuous Deploy 혹은 Delivery ) : 지속적 서비스 제공 또는 배포. 테스트 및 운영서버로 자동 배포를 의미.

 

배포시간의 감소

  - 기존 Monolithic에서는 몇십, 몇백GB 짜리 소스코드를 디플로이 하느라 시간이 오래걸린다.

    해당시간동안 서비스가 불가능하다는 의미이기도 하며, Time out 으로 디플로이가 실패할 수도 있다.

    

    하지만 MSA에서 소스코드 용량은 KB,MB 단위이기때문에 배포에 오랜시간이 걸리지 않는다.

 

다양한 형태의 아키텍처

  - 각 서비스간에 프로그래밍 언어나 프레임워크에 엮여있지 않아, 다양한 아키텍처 구성이 가능하다

   

 


단점

 

시스템 복잡도 상승

  - 위의 다양한 컴포넌트들에서 보이듯,  각 서비스별 관리에 있어 어느정도 컴포넌트에 대한 지식이 필요하다.

 

성능 하락

  - 서비스간 통신을 모두 API를 통해 진행하기 때문에, latency 및 네트워크 비용 발생

 

데이터 정합성

  - 데이터가 단일 DB가 아닌, 개별 서비스에 종속되어 있기때문에
    관리가 어렵고 정합성 문제가 발생할 수 있다.

'IT > 아키텍처' 카테고리의 다른 글

Rest  (0) 2021.07.29
Monolithic  (0) 2021.07.03

Monolithic ?

 

MSA에 대해 정리하기 전에, 반대되는 개념인 Monolithic을 살펴봤다.

 

흔히 우리가 개발할때 하나의 war나 directory로 묶어서 배포하는 방식을 의미한다.

 

쇼핑몰 홈페이지를 구축한다고 가정하여, Monolithic의 단점과 왜 MSA가 떠오르게 되었는지 서술하려한다.

 

 


 

조그마한 변경도, 시스템 전체에 영향을 줄 수 있다.

프로젝트로 회원가입, 로그인, 장바구니, 구매등의 기능이 있는 홈페이지를 하나 만들었다고 가정하자.

 

고객으로부터 포인트 서비스를 개발해달라는 요청을 받아, 아래와 같이 프로세스를 진행하는 중이다.

 

요구사항 분석 - 설계 - 개발 - 빌드 - 테스트

 

오랜시간에 걸쳐 테스트까지 완료되었고, 운영서버에 배포하고 서비스를 확인하려 했으나...

 

 

다른쪽 코드는 건들지도 않았는데, 메인페이지부터 모든 서비스가 안되기 시작한다.

 


강력한 결합으로, 컴포넌트의 변경이 다른 컴포넌트에 영향을 미침

 

고객 요청사항을 위해, 로그인 방식을 바꾸려고 한다.

 

이 기능은 시스템의 자바버전으로 구현이 어려워서, 버전을 올리고 코드를 반영했다.

 

배포 후, 기능이 잘 동작하는것에 미소짓고 있었는데...?

 

회원가입이 안된다는 VOC가 마구들어오고 있었다.

 

회원가입 중 일부기능이 신규 자바버전과 호환되지 않는 탓이었다.

 


 

고객의 요구사항 반영이 늦어짐

 

크게 데인 우리는, 기준을 높여 배포를 진행하기로 하였다.

 

1) 코드 변경 시, 엄격한 영향도 조사

2) 특정 서비스를 개발도중에, 관련 서비스까지 모두 타팀에서 건들지 말 것

3) 최소한의 서비스 중단을 위해, 고객들이 이용하지 않는 저녁시간 이후에 배포할 것

 

이후에, 하나의 요구사항 반영에는

개발 및 테스트시간보다 기타 절차들에서 시간이 더 걸리게되었고, 우리는 고객들의 불만에 시달렸다...

 

 


배포시간의 증가

 

시간이 지나 우여곡절끝에,  시스템은 안정화되었고 평화로운 나날을 보내고 있었다.

 

어느날 간단한 소프트웨어 패치로, 배포를 하게되었는데

 

반영버튼을 누른뒤로, Admin 페이지는 모래시계만 돌고 서비스도 계속 작동을 하지 않았다

 

특별한 에러로그는 없이, 계속 서비스는 내려가있었고 결국 프로세스를 재시작하기로 하였다.

 

가동하면서 로그를 봤는데 웬걸. 너무나 시스템이 커져버린탓에 몇 십분씩 걸리는 거였다.

 

(1)번째 서비스가 가동되었습니다. ( 19:33 )
(2)번째 서비스가 가동되었습니다.
                     ·
                     ·
                     ·
(153)번째 서비스가 가동되었습니다. ( 19:45 )

개별 프레임워크 구성이 어려움

 

고객 요청으로 154번째 서비스를 추가하려고 한다.

 

마침 쉽고 효과적으로 적용할 수 있는 오픈소르를 찾았고, 기쁘게 관련 문서를 뒤져봤는데.....

 

호환 언어 : Python

 

'IT > 아키텍처' 카테고리의 다른 글

Rest  (0) 2021.07.29
MSA ( MicroService Architecture )  (0) 2021.07.13

+ Recent posts