반응형

전체 글 90

사고도 공사도 없는데 왜 막힐까 — 한국 도로 정체의 진짜 원인

한국 도로에서 가장 흔한 정체는 사고 정체도 공사 정체도 아니다. 아무 일도 없었는데 갑자기 멈추고, 한참을 기어가다가, 이유 없이 다시 뻥 뚫리는 정체다. 앞에 뭐가 있었나 두리번거려도 아무것도 없다. 원인은 도로에 없다. 방금 그 도로를 지나간 운전자들, 그러니까 우리 자신에게 있다.한국 운전자들은 스스로를 꽤 실력 있다고 여긴다. 실제로 차를 다루는 조작 능력은 나쁘지 않다. 문제는 조작이 아니라 판단이다. 더 정확히 말하면, 도로를 자기 차 한 대의 문제로만 보고 뒤에 이어진 수십 대의 흐름을 전혀 계산에 넣지 않는다는 것이다. 그 결과가 매일 저녁 강변북로와 경부고속도로에 깔린다.1. 합류하자마자 좌향좌 — 목적지도 없는 1차선 사랑진입로에서 본선에 막 합류한 차가 있다. 이 차가 가장 먼저 하..

정보 2026.08.27

SSRF - 서버가 공격자의 심부름꾼이 되는 순간

이미지 URL을 입력하면 서버가 그 이미지를 받아서 썸네일을 만들어 주는 기능, 많이들 만들어 보셨을 겁니다. 저도 예전에 비슷한 걸 만들면서 "URL 형식만 맞으면 되겠지" 하고 넘어간 적이 있어요. 나중에 보안 점검에서 지적을 받았습니다. 그 입력창에 http://169.254.169.254/를 넣으면 클라우드 인스턴스의 자격 증명이 응답으로 돌아온다는 거였죠. 아찔했습니다. 오늘은 이 SSRF가 왜 그렇게 위험한지, 그리고 제대로 막는 방법을 정리해 볼게요.개념 / 원리SSRF는 Server-Side Request Forgery, 서버 측 요청 위조입니다. 이름 그대로 공격자가 서버를 시켜서 자기 대신 요청을 보내게 만드는 공격이에요.핵심은 "누가 요청을 보내느냐"입니다. 공격자는 방화벽 바깥에 있..

보안 2026.08.14

logrotate - 디스크 가득 참 장애를 막는 로그 관리

새벽에 "디스크 사용률 100%" 알람을 받아 본 적 있으시죠. 저는 접속해서 df -h를 치고 나서야 범인이 애플리케이션 로그 파일 하나라는 걸 알았습니다. 크기가 40GB였어요. 급한 김에 rm으로 지웠는데 디스크 여유 공간이 하나도 안 늘어나서 한참 헤맸습니다. 프로세스가 그 파일을 계속 열고 있었기 때문이었죠. 오늘은 이런 사고를 애초에 막아 주는 logrotate 이야기, 그리고 제가 그날 밟았던 함정까지 정리해 볼게요.개념 / 원리logrotate는 로그 파일이 무한정 커지지 않게 주기적으로 잘라 주고, 오래된 것부터 버려 주는 도구입니다. 대부분의 리눅스 배포판에 기본 설치돼 있어요.하는 일은 단순합니다.app.log를 app.log.1로 이름 변경새 app.log를 빈 파일로 생성오래된 a..

functools.lru_cache - 한 줄로 끝내는 메모이제이션

사내 API 하나가 유독 느려서 프로파일링을 걸어 본 적이 있습니다. 원인이 황당했어요. 요청 한 번 처리하는 동안 부서 코드를 부서명으로 바꾸는 조회를 300번 넘게 하고 있었습니다. 부서는 서른 개도 안 되는데 말이죠. 같은 값을 계속 다시 물어보고 있던 겁니다. 함수 위에 데코레이터 한 줄 붙였더니 응답 시간이 눈에 띄게 줄었습니다. 오늘은 그 한 줄, functools.lru_cache 이야기를 해볼게요.개념 / 원리메모이제이션은 한마디로 "같은 입력이면 계산하지 말고 저번 답을 그대로 주자" 입니다. 함수 인자를 키로, 반환값을 값으로 하는 딕셔너리를 하나 두고 있는 것과 같아요.직접 만들면 대략 이런 모습입니다._cache = {}def get_dept_name(code): if code..

MVCC - 읽기가 쓰기를 막지 않는 이유

예전에 배치가 도는 시간대에 조회 화면이 통째로 멈춘 적이 있었습니다. 밤새 도는 정산 배치가 몇백만 건을 업데이트하는 중이었고, 그 테이블을 단순히 SELECT만 하는 화면이 몇 분씩 응답을 못 했죠. 원인은 그 DB가 읽기에도 락을 잡는 구조였기 때문이었어요. 그런데 옆 팀 PostgreSQL 시스템은 같은 상황에서 조회가 멀쩡히 돌아갔습니다. 차이는 MVCC였습니다. 오늘은 이 MVCC가 정확히 뭘 하는 물건인지, 그리고 왜 공짜가 아닌지 정리해 볼게요.개념 / 원리MVCC는 Multi-Version Concurrency Control, 우리말로 다중 버전 동시성 제어입니다. 이름 그대로 같은 행(row)의 여러 버전을 동시에 들고 있는 방식이에요.기존의 락 기반 동시성 제어는 이렇게 동작합니다. ..

IT·리눅스/DB 2026.08.11

2,900원 받던 일기 앱을 무료로 풀었습니다 — 하루카드 무료 전환기

