반응형

전체 글 92

파이썬 독학 Day 2 - 문자열 슬라이싱, f-string, 연산자 완전 정리 (10일 완성 시리즈)

Day 1에서 "input()은 항상 문자열을 돌려준다" 는 얘기로 글을 마쳤다. 그럼 자연스럽게 다음 질문이 나온다. 그 문자열로 뭘 할 수 있는데?오늘이 그 답이다. 문자열을 자르고, 다듬고, 원하는 모양으로 출력하는 법, 그리고 값을 계산하고 비교하는 연산자까지 다룬다.솔직히 말하면 문자열 처리는 "기초 문법"이라고 하기엔 실무 비중이 너무 크다. 로그에서 날짜 잘라내기, 파일명에서 확장자 확인하기, 보고서 숫자에 천 단위 콤마 찍기 — 전부 오늘 배우는 내용으로 해결된다.이 시리즈는 평일 10일, 하루 한 편. 처음 배우는 분은 필수 파트만, 문법을 아는 분은 심화 파트까지. 글 마지막에 실습 문제와 해답 파일(zip)을 첨부한다.그리고 오늘도 함정이 하나 있다. 문자열 메서드는 원본을 바꾸지 않..

파이썬 독학 Day 1 - 변수, 자료형, print와 input 완전 정리 (10일 완성 시리즈)

요즘 업무 자동화 얘기가 나올 때마다 빠지지 않는 언어가 파이썬이다.반복 작업을 하다 보면 "이거 스크립트 한 줄이면 끝나지 않나?" 싶은 순간이 자꾸 온다.그래서 이번에 아예 마음먹고 10일 완성 커리큘럼을 직접 만들어서 정리하기로 했다.이 시리즈는 이렇게 진행한다.평일 10일, 하루 한 편. 처음 배우는 분은 필수 파트만, 문법을 이미 아는 분은 심화 파트까지. 각 글 마지막에 실습 문제와 해답 파일(zip)을 첨부한다.오늘 Day 1은 가장 기초인 실행 방법, 변수, 자료형, 입출력이다. 시시해 보일 수 있는데, 글 후반에 나오는 input() 함정은 입문자가 정말 자주 밟는 지뢰라서 그것 하나만 챙겨가도 오늘 글은 남는 장사다.1. 왜 파이썬인가 — 읽기 쉬운데 실무까지 간다파이썬의 가장 큰 특징..

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

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