SaaS, PaaS, IaaS 조사


이미지 - microsoft


위의 이미지는 개인적으로 SaaS, PaaS, IaaS에 대해 가장 잘 말해주는 것이라고 생각한다.

내가 처음 SaaS, PaaS, IaaS에 대해 접한 것은 2학년 복학 후 클라우드 컴퓨팅에 관심을 갖게 되고 관련 자료를 조사하면서 알게 되었다.

SaaS

SaaS는 호스팅된 응용 프로그램 부터 ~ 데이터 센터 물리적 공장/건물 즉 하드웨어 상태까지를 인터넷 상에서 제공해 주는 것을 말한다. 즉 사용자는 해당 프로그램 부터 ~ 하드웨어까지를 따로 구비하거나 설치하지 않아도 연결 가능한 데스크탑 만 있으면 SaaS 단위의 프로그램을 사용해도 된다. 별도의 소프트웨어 설치가 필요없기에 사용자는 쉽게 접근 가능하며, 일정 사용량만 내면 된다.

PaaS

PaaS는 응용프로그램이 아닌 개발 도구, 데이터베이스 관리 부터 ~ 하드웨어까지 제공해 주는 것을 말한다. 관련 경험으로 PaaS-Ta 경진 대회에 나갔을 때 PaaS 상에서 프로그램을 개발하고 배포를 할 수 있다. 이때 데이터베이스도 따로 구축할 필요가 없었으며 GUI를 통해 간단하게 배포 및 DB연결이 가능하였다.

IaaS

IaaS는 서버및 저장소 부터 하드웨어까지 제공해 주는 서비스를 말하며 관련 경험으로는 AWS를 사용하여 WAS를 구축하였던 것을 예를 들 수 있다. 물론 리눅스 운영체제 또한 제공해 주었지만 그 외에 서버및 저장소, 네트워크, 하드웨어 측면을 제공해 줌으로써 관련 업계에서 한번에 많은 양의 사용자를 단기간에 유지하거나 저 소득의 회사에서 부담없이 사용할 수 있다는 장점이 있다. 다만, 아직 학생들의 시점에서는 부담이 가는것이 사실이다.


출처 - 개인

블로그 이미지

리그캣

오픈소스같은 오픈지식

Chicken_Map-1.py

import folium


map_osm = folium.Map(location = [37.614776, 127.013337])

map_osm.save('d:/temp/map1.html')


map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17)

map_osm.save('d:/temp/map2.html')

라이브러리 추가하고 코드 테스팅

제대로 생성됐는지 확인해보는 작업

map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17, tiles='Stamen Toner')

map_osm.save('d:/temp/map_StamenToner.html')


map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17, tiles='Stamen Terrain')

map_osm.save('d:/temp/map_StamenTerrain.html')

이것도 parameter 적용하여 확인작업.

map_osm = folium.Map(location=[37.614776, 127.013337], zoom_start=17)

folium.Marker([37.614776, 127.013337], popup='서경대학교').add_to(map_osm)

folium.Marker([37.615970, 127.011834], popup='북악관').add_to(map_osm)

map_osm.save('d:/temp/map_SKu1.html')

다음식으로 좌표가져와서 마커와 팝업을 설정해 줄 수 있음.

소스코드 파악했으니 Chicken_Map을 만들어 볼 차례

import folium

import json

import urllib.request

import datetime

import pandas as pd

import webbrowser

필요 라이브러리 추가

#code1

def get_request_url(url):


  req = urllib.request.Request(url)

  req.add_header("X-Naver-Client-Id","Ch0vdY0HM6SPOidkt02i")

  req.add_header("X-Naver-Client-Secret","ANmaZHqA8m")

  try:

      response = urllib.request.urlopen(req)

      if response.getcode() == 200:

          print("[%s] Url Request Success"%datetime.datetime.now())

          return response.read().decode('utf-8')

  except Exception as e:

      print(e)

      print("[%s] Error for URL : %s" %(datetime.datetime.now(),url))

      return None

NAVER API 연동하기위한 URL REQUEST

#code2

def getGeoData(address):


  base = "https://openapi.naver.com/v1/map/geocode"

  node = ""

  parameters = "?query=%s" % urllib.parse.quote(address)

  url = base + node + parameters


  retData = get_request_url(url)


  if (retData == None):

      return None

  else:

      return json.loads(retData)

해당 API연동하여 정보가져오기


def main():

  #code3

  map = folium.Map(location=[37.5103, 126.982], zoom_start=12)


  #code4

  filename = 'pericana_modify.csv'

  df = pd.read_csv(filename, encoding='CP949', index_col=0, header=0)

  geoData = []

  for index, row in df.iterrows():

      if row['sido'] == '서울특별시':

          geoData = getGeoData(row['store_address'])

          if geoData != None:

              print(geoData)

              folium.Marker(geoData, popup=row['store'], icon=folium.Icon(color='blue')).add_to(map)


  #code5

  svFilename = 'Chicken_Map-1.html'

  map.save(svFilename)

  webbrowser.open(svFilename)



if __name__ == '__main__':

  main()

