INHA SW NET-Zero 공동해커톤 Server 코드

변현섭·2023년 7월 18일
0

활동 내역

목록 보기
5/9

이번 포스팅에서는 공동해커톤에서 사용한 저의 코드에 대해 소개해드리도록 하겠습니다. 코드는 아래의 깃허브 링크에 올려놓았으니 참고하시기 바랍니다. 또한 거의 하루만에 작성한 코드인만큼 다양한 API를 구현하기에는 어려운 점이 있었음을 양해 바랍니다.
>> 깃허브 링크
또 아래는 프론트엔드와 협업하기 위해 작성한 API 명세서입니다.
>> API 명세서

1. 가전기기 등록 API

가전기기에 대한 기본적인 정보는 공공데이터포털(https://www.data.go.kr/)에서 제공하는 엑셀파일을 이용했습니다. 공공데이터포털에서 제공하는 API를 바로 이용하지 않은 이유는 가격과 모델명 필드를 포함시켜 DB에 등록하기 위함입니다.

모델 코드명은 사용자 친화적이지 않기 때문에 모델의 이름 필드가 필요하였고, 가격까지 고려하여 자체점수를 산정하기 위해 가격필드도 추가해주었습니다.

가격과 모델명을 엑셀파일에 추가하는 작업은 인공지능 담당 팀원분께서 데이터 크롤링으로 진행해주셨습니다. 저는 완성된 엑셀파일을 Json파일로 변환한 후 API의 입력으로 넣어 데이터베이스를 완성하였습니다.

가전기기마다 필드가 조금씩 상이하기에 모두 별도의 엔티티로 구성하였습니다.

1) 전기냉방기

전기냉방기 테이블은 전기냉방기 ID, 업체명, 실내기 모델명, 정격냉방능력(W), 냉방기간월간소비전력량(kWh/월)(1:1기준), 냉방기간에너지소비효율(CSPF)(W/W)(1:1기준), 효율등급, 시간당 이산화탄소 배출량, 모델 이름, 가격, tanso_score 필드로 구성하였습니다.

2) 김치냉장고

김치냉장고 테이블은 김치냉장고 ID, 업체명, 모델명, 김치저장실유효내용적(ℓ), 월간소비전력량(kWh/월), 소비자효율등급지표, 효율등급, 시간당 이산화탄소 배출량, 모델 이름, 가격, tanso_score 필드로 구성하였습니다.

3) 전기냉장고

전기냉장고 테이블은 전기냉장고 ID, 업체명, 모델명, 월간소비전력량(kwh/월), 용량, 효율등급, 시간당 이산화탄소 배출량, 최대소비전력량, 연간에너지비용(원), 모델 이름, 가격, tanso_score 필드로 구성하였습니다.

4) 전기세탁기

전기세탁기 테이블은 전기세탁기 ID, 업체명, 모델명, 표준세탁용량(kg), 1회세탁시소비전력량(wh), 효율등급, 소비효율등급부여지표, 시간당 이산화탄소 배출량, 모델 이름, 가격, tanso_score 필드로 구성하였습니다.

2. 가전기기 검색 API

본인의 가전기기를 애플리케이션 내에서 검색할 수 있는 방법으로 2가지 기능을 제공합니다. 첫번째는 직접 텍스트로 모델명을 입력하는 것이고, 두번째는 에너지소비효율등급 사진을 찍어 올리는 것입니다.

1) 텍스트로 검색

시간이 없어 모델의 코드 네임으로 검색하는 API밖에 만들지 못했습니다. 하지만, 모델의 품명으로 검색하는 API도 로직 자체는 같기 때문에 코드를 작성하는 데에 별로 어려움이 없을 것입니다.

① 텍스트 완전 일치

  • 모델명은 가전기기의 분류에 무관하게 unique한 값이므로, 완전일치하는 모델 코드 네임을 입력하면 반드시 하나의 가전기기에 대한 정보만 반환됩니다.

