본문 바로가기
Sketch (Programming Language)/Python

식단 평가 프로그램 (Back-end 연결을 중심으로)

by 생각하는 이상훈 2023. 2. 8.
728x90

Diet_Judgement

아래 코드는 다이어트 분석을 수행하고 백엔드 서버와 통신하여 데이터를 검색하고 전송하는 파이썬 코드이다. 식단 평가는 "diet_judgement"라는 함수를 통해 수행된다. 나이, 키, 몸무게, 성별, 칼로리 섭취, 단백질 섭취, 탄수화물 섭취, 지방 섭취, 운동 시간 등 다양한 파라미터가 필요하다. 이 기능은 주어진 매개변수를 이용해 기초대사량(BMR)과 총에너지지출(TEE)을 계산한 뒤 각 macronutrient(단백질, 탄수화물, 지방)와 일일 권장치의 비율을 비교해 식단의 균형 여부를 판단한다.

import requests

calorie_judgement = "default"
protein_judgement = "default"
carbohydrate_judgement = "default"
fat_judgement = "default"

def diet_judgment(age, height, weight, gender, calorie, protein, carbohydrate, fat, exercise_time):
    bmr = 0
    if gender == 1:
        bmr = 66 + (13.7 * weight) + (5 * height) - (6.8 * age)
    elif gender == 0:
        bmr = 655 + (9.6 * weight) + (1.8 * height) - (4.7 * age)

    global calorie_judgement
    global protein_judgement
    global carbohydrate_judgement
    global fat_judgement

    # Calculating Total Energy Expenditure (TEE)
    tee = bmr * (1.2 + (0.175 * exercise_time))

    # Calculating Macros ratio
    protein_ratio = protein * 4 / calorie
    carbohydrate_ratio = carbohydrate * 4 / calorie
    fat_ratio = fat * 9 / calorie

    # Checking if the calorie is balanced or not
    if calorie < tee *0.9:
        calorie_judgement = "You gonna lose weight"
    elif calorie > tee *1.1:
        calorie_judgement = "You gonna gain weight"
    else:
        calorie_judgement = "Calorie intake is balanced"

    # Checking if the diet is balanced or not
    if protein_ratio >= 0.15:
        protein_judgement = "Not enough protein"
    elif protein_ratio <= 0.30:
        protein_judgement = "Too much protein"
    else:
        protein_judgement = "Balanced protein"

    if carbohydrate_ratio >= 0.47:
        carbohydrate_judgement = "Not enough carbohydrate"
    elif carbohydrate_ratio <= 0.63:
        carbohydrate_judgement = "Too much carbohydrate"
    else:
        carbohydrate_judgement = "Balanced carbohydrate"

    if fat_ratio >= 0.23:
        fat_judgement = "Not enough fat"
    elif fat_ratio <= 0.27:
        fat_judgement = "Too much fat"
    else:
        fat_judgement = "Balanced fat"

output = {
        "calorie": calorie_judgement,
        "protein": protein_judgement,
        "carbo": carbohydrate_judgement,
        "fat": fat_judgement
    }

url = "http://localhost:8080/api/AI/getNutritionalInfo"     # url 설정
response = requests.get(url)        # 함수를 실행하는데 필요한 data 백엔드에 요청
# 자료를 담아두고 함수를 실행
if response.status_code == 200:
    data = response.json()
    age = data["age"]
    height = data["height"]
    weight = data["weight"]
    gender = data["gender"]
    calorie = data["calorie"]
    protein = data["protein"]
    carbohydrate = data["carbohydrate"]
    fat = data["fat"]
    exercise_time = data["exercise_time"]
    diet_judgment(age, height, weight, gender, calorie, protein, carbohydrate, fat, exercise_time)
else:
    print("Failed to retrieve data from the server.")



response = requests.post(url, json= output) #실행 결과를 백엔드에 보내줌

if response.status_code == 200:
        print("Data sent to the server successfully.")
else:
        print("Failed to send data to the server.")


분석 후 출력은 "clorie", "protein", "carbohydrate", "fat" key와 함께 사전에 저장되어 각 macronutrient에 대한 판단을 나타낸다. 그런 다음 스크립트는 "request" 라이브러리를 사용하여 백엔드 서버와 통신한다.


백엔드와 연결

이 코드의 핵심은 백엔드와 연결하는 방법이었다.

우선은 백엔드에서 함수 실행에 필요한 데이터를 검색하는 것이다. 이 작업은  URL "http://localhost:8080/api/AI/get NutritionalInfo"에 GET 요청을 작성하여 수행된다. 서버로부터의 응답은 변수 "response"에 저장되며, 데이터가 성공적으로 검색되었는지 확인하기 위해 응답의 상태 코드를 확인한다. 상태 코드가 200이면 데이터가 성공적으로 검색되었음을 의미하며, 응답은 JSON 객체의 형태로 변수 "data"에 저장된다. 그런 다음 검색된 데이터는 "diet_judgement" 함수의 입력 매개 변수로 사용된다.

두 번째 단계는 분석 결과를 백엔드로 전송하는 것이다. 이는 동일한 URL에 POST 요청을 하여 출력을 전송할 JSON 데이터로 사전 "output"에 저장함으로써 이루어진다. 데이터가 성공적으로 전송되었는지 확인하기 위해 응답의 상태 코드를 다시 확인한다. 상태 코드가 200이면 데이터가 성공적으로 전송되었음을 의미하며 이를 나타내는 메시지가 표시된다.

결국 핵심은 GET 요청을 하여 함수에 넣을 인자를 받아오고 POST 요청을 하여 함수 실행 결과를 보내주는 것이다.


 

728x90

'Sketch (Programming Language) > Python' 카테고리의 다른 글

Baekjoon Training #11725  (0) 2023.02.13
Baekjoon Training #1759  (2) 2023.02.09
Baekjoon Training #1193  (0) 2023.02.04
Baekjoon Training #10844  (3) 2023.02.02
Baekjoon Training #2579  (0) 2023.01.31