지난 글에서 광고 없는 일기 앱 '하루카드'를 2,900원 유료 앱으로 출시했다고 썼습니다. 오늘은 그 뒤의 이야기입니다. 결론부터 말씀드리면, 하루카드는 이제 무료입니다.유료 앱의 벽은 가격이 아니었습니다2,900원은 커피 한 잔보다 쌉니다. 그런데도 스토어 페이지까지 온 분들이 설치 버튼 앞에서 돌아섰습니다. 지표를 들여다보며 내린 결론은, 문제가 가격이 아니라 지불 시점이라는 것이었습니다.일기 앱은 써봐야 압니다. 질문이 내 취향인지, 매일 손이 가는지, 한 달은 써봐야 알 수 있습니다. 그런데 유료 앱은 그 확인을 하기 전에 지갑부터 열라고 요구합니다. 아무리 싸도 순서가 잘못된 요구였습니다.무엇을 무료로 풀었나 — 전부입니다"무료 전환"이라고 하면 보통 기능 일부를 잘라 유료로 남기는 그림을 떠..

정보 2026.07.23

광고 없는 일기 앱을 만들었습니다 — 하루카드

일기를 써보려고 앱을 깔았다가, 광고 배너 보고 그대로 닫은 적이 있습니다. "기록은 사적인 건데 왜 광고가 따라붙지?" 싶었고, 그 이후로 일기 앱을 한 번도 깔아본 적이 없었습니다.그런데 어느 순간부터 회고 같은 글을 쓰고 싶다는 생각이 자꾸 들었습니다. 1년 단위로 내가 어떻게 살아왔는지 정리하고 싶은데, 막상 일기장을 펴면 뭘 써야 할지 모르겠더라고요. "오늘 뭐 했지?"에서 매번 막혔습니다.그래서 직접 만들었습니다. 이름은 하루카드입니다.어떤 앱인가요매일 22시(원하는 시각 설정 가능)에 질문 카드 한 장이 도착합니다."어릴 적 가장 자주 갔던 동네 풍경은 어떤 모습이었나요?""처음으로 '내가 일을 잘했다'고 느낀 순간은 언제였나요?" 이런 식의 회고 질문이 700개 들어있고, 카테고리는 어린 ..

정보 2026.07.11

Java Stream API 실전 - map, filter, collect 제대로 쓰기

Stream API가 처음 나왔을 때 실무에서 잘못 쓰인 걸 정말 많이 봤어요. 열 줄이면 될 for문을 세 줄짜리 .stream().filter().map().collect()로 바꾸긴 했는데, 안에서 다시 forEach로 리스트에 add를 하고 있어서 사실상 for문에 껍데기만 씌운 코드. 저도 처음엔 그렇게 썼습니다. Stream을 제대로 쓴다는 건 파이프라인처럼 데이터 변환 흐름을 표현한다는 뜻이고, 그때 진짜로 코드가 짧아지고 읽기도 편해집니다. 오늘은 실무에서 자주 쓰는 map·filter·collect 패턴과 자주 하는 실수를 정리해볼게요.개념 / 원리Stream은 컬렉션이 아닙니다. "데이터를 흘려보내는 파이프라인"에 가까워요. 컬렉션은 데이터를 담아두는 그릇, Stream은 그 데이터가 ..

IT·리눅스/Java 2026.07.10

제너레이터 vs 이터레이터 - Python yield는 언제 쓰나

몇 년 전에 로그 파일 하나가 20GB짜리인데 이걸 통째로 readlines()로 읽어서 처리하는 코드를 짠 적이 있어요. 로컬에서 500MB 짜리로 테스트할 때는 잘 돌더니 운영에서 메모리 부족으로 프로세스가 죽었죠. 원인은 20GB를 리스트로 다 올린 것. 그때 yield로 한 줄씩 뽑아주는 형태로 바꿨더니 메모리 20MB로도 잘 돌아갔습니다. 오늘은 이터레이터·제너레이터가 뭐고, 언제 yield를 써야 하는지 정리해볼게요.개념 / 원리먼저 용어부터 갈라봅시다.이터러블(Iterable): for로 순회할 수 있는 모든 것. __iter__ 메서드가 있다. 예: list, dict, 문자열, 파일 객체.이터레이터(Iterator): next()가 호출될 때마다 다음 값을 하나씩 뱉는 것. __iter_..

iptables 기본 룰 짜기 - INPUT/OUTPUT/FORWARD 체인 이해

신입 때 방화벽 룰을 짜라는 얘기를 처음 들었을 때 손이 덜덜 떨렸습니다. iptables 매뉴얼은 옵션이 100개가 넘어 보였고, 잘못 건드리면 SSH가 끊겨서 서버가 통째로 격리된다는 얘기를 여기저기서 들었거든요. 실제로 그 뒤에 몇 번 원격 서버에서 SSH가 끊겨 콜을 부른 적도 있고요. 알고 보면 기본 구조는 단순합니다. 어떤 체인에 어떤 조건을 만나면 어떻게 처리할지를 규칙 목록에 넣는 것뿐이에요. 오늘은 INPUT/OUTPUT/FORWARD가 뭐고, 최소한 방어 룰을 어떻게 짜는지 정리해볼게요.개념 / 원리iptables는 커널의 netfilter 위에 얹힌 유저 도구예요. 패킷이 커널 네트워크 스택을 지날 때 정해진 "체인"에 걸린 규칙을 위에서 아래로 검사합니다. 매칭되면 -j 뒤에 지정한..