서비스 지향 아키텍처(SOA) 핵심 개념과 실무 적용 예시

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 소프트웨어 개발자, 시스템 아키텍트
  • 중간 수준 이상의 개발자 (Node.js, Express 프레임워크 사용 경험이 필요)

핵심 요약

  • SOA 정의: 서비스 간 비교적 느슨한 결합(Loose Coupling)과 재사용성을 통해 복잡한 애플리케이션을 구축하는 아키텍처 패턴
  • 핵심 원칙:

- 상호 운용성(Interoperability): HTTP, JSON, XML 등 표준 프로토콜을 통한 서비스 통신

- 서비스 발견성(Discoverability): 서비스 레지스트리 사용

- 정렬(Orchestration)과 협업(Choreography) 방식의 서비스 조합

  • 예제 구현:

- Node.js + Express 기반의 userService.jsorderService.js를 사용한 서비스 통신

- axios 라이브러리로 외부 서비스 호출 (예: axios.get('http://localhost:3001/users'))

섹션별 세부 요약

1. 서비스(Service)

  • 서비스는 독립적인 기능 단위로, 특정 비즈니스 로직을 수행
  • 재사용성을 위해 외부 애플리케이션에서 호출 가능
  • 예: userService.js에서 사용자 목록 조회 API 제공 (/users)

2. 느슨한 결합(Loose Coupling)

  • 서비스 간 의존성 최소화
  • 업데이트/유지보수 용이
  • 예: orderService.jsuserService.js의 변경에 영향을 받지 않음

3. 상호 운용성(Interoperability)

  • 표준 프로토콜(HTTP, JSON)을 통해 다양한 기술 스택의 서비스 통합
  • 서비스 간 데이터 교환 시 JSON 형식 사용

4. 서비스 발견성(Discoverability)

  • 서비스 레지스트리(Service Registry)를 통해 서비스 검색 및 접근 가능
  • 예: 서비스 등록 시 serviceRegistry.register('userService', 'http://localhost:3001')

5. 정렬(Orchestration) vs 협업(Choreography)

  • 정렬: 중앙 컨트롤러가 서비스 실행 순서를 정의 (예: orderService에서 userService 호출)
  • 협업: 서비스 간 직접 상호작용 (예: 이벤트 기반 통신)

6. 예제 구현 (Node.js)

  • 프로젝트 초기화:

```bash

npm init -y

npm install express axios

```

  • 디렉토리 구조:

```plaintext

soa-example/

├── services/

│ ├── userService.js

│ └── orderService.js

└── index.js

```

  • userService.js: 사용자 데이터 제공 API (GET /users)
  • orderService.js: userService와 통신하여 주문 생성 (POST /orders)

7. 실행 및 테스트

  • 서비스 실행:

```bash

node services/userService.js

node services/orderService.js

```

  • API 요청 예시:

- 사용자 조회: GET http://localhost:3001/users

- 주문 생성:

```json

POST http://localhost:3002/orders

{

"userId": 1,

"product": "Laptop"

}

```

결론

  • SOA 적용 시 주요 팁:

- 서비스 간 통신을 위한 표준 프로토콜(HTTP, JSON) 사용

- 서비스 레지스트리 도입으로 서비스 발견성 향상

- Node.js + Express로 간단한 서비스 구현 예제 제공 (예: userService.jsorderService.js)

  • 실무 적용 권장사항:

- 복잡한 시스템에서 정렬(Orchestration) 방식으로 서비스 통합

- 상호 운용성을 위해 RESTful API 설계 준수