[WEB]

[TIL #1] Web Service / REST / XML / Open API

ddgoori 2020. 4. 10. 21:28

업무 중에 생긴 질문 아래와 같음!

 

  • WEBSERVICE
  • XML
  • OPEN API
  • REST
  • REST API

 

웹 서비스(Web Service)

 

는 = XML + SOAP + WSDL / HTTP 이다.

http://www.nextree.co.kr/p11842/

 

알고보면 쉬운 웹서비스

웹 서비스를 적용한 애플리케이션을 구축하는 것은 쉽지 않습니다. 그러나 웹서비스의 개념과 구성을 큰 그림으로 이해한다면, 웹서비스를 구축하는 과정이 다르게 느껴질 수 있습니다. 오늘은 그동안 웹서비스를 공부하면서 개운치 않았던 부분들을 긁어드리려 합니다. 알고보면 쉬운 웹서비스에 대해 함께 살펴봅니다. 왜 웹 서비스를 선택할까요? 먼저 왜 웹서비스를 사용하는지에 대한 궁금증부터 해소해볼까요. 우리가 웹서비스를

www.nextree.co.kr

 

웹 서비스(Web Service)는 네트워크 상에서 서로 다른 종류의 컴퓨터들 간에 상호작용을 하기 위한 소프트웨어 시스템이다. 웹 서비스는 서비스 지향적 분산 컴퓨팅 기술의 일종으로 SOAP, WSDL, UDDI 등의 주요 표준 기술로 이루어진다. 웹 서비스의 모든 메시징에는 주로 XML이 사용된다. -Wikipedia-

 

Web Service의 주요 구성요소

 

- SOAP(Simple Object Access Protocol)

  XML과 HTTP등을 기본으로 하여 다른 컴퓨터에 있는 데이터나 서비스를 호출하기 위한 통신규약

 

- UDDI(Universal Description, Discovery, and Integration)

  개방형 표준과 비독점적 기술 기반으로 개발된 전역 비지니스 레지스터리(?) 무슨말이얔ㅋㅋ

 

- WSDL(Web Service Description Language)

  웹서비스에서 제공하는 기능을 외부에서 이용할 수 있도록 그 사용방법을 알려주는 인터페이스 언어로 XML기반으로 작성됨

 

**Web Service 구성도

 

 

XML

이란?

 

- XML은 HTML과 비슷한 문자기반의 마크업 언어(사람과 기계가 동시에 읽기 편한 구조)

- XML은 HTML처럼 데이터를 보여주는 목적이 아닌 데이터를 저장하고 전달할 목적으로 만들어짐

- XML 태그는 HTML태그처럼 미리 정의되어 있지 않고, 사용자가 직접 정의할 수 있음

  => WHY? XMl은 어떠한 데이터를 설명하기 위해 이름을 임의로 지은 태그로 데이터를 감싼다. 즉, 태그로 데이터를 설명하는 것이다. 이 부분에서 데이터의 표시(Mark Up)이 되고, 더 필요한 데이터가 생길 시 태그추가나, 태그 안의 내용을 추가할 수 있음(Extensible)

 

XML의 특징

 

- 다른 시스템끼리 다양한 종류의 데이터를 손쉽게 교환할 수 있도록 해줌

- XML은 새로운 태그를 만들어 추가해도 계속 동작함으로 확장성이 좋음

- XMl은 텍스트 데이터 형식의 언어로 모든 XML 문서는 유니코드 문자로만 이루어짐

 

예제)

 

 

 

REST

https://medium.com/@hckcksrl/rest%EB%9E%80-c602c3324196

 

REST란

REST 란 ?

medium.com

1.     2000년 로이 필딩이 박사학위 청구 논문에서 REST ( Repressentational State Transfer ) 를 소프트웨어 아키텍처 스타일로 제안한 후 OPEN API를 개발하는 기본으로 급속도로 확산되고 있다.

