5.10. 클라우드 데이터베이스에 온도 저장

이전 과정을 통해 API Gateway, Lambda, 데이터베이스를 연결하였다. 이 장은 스마트폰에서 측정된 온도정보를 클라우드 데이터베이스에 저장하는 기능을 구현한다.

서버 코드 변경

Lambda 함수를 API가 호출되면 데이터베이스에 온도정보를 저장할 수 있도록 코드를 수정한다.

import psycopg2
import json
from datetime import datetime

def lambda_handler(event, context):
    query_parameters = event.get('queryStringParameters', {})
   
    # 이름, 온도, 날짜정보 수신
    name = query_parameters.get('name', None)
    temperature = query_parameters.get('temperature', None)
    date = query_parameters.get('date', None)
   
    # 파라미터가 없다면 오류 반환
    if name is None or temperature is None or date is None:
        return {
            'statusCode': 400,
            'body': json.dumps(f'parameter error {name}, {temperature}, {date}')
        }

    # 문자열을 적절한 형태로 변환
    temperature = float(temperature)
    date = datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
   
    try:
        # 데이터베이스 연결
        conn = psycopg2.connect(
            host = "호스트 주소",
            database = "데이터베이스 이름",
            user = "유저 이름",
            password = "마스터 비밀번호"
        )
    except:
        return {
            'statusCode': 401,
            'body': json.dumps('Database Connect Error')
        }
       
    with conn.cursor() as curs:
        try:
            # 온도정보 저장
            curs.execute("""INSERT INTO "TemperatureInformation" (name, temperature, date) values (%s, %s, %s);""", (name, temperature, date))
            # 트랜잭션 테이블에 반영
            curs.execute("commit;")
   
        except:
            return {
                'statusCode': 402,
                'body': json.dumps('Insert Error')
            }

    return {
        'statusCode': 200,
        'body': json.dumps('Success Data Insert')
    }

이후 다음 URL을 사용해 API 호출을 테스트해보면 Success Data Insert가 화면에 나타나고, pgAdmin4에 온도정보가 올바르게 저장된것을 확인할 수 있다.

API 스테이지 URL + /ts100_resource?name=TS100-12345&temperature=36.5&date=2011-11-11 11:11:11

온도 정보 클라우드에 저장

각 플랫폼별 클라우드 데이터베이스에 온도정보를 저장하는 방법에 대해 설명한다.

Raspberry Pi(Python)

클라우드에 온도정보를 저장하기 위해 API 호출 관련 모듈을 추가한다.

# API 호출 관련 라이브러리
import requests

이후 API 호출 함수를 작성한다.

def send_cloud(temperature, date):
    # String으로 변환
    convert_date = date.strftime("%Y-%m-%d %H:%M:%S")
    convert_temperature = str(temperature)

    # URL 생성
    base_url = "API 스테이지 URL"
    url_params = {'name': selected_device.name, 'date': convert_date, 'temperature': convert_temperature}
    my_url = f"{base_url}?name={url_params['name']}&date={url_params['date']}&temperature={url_params['temperature']}"

    print(my_url)
    # URL 인코딩
    encoded_url = requests.utils.requote_uri(my_url)

    # HTTP GET 요청
    response = requests.get(encoded_url)

    # 상태 확인
    if response.status_code in range(200, 300):
        print("Success")
    elif response.status_code in range(400, 500):
        print("Error")
    else:
        print("Default Error")

바나나 체온계로부터 온도정보를 수신했을 떄 API호출하는 메서드를 추가 후 실행하면 온도정보가 클라우드에 저장되는 코드가 실행되는것을 확인할 수 있다.

# 온도정보 변환
def parse_temperature_information(data: bytearray):
    global cursor

    # 온도정보 변환
    temperature = temperature_calculate(data[1], data[2], data[3], data[4])

    array_slice = data[5:]
    date_array = list(map(int, array_slice))
    # 날짜정보 변환
    date = date_calculate(date_array)
    # 온도, 날짜정보 출력
    print(date)
    print(temperature)

    # 데이터베이스에 저장
    cursor.execute("INSERT INTO TEMPERATURE (name, temperature, date) VALUES (?, ?, ?)", (selected_device.name, temperature, date))
    conn.commit()


    # 클라우드에 저장(추가된 부분)
    send_cloud(temperature, date)

클라우드 데이터베이스 정보 확인

클라우드에 저장된 온도정보 확인을 위해 pgAdmin4를 실행해 Tables 우클릭 → Query Tool을 클릭해 Query Tool 화면으로 전환한다.

Query문을 다음과 같이 작성한 후 실행버튼을 클릭하면 1초단위로 온도정보가 클라우드 데이터베이스에 저장되어있는것을 확인할 수 있다.

select * from "TemperatureInformation";

온도정보 필터링

특정 조건을 만족하는 온도정보를 출력하는 방법에 대해 설명한다. 체온의 정상 범위인 36 ~ 37.5℃ 내에 있는 온도정보를 확인하기 위해 SQL문을 아래와 같이 작성한다.

select * from "TemperatureInformation" where temperature >= 36.0 and temperature <= 37.5;

SQL문을 작성하고 실행하면 다음과 같이 정상 온도범위의 온도정보만 출력되는것을 확인할 수 있다.

Last updated