브이젠
경력근거: 발전소 모니터링, 발전량 예측, 전력시장 입찰 및 정산, ESS 충·방전 최적화, 전력중개, 디지털 O&M
브이젠은 2017년 설립된 VPP(통합발전소) 전문기업으로, 태양광·풍력·ESS 같은 분산된 재생에너지 발전소를 묶어 발전량을 예측하고 전력시장 입찰·정산과 전력중개를 맡아요. 발전사업자는 OPEN 플랫폼에서 시간대별 발전량과 예측오차율, 자원별 수익을 확인해요.
공고는 회사가 '발전소 모니터링, 발전량 예측, 전력시장 입찰 및 정산' 등으로 '재생에너지 발전사업자의 안정적인 발전소 운영과 수익 향상을 지원하고 있습니다'라고 소개해요. 발전량 예측 정산금은 발전소마다 거래시간 단위로, 하루 전에 낸 예측이 실제 발전량과 얼마나 맞았는지에 따라 붙어요. 그래서 한 달 합계만으로는 어느 시간에 얼마를 놓쳤는지 보이지 않고, 예측이 제출되지 않았거나 계량값이 들어오지 않은 시간이 섞이면 줄어든 이유가 더 흐려져요.
공고는 회사가 발전소 모니터링, 발전량 예측, 전력시장 입찰 및 정산, 전력중개로 재생에너지 발전사업자의 발전소 운영과 수익 향상을 지원한다고 소개해요.
공고는 전력시장이 실시간·입찰 중심으로 바뀌면서 분산된 발전자원을 통합해 예측·운영·제어·최적화하는 VPP의 역할이 커지고 있다고 말해요. 회사는 AI 기반 발전량 예측과 최적화 기술로 이 사업을 넓히고 있어요.
주요업무는 AI로 서비스를 개발하고 AI로 유지보수하는 일이에요. 자격요건으로 프론트와 백엔드 기술 스택에 대한 기본 이해와, 만든 것을 배포 URL·GitHub·시연 영상 같은 링크로 보여줄 수 있는 경험을 들어요.
발전사업자와 브이젠 중개 운영 담당자가 거래일이 지난 뒤 함께 열어 보는 관리자 페이지예요. 발전사업자의 발전소마다 그날 거래시간별로 예측 정산금을 받았는지, 받지 못했다면 오차가 컸는지·정산 대상 시간이 아니었는지·예측이 제출되지 않았는지·계량값이 빠졌는지 알려 주고, 발전소별로 받은 정산금을 보여 줘요. 받은 데이터를 담을 DB 설계와 기술·구조는 지원자가 정해요.
브이젠과 전력중개 계약을 맺은 중소 태양광·풍력 발전사업자예요. 예측 정산금은 거래시간마다 따로 매겨져서, 한 달 합계만 보면 어느 날 어느 시간에 정산금을 놓쳤는지, 예측이 빗나간 시간인지 예측이 제출되지 않은 시간인지가 드러나지 않아요.
중개사업자에 위탁된 발전소예요. 한 행이 발전소 한 곳이고 plant_id 가 키예요. producer_id 는 그 발전소를 가진 발전사업자이고, 한 발전소는 발전사업자 한 명에게만 속하지만 한 발전사업자는 여러 발전소를 가질 수 있어요. capacity_kw 는 설비용량(kW)이고, source 는 태양광(solar)과 풍력(wind) 가운데 하나예요. 태양광과 풍력을 함께 가진 발전사업자도 있어요. 큰 데이터는 발전소 300곳이고, 시작용은 그 가운데 발전사업자 PR-047 의 발전소 2곳을 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 2행 가운데 앞 2행이에요.
| plant_id | plant_name | producer_id | source | capacity_kw |
|---|---|---|---|---|
| PL-0072 | 구좌 태양광 5호 | PR-047 | solar | 998 |
| PL-0073 | 한경 풍력 1호 | PR-047 | wind | 3,000 |
2행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 300행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "발전소 한 곳. 키는 plant_id.",
"additionalProperties": false,
"required": [
"plant_id",
"plant_name",
"producer_id",
"source",
"capacity_kw"
],
"properties": {
"plant_id": {
"type": "string",
"pattern": "^PL-[0-9]{4}$",
"description": "발전소 번호. 이 표의 키예요."
},
"plant_name": {
"type": "string",
"description": "발전소 이름(지역·발전원·호기). 발전소마다 달라요."
},
"producer_id": {
"type": "string",
"pattern": "^PR-[0-9]{3}$",
"description": "이 발전소를 가진 발전사업자 코드. 한 발전소는 발전사업자 한 명에게만 속해요."
},
"source": {
"type": "string",
"enum": [
"solar",
"wind"
],
"description": "발전원. solar 는 태양광, wind 는 풍력이에요."
},
"capacity_kw": {
"type": "integer",
"minimum": 1,
"description": "설비용량(kW, 정수)."
}
}
}발전소마다 거래일 하루 전에 제출된 거래시간별 예측 발전량이에요. 한 행이 한 발전소의 한 거래시간이고 plant_id 와 trade_hour 묶음이 키예요. plant_id 는 plants.plant_id 를 가리켜요. trade_hour 는 거래시간이 시작하는 정각(한국 시간)이고 meter_readings 와 같은 거래시간 기준이에요. 이 데이터에서는 예측이 제출되지 않은 거래시간에 행이 없어요. 태양광 발전소의 밤 시간에는 0kWh 예측이 제출돼 있어요. 하루 전체 예측이 빠진 날과 몇 시간만 빠진 날, 예측이 실제와 크게 어긋난 시간, 발전량이 적은 이른 아침·늦은 오후, 밤에도 발전하는 풍력 시간이 들어 있어요. 큰 데이터는 2026년 9월 1일부터 10월 16일까지 46일 동안 발전소 300곳의 예측 329,275행이고, 시작용은 그 마지막 날 PR-047 발전소 2곳의 하루 전체를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 46행 가운데 앞 5행이에요.
| plant_id | trade_hour | forecast_kwh |
|---|---|---|
| PL-0072 | 2026-10-16T00:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T01:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T02:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T03:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T04:00:00+09:00 | 0 |
46행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 329,275행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "한 발전소의 한 거래시간에 제출된 예측. 키는 (plant_id, trade_hour) 묶음.",
"additionalProperties": false,
"required": [
"plant_id",
"trade_hour",
"forecast_kwh"
],
"properties": {
"plant_id": {
"type": "string",
"pattern": "^PL-[0-9]{4}$",
"description": "예측을 낸 발전소. plants.plant_id 를 가리켜요."
},
"trade_hour": {
"type": "string",
"format": "date-time",
"description": "거래시간이 시작하는 시각. 한국 시간(+09:00) ISO 8601, 정각이에요. 13:00 은 13:00~14:00 한 시간을 뜻하고, forecasts 와 meter_readings 가 같은 거래시간 기준을 써요."
},
"forecast_kwh": {
"type": "integer",
"minimum": 0,
"description": "거래일 하루 전에 제출된, 이 거래시간 한 시간 동안의 예측 발전량(kWh, 정수)."
}
}
}발전소마다 거래시간 한 시간 동안 계량된 실제 발전량이에요. 한 행이 한 발전소의 한 거래시간이고 plant_id 와 trade_hour 묶음이 키예요. plant_id 는 plants.plant_id 를 가리키고, trade_hour 는 forecasts 와 같은 거래시간 기준이에요. 이 데이터에서는 계량값이 들어오지 않은 거래시간에 행이 없어요. 한 시간만 빠진 경우와 두세 시간 이어서 빠진 경우, 같은 시간에 예측도 함께 빠진 경우가 들어 있어요. 큰 데이터는 46일 동안 발전소 300곳의 계량값 329,943행이고, 시작용은 마지막 날 PR-047 발전소 2곳의 하루 전체를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 47행 가운데 앞 5행이에요.
| plant_id | trade_hour | actual_kwh |
|---|---|---|
| PL-0072 | 2026-10-16T00:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T01:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T02:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T03:00:00+09:00 | 0 |
| PL-0072 | 2026-10-16T04:00:00+09:00 | 0 |
47행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 329,943행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "한 발전소의 한 거래시간 계량값. 키는 (plant_id, trade_hour) 묶음.",
"additionalProperties": false,
"required": [
"plant_id",
"trade_hour",
"actual_kwh"
],
"properties": {
"plant_id": {
"type": "string",
"pattern": "^PL-[0-9]{4}$",
"description": "계량한 발전소. plants.plant_id 를 가리켜요."
},
"trade_hour": {
"type": "string",
"format": "date-time",
"description": "거래시간이 시작하는 시각. 한국 시간(+09:00) ISO 8601, 정각이에요. 13:00 은 13:00~14:00 한 시간을 뜻하고, forecasts 와 meter_readings 가 같은 거래시간 기준을 써요."
},
"actual_kwh": {
"type": "integer",
"minimum": 0,
"description": "그 거래시간 한 시간 동안 계량된 실제 발전량(kWh, 정수)."
}
}
}발전량 예측 정산의 단가 구간으로, 제도에 정해져 있는 값이에요. 한 행이 한 구간이고 band_id 가 키예요. 오차율은 그 거래시간의 예측 발전량과 계량값 차이의 크기를 발전소 설비용량으로 나눈 비율이에요. 오차율이 max_error_pct 이하인 구간 가운데 상한이 가장 낮은 구간의 won_per_kwh 를 계량 발전량 1kWh 마다 받고, 어느 구간에도 들지 않으면 그 시간 정산금은 없어요. min_utilization_pct 는 정산 대상이 되는 거래시간의 최소 이용률(계량값을 설비용량으로 나눈 비율)로, 모든 구간에 같은 값이 적혀 있어요. 큰 데이터와 시작용이 같은 2행이에요.
전체 2행 가운데 앞 2행이에요.
| band_id | max_error_pct | won_per_kwh | min_utilization_pct |
|---|---|---|---|
| B1 | 6 | 4 | 10 |
| B2 | 8 | 3 | 10 |
2행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 2행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "예측 정산 단가 구간 하나. 키는 band_id.",
"additionalProperties": false,
"required": [
"band_id",
"max_error_pct",
"won_per_kwh",
"min_utilization_pct"
],
"properties": {
"band_id": {
"type": "string",
"pattern": "^B[0-9]$",
"description": "구간 코드. 이 표의 키예요."
},
"max_error_pct": {
"type": "integer",
"minimum": 1,
"description": "이 구간 단가를 받는 오차율의 상한(%, 이 값과 같아도 이 구간). 오차율은 그 거래시간의 예측 발전량과 계량값 차이의 크기를 설비용량으로 나눈 비율이에요."
},
"won_per_kwh": {
"type": "integer",
"minimum": 1,
"description": "이 구간에서 계량 발전량 1kWh 마다 받는 정산 단가(원, 정수)."
},
"min_utilization_pct": {
"type": "integer",
"minimum": 0,
"description": "정산 대상이 되는 거래시간의 최소 이용률(%). 이용률은 그 거래시간 계량값을 설비용량으로 나눈 비율이고, 이 값에 못 미치는 거래시간은 정산 대상이 아니에요. 모든 구간에 같은 값이 적혀 있어요."
}
}
}