서울특별시에 한정되어 pericana_modify.csv에 있는 주소 표시하기 위한 코드

실행시켰더니 에러가나서 보니

print(geoData)

를 실행하여 데이터를 확인해보니getGeoData(address)가  json 형식 그대로 가져오는 것을 확인할 수 있었음

{'result': {'total': 1, 'userquery': '서울특별시 강서구 양천로51길 11, 1층 102호(가양동,신환빌딩)', 'items': [{'address': '서울특별시 강서구 양천로51길 11 신환빌딩', 'addrdetail': {'country': '대한민국', 'sido': '서울특별시', 'sigugun': '강서구', 'dongmyun': '양천로51길', 'ri': '', 'rest': '11 신환빌딩'}, 'isRoadAddress': Tru



{'result':

{'total': 1, 'userquery': '서울특별시 강서구 양천로51길 11, 1층 102호(가양동,신환빌딩)',

'items': [{'address': '서울특별시 강서구 양천로51길 11 신환빌딩', 'addrdetail': {'country': '대한민국', 'sido': '서울특별시', 'sigugun': '강서구', 'dongmyun': '양천로51길', 'ri': '', 'rest': '11 신환빌딩'},

'isRoadAddress': True, 'point': {'x': 126.8428764, 'y': 37.5682634}}]}}

이때 json형식을 보면 다음과같이 x,y좌표를 확인할 수 있었음.

이것을 뽑아내보자는 생각이 들어 다음과 같이 실행함


for index, row in df.iterrows():

  if row['sido'] == '서울특별시':

      geoData = getGeoData(row['store_address'])

      if geoData != None:

          print(geoData['result']['items'][0]['point']['x'])

          print(geoData['result']['items'][0]['point']['y'])

Traceback (most recent call last):

126.8428764

37.5682634

다음과 같이 출력되는것을 확인

folium.Marker([geoData['result']['items'][0]['point']['x'],geoData['result']['items'][0]['point']['y']], popup=row['store'], icon=folium.Icon(color='blue')).add_to(map)

을 사용하기로 함.

??


왜 북극에 가잇냥..

이 좌표가 아닌가..;;

x, y 좌표를 바꾸어보자는 생각이 들어서 바꾸어 보았음.

오 정상 출력되는 것을 확인 가능.

같은 방식으로 굽네치킨 주소도 표시해 보겠음

전체소스코드

import folium

import json

import urllib.request

import datetime

import pandas as pd

import webbrowser


#code1

def get_request_url(url):


  req = urllib.request.Request(url)

  req.add_header("X-Naver-Client-Id","Ch0vdY0HM6SPOidkt02i")

  req.add_header("X-Naver-Client-Secret","ANmaZHqA8m")

  try:

      response = urllib.request.urlopen(req)

      if response.getcode() == 200:

          print("[%s] Url Request Success"%datetime.datetime.now())

          return response.read().decode('utf-8')

  except Exception as e:

      print(e)

      print("[%s] Error for URL : %s" %(datetime.datetime.now(),url))

      return None


#code2

def getGeoData(address):


  base = "https://openapi.naver.com/v1/map/geocode"

  node = ""

  parameters = "?query=%s" % urllib.parse.quote(address)

  url = base + node + parameters


  retData = get_request_url(url)


  if (retData == None):

      return None

  else:

      return json.loads(retData)


def main():

  #code3

  map = folium.Map(location=[37.5103, 126.982], zoom_start=12)


  #code4

  filename = 'pericana_modify.csv'

  df = pd.read_csv(filename, encoding='CP949', index_col=0, header=0)

  geoData = []

  for index, row in df.iterrows():

      if row['sido'] == '서울특별시':

          geoData = getGeoData(row['store_address'])

          if geoData != None:

              print(geoData['result']['items'][0]['point']['x'])

              print(geoData['result']['items'][0]['point']['y'])

              folium.Marker([geoData['result']['items'][0]['point']['y'],geoData['result']['items'][0]['point']['x']], popup=row['store'], icon=folium.Icon(color='blue')).add_to(map)


  filename2 = 'goobne_modify.csv'

  df2 = pd.read_csv(filename2, encoding='CP949', index_col=0, header=0)

  geoData2 = []

  for index, row in df2.iterrows():

      if row['sido'] == '서울특별시':

          geoData2 = getGeoData(row['store_address'])

          if geoData2 != None:

              print(geoData2['result']['items'][0]['point']['x'])

              print(geoData2['result']['items'][0]['point']['y'])

              folium.Marker([geoData2['result']['items'][0]['point']['y'],geoData2['result']['items'][0]['point']['x']], popup=row['store'], icon=folium.Icon(color='red')).add_to(map)



  #code5

  svFilename = 'Chicken_Map-1.html'

  map.save(svFilename)

  webbrowser.open(svFilename)



if __name__ == '__main__':

  main()



표시화면

다음과 같이 표시가 가능하다



블로그 이미지

리그캣

오픈소스같은 오픈지식

기존에 있던 치킨집 매장 주소를 보정하여 보았다.


주소를 보정하여, goobne_modify.csv 파일로 저장

import pandas as pd # 판다스 사용

filename ='goobne.csv'

판다스 사용하기로 선언

파일이름 선언 (같은 폴더에 넣어놨음)

goobne_table = pd.read_csv(filename, encoding='CP949', index_col=0, header=0)

print(goobne_table.sido.unique())


from_csv 함수가 에러나서 read_csv로 변환하였음.

print처리 안해주면 확인할수 없어서 print로 확인하여줌.

다음과 같이 확인가능한 것을 볼 수 있음.

print(goobne_table[goobne_table['sido']=='0'])

print(goobne_table[goobne_table['sido']==''])

print(goobne_table[goobne_table['sido']==' '])

필요한값을 sido로 갖고있는 튜플 찾아보았음.


해당 인덱스 값 갖고있는 튜플제거

goobne_table = goobne_table.drop([473,509,700,839,898])



print(goobne_table.sido.unique())


sido_table = pd.read_csv('district.csv', encoding='CP949', index_col=0, header=0)

print(sido_table)


m = goobne_table.merge(sido_table, on=['sido', 'gungu'], how='outer', suffixes=['', '_'], indicator=True)


m_result = m.query('_merge=="left_only" ')

print(m_result)

행정구역 데이터를 이용하여 행정구역 데이터 보정.

잘못된 행정구역 찾기

91      일도동광초점    제주도 제주시                   제주도 제주시 연수로3길 7 1층

92         오라점 제주도       제주시 제주도 제주시 오라삼동 2995-1, 지하   

149       호매실점 경기도    수원시권선구 경기도 수원시권선구  서수원로523번길 30-35, 101호

150       오목천점 경기도    수원시권선구        경기도 수원시권선구 오목천로 31

203       하복대점 충청북도    청주시흥덕구       충청북도 청주시흥덕구 죽천로 120

204    청주강서지구점     충청북도 청주시흥덕구                  충청북도 청주시흥덕구 서현북로 24

205        오송점 충청북도    청주시흥덕구        충청북도 청주시흥덕구 만수길 14-4

246        표선점 제주도      서귀포시  제주도 서귀포시 표선면 표선중앙로 106   

247      제주중문점  제주도 서귀포시                  제주도 서귀포시 천제연로 183-1

248      제주동홍점  제주도 서귀포시                   제주도 서귀포시 일주동로 8588

249      신시가지점  제주도 서귀포시                     제주도 서귀포시 신서귀로 43

250  봄그리고가을리조트      제주도 서귀포시    제주도 서귀포시 성산읍 해맞이해안로 2660, 1층\r\n   

251       모슬포점 제주도      서귀포시 제주도 서귀포시 대정읍 화모리 1238-6번지   

다음과 같이 나옴.


print(m_result[['sido','gungu']])


943     경상남도 창원시마산회원구

944     경상남도 창원시마산회원구

945     경상남도 마산회원구


[79 rows x 2 columns]

잘못된 데이터 찾앗음

gungu_alias = """청주시흥덕구:청주시  여주군:여주시 청주시서원구:청주시  용인시기흥구:용인시

고양시일산서구:고양시  부천시오정구:부천시 천안시동남구:천안시  부강면:세종시 연서면:세종시

창원시진해구:창원시  나리로:세종시 갈매로:세종시  성남시수정구:성남시 청주시상당구:청주시

전의면:세종시  조치원읍:세종시 전주시완산구:전주시  창원시마산합포구:창원시 당진군:당진시

안산시단원구:안산시  부천시소사구:부천시 안산시상록구:안산시  수원시장안구:수원시

고양시일산동구:고양시  천안시서북구:천안시 안양시동안구:안양시  부천시원미구:부천시

전주시덕진구:전주시  포항시북구:포항시 창원시마산회원구:창원시   창원시성산구:창원시

안양시만안구:안양시  포항시남구:포항시 수원시권선구:수원시   고양시덕양구:고양시

청원군:청주시   용인시수지구:용인시   수원시영릉구:수원시 청주시청원구:청주시   성남시분당구:성남시

용인시처인구:용인시   수원시팔달구:수원시 누리로:세종시   도움3로:세종시 보듬3로:세종시 성남시중원구:성남시

수원시영통구:수원시   마산회원구:마산시 창원시의창구:창원시

              """


gungu_dict = dict()

for aliasset in gungu_alias.split():

  s = aliasset.split(':')

  gungu_dict.update({s[0]: s[1]})


goobne_table.gungu = goobne_table.gungu.apply(lambda v: gungu_dict.get(v,v))

m = goobne_table.merge(sido_table, on= ['sido', 'gungu'], how='outer', suffixes=['', '_'], indicator=True)

m_result = m.query('_merge =="left_only"')

print("여기서 수정해야함")

print(m_result[['sido','gungu']])



에러나서 다음과 같이 수정하였음

print로 해당 좌표찍으면서 수정하여 완료

goobne_table.to_csv('goobne_modify.csv', encoding="euc-kr", mode='a', header=False)

다음과 같이 사용할시 csv파일 상측이 깨지는 현상이 발생됩니다. 해당현상은 해결하지 못하였습니다.



블로그 이미지

리그캣

오픈소스같은 오픈지식

티스토리 툴바