기본 콘텐츠로 건너뛰기

9월, 2025의 게시물 표시

if name == "main"의 의미와 올바른 사용법

파이썬 코드 짜다 보면 if __name__ == "__main__": 이 부분, 꼭 한 번쯤은 봤을 거예요. 처음 봤을 때 저는 솔직히 뭐하는 건지 몰라서 엄청 헤맸거든요. 그런데 알고 나니 정말 유용한 기능이더라고요! 오늘은 이 부분이 왜 중요하고, 어떻게 사용하는지 제 경험과 함께 풀어서 설명해 드릴게요. 쉽게 말해서, __name__ 이라는 변수는 파이썬이 자동으로 만들어주는 특별한 이름표 같은 거예요. 내가 직접 이 파일을 실행하면 "__main__" 라는 이름을 붙여주고, 다른 파일에서 이 파일을 불러다 쓸 때는 파일 이름을 붙여줘요. 마치 친구를 부를 때, "야, 너!" 하고 부르는 것과 이름을 불러서 부르는 것의 차이라고 생각하면 쉬울 거예요. 그래서 if __name__ == "__main__": 이 부분은 "내가 직접 이 파일을 실행했을 때만 실행해!" 라는 뜻이에요. 다른 파일에서 이 파일을 불러와서 쓴다면, 이 안에 있는 코드는 무시되고, 그냥 다른 함수들만 사용하게 되는 거죠. 예를 들어볼게요. 제가 my_module.py 라는 파일을 만들었어요. 여기에는 두 개의 함수 my_function() 과 another_function() 이 있고, if __name__ == "__main__": 블록 안에는 이 함수들을 실행하는 코드와 "이 파일을 직접 실행했을 때만 나오는 메시지"를 출력하는 코드를 넣었어요. # my_module.py def my_function(): print("my_module의 함수가 실행됐어요!") def another_function(): print("my_module의 또 다른 함수가 실행됐어요!") if __name__ == "__main__": print("...

functools, toolz로 함수형 프로그래밍 하기

파이썬으로 개발하면서 함수형 프로그래밍이 얼마나 매력적인지 요즘 뼈저리게 느끼고 있어요. 처음엔 좀 낯설었는데, functools 와 toolz 라는 멋진 라이브러리를 알고 나선 정말 신세계더라고요! 특히 데이터 처리할 때 효율이 확실히 달라요. 이 두 라이브러리 활용법, 제가 경험을 바탕으로 쉽게 풀어서 설명해 드릴게요. 먼저, 파이썬 표준 라이브러리에 있는 functools 부터 살펴볼까요? 이건 함수형 프로그래밍에 필요한 기본 도구 상자 같은 거라고 생각하면 돼요. 제가 자주 쓰는 함수는 partial , reduce , lru_cache 세 가지인데요. partial 은 말 그대로 함수의 일부 인자를 미리 설정해주는 기능이에요. 예를 들어, 인자 세 개를 받는 함수가 있는데, 항상 한 인자는 고정값이라면 partial 을 이용해서 미리 설정해두면 나중에 함수를 호출할 때 인자를 하나 덜 써도 돼서 편하죠. 복잡한 함수를 좀 더 간결하게 만들어주는 셈이에요. 실제로 제가 한 프로젝트에서 데이터 전처리 함수에 사용했는데, 코드가 훨씬 깔끔해졌어요. reduce 는 시퀀스(리스트, 튜플 등)의 요소들을 차례대로 계산해서 하나의 결과값을 만들어내는 함수죠. sum() 함수랑 비슷하지만, 사용자 정의 함수를 적용할 수 있다는 점이 큰 장점이에요. 저는 이걸 이용해서 리스트 안의 숫자들을 특정 방식으로 계산해서 하나의 값을 얻어내는 작업을 간단하게 해결했던 기억이 나네요. lru_cache 는 데코레이터로, 함수의 결과를 캐싱(저장)해두는 기능을 해요. 같은 입력값으로 함수를 여러 번 호출하면, 이미 계산된 결과를 바로 가져오기 때문에 속도가 엄청 빨라져요! 계산에 시간이 오래 걸리는 함수에 적용하면 효과가 정말 대단하답니다. 단, maxsize 값을 잘 설정해야 해요. 무한정 캐싱하면 메모리가 터질 수 있으니까요. 이 부분은 꼭 기억해두세요! 자, 그럼 이제 toolz 로 넘어가 볼까요? functools 보다 기능이 더...

