공개 API에 요청 제한이 없으면 생기는 일 - Token Bucket으로 핵심 자원만 정확히 보호하기
·
BackEnd
1. 공개 API에 제한이 없으면 생기는 일배포를 앞두고 전체 API를 점검하고 있었습니다. 기능 테스트는 통과했고, 정상적인 흐름에서는 문제가 없었습니다. 그런데 하나가 마음에 걸렸습니다. 구독 신청 API를 아무런 제한 없이 누구나 호출할 수 있다는 것이었습니다. 이 API는 단순한 데이터 저장이 아닙니다. 호출될 때마다 Gmail SMTP를 통해 인증 메일을 발송합니다. 문제는 Gmail SMTP에 하루 500건이라는 발송 제한이 있다는 것입니다. 정상적인 사용이라면 하루에 500건을 넘길 일은 없습니다. 하지만 정상적인 사용만 들어온다는 보장은 어디에도 없습니다.시나리오를 하나 그려봤습니다. 공격자가 스크립트 하나를 작성합니다. 구독 API에 매번 다른 이메일 주소를 넣어서 반복 호출합니다. 요청..
아티클 작성 파이프라인을 AI Agent Workflow로 자동화 개선기 (하네스 엔지니어링, Sub-Agent)
·
공부중
1. 하나의 AI에게 전부 맡겼더니 생긴 일처음에는 단순하게 생각했습니다. AI한테 주제를 주면 글이 나오겠지. 근데 해보니까 잘 될 때도 있고 안 될 때도 있었습니다. 같은 주제인데 어떻게 물어보냐에 따라 어떤 날은 괜찮은 글이 나오고, 어떤 날은 읽기 힘든 글이 나왔습니다. 이게 왜 문제냐면, 서비스에 올리는 글이기 때문입니다. 품질이 매번 다르면 쓸 수가 없습니다. 운 좋게 잘 나온 글만 골라서 올릴 수도 없고, 그러려면 결국 사람이 다 확인해야 하니까 자동화한 의미가 없습니다. 그래서 왜 결과가 이렇게 들쭉날쭉한지 생각해봤습니다. 돌이켜보면 당연한 건데, 저도 글을 쓸 때 한 번에 완성하지 않습니다. 자료 찾고, 어떤 순서로 쓸지 정하고, 초안 쓰고, 다시 읽으면서 고칩니다. 단계마다 하는 일이 ..
백엔드 개발자 이력서 특강 후기 - "왜?"를 던지는 이력서가 살아남는다
·
외부활동
특강 소개그릿모먼츠에서 주니어 백엔드 개발자를 위한 이력서 특강이 있었다. 비슷비슷한 이력서 틈에서 어떻게 하면 나를 돋보이게 할 수 있는지, 그 핵심을 짚어주는 시간이었다.가장 인상 깊었던 내용 3가지1. 이력서는 자서전이 아니라 "마케팅"이다특강에서 가장 먼저 와닿은 말이었다. 이력서에 내가 한 일을 시간 순서대로 나열하는 건 일기장이지, 이력서가 아니라는 것이다. 이력서는 나라는 상품을 팔기 위한 마케팅 도구다. 상품(나의 역량), 타겟(채용 담당자), 카피(어떻게 표현할 것인가)가 존재한다. 이 관점이 왜 도움이 됐냐면, 그동안 나는 이력서를 "내가 뭘 했는지 정리하는 문서"로만 생각했기 때문이다. 앞으로는 "이 내용을 읽는 사람이 나를 채용하고 싶게 만드는 문서"로 접근해야겠다고 생각이 바뀌었다..
Redis Geohash를 사용하여 위치 기반 검색기능 TPS 100배 성능 개선 로그
·
BackEnd
문제: 위치 기반 매치 검색 API의 TPS가 4, P95 응답시간이 28초해결: MySQL Spatial Index → Redis GeoHash 순차 적용결과: TPS 431 달성 (112배 개선), P95 1.5초문제 인식핵심 기능 중 하나가 "내 위치 기준 5km 이내 경기 검색"이었는데, 개발 환경에서는 잘 동작했다.문제는 운영 환경에 약 1만 건의 테스트 데이터를 넣고 나서 발생했다. 화면이 하염없이 로딩만 돌았다."서버가 죽었나?" 싶어서 로그를 확인했는데, 죽은 게 아니었다. 그냥 느렸다.측정 없이는 개선도 없다감으로 "느리다"고만 하면 안 되니까 k6로 부하 테스트를 돌려봤다.// k6 부하 테스트 설정export const options = { stages: [ { du..
일의 감각: 감각이란, 본질까지의 거리를 줄이는 힘
·
독후감
『일의 감각』 (조수용)메인 테마: 오너의 고민 조수용 대표는 "잘 가려내는 것이 곧 감각"이라 말한다. 이 책을 읽으며 하나의 확신이 생겼다. 프로로서의 태도, 브랜딩, 집요함—이 모든 것은 결국 본질에 다가가기 위한 과정이라는 것. 감각이란 타고나는 미적 재능이 아니라, 본질까지의 거리를 끊임없이 줄여가는 훈련된 능력이다. "세상에 원래 그런 건 없습니다. 왜 그런지 끊임없이 물어야 합니다." 이 문장이 가장 깊이 남았다. 일을 하다 보면 "원래 그런 거 아닌가?"라고 넘기기 쉬운 순간이 있다. 익숙하다는 이유로, 다들 그렇게 한다는 이유로, 당장 문제가 없다는 이유로 우리는 쉽게 관성에 기댄다.하지만 그 순간에 "왜"를 멈추지 않는 사람만이 문제의 본질에 도달한다. 관성적으로 수용하는 것과 성실하게..
다중 인스턴스 환경에서 스케줄러 중복 실행 문제 해결하기
·
BackEnd
비즈니스 상황서비스는 경기 시작/종료 시간이 되면 자동으로 상태를 변경하는 스케줄러를 운영합니다.PENDING/CONFIRMED → IN_PROGRESS (경기 시작 시간)IN_PROGRESS → ENDED (경기 종료 시간)현재는 단일 서버로 운영 중이지만, 서비스 성장에 따라 다중 인스턴스로 확장해야 할 상황입니다.무엇이 문제인가?@Scheduled(fixedRate = 60000) // 1분마다 실행public void updateMatchStatuses() { updateMatchStatusUseCase.startMatches(); updateMatchStatusUseCase.endMatches();}단일 서버에서는 문제가 생기지 않지만 다중 인스턴스에서는 다음과 같은 문제 발생[Ser..
함께 자라기 - 학습과 함께를 바라보는 관점을 기르자
·
독후감
오늘날 소프트웨어 개발 환경은 AI라는 거대한 파도를 맞이하고 있다. 하지만 기술의 진보보다 중요한 것은 그 도구를 다루는 인간의 '태도'와 '소통' 방식이다. 나는 이번 학습을 통해 AI와 협업하고 동료와 교감하는 과정에서 가져야 할 두 가지 핵심 패러다임인 ‘야생 학습’과 ‘투명한 신뢰’에 대해 깊이 고찰해 보았다.1. 학교 학습을 넘어 ‘야생’으로: 문제를 정의하는 개발자책에서는 학습을 두 가지 분류로 나눈다. 정해진 정답(Syntax)만을 찾는 ‘학교 학습’과 불확실성 속에서 스스로 길을 만들어가는 ‘야생 학습’이다. 그동안의 학습이 설계된 환경 내에서 낮은 기대값에 머물렀다면, 이제는 예상치 못한 변수가 난무하는 실제 현장에 대응할 수 있는 힘을 길러야 한다. 야생 학습의 핵심은 "문제를 해결하..
좋은 개발은 좋은 컨셉에서 시작된다 - 컨셉 수업
·
독후감
아이팟 출시 당시 애플은 '5GB 하드드라이브'라는 스펙 대신 "주머니 속의 1,000곡"을 내세웠습니다.기능(5GB): 사용자에게 '용량 계산'이라는 인지 부하를 줍니다. 5GB에 노래가 몇 곡 들어가는지, 내 라이브러리를 다 담을 수 있는지 다시 계산하게 만듭니다.의미(1000곡): 계산을 생략하고 즉각적인 가치를 제시합니다. 내 모든 음악을 들고 다닐 수 있다는 라이프스타일의 변화를 정의한 것입니다.기능 중심 제품이 패배하는 근본적 이유: '비교'와 '대체’ 엔지니어들이 흔히 빠지는 함정이 "성능이 더 좋으면 이긴다"는 생각입니다. 하지만 여기에는 치명적인 약점이 있습니다. 기능은 '선형적'입니다: 5GB는 10GB에 의해 즉시 구식이 됩니다.기능 중심의 제품은 더 높은 스펙을 가진 경쟁자가 나타나..
Docker 이전의 가상화(VM)의 세계와 현대 개발에서 Docker가 해결한 개발 환경의 일관성 문제
·
BackEnd
Docker 이전의 세계Docker 이전에는 협업 시 개발환경을 맞추기가 굉장히 까다로웠다.이전글에서 정리했듯이, "제 컴퓨터에서 실행이 안되요"가 가장 대표적인 문제였다. 이러한 문제를 해결하기 위해 VM(Virtual Machine) 이라는 가상화 기술이 사용되어 왔다. VM을 통해 동일한 환경을 구축할 수 있었지만, 무겁고 느리다는 치명적인 단점이 있었다. 그래서 등장한 것이 Docker다. Docker는 VM보다 훨씬 가볍고 빠르면서도, 개발 - 테스트 - 프로덕션 환경을 일관되게 관리하고 배포할 수 있게 해준다. 이것이 많은 기업들이 VM 대신 Docker를 선택하는 이유다.가상 머신(Virtual Machine)이란?참고 자료가상 머신(VM)이란 무엇인가요? | IBM 가상 머신(VM)이란 무..