전체 글
Happy Hacking!
-
들어가면서 최근에 쿼리 자체로만 해결할 수 없는 일인데 쿼리에 집착해서 시간을 잡아먹었던 일이 2가지 있었다. 아무래도 쿼리는 수치로 얼만큼 느린지 바로 보이기도 하고, DB 영역이 문제 발생시 원인이 되는 주 영역이기 때문에 더욱 신경쓰느라 그런 것 같다. 이번 일기에서는 해당 사건들을 서술하고, 배운 점들에 대해 적어보았다. 사례 1: 쿼리 튜닝 말고 주어진 환경 이해하고 변경하기 재고의 수를 동기화하는 API에서 자꾸 timeout이 발생해서 동기화 태스크가 실행 안 된다는 문제가 있었다. 직접 실행하다 보니, 이 문제는 동기화 과정에서 특정 조건에 대한 COUNT와 column에 대해 GROUP BY SELECT하는 복합 쿼리가 문제였다. 나는 해당 쿼리의 문제점이 1. GROUP BY에 의해 임..
쿼리에 집착하지 않기들어가면서 최근에 쿼리 자체로만 해결할 수 없는 일인데 쿼리에 집착해서 시간을 잡아먹었던 일이 2가지 있었다. 아무래도 쿼리는 수치로 얼만큼 느린지 바로 보이기도 하고, DB 영역이 문제 발생시 원인이 되는 주 영역이기 때문에 더욱 신경쓰느라 그런 것 같다. 이번 일기에서는 해당 사건들을 서술하고, 배운 점들에 대해 적어보았다. 사례 1: 쿼리 튜닝 말고 주어진 환경 이해하고 변경하기 재고의 수를 동기화하는 API에서 자꾸 timeout이 발생해서 동기화 태스크가 실행 안 된다는 문제가 있었다. 직접 실행하다 보니, 이 문제는 동기화 과정에서 특정 조건에 대한 COUNT와 column에 대해 GROUP BY SELECT하는 복합 쿼리가 문제였다. 나는 해당 쿼리의 문제점이 1. GROUP BY에 의해 임..
2024.02.28 -
들어가면서 파이썬을 사용하다 보면 가끔 몽키패칭과 덕타이핑이란 키워드를 듣게 되는데, 이번 기회에 조사해 보면서 최근 읽는 러닝 파이썬이란 책에서 공부한 내용을 바탕으로 생각을 정리해 보았다 단순히 보았을 때 몽키패칭은 테스트 작성시 혹은 외부 모듈 수정시 유용하고, 덕타이핑은 타입 관계 없이 행위로 받아서 사용할 때 유용해 보인다. 몽키패칭 Java만 사용하던 사람들은 깜짝 놀라 기절할 수도 있지만 파이썬에선 이러한 행위가 가능하다. class BananaClient: def request_banana(self): return "banana" banana_client = BananaClient() class Monkey: def banana(self): return banana_client.reques..
파이썬 동적 타입 언어와 몽키패칭, 덕타이핑들어가면서 파이썬을 사용하다 보면 가끔 몽키패칭과 덕타이핑이란 키워드를 듣게 되는데, 이번 기회에 조사해 보면서 최근 읽는 러닝 파이썬이란 책에서 공부한 내용을 바탕으로 생각을 정리해 보았다 단순히 보았을 때 몽키패칭은 테스트 작성시 혹은 외부 모듈 수정시 유용하고, 덕타이핑은 타입 관계 없이 행위로 받아서 사용할 때 유용해 보인다. 몽키패칭 Java만 사용하던 사람들은 깜짝 놀라 기절할 수도 있지만 파이썬에선 이러한 행위가 가능하다. class BananaClient: def request_banana(self): return "banana" banana_client = BananaClient() class Monkey: def banana(self): return banana_client.reques..
2024.02.17 -
들어가면서 사내에서 사용하는 함수 중 @redis_cache라는 함수가 있다. 함수의 FQCN과 input을 기억해놓고 캐싱하는 역할의 함수이다. 이 함수를 사용하는데, 자꾸만 TypeError가 발생했다. TypeError라고 해서 인자 타입이 잘못된 것인줄 알았는데 Python의 TypeError는 호출하려는 함수의 시그니처가 다를 경우 발생하기도 한다. @redis_cache def get_feeds(feed_pk: int) { ... } Python에서는 시그니처 검사시 타입을 검사하지 않고 인수의 수만 검사한다. 동적 언어기 때문에 식별자에 담긴 타입이 언제든지 변할 수 있고, 참조값을 저장하기 때문에 타입 검사가 의미 없기 때문이다. 실제로 feed_pk에서 타입 힌팅을 int로 주고 있지만 ..
Python Decorator 선언시 호출하지 않으면 TypeError 발생했던 이유들어가면서 사내에서 사용하는 함수 중 @redis_cache라는 함수가 있다. 함수의 FQCN과 input을 기억해놓고 캐싱하는 역할의 함수이다. 이 함수를 사용하는데, 자꾸만 TypeError가 발생했다. TypeError라고 해서 인자 타입이 잘못된 것인줄 알았는데 Python의 TypeError는 호출하려는 함수의 시그니처가 다를 경우 발생하기도 한다. @redis_cache def get_feeds(feed_pk: int) { ... } Python에서는 시그니처 검사시 타입을 검사하지 않고 인수의 수만 검사한다. 동적 언어기 때문에 식별자에 담긴 타입이 언제든지 변할 수 있고, 참조값을 저장하기 때문에 타입 검사가 의미 없기 때문이다. 실제로 feed_pk에서 타입 힌팅을 int로 주고 있지만 ..
2024.02.04 -
들어가기 앞서 인프런 강의 MySQL 성능 최적화 강의를 들으면서 들었던 생각, 궁금한 내용 등을 정리한 글입니다 https://www.inflearn.com/course/mysql-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94/dashboard MySQL 성능 최적화 강의 - 인프런 라인, 구글, 당근, 카카오 등의 회사에서 실제로 MySQL 성능을 개선한 사례들을 배워볼거에요. 단순한 성능 최적화 가이드를 떠나서 MySQL 의 내부 동작을 이해하고, 효율적으로 쓰는 방법에 대해 www.inflearn.com Q: 공부하면서 제가 궁금함을 느꼈던 부분입니다 P: 전에 알고 있었던 개념 / 키워드 등에 대해 다시 찾아보고 정리한 부분입니다 Multiple-Column..
MySQL 성능 최적화 섹션 1 ~ 3들어가기 앞서 인프런 강의 MySQL 성능 최적화 강의를 들으면서 들었던 생각, 궁금한 내용 등을 정리한 글입니다 https://www.inflearn.com/course/mysql-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94/dashboard MySQL 성능 최적화 강의 - 인프런 라인, 구글, 당근, 카카오 등의 회사에서 실제로 MySQL 성능을 개선한 사례들을 배워볼거에요. 단순한 성능 최적화 가이드를 떠나서 MySQL 의 내부 동작을 이해하고, 효율적으로 쓰는 방법에 대해 www.inflearn.com Q: 공부하면서 제가 궁금함을 느꼈던 부분입니다 P: 전에 알고 있었던 개념 / 키워드 등에 대해 다시 찾아보고 정리한 부분입니다 Multiple-Column..
2024.01.27 -
들어가면서 최근 회사에서 Django를 만지면서, 또 핸즈온 장고라는 책을 읽으면서 ORM 자체에 대한 이해도도 늘었다. (Django ORM을 공부하면서 JPA 실력이 는 기분이라니...) 이번 기회에 내가 새롭게 느낀 것들에 대해서 이야기 해보려 한다 N + 1 문제에 대한 오해 이전에는 N + 1 문제 발생의 원인이 단순히 기술적 한계라고 생각했고, 다른 한 편으로는 그렇게 그 이유에 대해 뭉뚱그려서 생각하니까 복잡한 것이라 생각했고, 해결하기 복잡한 것이라 생각했다. 이 생각은 사실 저번주 까지도 유효했고, 이번에 처리한 티켓에서 N+1 문제를 해결하면서 성능을 많이 이끌어 내면서 아 N + 1 이란게 RDBMS 구조상 당연히 일어나는 것이고 별로 어려운 문제도 아님을 느끼게 되었다. 우선 내가 ..
3주간 Django ORM 써보면서 느낀 점들어가면서 최근 회사에서 Django를 만지면서, 또 핸즈온 장고라는 책을 읽으면서 ORM 자체에 대한 이해도도 늘었다. (Django ORM을 공부하면서 JPA 실력이 는 기분이라니...) 이번 기회에 내가 새롭게 느낀 것들에 대해서 이야기 해보려 한다 N + 1 문제에 대한 오해 이전에는 N + 1 문제 발생의 원인이 단순히 기술적 한계라고 생각했고, 다른 한 편으로는 그렇게 그 이유에 대해 뭉뚱그려서 생각하니까 복잡한 것이라 생각했고, 해결하기 복잡한 것이라 생각했다. 이 생각은 사실 저번주 까지도 유효했고, 이번에 처리한 티켓에서 N+1 문제를 해결하면서 성능을 많이 이끌어 내면서 아 N + 1 이란게 RDBMS 구조상 당연히 일어나는 것이고 별로 어려운 문제도 아님을 느끼게 되었다. 우선 내가 ..
2024.01.20 -
이 글은 이 책의 내용을 요약하는 것이 아닌, 읽으면서 어떤 생각이 들었던 부분들에 대해 적은 글입니다. Chapter 2. 파이썬이 프로그램을 실행하는 방법 "파이썬에서 컴파일러는 항상 런타임에 나타나며, 프로그램을 실행시키는 시스템의 일부다." -p. 41 파이썬도 컴파일을 한다. 그런데 미리 해두고 사용하는 것이 아니라, import 문을 읽는 시점에 해당 소스를 컴파일한다. 이때 컴파일해서 나온 파일이 .pyc인데, 파이썬 바이트코드 형태로 쓰여져 있다. 그렇다면 같은 파일을 import할 때마다 매번 컴파일할까? 그건 아니다. 컴파일하기 전에 버전을 체크해서 이 소스가 이미 컴파일된 것은 아닌지, 컴파일된 이후에 변경점은 있는지를 체크한다. 여기서 들었던 생각은 2가지가 있다. 1. 확실히 빌드..
러닝 파이썬 읽으며 들었던 생각들 chapter1에서 4까지이 글은 이 책의 내용을 요약하는 것이 아닌, 읽으면서 어떤 생각이 들었던 부분들에 대해 적은 글입니다. Chapter 2. 파이썬이 프로그램을 실행하는 방법 "파이썬에서 컴파일러는 항상 런타임에 나타나며, 프로그램을 실행시키는 시스템의 일부다." -p. 41 파이썬도 컴파일을 한다. 그런데 미리 해두고 사용하는 것이 아니라, import 문을 읽는 시점에 해당 소스를 컴파일한다. 이때 컴파일해서 나온 파일이 .pyc인데, 파이썬 바이트코드 형태로 쓰여져 있다. 그렇다면 같은 파일을 import할 때마다 매번 컴파일할까? 그건 아니다. 컴파일하기 전에 버전을 체크해서 이 소스가 이미 컴파일된 것은 아닌지, 컴파일된 이후에 변경점은 있는지를 체크한다. 여기서 들었던 생각은 2가지가 있다. 1. 확실히 빌드..
2024.01.13