인생2막
인턴·신입근거: 운영 중인 고객 시스템의 장애를 추적해 원인을 찾고, 대응한 뒤 재발 방지책까지 정리합니다.
인생2막은 고객사의 문제를 AI로 해결하는 AX 일을 하고, 부업·수익화 온라인 강의 플랫폼 인생2막클래스를 운영하는 회사예요. 공고에 따르면 월 수천만원 규모의 AX 계약이 진행 중이에요.
공고는 이 자리가 할 일로 '운영 중인 고객 시스템의 장애를 추적해 원인을 찾고, 대응한 뒤 재발 방지책까지 정리합니다'와 '진행 상황과 성과를 고객이 이해하는 말로 정리해 주간, 월간 단위로 보고합니다'를 꼽아요. 방지책이 효과가 있었는지는 적용한 뒤의 로그를 봐야 알 수 있고, 그사이 로그가 비어 있으면 오류가 없었는지 로그가 안 남았는지 가를 수 없어요. 장애 기록과 로그를 손으로 맞춰 보면 장애로 열지 않은 채 이어지는 오류도 보고에서 빠지기 쉬워요.
공고는 주요업무로 운영 중인 고객 시스템의 장애를 추적해 원인을 찾고, 대응한 뒤 재발 방지책까지 정리하는 일을 꼽아요.
공고는 진행 상황과 성과를 고객이 이해하는 말로 정리해 주간, 월간 단위로 보고하는 일을 이 자리에 맡겨요. 자격요건에는 결론부터 짧고 명확하게 소통하는 분을 적었어요.
자격요건에 추측보다 직접 확인한 사실로 보고하는 분을 적었어요. 일하는 방식으로는 요청을 받는 데서 끝나지 않고 고객의 문제가 실제로 풀렸는지까지 본다고 밝혀요.
FDE가 고객에게 주간 보고를 보내기 전에 돌려 보는 명령줄 도구예요. 고객 시스템과 보고할 주를 고르면, 그 주에 보고할 장애마다 방지책을 적용한 뒤 같은 오류가 다시 났는지, 방지책 없이 오류가 이어지는지, 로그가 비어 있어 확인할 수 없는지 알려 주고, 장애로 열지 않은 채 이어진 오류도 따로 짚어 줘요. 받은 데이터를 담을 DB 설계와 기술·구조, 그리고 장애로 열어야 할 오류 횟수와 로그가 끊겼다고 볼 시간 기준은 지원자가 정해요.
고객사 시스템 운영을 맡은 신입 FDE예요. 장애마다 원인을 찾아 재발 방지책을 적용하지만, 주간 보고를 쓸 때 장애 기록과 로그를 하나씩 맞춰 보다 보면 방지책 뒤 같은 오류가 다시 났는지, 장애로 열지 않은 오류나 로그가 비어 있는 시간이 있는지 놓치기 쉬워요.
고객 시스템을 이루는 서비스 목록이에요. 한 행이 서비스 하나이고 service_id 가 키예요. system_id 는 그 서비스가 속한 고객 시스템(CS-01~CS-03)이고, 한 서비스는 한 고객 시스템에만 속해요. name 은 사람이 부르는 이름이라, 고객 시스템이 다르면 API 서버·배치 작업 같은 같은 이름이 다시 나와요. 큰 데이터는 고객 시스템 세 곳의 서비스 12개 전부이고, 시작용은 그 가운데 CS-01 의 서비스 5개를 같은 ID·같은 값으로 담았어요.
전체 5행 가운데 앞 5행이에요.
| service_id | system_id | name |
|---|---|---|
| SV-01 | CS-01 | API 서버 |
| SV-02 | CS-01 | 인증 서버 |
| SV-03 | CS-01 | 배치 작업 |
| SV-04 | CS-01 | 알림 발송 |
| SV-05 | CS-01 | 관리자 화면 |
5행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 12행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "고객 시스템의 서비스 하나. 키는 service_id.",
"additionalProperties": false,
"required": [
"service_id",
"system_id",
"name"
],
"properties": {
"service_id": {
"type": "string",
"pattern": "^SV-[0-9]{2}$",
"description": "서비스 번호. 이 표의 키예요."
},
"system_id": {
"type": "string",
"pattern": "^CS-[0-9]{2}$",
"description": "이 서비스가 속한 고객 시스템 코드(CS-01~CS-03). 한 서비스는 한 고객 시스템에만 속해요."
},
"name": {
"type": "string",
"enum": [
"API 서버",
"인증 서버",
"배치 작업",
"알림 발송",
"관리자 화면"
],
"description": "사람이 부르는 서비스 이름. 고객 시스템이 다르면 같은 이름이 다시 나와요."
}
}
}고객 시스템의 서비스들이 남긴 로그를 모은 기록이에요. 한 행이 로그 한 줄이고 log_id 가 키예요. service_id 는 그 줄을 남긴 서비스로 services.service_id 를 가리켜요. 이 데이터에는 서비스마다 매시 정해진 분에 남기는 상태 확인 줄과 서비스를 다시 시작할 때 남기는 줄(둘 다 info), 그리고 경고(warn)와 오류(error) 줄만 모았고, 요청 하나하나의 줄은 담지 않았어요. error_code 는 warn·error 줄의 오류 코드이고 info 줄에서는 null 이에요. 같은 오류 코드가 다른 서비스에서도 나와요. logged_at 은 서비스가 그 줄을 쓴 시각으로, 그 서비스 서버의 시계로 찍은 한국 시간이에요. 서버 시계는 서로 맞춰져 있어 incidents 의 opened_at·prevented_at 과 바로 견줄 수 있어요. 장애로 기록된 오류가 몰려 나는 때, 방지책을 적용한 뒤 며칠 조용하다가 같은 오류가 다시 나는 경우, 장애로 기록되지 않은 채 같은 오류가 이어지는 경우, 한 서비스의 줄이 몇 시간 동안 하나도 없다가 다시 이어지는 때(짧게 빈 때와 길게 빈 때), 같은 오류 코드가 다른 서비스에서 나는 경우, 같은 오류 코드가 warn 으로만 남은 경우가 들어 있어요. 큰 데이터는 2026년 4월 27일 0시부터 10월 26일 0시 전까지 서비스 12개가 남긴 줄 전부이고, 시작용은 그 마지막 7일(10월 19일 월요일 0시부터 10월 26일 0시 전까지) 동안 CS-01 의 서비스 5개가 남긴 줄 전부를 같은 ID·같은 값으로 잘라 낸 것이에요.
전체 955행 가운데 앞 5행이에요.
| log_id | service_id | level | error_code | message | logged_at |
|---|---|---|---|---|---|
| LG-0053240 | SV-03 | info | — | 상태 확인 | 2026-10-19T00:05:55+09:00 |
| LG-0053241 | SV-05 | info | — | 상태 확인 | 2026-10-19T00:10:07+09:00 |
| LG-0053243 | SV-02 | info | — | 상태 확인 | 2026-10-19T00:20:44+09:00 |
| LG-0053246 | SV-04 | info | — | 상태 확인 | 2026-10-19T00:35:28+09:00 |
| LG-0053249 | SV-01 | info | — | 상태 확인 | 2026-10-19T00:50:23+09:00 |
955행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 55,416행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "서비스가 남긴 로그 한 줄. 키는 log_id.",
"additionalProperties": false,
"required": [
"log_id",
"service_id",
"level",
"error_code",
"message",
"logged_at"
],
"properties": {
"log_id": {
"type": "string",
"pattern": "^LG-[0-9]{7}$",
"description": "로그 줄 번호. 이 표의 키이고, 모든 서비스의 줄에 시각 순으로 붙어 있어요."
},
"service_id": {
"type": "string",
"pattern": "^SV-[0-9]{2}$",
"description": "이 줄을 남긴 서비스. services.service_id 를 가리켜요."
},
"level": {
"type": "string",
"enum": [
"info",
"warn",
"error"
],
"description": "info 는 상태 확인 줄과 서비스를 다시 시작한 줄, warn 은 재시도해서 넘어간 오류, error 는 처리하지 못한 오류예요."
},
"error_code": {
"type": [
"string",
"null"
],
"pattern": "^[A-Z0-9_]+$",
"description": "warn·error 줄의 오류 코드. info 줄에서는 null 이에요. 같은 코드가 다른 서비스에서도 나와요."
},
"message": {
"type": "string",
"description": "그 줄의 짧은 내용. warn·error 줄은 level 과 오류 코드가 같으면 같은 글이고, info 줄은 '상태 확인'과 '서비스 다시 시작' 두 가지예요."
},
"logged_at": {
"type": "string",
"format": "date-time",
"description": "서비스가 이 줄을 쓴 시각. 그 서비스 서버의 시계로 찍은 한국 시간(+09:00) ISO 8601, 초 단위예요. 서버 시계는 서로 맞춰져 있어요."
}
}
}고객 시스템에서 난 장애를 하나씩 적은 기록이에요. 한 행이 장애 하나이고 incident_id 가 키예요. service_id 는 장애가 난 서비스로 services.service_id 를 가리키고, error_code 는 그 장애의 오류 코드로 service_logs.error_code 와 같은 글자로 적혀 있어요. 한 장애는 서비스 하나·오류 코드 하나에 대한 기록이고, 같은 서비스·오류 코드로 나중에 장애를 다시 연 경우도 있어요. opened_at 은 장애 기록을 연 시각으로, 대개 그 오류가 처음 난 뒤예요. prevented_at 은 재발 방지책을 배포해 적용한 시각으로 배포 기록의 시각을 옮겨 적었고, prevention 은 그 방지책을 짧게 적은 글이에요. 2026년 10월 26일 0시까지 방지책을 적용하지 않은 장애는 둘 다 null 이에요. 시각은 모두 한국 시간이고 service_logs.logged_at 과 같은 기준이에요. 한 주에 열고 다음 주에 방지책을 적용한 장애, 몇 달 전에 방지책을 적용한 장애와 같은 서비스·오류 코드로 다시 연 장애, 아직 방지책을 적용하지 않은 장애가 들어 있어요. 큰 데이터는 2026년 4월 27일부터 10월 25일까지 고객 시스템 세 곳에서 연 장애 전부이고, 시작용은 그 가운데 CS-01 의 장애 전부를 같은 ID·같은 값으로 담았어요.
전체 36행 가운데 앞 5행이에요.
| incident_id | service_id | error_code | title | opened_at | prevented_at | prevention |
|---|---|---|---|---|---|---|
| INC-0001 | SV-03 | DISK_FULL | 배치 작업 디스크 공간 부족 | 2026-04-30T09:27:00+09:00 | 2026-05-03T20:17:00+09:00 | 오래된 파일 정리 작업 추가 |
| INC-0008 | SV-04 | TEMPLATE_ERROR | 알림 발송 알림 템플릿 오류 | 2026-05-06T16:49:00+09:00 | 2026-05-13T04:19:00+09:00 | 템플릿 변수 검증 추가 |
| INC-0010 | SV-04 | PUSH_REJECTED | 알림 발송 푸시 거절로 알림 누락 | 2026-05-11T14:11:00+09:00 | 2026-05-13T22:26:00+09:00 | 푸시 요청 형식 수정 |
| INC-0013 | SV-01 | CERT_EXPIRED | API 서버 인증서 만료로 접속 실패 | 2026-05-17T10:13:00+09:00 | 2026-05-19T12:03:00+09:00 | 인증서 갱신 자동화 |
| INC-0016 | SV-05 | EXPORT_TIMEOUT | 관리자 화면 내보내기 시간 초과 | 2026-05-22T20:22:00+09:00 | 2026-05-26T13:32:00+09:00 | 내보내기를 비동기 작업으로 변경 |
36행 전부를 JSON 파일 하나로 받을 수 있어요.
같은 형식으로 만든 115행이에요. 위 데이터가 이 안에 그대로 들어 있어요(한 줄에 한 행, gzip 압축).
미리보기와 내려받는 데이터 모두 이 형식(JSON Schema)을 따라요.
{
"type": "object",
"description": "장애 기록 하나. 키는 incident_id.",
"additionalProperties": false,
"required": [
"incident_id",
"service_id",
"error_code",
"title",
"opened_at",
"prevented_at",
"prevention"
],
"properties": {
"incident_id": {
"type": "string",
"pattern": "^INC-[0-9]{4}$",
"description": "장애 번호. 이 표의 키이고, 고객 시스템 세 곳이 한 번호 체계를 열린 순서대로 써요."
},
"service_id": {
"type": "string",
"pattern": "^SV-[0-9]{2}$",
"description": "장애가 난 서비스. services.service_id 를 가리켜요."
},
"error_code": {
"type": "string",
"pattern": "^[A-Z0-9_]+$",
"description": "이 장애의 오류 코드. service_logs.error_code 와 같은 글자로 적혀 있어요."
},
"title": {
"type": "string",
"description": "장애를 열 때 적은 한 줄 제목."
},
"opened_at": {
"type": "string",
"format": "date-time",
"description": "장애 기록을 연 시각. 한국 시간(+09:00) ISO 8601, 초 단위예요."
},
"prevented_at": {
"type": [
"string",
"null"
],
"format": "date-time",
"description": "재발 방지책을 배포해 적용한 시각. 배포 기록의 시각을 옮겨 적은 한국 시간(+09:00)이에요. 2026-10-26 0시까지 방지책을 적용하지 않은 장애는 null 이에요."
},
"prevention": {
"type": [
"string",
"null"
],
"description": "적용한 재발 방지책을 짧게 적은 글. prevented_at 이 null 이면 이것도 null 이에요."
}
}
}근거: 운영 중인 고객 시스템의 장애를 추적해 원인을 찾고, 대응한 뒤 재발 방지책까지 정리합니다.