Python으로 Excel/CSV 등 파일 다루기 (openpyxl, csv, pandas 차이점)

자, Python으로 Excel이나 CSV 파일을 다루는 방법을 알아볼까요? 데이터 분석이나 웹 개발하다 보면 이런 파일들 정말 자주 만나게 되잖아요. 저도 처음엔 뭘 써야 할지 엄청 고민했었는데, 이제는 좀 감이 잡혀서 여러분께 팁을 드릴 수 있을 것 같아요! 주로 쓰는 세 가지 라이브러리, openpyxl , csv , 그리고 pandas 를 비교해 볼 건데요, 각각의 특징과 언제 써야 효율적인지, 제 경험을 바탕으로 꼼꼼하게 설명해 드릴게요. 먼저, 핵심 개념부터 간단히 정리해 드릴게요. openpyxl 은 Excel 파일(.xlsx)을 전문적으로 다루는 라이브러리예요. 세포(셀) 하나하나를 직접 조작할 수 있고, 심지어 폰트나 색깔 같은 서식까지 바꿀 수 있죠. 엑셀 파일 구조를 꽤 복잡하게 바꿔야 할 때 정말 유용해요. 예를 들어, 특정 셀에 있는 값을 다른 셀로 복사하거나, 새로운 시트를 만들고 싶을 때 딱이죠! 다음은 csv 모듈인데요, 이건 Python에 기본적으로 내장된 라이브러리라 따로 설치할 필요가 없어요. CSV 파일(쉼표로 데이터가 구분된 파일)을 읽고 쓰는 데 특화되어 있고, 가볍고 속도가 빨라서 대용량 파일을 처리할 때도 좋답니다. 저는 개인적으로 간단한 데이터만 주고받을 때는 이걸 제일 많이 써요. 복잡한 작업 없이 빨리 처리해야 할 때 최고죠! 마지막으로, 데이터 분석의 핵심 무기인 pandas 가 있어요. 이건 Excel, CSV 파일은 물론이고 다양한 형태의 데이터를 'DataFrame'이라는 표 형태로 처리해 줘요. 데이터를 정리하고 분석하고 시각화하는 기능이 정말 강력해서, 복잡한 데이터 분석 작업을 할 때 빼놓을 수 없죠. 저는 이걸로 데이터 전처리부터 분석, 시각화까지 한 번에 해결하는 경우가 많아요. 특히, 데이터를 깔끔하게 정리하고 싶을 때 정말 편리하답니다. 혹시 데이터 분석에 관심 있으시다면, pandas 는 꼭 마스터하셔야 해요! 자, 이제 실제 코드를 보여...

Python으로 REST API 호출 최적화 (requests, httpx, retry 전략)