2.     SOAP이 서비스 지향 구조인 것과 달리 자원지향구조(ROA : Resource Oriented Architecture) 로 웹 사이트의 컨텐츠 , DB의 내용 등을 전부 하나의 자원으로 파악하여 각 자원의 고유한 URI( Uniform Resource Identifier ) 를 부여하고 , 해당 자원에 대한

 

CRUD ( Create , Read , Update , Delete ) 작업을 HTTP 기본 명령어인 POST , GET , PUT ,DELETE 를 통해서 처리한다.

 

REST 란 “Representational State Transfer” 의 약자이다. 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다. REST란, “웹에 존재하는 모든 자원(이미지, 동영상, DB 자원)에 고유한 URI를 부여해 활용하는 것으로, 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다고 한다. 이런 REST의 형식을 따른 시스템을 RESTful 이라고 부른다. HTTP URI 를 통해 자원을 명시하고 HTTP Method를 통해 해당 자원의 대한 CRUD Operation을 적용한다.

CRUD Operation , HTTP Method

  1. Create : POST (자원 생성) : INSET
  2. Read : GET (자원의 정보 조회) : SELECT
  3. Update : PUT (자원의 정보 업데이트) : UPDATE
  4. Delete : DELETE (자원 삭제) : DELETE

 

REST API?

 

- REST 구조 스타일에 적합한 Web API를 REST API라고 함

- REST API를 제공하는 웹 서비스를 RESTful 하다고 함

- REST API 정보제공 방식은 XML, JSON, RSS

 

 

RESRT API 설계시 고려되는 점

 

1) REST API를 통해 제공하려는 자원은 무엇?

2) URI 경로 Path는 언제 복수로 써야하는지?

3) 리소스의 상태를 업데이트 하려면 어떤 메소드를 사용해야 하는가?

4) CRUD가 아닌 연산을 어떻게 URL에 매핑하는지?

5) 특정한 시나리오에 가장 적합한 HTTP 응답은 무엇인지?

6) 리소스 상태 표현의 버전은 어떻게 관리할 수 있는지?

7) JSON에 포함된 하이퍼링크는 어떻게 구조화 하는지?

'

 

*출처: https://dlsdn73.tistory.com/526?category=717872

 

 

 

 

OPEN API

- 공공데이터 미세먼지농도 API 다뤄보기

 

1) 미세먼지라고 찾고 참고 문서를 확인한다.

- 데이터 포멧의 형태, End Point, 참고문서가 있다.

- 참고문서를 확인하면 API 사용방법이 있음

 

2) API 사용을 위해 활용신청 누름

 

3) Serviecekey 인증키 발급

 

4) 참고문서에서 메소드 확인

 