② 부분일치

  • 만약 완전히 일치하는 결과가 없다면 부분일치 검색을 실행합니다.
  • 부분적으로 일치하는 가전기기를 모두 찾아 종류별로 정보를 반환합니다.

    API의 응답이 너무 길기 때문에 반복되는 내용은 생략하여 대강의 결과만 아래에 나타내었습니다.
{
    "isSuccess": true,
    "code": 1000,
    "message": "요청에 성공하였습니다.",
    "result": {
        "airList": [
            {
                "companyName": "LG전자(주)",
                "modelName": "FQ17HDNHCN",
                "coolingCapacity": 7000,
                "monthlyConsumption": 203.0,
                "energyEfficiency": 6.985,
                "grade": "2",
                "emissionsPerHour": 367.0,
                "name": "LG전자 스탠드 에어컨 리모컨 AKB76041401",
                "price": 48400,
                "score": 82
            },
            {
                "companyName": "LG전자(주)",
                "modelName": "FQ17HDNVCN",
                "coolingCapacity": 7000,
                "monthlyConsumption": 203.0,
                "energyEfficiency": 6.985,
                "grade": "2",
                "emissionsPerHour": 367.0,
                "name": "LG전자 LG전자 LG 휘센 정품 스탠드 에어컨 리모컨 FQ17HCNBC2 FQ17HCNBCN FQ17HCNWC2 FQ17HCNWCN FQ17HDNHCN FQ17HDNVCN",
                "price": 64200,
                "score": 82
            }
        ],
        "kimchiList": [
            {
                "companyName": "(주)대유플러스",
                "modelName": "HDKR12FRS",
                "stroageEfficiency": 120.0,
                "monthlyConsumption": 10.39,
                "efficiencyRate": 0.917973262914672,
                "grade": "4",
                "emissionsPerHour": 5.0,
                "name": "롯데하이마트 하이메이드 HDKR12FRS",
                "price": 623660,
                "score": 8
            }          
        ],
        "refList": [],
        "washList": [
            {
                "companyName": "주식회사 위니아",
                "modelName": "HDP-20EEW",
                "washingCapacity": 20,
                "oneTimeConsumption": 109.1,
                "grade": "2",
                "efficiencyRate": 8.6,
                "emissionsPerHour": 46.0,
                "name": "롯데하이마트 하이메이드 HDP-20EEW",
                "price": 962950,
                "score": 78
            },
            {
                "companyName": "주식회사 위니아",
                "modelName": "WWF15HDW",
                "washingCapacity": 15,
                "oneTimeConsumption": 138.6,
                "grade": "5",
                "efficiencyRate": 14.8,
                "emissionsPerHour": 59.0,
                "name": "위니아에이드 WWF15HDW 대우클라쎄세탁기 거름망 세탁기필터먼지망 WWF15HDW 1개",
                "price": 15150,
                "score": 62
            }
        ]
    }
}

2) 사진으로 검색

사용자가 카메라로 찍은 사진을 AWS S3로 업로드하는 API를 작성했습니다. S3에 업로드해야 할 사진은 가전기기에 표시된 에너지소비효율등급입니다. 프론트쪽에서 카메라에 빨간색 가이드라인으로 규격을 만들어주면, 해당 규격에 맞게 사용자가 에너지소비효율 등급을 촬영해야 합니다.

에너지소비효율등급표에는 모델명이 기입되어 있기 때문에 모델명이 위치하는 좌표 값의 글자를 AWS Textract를 이용해 추출할 수 있습니다. (이 부분은 인공지능 담당 팀원이 진행해주셨습니다.) 추출된 모델명은 "텍스트로 검색"하는 API의 입력 값으로 들어와 결과적으로 해당 모델에 대한 상세정보가 반환됩니다.


서버 파트에선 사진을 AWS S3로 업로드하는 코드를 작성했고, 인공지능 파트에선 S3에서 사진을 가져와 모델명을 추출하는 코드를 완성했습니다.

하지만 문제는 S3에 사진이 업로드되어도 인공지능 쪽에서 자동 트리거 함수를 실행하지 못한다는 점이었습니다. 서버환경으로 AWS EC2를 사용하였는데, EC2 서버에서 S3에 함수를 트리거시키는 일은 매우 어렵습니다(불가능할 수도 있습니다).

S3에 함수를 트리거시키기 위해선 AWS의 서버리스 컴퓨팅 서비스인 Lambda와 메시징 큐 서비스인 SQS를 사용해야한다고 멘토님께서 말씀해주셨지만, SQS와 Lambda의 사용법이 생소했던 터라 결국 아이디어를 실현시키지는 못했습니다.

