티스토리 뷰
프로그래밍을 업으로 20년 이상해왔지만 Web Service를 실제로 서비스에 제대로 사용해 본적이 없다. 스프링에서 RMI도 써봤는데 말이다. 그런데 이미 철이 많이지난 지금에서야 드디어 사용해 볼 기회가 생겼다. 그래서 잘 모른다고 하는 게 정확하다.
잘 모르는 주제에 여기에 이걸 적는 이유는 언제나 그랬듯 나의 형편없는 기억력 때문이다.
Web Service는 결과적으로 REST가 하는 것과 동일한 것을 한다.
특징 몇가지를 적어보면
1. 서비스와 데이터의 정의를 위해 xml을 사용한다. 메시지의 구조와 서버의 명세 같은 것들이 모두 xml로 되어 있다.
2. HTTP를 통신기반으로 사용한다는 점에서 REST와 차이가 없다.
3. REST와 다른 점은 endpoint가 외부로 노출되어 있지 않고(노출되어 있지만 별로 관심사가 아니다) HTTP프로토콜 위에 SOAP라는 별도의 프로토콜로 통신한다.
4. 보이지 않은 부분이 많아서 어려워 보이지만 그냥 안보이는 부분은 자동으로 된다고 생각하면 편하다.
Web Service는 일반적으로 아래의 구조로 간단히 설명할 수 있다. 아래는 위키피디아에서 가져왔다.
1. 아래 그림에서 왼쪽의 서비스 제공자는 자신이 어떤 서비스를 하는지를 설명하는 wsdl을 공개적으로 게시한다.
2. 누구나 wsdl을 이해할 수 있으면 서비스를 요청할 수 있다. 서비스 공급자는 아래처럼 다른 곳(UDDI)에 wsdl을 공개할 수 있지만 대부분은 공급자 자신이 wsdl을 게시하는 경우가 대부분이다.
3. wsdl은 어떤 서비스 port type를 제공하는데 그 서비스 내에 어떤 기능들이 있는지(operation)이 있는지, 그리고 그 각 서비스는 어떤 메시지를 주고(request), 받는지(response), 그리고 그 메시지는 어떤 타입(type)인지 전부를 기술하고 있다. 각 기능들은 기능이 위치하는 URL을 모두 가지고 있다.
4. 예를 들면 호텔 예약이라는 서비스를 제공한다고 하면 예약이라는 것이 port type이 된다. 예약이라는 서비스 안에는 많은 기능들이 있는데, 예약정보 전체가져오기, 예약정보 검색하기, 예약하기, 예약취소하기, 예약변경하기 같은 것을 생각하면 될 것이다. 이 각각 기능을 operation이라고 한다.
5. port type은 특정한 서비스를 제공하기 위한 기능들의 집합이라고 할 수 있다. 예약조회라는 기능을 예를 들어 생각하면 예약조회를 위해서는 검색어가 필요하다. 그리고 이 검색 결과를 받아야 한다. 이것을 각각 input, ouput으로 생각할 수 있다. 물론 input만 있는 기능, output만 있는 기능도 있을 수 있다. 이런 각 input, output을 메시지라고 한다. 예약검색이라는 기능의 input 즉 예약 요청이라는 메시지를 생각해 보면 이 메시지 내에는 여러가지 필드가 존재할 수 있다. 예약자 이름, 예약번호, 예약 일자 같은 것들이 들어갈 수 있는데, 이런 각각의 요소들이 있고 이런 element에게 type이 부여된다. type은 단순히 생각하면 프로그래밍 언어의 타입을 생각하면 비슷하다. 이런 타입이 wsdl의 마지막 요소인 type을 구성한다. 물론 string 같은 simple type과 여러 타입으로 구성된 complex 타입으로 다시 구분할 수 있는데 이건 wsdl 파일을 보면 쉽게 알아 볼 수 있다.
6. bind라는 것이 추가적으로 존재하는 데 이것은 각 기능들이 어떤 형식으로 교환되는지 style에 정의 할 수 있고 SOAP 프로토콜에서 사용할 헤더 정보를 설정하여 저장한다. 내부적으로 어떻게 통신할지를 기술하고 있다고 생각하면 된다.
7. Service라는 것이 마지막으로 존재하는데 wsdl의 제일 마지막에 위치한다. 이것은 서비스를 호출할 기본 서버 내의 서버스가 위치하는 실제 주소를 가지고 있다.
'기록' 카테고리의 다른 글
AWS : private subnet 서버 접근 2 - Session Manager 사용 (0) | 2023.01.29 |
---|---|
Vagrant : Ubuntu 22.10 Vagrant libvirt로 nfs mount문제 (0) | 2023.01.05 |
데이터베이스 : 트랜잭션 언제 적용해야 하나 (0) | 2022.12.16 |
Nodejs: NFC Reader 노드에서 사용 관련 Research (0) | 2022.11.20 |
AWS : private subnet 서버 접근 1 - bastion 서버 활용 (0) | 2022.11.17 |
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
- jsp
- one-to-one
- 스프링부트
- Angular
- Spring
- one-to-many
- form
- 스프링
- MYSQL
- 외부파일
- login
- XML
- Rest
- 로그인
- Validation
- hibernate
- spring boot
- Spring Security
- 상속
- 매핑
- Many-To-Many
- 하이버네이트
- Security
- 설정
- 자바
- 설정하기
- mapping
- RestTemplate
- crud
- WebMvc