5) Java에서 URI를 통해서 값을 GET 방식으로 받아오는 법

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Example2 {
	public static void main(String [] args) 
	{
		BufferedReader br = null;
		try 
		{
			String urlstr = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?stationName=%EC%A2%85%EB%A1%9C%EA%B5%AC&dataTerm=month&pageNo=1&numOfRows=10&ServiceKey=oOAJnP%2FmbpEtkXEOu4jK1LzPbACEpO6Iy2zRdBDiUjVWIWNL61sqfioNEiw1ZYguuqls5Fje3UHZvhxyNr4uKQ%3D%3D&ver=1.3";
			# URI주소

			URL url = new URL (urlstr);

			HttpURLConnection urlconnection = (HttpURLConnection) url.openConnection();
			# urlconnection에 연결되는 역할
 
			urlconnection.setRequestMethod("GET");
 # GET방식으로 

			br = new BufferedReader(new InputStreamReader(urlconnection.getInputStream(),"UTF-8"));
			
			String result = "";
			String line;
			while((line = br.readLine()) != null) 
			{
				result = result + line + "\n";
			}
			
			System.out.println(result);
		}
		catch(Exception e) 
		{
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
}

 

 

 

 

 

API로 얻어진 XML을 Parsing해서 Java에서 사용하기

 

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class ParsingExample {
	public static void main(String[] args) {
		
		// page는 파싱해오는 url을 구분해 주기 위한 것.
		int page = 1;
		
		try {
			while (true) 
			{
				
				String url = "http://ws.bus.go.kr/api/rest/busRouteInfo/getBusRouteList?"
						+ "ServiceKey=" # 인증키는 자신의 인증키를 넣어서 사용..
						+ "&strSrch=3"+page;
				// parsing할 url 지정 ( API 키 포함해서 이다 )
				
				// 페이지에 접근해줄 Document 객체를 생성해 주어야 한다.
				// 여기서 생성한 document 객체를 통해 파싱할 url의 요소를 읽어 들인다.
				// doc.getDocumentElement().getNodeName()를 출력하면 위 XML의 최상위 tag 값을 가져온다.
				// 여기서는 ServiceResult 가 최상위 tag값이 될 것이다.
				DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
				DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
				Document doc = dBuilder.parse(url);
				doc.getDocumentElement().normalize();
				System.out.println("Root element : " + doc.getDocumentElement().getNodeName());
				
				// 여기는 파싱할 정보가 있는 tag에 접근하는 부분이다.
				// 여기서 파싱할 데이터는 <itemList>라는 tag안에 있기 때문에 나는 여기로 접근해야한다.
				// 그러면 nList에 <itemList> 태그가 하나씩 담기게 되고 , getLength()를 통해 리스트의 수를 확인할 수 있게된다.
				
				NodeList nList = doc.getElementsByTagName("itemList");
				System.out.println("파싱할 리스트 수 : " + nList.getLength());
				
				// 이 부분은 list에 담긴 데이터를 출력하는 부분 
				// 위에 담긴 list를 반복문을 통해서 출력할 것이다
				// getTextContent() 는 전체 정보를 의미
				// getTagValue (" tag " , element ) : 입력한 tag 정보를 의미
				// getTagValue ( " tag " <- 실질적인 tag의 변수값을 넣어줘야 함 ) 
				// getTagValue는 따로 메소드를 만들어 준 것

				for (int temp = 0; temp < nList.getLength(); temp++) {
				
  // for문을 사용해 준 것은 모든 데이터를 출력해 보기 위해서이다.

					Node nNode = nList.item(temp);
					
					if (nNode.getNodeType() == Node.ELEMENT_NODE) {
						
						Element eElement = (Element) nNode;
						
						System.out.println("----------------------------------------");
						System.out.println("노선 ID      : " + getTagValue("busRouteId", eElement));
						System.out.println("노선명                : " + getTagValue("busRouteNm", eElement));
						System.out.println("운수사명             : " + getTagValue("corpNm", eElement));
						System.out.println("금일첫차시간       : " + getTagValue("firstBusTm", eElement));
						System.out.println("금일저상첫차시간 : " + getTagValue("firstLowTm", eElement));
						System.out.println("금일저상막차시간 : " + getTagValue("lastLowTm", eElement));
						System.out.println("금일막차시간       : " + getTagValue("lastBusTm", eElement));
						System.out.println("노선 길이 (Km) : " + getTagValue("length", eElement));
						System.out.println("노선 유형            : " + getTagValue("routeType", eElement));
						System.out.println("기점                   : " + getTagValue("stStationNm", eElement));
						System.out.println("종점                   : " + getTagValue("edStationNm", eElement));
						System.out.println("배차간격 (분)  : " + getTagValue("term", eElement));
					}
				
				
				
				
				}
				
				//하나의 리스트 값을 출력하면 +1 을 함으로써 구분시킬려고 , 20번째까지 구하기 위해서 , 임의로 
				page += 1;
				System.out.println("page number " + page);
				if(page > 20) 
				{
					break;
				}
				
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	// getTagValue 메소드 인데 , 이 부분은 TagName을 가져옴으로써 nlList에 저장을 시키는 부분 
	
	private static String getTagValue(String tag, Element eElement) {
		NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
		Node nValue = (Node) nlList.item(0);
		if (nValue == null) {
			return null;
		}
		return nValue.getNodeValue();
	}
}

 

 

 

출처:

https://mommoo.tistory.com/17

https://dlsdn73.tistory.com/530

https://dlsdn73.tistory.com/530?category=717872