아직까지 아쉬움이 많이 남는 부분입니다. 나중에 시간이 된다면 SQS나 Lambda에 대한 공부를 진행해보고, 포스팅으로 올려보도록 하겠습니다.

3. 품목별 랭킹 조회

사실 백엔드 측에서 쿼리문으로 품목별 랭킹을 얼마든지 매길 수 있었지만, 프론트엔드를 담당하는 팀원분이 랭킹을 본인이 직접 매기는게 편하다며, 그냥 전체 조회 API를 만들어달라고 하였습니다. 그리하여 랭킹을 매기지 않은 상태로, 페이지네이션만 처리하여 프론트 파트로 넘겨주었습니다. 아래는 API의 실행 결과입니다. (score 필드를 기준으로 정렬된 값을 반환하는게 아니라 그냥 무작위 순서로 조회하는 API로 작성했습니다. 랭킹은 프론트엔드 쪽에서 처리해주셨습니다.)

1) 전기냉방기 전체 조회


이것 역시도 응답이 길기 때문에 아래에 대략적으로만 적어놓겠습니다.

{
    "isSuccess": true,
    "code": 1000,
    "message": "요청에 성공하였습니다.",
    "result": {
        "content": [
            {
                "companyName": "LG전자(주)",
                "modelName": "SQ07SCJVAN",
                "coolingCapacity": 2800,
                "monthlyConsumption": 90.1,
                "energyEfficiency": 6.292,
                "grade": "3",
                "emissionsPerHour": 147.0,
                "name": "메카트로 COMBO-119B (LG에어컨 |LP-C233SK|LSNC133S|SQ07SCJVAN|FNQ233DAAW|FNC120CQW|LM-N1120TSD|LT-W402SCJ)",
                "price": 15000,
                "score": 84
            },
            {
                "companyName": "LG전자(주)",
                "modelName": "SQ07SCJGAN",
                "coolingCapacity": 2800,
                "monthlyConsumption": 90.1,
                "energyEfficiency": 6.292,
                "grade": "3",
                "emissionsPerHour": 147.0,
                "name": "SQ07SCJGAN|LM-080NTA|LP-C230S|FUC180DDU|LS-C103S",
                "price": 27300,
                "score": 83
            },
            {
                "companyName": "LG전자(주)",
                "modelName": "SQ07SCJBAN",
                "coolingCapacity": 2800,
                "monthlyConsumption": 90.1,
                "energyEfficiency": 6.292,
                "grade": "3",
                "emissionsPerHour": 147.0,
                "name": "낫투 COMBO-119B (LG에어컨 |LM-357C2M |LTNW1102FM3 |LP-257CA |SQ07SCJBAN |LS-C085AR |FNC165DNSW |LHK1453T)",
                "price": 15000,
                "score": 84
            }
        ],
        "pageable": {
            "sort": {
                "empty": true,
                "sorted": false,
                "unsorted": true
            },
            "offset": 0,
            "pageSize": 50,
            "pageNumber": 0,
            "unpaged": false,
            "paged": true
        },
        "totalPages": 3,
        "last": false,
        "totalElements": 145,
        "size": 50,
        "number": 0,
        "sort": {
            "empty": true,
            "sorted": false,
            "unsorted": true
        },
        "first": true,
        "numberOfElements": 50,
        "empty": false
    }
}

2) 김치냉장고 전체 조회

