Repository navigation
Releases: thsvkd/jari-android
Release list
4.24.0 — 코레일 예약 대기
매진 열차에 코레일 공식 예약 대기를 먼저 권하고, 자리 찾기가 코레일 계정을 지키도록 바꿉니다.
- 예약 대기가 되는 매진 열차는 열차 카드 첫 줄에서 바로 "코레일 예약 대기 신청"을 할 수 있습니다. 한 번 신청하면 코레일이 취소표를 배정하므로 계속 조회하지 않습니다. 일반실만 되고 좌석 위치·방향은 고를 수 없어, 특실이나 좌석 조건이 필요하면 취소표 자리 찾기를 고릅니다.
- 신청한 대기는 홈과 자세히 보기에 카드로 보입니다. 10분 이상 간격으로 확인해 좌석이 배정된 것 같으면 알리고, 결제는 코레일 앱에서 직접 합니다. 대기 중에는 카드에서 취소할 수 있습니다.
- 자리 찾기는 3초 안팎 간격으로 조회합니다. 코레일이 접속을 막은 것 같은 응답을 받으면 그 자리에서 멈추고, 응답이 10분 넘게 없거나 1시간 동안 자리가 나지 않아도 멈춘 뒤 알립니다.
서버는 이 버전과 함께 이미 배포되어 있습니다. Play 설치본과 직접 설치한 APK는 서명이 달라 서로 업데이트되지 않으니, 같은 배포 경로로 업데이트해 주세요. 4.23.0 이상의 직접 설치본은 설정의 업데이트 확인에서 이 버전을 받을 수 있습니다.
검증: 프런트엔드·서버 유닛·통합·헤드리스 레이아웃 검사와 이 Mac 에뮬레이터 기기 단계(npm run verify)를 통과했습니다. 예약 대기의 대기 중 상태와 취소는 실제 코레일 계정으로 신청·취소해 확인했고, 좌석 배정 뒤의 응답은 아직 실제로 보지 못했습니다(배정은 "배정된 것 같아요"로만 알립니다).
4.23.0
설정의 앱 업데이트를 Android 앱 패키지 전체를 설치하는 방식으로 바꿉니다.
- Google Play 설치본은 Play의 즉시 업데이트 화면을 사용합니다.
- GitHub APK 설치본은 새 APK를 확인·다운로드한 뒤 Android 시스템 설치 화면으로 이어집니다. 서명, 파일 해시, 패키지, 버전, 설치 인증서를 확인합니다.
- 업데이트 취소 후 다시 시도할 수 있고, 앱을 교체해도 저장된 로그인 정보는 유지됩니다.
- 이전 웹 OTA 파일과 경로를 정리하고 새 APK에 포함된 화면으로 시작합니다.
기존 4.22.0 / 4.22.0-web.2에서 이 기능을 쓰려면 이번 4.23.0 앱을 먼저 설치해야 합니다. 이후 앱 내 버튼으로 다음 앱 버전을 확인할 수 있습니다. Play 설치본과 직접 설치한 APK는 서명이 다르므로 같은 배포 경로로 업데이트해 주세요.
검증: 프런트엔드·서버·통합·레이아웃 검사, 공식 Play Fake SDK의 에뮬레이터 검사, Android 시스템 설치를 통한 실제 APK 버전 교체 및 Keystore 세션 유지 검사를 통과했습니다. Play Fake SDK 검사는 실제 Play 배포 서버를 통한 패키지 교체와 구분합니다.
4.22.0 — 앱 내 화면 업데이트
설정에서 업데이트를 확인하고 APK를 매번 다시 설치하지 않고 화면과 로직을 업데이트할 수 있습니다.
- 구글 연결을 해제해도 요청한 휴대폰의 앱 로그인은 유지합니다. 다른 휴대폰의 세션과 진행 중인 구글 연결 요청은 해제합니다.
- 빈 탭에 체험·오프라인 배너가 있어도 빈 여백 때문에 스크롤되지 않습니다. 긴 설정·폼·목록은 끝까지 내릴 수 있습니다.
- 업데이트 서명을 검증하고, 실행되지 않는 업데이트는 이전 화면으로 자동 복구합니다.
- 적용하면 화면이 다시 열리고 로그인과 서버의 자리 찾기는 유지됩니다. 입력 중인 내용은 사라질 수 있습니다.
현재 OTA는 4.22.0-web.2입니다. 4.22.0 APK 또는 Play 업데이트를 한 번 설치한 뒤 설정 → 업데이트 확인 → 업데이트 적용으로 받을 수 있습니다. 네이티브 기능 변경에는 APK/Play 업데이트가 필요합니다.
APK는 기존 GitHub 배포본과 같은 인증서로 서명합니다. Play에서 받은 앱은 내부 테스트의 4.22.0을 사용해 주세요. ZIP과 ota-manifest.json은 앱이 검증해 적용하는 파일이며 직접 설치하지 않습니다.
자리났다 4.21.0
구글 계정 연결 해제에 앱 비밀번호를 묻지 않고, 로그인 직후 오류 화면이 잠깐 비치지 않습니다.
- 설정 → 구글 계정 연결됨 → 연결 해제는 연결할 때처럼 앱 비밀번호 없이 확인 창만 거칩니다. 해제하면 다른 휴대폰의 앱 로그인도 함께 풀리고, 그다음부터는 앱 아이디와 비밀번호로 로그인합니다.
- 구글로 로그인한 휴대폰에서 해제하면 그 휴대폰도 로그아웃됩니다. 구글 계정을 다른 사람이 손에 넣었을 때 먼저 연결을 해제하고 혼자 남는 일을 막기 위해서입니다.
- 로그인하고 첫 화면을 불러오는 동안 ‘앱을 열지 못했어요’가 잠깐 비치던 것을 고쳤습니다.
아래 APK는 기존 GitHub APK와 같은 인증서로 서명되어 업데이트할 수 있습니다. Google Play에서 설치한 앱은 Play 내부 테스트에서 업데이트해 주세요.
자리났다 4.20.0
결제 버튼이 코레일+ 앱으로 바로 이어지고, 구글 로그인이 확인 코드 없이 앱 복귀로 끝납니다.
- ‘코레일에서 결제하기’를 누르면 코레일 웹 로그인 대신 코레일+ 앱의 ‘예약 승차권 조회 · 취소’ 화면이 열립니다. 코레일+에 같은 코레일 계정으로 로그인돼 있으면 로그인 없이 바로 결제 방식을 골라 결제합니다.
- 코레일+가 없거나 열리지 않으면 지금처럼 코레일 웹을 브라우저로 엽니다.
- 구글 로그인·연결은 브라우저에서 확인 코드를 입력하지 않고, 확인이 끝나면 이 휴대폰의 앱으로 돌아와 마무리합니다.
아래 APK는 기존 GitHub APK와 같은 인증서로 서명되어 업데이트할 수 있습니다. Google Play에서 설치한 앱은 Play 내부 테스트에서 업데이트해 주세요.
자리났다 4.19.0
시간 범위 선택을 이전 슬라이더 방식으로 되돌리고 구글 계정 연결을 간편하게 만듭니다.
- ‘이 시간부터’와 ‘이 시간까지’를 시·분 슬라이더로 고릅니다. 분은 5분 단위로 조절합니다.
- ‘마지막 열차까지 찾기’와 로그인 후 예약 입력 복원은 유지합니다.
- 유효한 로그인 상태에서는 로그인한 지 얼마나 지났든 구글 계정 연결 시 앱 비밀번호를 다시 묻지 않습니다.
- 기존 4.18 앱도 새 서버의 재입력 불필요 안내를 받아 비밀번호 없이 연결할 수 있습니다.
- 구글 계정 연결 해제에는 앱 비밀번호가 필요합니다. Google 로고와 최소 비밀번호 8자 정책을 유지합니다.
아래 APK는 기존 GitHub APK와 같은 인증서로 서명되어 업데이트할 수 있습니다. Google Play에서 설치한 앱은 Play 내부 테스트에서 업데이트해 주세요.
자리났다 4.18.0
구글 계정 연결과 회원 승인 기능을 개선합니다.
- 설정의 구글 계정 연결·해제 항목에 공식 Google 로고를 표시합니다.
- 로그인 또는 비밀번호 확인 후 10분 이내에는 구글 연결 시 앱 비밀번호를 다시 묻지 않습니다. 오래된 로그인과 기존 세션은 한 번 본인 확인을 거칩니다.
- 구글 연결 해제에는 앱 비밀번호가 필요합니다. 앱 비밀번호의 최소 길이는 8자입니다.
- 새 가입 신청은 관리자가 설정의 회원 관리에서 승인할 수 있습니다. 기존 회원과 로그인 상태는 유지합니다.
- 회원 목록을 다시 불러오지 못하면 이전 승인 버튼을 숨기고 재시도할 수 있습니다.
아래 APK는 기존 GitHub APK와 같은 인증서로 서명되어 업데이트할 수 있습니다. Google Play에서 설치한 앱은 Play 내부 테스트에서 업데이트해 주세요.
자리났다 4.17.0
구글 로그인과 예약 입력 편의 기능을 추가했습니다.
달라진 점
- 구글 로그인: 기존 앱 계정으로 로그인한 뒤 설정 → 구글 계정 연결에서 한 번 연결하면, 이후 구글로 같은 계정을 이용할 수 있습니다. 이메일 일치만으로 자동 연결하거나 구글만으로 새 계정을 만들지는 않습니다.
- 예약 입력 유지: 홈에서 입력하다 로그인이 필요해져도, 같은 계정으로 로그인하면 구간·날짜·시간·인원·좌석 조건을 이어서 사용할 수 있습니다.
- 좌석 방향 선택: 자동 배정 예약에서 순방향·역방향·무관을 선택할 수 있습니다. 지정 좌석 예약·예약 대기에서는 방향을 함께 지정할 수 없습니다.
- 비밀번호: 앱 비밀번호 최소 길이가 8자로 바뀌었습니다.
- 최근 구간: 가로로 스크롤되는 목록에서도 첫 항목의 화면 여백을 유지합니다.
- 에이전트 연결: Claude Code와 Codex에서 실행할 연결 명령만 보여 줍니다.
설치
아래 jari-4.17.0-debug.apk를 내려받아 설치합니다. 기존 GitHub APK와 같은 서명으로 만들었으므로 해당 설치본 위에 업데이트할 수 있습니다.
Google Play에서 설치한 앱은 서명이 다르므로 Play 내부 테스트 업데이트를 사용하세요. APK와 Play 설치본은 서로 덮어쓸 수 없습니다.
확인 범위
로컬 전체 검증(에뮬레이터 포함)과 GitHub Actions의 서버·화면·기기 검사를 통과한 커밋을 배포합니다. 운영 서버의 Google 로그인 활성화와 실제 Google 인증 후 서버 콜백을 확인했습니다. 실제 사용자 계정의 연결 완료와 로그인은 별도 확인이 필요하며, 실제 좌석 예약 성공을 이번 릴리스 검증으로 주장하지 않습니다.
자리났다 4.16.0
에이전트(MCP) 연결을 크게 손본 버전입니다. 에이전트에게 감시·예약을 맡길 때 승인 창에서 무엇을 승인하는지 문장으로 읽을 수 있고, 그 문장이 실제 요청과 다르면 서버가 거절합니다. 열차 검색은 코레일 목록을 고른 시간대 끝까지 읽습니다.
에이전트(MCP)
이미 연결한 에이전트는 한 번 다시 연결해 주세요. 도구 입력 형식이 바뀌었습니다(
summary필수,get_status·start_watch결과 모양 변경). 다시 연결하지 않으면 감시·예약 요청이 오류로 끝납니다. 권한(조회만·예약까지)은 그대로입니다.
승인 문장(summary)
- 승인 창은 도구 인자를 JSON 그대로 보여 줘서 무엇을 승인하는지 읽기 어려웠습니다. 이제
start_watch·stop_watch·reserve_seat·cancel_reservation은 사용자가 읽을 한두 문장(summary)을 꼭 받습니다. - 서버는 그 문장을 실제 호출과 맞춰 보고, 빠지거나 다르면 코레일 요청 한도를 쓰기 전에 거절합니다.
start_watch: 날짜·출발역→도착역·열차 번호, 특실이면 "특실",seat=any면 "일반실 우선(없으면 특실)",start_at이 있으면 "10월 15일 07:00부터"처럼 시작 시각, 예약 대기 여부reserve_seat:trainKey가 가리키는 열차의 날짜·구간·번호, 호차와 좌석("8C(2호차)"·"2호차 8 C"·"8C·D" 도 읽음), 특실 여부stop_watch: 멈추는 진행 중·예정 감시마다 날짜·구간cancel_reservation: 함께 취소되는 결제 대기 예약마다 열차 번호- 문장에 인원("2명"·"1석"·"한 명")을 적었다면
passengers와 같아야 합니다. 일반실을 특실이라 하거나 등급을 "말고"로 빼는 문장도 거절합니다.
- 멈추기·취소 검사는 실제 실행과 같은 사용자 잠금 안에서 한 번 더 상태를 읽어 확인합니다.
- 결과의
notes가 잡은 좌석·취소한 예약·시작하거나 예약된 감시 내용을 문장으로 다시 말합니다(열차 번호와 시각 포함).
상태와 결과
get_status와start_watch결과의 감시를 앱 필드(depDate:"20261019"·depTime:"0700"·specialInfoShow) 대신start_watch인자와 같은 말(date·from·to·earliest·latest·trains·passengers, 등급·좌석 방식은 한국어)로 줍니다.- 감시 상태가 앱의 "확인 지연"과 같은 기준(마지막 조회 120초)으로 조회가 없다고 알리고, 일부 좌석만 잡았으면 "N석 중 M석"을 알립니다.
- 실패를 도구별로 알립니다. 조회 실패는 "좌석이 없다는 뜻이 아니에요"로, 변경 도구의 응답 끊김은
get_status로 확인하라고 안내합니다. 매진 등급 예약은 좌석표 재조회 대신 감시를 안내합니다. - 날짜가 과거이거나
latest가earliest이하인 입력은 필드 이름과 함께 바로 거절해 요청 한도를 쓰지 않습니다. - 60일보다 먼 날짜의 조회 실패에는 아직 팔지 않는 날짜일 수 있다고 덧붙입니다(운영에서 60일 앞까지 조회됨을 확인).
열차 검색과 감시(앱·에이전트 공통)
- 코레일은 열차를 10줄씩 주고 다음 쪽 커서를 비워 보냅니다. 이제 마지막 줄의 출발 시각부터 이어 읽어(최대 5쪽) 하루 전체를 찾아도 앞쪽 열차(KTX 6편 남짓)만 나오던 문제를 고쳤습니다. 감시도 같은 방식으로 고른 열차를 찾습니다. 다 읽지 못하면
truncated로 알립니다. - 좌석을 고르지 않은 감시에서 종료 시각을 정하면, 예약 대기를 받는 매진 열차의 출발 시각을 0으로 읽어 빠뜨리던 문제를 고쳤습니다.
- 열차를 고르지 않은 감시가, 서울처럼 도시 이름으로 읽히는 역에서 다른 역(청량리 등)을 오가는 열차를 잡지 않습니다(예: 서울→부산 감시에 703 청량리→부전).
- 뒤쪽 쪽 조회가 실패하면 "빈자리 없음"이 아니라 조회 실패로 알립니다.
앱
- 열차 목록이 잘렸을 때의 안내를 "시간대를 좁혀 다시 조회하면 나머지를 볼 수 있어요"로 바꿨습니다. 그 밖의 화면은 4.15.1과 같습니다.
서버는 이미 이 변경으로 배포되어 있어 4.15.x 앱에서도 위 수정이 적용됩니다.
Android 7.0 이상이 필요합니다. 이 APK는 직접 설치용이며, Play에서 받은 앱과 서명이 달라 서로 업데이트되지 않습니다. 가능하면 Google Play 내부 테스트로 받아 주세요.
APK SHA-256: 6acae49c7c216beda0af9b1b36a1fc13090bd8623f024f68fb752dd925d442ac
APK 서명 인증서 SHA-256: cc949e18b5a541a7f533ef954d1b2f675aa0847d413e784234c016e233e34f5e (이전 릴리스와 같음)
배포·검증
- 서버(pit5):
ad24a72로 배포했습니다(2026-10-13, 진행 중인 감시·결제 대기 0건 확인 뒤 API만 재생성). - Google Play 내부 테스트: 4.16.0(versionCode 41600)을 2026-10-13 21:49(KST)에 출시했습니다(내부 테스터에게 제공됨). AAB SHA-256
fd3bdd41ad84bb3d26a45ac92d4755c4328776bdc6ffce2330c6f72c892e084e. - 태그
v4.16.0은 main 커밋ad24a72를 가리킵니다. - 이 Mac에서 에뮬레이터를 포함한
npm run verify전체 통과: 프론트 278개, 백엔드 1034개, 통합 18개, 브라우저·레이아웃(헤드리스) 116개와 에뮬레이터 기기 단계 44개. - GitHub Actions: 브랜치 실행에서
checks·device통과. 첫 실행에서 기기 단계의 뒤로가기 테스트가 한 번 실패했지만(시트가 뜬 직후 보낸 뒤로가기 키가 먹히지 않음) 재실행과 로컬 에뮬레이터에서는 통과해 재현되지 않았습니다. - MCP 변경은 독립 코드 리뷰를 여러 차례 거쳤고, 운영 서버에서 실제 코레일로 다시 검증했습니다(2026-10-13): 문장이 틀린 예약·감시·멈추기·취소는 상태 변화 없이 거절되고, 맞는 문장으로 1석 예약 후 바로 취소, 예정·진행 감시 시작 후 바로 멈춤까지 확인했습니다. 서울→강릉에 KTX-이음이 나오고 서울→부산에 703이 없는 것도 확인했습니다.
- 아직 실호출로 확인하지 않은 경로: 예약 대기(
waitlist=true), 일부만 취소, 승객 2명 이상, 1분 호출 한도 초과.
v4.15.1
좌석표 취소표 대기의 '좌석 무관' 예약을 고치고, 끊긴 예약 응답과 같은 열차 중복 예약을 처리하는 버전입니다.
- 좌석표 취소표 대기에서 열차를 '좌석 무관'으로 고르면 자리가 나도 예약되지 않던 문제를 고쳤습니다. 이제 고른 등급(일반실·특실)으로 코레일이 배정한 좌석을 잡고, 알림에 "코레일 배정 · 일반실"처럼 표시합니다.
- 예약 요청이 응답 없이 끊겨도 코레일에는 좌석이 잡혔을 수 있습니다. 이때 몇 분 동안 내 예약을 확인해, 이 감시가 보낸 요청과 열차·운행일·좌석 수·좌석(또는 등급)이 모두 맞는 새 예약만 결제 대기로 알립니다. 감시 도중 직접 잡은 다른 예약은 받아들이지 않습니다.
- 같은 열차에 예약이 이미 있어서 취소표를 잡지 못하면 감시마다 한 번 알립니다.
- 코레일이 그 등급의 호차를 주지 않아 다른 날 편성으로 그린 참고 좌석표는 빈자리로 내놓지 않고, 그 좌석으로 예약을 시도하지도 않습니다(에이전트 도구 포함).
- 서버가 취소표 감시에서 이미 받는 조회 응답으로 빈자리가 얼마나 오래 남는지 기록합니다(추가 요청 없음, 사용자 정보 없음). 감시 간격을 정하는 데 씁니다.
앱 화면은 4.15.0과 같고, 바뀐 것은 대부분 서버입니다. 서버는 4.15.1로 배포했으므로 4.15.0 앱에서도 위 수정이 적용됩니다.
Android 7.0 이상이 필요합니다. 이 APK는 직접 설치용이며, Play에서 받은 앱과 서명이 달라 서로 업데이트되지 않습니다.
APK SHA-256: ce076ebcfdcf9b3c64373841c738151ae5bce9c3dd986f4852e69ed155eb8792
APK 서명 인증서 SHA-256: cc949e18b5a541a7f533ef954d1b2f675aa0847d413e784234c016e233e34f5e (이전 릴리스와 같음)
배포·검증
- 서버(pit5):
f5fae81로 배포했습니다(2026-10-12, 진행 중인 검색 0건 확인 뒤 API만 재생성). - Google Play 내부 테스트: 4.15.1(versionCode 41501)을 2026-10-12 02:03(KST)에 출시했습니다(내부 테스터에게 제공됨). AAB SHA-256
b29c58de3047e703a583004d85a62e3f04cfd63446ae2ce4abddc8743d86a591. - 태그
v4.15.1은 main 커밋f5fae81을 가리킵니다. - 이 Windows PC에서 에뮬레이터를 포함한
npm run verify전체 통과: 프론트 278개, 백엔드 780개, 통합 16개, 브라우저·레이아웃(헤드리스) 114개와 에뮬레이터 기기 단계 44개. - GitHub Actions: 브랜치 실행에서
checks·device통과. - 별도 검토자의 코드 리뷰를 거쳤습니다. 첫 리뷰에서 나온 High(감시 도중 직접 잡은 예약을 감시의 것으로 받아들이던 문제)는 고쳐서 재검토로 확인했습니다.
- 실제 코레일에서 '좌석 무관' 예약과 끊긴 응답 되찾기는 아직 확인하지 않았습니다(테스트는 실제 라이브러리 클래스로 했습니다).