요즘 백엔드 개발하면서 REST API 호출 최적화 때문에 정말 애먹었거든요. 네트워크 문제나 서버 장애 때문에 API 요청이 계속 실패하는 경우가 꽤 있었어요. 그래서 requests 랑 httpx 라이브러리를 써서 최적화 작업을 해봤는데, 그 경험을 여러분과 공유해볼까 합니다! 일단 requests 는 오래 써왔던 친숙한 라이브러리인데, httpx 는 비동기 처리나 HTTP/2 지원이 되는 등 좀 더 최신 기능들을 지원해서 요즘 많이 쓰더라고요. 저도 처음엔 requests 로 시작했는데, API 호출 횟수가 많아지니까 속도가 너무 느려서 httpx 로 갈아탔어요. 대규모 API 호출이라면 httpx 가 확실히 효율적인 것 같아요. 물론 기존 코드랑 호환성 때문에 requests 를 계속 써야 하는 경우도 있겠지만요. 어떤 라이브러리를 선택할지는 여러분 프로젝트 상황에 따라 결정하시면 됩니다. 그리고 중요한 게 HTTP 연결 풀링 이에요. 매번 새로운 연결을 만드는 건 시간이 많이 걸리잖아요? requests 나 httpx 는 연결을 재사용해서 이런 오버헤드를 줄여줘요. 마치 수영장에 이미 있는 수건을 쓰는 것처럼 말이죠! 덕분에 API 호출 속도가 꽤 빨라졌어요. 또, API 호출이 실패하는 경우를 대비해서 retry 전략 을 꼭 구현해야 해요. 네트워크 문제나 서버 장애는 언제든 발생할 수 있으니까요. 저는 지수 백오프(exponential backoff) 기법을 사용했는데, 처음 실패하면 잠깐 기다렸다가 다시 시도하고, 또 실패하면 더 오래 기다렸다가 다시 시도하는 방식이에요. 이렇게 하면 일시적인 오류 때문에 프로그램이 멈추는 것을 방지할 수 있어요. 그리고 타임아웃 설정 도 잊지 마세요! 응답이 너무 오래 걸리면 무한정 기다리지 말고 적절한 시간 내에 포기하고 다음 작업으로 넘어가야 하거든요. 아, 그리고 실제 코드 예시를 보여드릴게요. httpx 와 tenacity 라이브러리를 사용해서 비동기로 API...

레거시 코드, 어떻게 리팩토링해야 성공할까?

레거시 코드, 어떻게 리팩토링해야 성공할까? “레거시 코드(legacy code)”라는 단어를 들으면 어떤 이미지가 떠오르시나요? - 문서화 없는 수천 줄짜리 함수 - 테스트 한 줄 없는 프로젝트 - ‘손대면 터질 것 같은’ 불안한 코드 대부분의 개발자에게 레거시 코드는 두려움과 동시에 숙명 입니다. 문제는 “이걸 어떻게 바꿔야 하는가?”입니다. 무턱대고 구조를 갈아엎다간 서비스 장애로 이어지고, 그렇다고 손을 안 대면 기술 부채는 쌓여만 갑니다. 이번 글에서는 레거시 코드 리팩토링을 성공적으로 진행하는 5단계 전략 을 소개합니다. 1. 안전망부터 구축하라 – 테스트 & 모니터링 리팩토링의 대전제는 기존 기능이 그대로 유지되어야 한다 는 것입니다. 이를 보장하는 장치는 크게 두 가지입니다. 캐릭터라이제이션(Characterization) 테스트 현재 코드가 어떤 출력을 내는지 그대로 고정하는 테스트 버그가 있더라도 우선 “동작 보존”을 보장 관찰 가능성(Observability) 구조화 로깅, 모니터링 지표, 에러 알림 리팩토링 후 성능/에러율 변화를 즉시 확인 👉 테스트 없는 리팩토링은 어두운 방에서 칼 휘두르는 것과 같습니다. 안전망부터 확보하세요. 2. 작은 단위로 나누어라 – Big Bang은 금물 레거시 코드를 한 번에 전부 고치고 싶다는 유혹이 있습니다. 그러나 한 번에 갈아엎는 방식(Big Bang Rewrite) 은 거의 실패합니다. 대신, 작게 쪼개고 점진적으로 전환 하는 것이 핵심입니다. 기능 단위 리팩토링 : 모듈/클래스/함수 단위로 잘라서 리팩토링 트래픽 단위 전환 : 신규 코드에 일부 요청만 보내는 카나리 배포 Strangler Fig 패턴 : 기존 시스템에 새 모듈을 붙이고, 점진적으로 교체 3. 데이터베이스 변경은 Expand → Migrate → Contract 레거시 코드 리팩토링에서 가장 위험한 순간은 DB 스키마 변경입니다. 안전한 절차는 3단계 입니다. ...