{
    "isSuccess": true,
    "code": 1000,
    "message": "요청에 성공하였습니다.",
    "result": {
        "content": [
            {
                "companyName": "LG전자(주)",
                "modelName": "K411MB141",
                "stroageEfficiency": 403.1,
                "monthlyConsumption": 14.82,
                "efficiencyRate": 0.0835121307146394,
                "grade": "3",
                "emissionsPerHour": 7.0,
                "name": "LG전자 디오스 김치통 AKC67523734",
                "price": 18000,
                "score": 95
            },
            {
                "companyName": "LG전자(주)",
                "modelName": "K411SS141",
                "stroageEfficiency": 403.1,
                "monthlyConsumption": 14.82,
                "efficiencyRate": 0.0835121307146394,
                "grade": "3",
                "emissionsPerHour": 7.0,
                "name": "LG전자 디오스 김치톡톡 K411SS141 (2022년형)",
                "price": 1798870,
                "score": 75
            },
            {
                "companyName": "주식회사 위니아",
                "modelName": "EDT41GBRZK",
                "stroageEfficiency": 412.3,
                "monthlyConsumption": 14.21,
                "efficiencyRate": 0.0742696814655883,
                "grade": "1",
                "emissionsPerHour": 6.0,
                "name": "위니아 딤채 EDT41GBRZK (2023년형)",
                "price": 4790170,
                "score": 55
            }
        ],
        "pageable": {
            "sort": {
                "empty": true,
                "sorted": false,
                "unsorted": true
            },
            "offset": 0,
            "pageSize": 50,
            "pageNumber": 0,
            "unpaged": false,
            "paged": true
        },
        "totalPages": 4,
        "last": false,
        "totalElements": 190,
        "size": 50,
        "number": 0,
        "sort": {
            "empty": true,
            "sorted": false,
            "unsorted": true
        },
        "first": true,
        "numberOfElements": 50,
        "empty": false
    }
}
            

3) 전기냉장고 전체 조회

{
    "isSuccess": true,
    "code": 1000,
    "message": "요청에 성공하였습니다.",
    "result": {
        "content": [
            {
                "companyName": "주식회사 스타리온성철",
                "modelName": "RCM281JPR",
                "monthlyConsumption": 32.17,
                "volume": 273.1,
                "grade": "2",
                "emissionPerHour": 62000.0,
                "maxPowerConsumption": 273.1,
                "annualCost": 40.19,
                "name": "상품상세설명 참조 LG전자 RCM281JPR 빌트인 냉장고",
                "price": 720000,
                "score": 71
            },
            {
                "companyName": "쿠팡 주식회사",
                "modelName": "F48SDVS",
                "monthlyConsumption": 11.77,
                "volume": 47.0,
                "grade": "5",
                "emissionPerHour": 23000.0,
                "maxPowerConsumption": 47.0,
                "annualCost": 18.49,
                "name": "TCL F48SD",
                "price": 119000,
                "score": 77
            }
        ],
        "pageable": {
            "sort": {
                "empty": true,
                "sorted": false,
                "unsorted": true
            },
            "offset": 0,
            "pageSize": 50,
            "pageNumber": 0,
            "unpaged": false,
            "paged": true
        },
        "totalPages": 6,
        "last": false,
        "totalElements": 293,
        "size": 50,
        "number": 0,
        "sort": {
            "empty": true,
            "sorted": false,
            "unsorted": true
        },
        "first": true,
        "numberOfElements": 50,
        "empty": false
    }
}

4) 전기세탁기 전체 조회

{
    "isSuccess": true,
    "code": 1000,
    "message": "요청에 성공하였습니다.",
    "result": {
        "content": [
            {
                "companyName": "하이얼 전자판매(주)",
                "modelName": "XQB60-1699J",
                "washingCapacity": 0,
                "oneTimeConsumption": 76.5,
                "grade": "1",
                "efficiencyRate": 20.71,
                "emissionsPerHour": 36.0,
                "name": "[해외] 세탁기 컴퓨터 보드 XQB60-1699J 65-1699J 한개옵션0",
                "price": 44800,
                "score": 63
            },
            {
                "companyName": "하이얼 전자판매(주)",
                "modelName": "HWM40FTW",
                "washingCapacity": 0,
                "oneTimeConsumption": 46.9,
                "grade": "1",
                "efficiencyRate": 19.28,
                "emissionsPerHour": 23.0,
                "name": "하이얼 댕댕이 HWM40FTW",
                "price": 197890,
                "score": 69
            }
        ],
        "pageable": {
            "sort": {
                "empty": true,
                "sorted": false,
                "unsorted": true
            },
            "offset": 0,
            "pageSize": 50,
            "pageNumber": 0,
            "unpaged": false,
            "paged": true
        },
        "totalPages": 10,
        "last": false,
        "totalElements": 474,
        "size": 50,
        "number": 0,
        "sort": {
            "empty": true,
            "sorted": false,
            "unsorted": true
        },
        "first": true,
        "numberOfElements": 50,
        "empty": false
    }
}
profile
Java Spring, Android Kotlin(Java), Node.js, React.js 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글