본문 바로가기

Programmer

(33)
Java 배치 처리에서 구독 서비스 토큰 관리 설계 고민 기존에 없던 AI 기반 서비스를 추가하면서,토큰 관리가 생각보다 훨씬 복잡한 영역이라는 걸 체감하게 됐다. 특히 월간·연간 정기 결제와 일회성 결제가 함께 존재하다 보니“배치(Job) 한 번 돌리면 되겠지”라는 단순한 접근으로는 해결되지 않았다. 여기에 향후 사용자 트래픽까지 고려해야 했지만,소규모 팀에서 중장기적인 계획을 충분히 세우기보다는 빠른 출시가 우선되는 상황이었다. 혼자 설계를 진행하다 보니 미숙한 선택도 있었고,그 과정에서 여러 시행착오를 겪게 됐다. 이 글에서는 실제 서비스 운영 과정에서 겪은 문제 상황을 바탕으로,하루 1회 배치 구조에서 토큰을 어떻게 관리했는지, 그리고 그 과정에서 고민하게 된 더 효율적인 대안까지 정리해 본다.토큰 관리를 추가하며 생긴 문제구독형 서비스에서 발생하는 문..
history.back() 대신 뭘 써야 할까? 웹앱에서의 뒤로 가기 정리 웹에서 뒤로 가기 버튼을 만들다 보면 가장 먼저 떠오르는 코드가 있습니다.history.back(); 짧고, 간단하고, 눈에 띄게 문제없어 보입니다.저도 한동안은 아무 생각 없이 이 코드를 썼습니다. 그런데 웹앱 형태로 화면이 점점 복잡해지고,Ajax나 로그인 흐름이 섞이기 시작하면서 문제가 하나씩 튀어나오기 시작했습니다.history.back()은 “이전 페이지”가 아닙니다처음엔 저도 이렇게 생각했습니다.“그냥 이전 페이지로 가는 거 아닌가?” 하지만 실제로는 조금 다릅니다.history.back()은 URL이 아니라 브라우저의 히스토리 상태로 이동합니다. 즉, 페이지를 다시 불러오는 게 아니라브라우저가 기억하고 있던 화면 상태를 그대로 꺼내오는 경우가 많습니다.이 차이가 웹앱에서는 꽤 큰 문제로 이어..
jQuery 여러 Ajax 요청 완료 후 실행하기: $.when.apply + done/fail 예제 이 글은 jQuery에서 $.when.apply($, reqs).done()을 처음 써보는 분이 바로 따라 할 수 있게 정리한 내용이다.반복문에서 $.ajax를 여러 번 호출하다 보면, “저장되었습니다” 같은 안내를 언제 띄워야 할지 헷갈릴 때가 많다.여기서는 요청을 reqs 배열에 모아두고, 모든 요청이 끝난 뒤에만 완료 팝업을 띄우는 방식(done/fail)으로 처리한다.목표$.ajax 저장 요청을 여러 번 보내더라도 전부 성공했을 때만 “저장되었습니다”를 띄운다중간에 하나라도 실패하면 공통 에러 처리(ajaxFail) 로 넘긴다1) 설치 / 로드2) 기본 예제핵심은 reqs 배열에 ajax 요청(Deferred)을 담아두고, $.when.apply로 “전체 완료”를 기다린 다음 done/fail에서..
Java Gemini API 파일 업로드가 실패하는 이유: state ACTIVE 기다려야 하는 이유 이전 글에서는 Java 서버에서 Gemini API를 연동하는 기본 구조와 텍스트 + 이미지(멀티모달) 요청 흐름을 정리했다.이번 글은 그 연장선으로, 실서비스에서 반드시 부딪히는 포인트인 “파일 첨부(업로드) 처리”를 좀 더 깊게 정리해 본다.특히 Gemini는 단순히 로컬 파일을 그대로 넘기는 방식이 아니라, 대부분의 경우 파일을 먼저 업로드하고 fileUri로 참조하는 흐름이 안정적이다. (업로드 상태가 ACTIVE가 되기 전에 호출하면 에러가 나기도 해서, 운영 환경에서는 체크가 필수다.)파일 첨부(업로드)가 필요한 이유Gemini API에서 파일을 함께 분석시키려면, 내부적으로 File 리소스를 만들고 그 리소스를 참조하는 URI(fileUri)가 필요하다.즉, 흐름은 아래처럼 정리된다.로컬 파..