레브잇
경력근거: 40~60대 유저들이 올팜을 계속 찾아오게 만드는 데 필요한 이니셔티브를 데이터와 유저의 목소리에서 찾고
레브잇은 여럿이 함께 사면 값이 내려가는 팀구매 방식의 식품·생필품 커머스 앱 올웨이즈를 운영해요. 이 자리가 합류하는 올팜은 고객이 발견형 쇼핑 기반의 미션에 참여하며 무료 작물을 재배하고 수확하는 앱테크형 커머스 서비스예요.
공고는 이 자리가 할 일로 '40~60대 유저들이 올팜을 계속 찾아오게 만드는 데 필요한 이니셔티브를 데이터와 유저의 목소리에서 찾고, PO·디자이너와 함께 해결할 과제를 구체화합니다'를 꼽고, 우대사항에 '사내 운영 도구, 어드민, 업무 자동화 시스템 등 내부 사용자를 위한 제품을 직접 기획·개발·운영하고'를 적었어요. 작물 재배는 심고, 키우고, 수확하는 일이 차례로 이어지는 흐름이라, 고객이 멈추는 자리도 키우는 도중·수확 앞·수확 뒤로 갈라져요. 멈춘 자리마다 고객이 다시 찾아오게 할 과제가 달라져요.
공고는 40~60대 유저들이 올팜을 계속 찾아오게 만드는 데 필요한 이니셔티브를 데이터와 유저의 목소리에서 찾고, PO·디자이너와 함께 해결할 과제를 구체화하는 일을 이 자리의 업무로 꼽아요.
공고는 올팜을 고객이 발견형 쇼핑 기반의 미션에 참여하며 무료 작물을 재배하고 수확할 수 있는 앱테크형 커머스 서비스로 소개해요. 리텐션 스쿼드는 고객이 올팜에서 가치를 느끼고 꾸준히 이용하도록 제품 경험을 개선하는 팀이에요.
공고는 반복되는 개발·실험·운영 업무를 자동화하고 필요한 내부 도구를 만드는 일을 이 자리에 맡겨요. 우대사항에는 사내 운영 도구·어드민처럼 내부 사용자를 위한 제품을 직접 기획·개발·운영해 본 경험을 꼽았어요.
리텐션 스쿼드의 PO가 디자이너·엔지니어와 다음에 풀 과제를 고를 때 여는 관리자 페이지예요. 기준 시각까지 작물을 심은 적 있는 고객마다 작물 키우기가 이어지는지, 미션 참여가 끊겼는지, 다 자란 작물을 수확하지 않았는지, 수확한 뒤 새 작물을 심지 않았는지 알려 주고, 묶음마다 고객이 몇 명인지 보여 줘요. 받은 데이터를 담을 DB 설계와 기술·구조, 그리고 멈췄다고 볼 기간은 지원자가 정해요.
올팜 리텐션 스쿼드의 PO예요. 작물을 심고 미션으로 키워 수확하는 흐름은 한 번에 끝나지 않아서, 고객마다 어느 자리에서 멈췄는지 따로 보지 않으면 키우다 멈춘 고객과 다 자란 작물 앞에서 멈춘 고객, 수확 뒤 다시 심지 않은 고객이 한 묶음으로 보여 다음에 풀 과제를 정하기 어려워요.
고객이 올팜에서 심은 작물이에요. 한 행이 작물 하나이고 crop_id 가 키예요. user_id 는 작물을 심은 고객이고, crop_kind 는 crop_kinds.crop_kind 를 가리켜요. planted_at 은 고객이 그 작물을 심은 시각이에요. 이 데이터에서는 한 고객이 한 번에 작물 하나만 키우고, 앞 작물을 수확한 뒤에만 다음 작물을 심어요. 마지막 기준 시각 전날 밤에 처음 심어 그때까지 미션 기록이 없는 작물, 수확한 그 자리에서 바로 다음 작물을 심은 고객, 수확한 뒤 며칠 동안 다음 작물이 없는 고객, 마지막 기준 시각 뒤에 새로 심은 작물이 들어 있어요. 큰 데이터는 고객 2,400명이 8월 1일부터 10월 21일 12:00 전까지 심은 작물 전부이고, 시작용은 그 가운데 10월에 처음 작물을 심은 고객 12명의 작물 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 21행 가운데 앞 5행이에요.
| crop_id | user_id | crop_kind | planted_at |
|---|---|---|---|
| CR-112836 | U-20417 | 양파 | 2026-10-04T12:31:09+09:00 |
| CR-113265 | U-30121 | 양파 | 2026-10-05T16:40:27+09:00 |
| CR-113317 | U-15268 | 양파 | 2026-10-05T19:40:02+09:00 |
| CR-114393 | U-20417 | 고구마 | 2026-10-08T18:22:09+09:00 |
| CR-114660 | U-15268 | 고구마 | 2026-10-09T13:20:17+09:00 |
21행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 19,318행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "고객이 심은 작물 하나. 키는 crop_id.",
"additionalProperties": false,
"required": [
"crop_id",
"user_id",
"crop_kind",
"planted_at"
],
"properties": {
"crop_id": {
"type": "string",
"pattern": "^CR-[0-9]{6}$",
"description": "작물 번호. 이 표의 키예요."
},
"user_id": {
"type": "string",
"pattern": "^U-[0-9]{5}$",
"description": "작물을 심은 고객 번호."
},
"crop_kind": {
"type": "string",
"description": "작물 종류. crop_kinds.crop_kind 를 가리켜요."
},
"planted_at": {
"type": "string",
"format": "date-time",
"description": "고객이 작물을 심은 시각. 한국 시간(+09:00) ISO 8601, 초 단위예요. 이 데이터의 시각은 모두 같은 서비스 서버 시계로 찍었어요."
}
}
}고객이 미션을 마칠 때마다 남은 기록이에요. 한 행이 미션 완료 한 번이고 log_id 가 키예요. crop_id 는 그 미션으로 성장 포인트를 받은 작물(그때 키우던 작물)로 farm_crops.crop_id 를 가리키고, user_id 는 그 작물을 심은 고객(farm_crops.user_id)과 같아요. growth_points 는 그 미션으로 작물이 받은 성장 포인트예요. 이 데이터에서는 작물이 받은 포인트를 더한 값이 수확 기준(crop_kinds.points_to_harvest)에 닿으면, 그 뒤로는 그 작물에 미션 기록이 붙지 않아요. 며칠 쉬었다가 다시 미션을 시작한 고객, 마지막 미션 뒤로 며칠째 기록이 없는 작물, 받은 포인트가 수확 기준과 똑같이 찬 작물, 마지막 기준 시각 한 시간쯤 뒤에 마친 미션이 들어 있어요. 큰 데이터는 고객 2,400명이 10월 21일 12:00 전까지 마친 미션 전부이고, 시작용은 그 가운데 고객 12명의 미션 기록 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 61행 가운데 앞 5행이에요.
| log_id | user_id | crop_id | mission_id | completed_at | growth_points |
|---|---|---|---|---|---|
| ML-1060804 | U-20417 | CR-112836 | MS-05 | 2026-10-05T20:02:44+09:00 | 200 |
| ML-1061299 | U-15268 | CR-113317 | MS-04 | 2026-10-06T08:12:19+09:00 | 150 |
| ML-1061371 | U-20417 | CR-112836 | MS-03 | 2026-10-06T08:51:30+09:00 | 120 |
| ML-1061377 | U-30121 | CR-113265 | MS-05 | 2026-10-06T08:55:12+09:00 | 200 |
| ML-1064272 | U-30121 | CR-113265 | MS-04 | 2026-10-07T20:11:39+09:00 | 150 |
61행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 88,950행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "미션 완료 한 번. 키는 log_id.",
"additionalProperties": false,
"required": [
"log_id",
"user_id",
"crop_id",
"mission_id",
"completed_at",
"growth_points"
],
"properties": {
"log_id": {
"type": "string",
"pattern": "^ML-[0-9]{7}$",
"description": "미션 기록 번호. 이 표의 키예요."
},
"user_id": {
"type": "string",
"pattern": "^U-[0-9]{5}$",
"description": "미션을 마친 고객 번호. crop_id 작물을 심은 고객(farm_crops.user_id)과 같아요."
},
"crop_id": {
"type": "string",
"pattern": "^CR-[0-9]{6}$",
"description": "그 미션으로 성장 포인트를 받은 작물. farm_crops.crop_id 를 가리켜요."
},
"mission_id": {
"type": "string",
"pattern": "^MS-[0-9]{2}$",
"description": "마친 미션의 코드(MS-01~MS-07)."
},
"completed_at": {
"type": "string",
"format": "date-time",
"description": "고객이 미션을 마친 시각. 한국 시간(+09:00) ISO 8601, 초 단위예요. 이 데이터의 시각은 모두 같은 서비스 서버 시계로 찍었어요."
},
"growth_points": {
"type": "integer",
"minimum": 1,
"description": "그 미션으로 작물이 받은 성장 포인트(정수)."
}
}
}작물 종류마다 정해진 수확 기준이에요. 한 행이 작물 종류 하나이고 crop_kind 가 키이며, farm_crops.crop_kind 가 이 칸을 가리켜요. points_to_harvest 는 이 종류의 작물 하나가 받은 성장 포인트를 더한 값이 이 값과 같거나 크면 수확할 수 있게 되는 기준이에요. 이름 앞부분만 다른 두 작물(토마토와 방울토마토)이 있고, 두 작물의 기준은 서로 달라요. 시작용과 큰 데이터가 같은 7행이에요.
전체 7행 가운데 앞 5행이에요.
| crop_kind | points_to_harvest |
|---|---|
| 당근 | 450 |
| 양파 | 500 |
| 감자 | 600 |
| 방울토마토 | 700 |
| 고구마 | 800 |
7행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 7행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "작물 종류 하나와 그 수확 기준. 키는 crop_kind.",
"additionalProperties": false,
"required": [
"crop_kind",
"points_to_harvest"
],
"properties": {
"crop_kind": {
"type": "string",
"description": "작물 종류 이름. 이 표의 키예요."
},
"points_to_harvest": {
"type": "integer",
"minimum": 1,
"description": "이 종류의 작물을 수확할 수 있게 되는 성장 포인트(정수). 한 작물이 받은 포인트를 더한 값이 이 값과 같거나 크면 수확할 수 있어요."
}
}
}고객이 다 자란 작물을 수확한 기록이에요. 한 행이 수확 한 번이고, 작물 하나는 한 번만 수확하므로 crop_id 가 이 표의 키이자 farm_crops.crop_id 를 가리키는 참조예요. harvested_at 은 고객이 수확한 시각이에요. 포인트가 찬 그 자리에서 바로 수확한 작물, 다 찬 뒤 반나절 넘게 지나서 수확한 작물, 마지막 기준 시각 몇 분 뒤에 수확한 작물이 들어 있어요. 포인트가 다 찼는데 아직 수확하지 않은 작물은 이 표에 행이 없어요. 큰 데이터는 고객 2,400명이 10월 21일 12:00 전까지 수확한 기록 전부이고, 시작용은 그 가운데 고객 12명의 수확 기록 전부를 같은 값으로 잘라 낸 것이에요.
전체 10행 가운데 앞 5행이에요.
| crop_id | harvested_at |
|---|---|
| CR-112836 | 2026-10-08T18:21:30+09:00 |
| CR-113265 | 2026-10-09T08:12:40+09:00 |
| CR-113317 | 2026-10-09T13:19:05+09:00 |
| CR-115133 | 2026-10-13T07:29:33+09:00 |
| CR-115576 | 2026-10-14T21:10:01+09:00 |
10행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 17,327행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "작물 하나의 수확. 키는 crop_id.",
"additionalProperties": false,
"required": [
"crop_id",
"harvested_at"
],
"properties": {
"crop_id": {
"type": "string",
"pattern": "^CR-[0-9]{6}$",
"description": "수확한 작물. 이 표의 키이고 farm_crops.crop_id 를 가리켜요."
},
"harvested_at": {
"type": "string",
"format": "date-time",
"description": "고객이 작물을 수확한 시각. 한국 시간(+09:00) ISO 8601, 초 단위예요. 이 데이터의 시각은 모두 같은 서비스 서버 시계로 찍었어요."
}
}
}리텐션 스쿼드가 고객별 진행 상황을 볼 기준 시각이에요. 한 행이 기준 시각 하나이고 view_id 가 키예요. viewed_at 이 이 기능이 '지금'으로 삼는 시각이에요. 다른 표의 기록은 10월 21일 12:00 전까지 있어서, 기준 시각보다 늦게 남은 기록도 들어 있어요. 큰 데이터는 9월 2일부터 10월 21일까지 매주 수요일 09:00 의 8행이고, 시작용은 마지막 10월 21일 09:00 한 행이에요.
전체 1행 가운데 앞 1행이에요.
| view_id | viewed_at |
|---|---|
| SV-008 | 2026-10-21T09:00:00+09:00 |
1행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 8행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "진행 상황을 볼 기준 시각 하나. 키는 view_id.",
"additionalProperties": false,
"required": [
"view_id",
"viewed_at"
],
"properties": {
"view_id": {
"type": "string",
"pattern": "^SV-[0-9]{3}$",
"description": "기준 시각 번호. 이 표의 키예요."
},
"viewed_at": {
"type": "string",
"format": "date-time",
"description": "고객별 진행 상황을 볼 기준 시각. 이 기능이 '지금'으로 삼는 시각이에요. 한국 시간(+09:00) ISO 8601 이에요."
}
}
}