Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#29 BE : [FEAT] 전력량 데이터 API 구현 #37

Merged
merged 13 commits into from
Nov 9, 2024
Merged

Conversation

bbabbi
Copy link
Collaborator

@bbabbi bbabbi commented Nov 7, 2024

✨ Related Issue


📝 기능 구현 명세

1️⃣ DB 전력량 데이터 세팅

  • 전력량을 계산하려면, 전력량 계산에 필요한 데이터가 있어야 하고, 이 기능들을 전부 하나로 담기보다는 테이블을 분리해서 생각하는 것이 좋겠다고 판단했습니다.
  • 그래서 EnergyData Entity를 추가하여, 에너지 데이터를 저장하고, 이후에 EnergyUsage Entity를 통해 계산된 전력량과 그래프 구성에 필요한 정보를 따로 관리하는 방법을 선택했습니다.
  • 또, DB 전력량을 실제 DB에서 가져오는 것 vs TEstBEd 사이트에서 크롤링 해오는 것 두 가지 방법이 있었는데, 우선 두 번째 방법으로 구현하는 것을 선택했습니다.

TEstBEd 페이지가 정적 데이터 형식을 사용하도록 구현되어 있어, Jsoup을 이용하여 구현했습니다.

@Scheduled(fixedRate = 300000) // 5분마다 크롤링
public void crawlData() {
List<String> urls = List.of(
"https://swiu_testbed.dongguk.edu/sensorboard/67/dataview?senMngno=000100010000000067&prjtype=&sengrpcd=0001&prjgrpcd=0001",
"https://swiu_testbed.dongguk.edu/sensorboard/68/dataview?senMngno=000100010000000068&prjtype=&sengrpcd=0001&prjgrpcd=0001"
// 추가 URL
);

  • 여러 페이지에서 데이터를 불러와야하는 형태이기 때문에, URL을 추가하면 하나의 테이블에 데이터가 저장될 수 있도록 구현했으며, 현재는 5145호와 5147호의 스마트콘센트 데이터를 이용했습니다.

2️⃣ 전력량 계산 기능 구현

public EnergyDataService(EnergyDataRepository energyDataRepository) {
this.energyDataRepository = energyDataRepository;
}
public List<EnergyUsageResponse> getAllEnergyUsages() {
return energyDataRepository.findAll().stream()
.map(data -> {
double current = Double.parseDouble(data.getCurrent());
double voltage = Double.parseDouble(data.getVoltage());
double result = current * voltage;
double percentage = (result / THRESHOLD) * 100;
return new EnergyUsageResponse(
data.getSensorNumber(),
data.getDateTime(),
result,
percentage
);
})
.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
}
}

  • current와 voltage를 곱한 값을 threshold로 나누어 100을 곱한 값을 percentage로 반환하도록 구현했습니다.

3️⃣ 전력량 데이터 반환 API 구현

@GetMapping
public List<EnergyUsageResponse> getEnergyUsage() {
return energyDataService.getAllEnergyUsages();
}

  • Service 코드에서 처리한 계산된 값을 반환합니다.

4️⃣ 데이터 초기화

// 매일 자정 테이블 초기화
@Scheduled(cron = "0 0 0 * * *")
public void resetTableData() {
energyDataRepository.deleteAll();
resetAutoIncrement();
System.out.println("데이터베이스 테이블이 초기화되었습니다.");
}
private void resetAutoIncrement() {
String resetSql = "ALTER TABLE energy_data AUTO_INCREMENT = 1";
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.createNativeQuery(resetSql).executeUpdate();
transaction.commit();
} catch (Exception e) {
if (transaction.isActive()) {
transaction.rollback();
}
e.printStackTrace();
} finally {
entityManager.close();
}
}

  • 효율적인 DB 관리를 위해 매일 자정 전력량 데이터가 초기화되도록 구현했으며, 초기화 되면서 id 값도 1로 초기화되도록 구현했습니다.

⭐️ 결과

1) 데이터 크롤링

스크린샷 2024-11-09 오후 9 26 04

2) API 테스트

스크린샷 2024-11-09 오후 9 26 45

@bbabbi bbabbi added the ✨ feat add new feature of project label Nov 7, 2024
@bbabbi bbabbi self-assigned this Nov 7, 2024
@bbabbi bbabbi merged commit 47de7c9 into develop Nov 9, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ feat add new feature of project
Projects
None yet
Development

Successfully merging this pull request may close these issues.

BE : [FEAT] 전력량 데이터 API
1 participant