SW개발/개발이야기
인스타그램의 샤딩 방법과 ID에 관하여 (feat. 분산 환경에서의 고유한 ID)
안녕하세요, 오늘은 정말 1초에 정말 수많은 사진들이 업로드되는 인스타그램의 샤딩과 ID에 관한 내용에 대해서 다뤄볼까 합니다. 인스타그램의 공식 엔지니어링 블로그에 소개된 글을 번역합니다. 자세한 내용은 아래의 원문을 참고해주세요. https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c Sharding & IDs at Instagram With more than 25 photos and 90 likes every second, we store a lot of data here at Instagram. To make sure all of our important data fits… instagram-engineering.com S..
[캐시]캐싱 전략에 대해서 (feat. Redis)
안녕하세요, 오늘은 Redis에서 캐싱을 위한 여러가지 전략들에 대해서 알아보려고 합니다. 이전까지는 캐싱에 대해서 단순하게 잘 바뀌지 않는 데이터를 캐싱하면 좋을거야, DB 엑세스보다 메모리 엑세스가 빠르니 캐싱이 좋을거야와 같은 1차원적인 생각만을 가지고 있었는데요. Redis에서 캐시를 읽고 쓰기 위한 여러가지 전략들에 대해 알게되어, 공부하는 차원에서 캐싱 전략에 대한 내용들을 정리해보려고 합니다. Redis 캐시 읽기 전략 Look Aside (Cache Aside) 전략 기본적으로 캐시에 데이터가 있는지 확인합니다. 데이터가 없다면 DB에서 데이터를 찾아봅니다. DB에서 가져온 데이터를 캐시에 저장합니다. 데이터를 사용자에게 전달합니다. 이처럼 Look Aside 전략은 데이터가 캐시에 있는지..
앱 스토어 인앱결제 서버 알림 Signature 검증 구현기 (feat. X.509 인증서란?)
안녕하세요, 오늘은 앱 스토어 인앱결제 시스템 구현을 위해 사용되어지는 App Store Server Notification에서 수신 받는 데이터를 검증하는 방법에 대해서 이야기 해보려고 합니다. https://developer.apple.com/documentation/appstoreservernotifications Apple Developer Documentation developer.apple.com App Store Server Notification 란? 앱 스토어에서 인앱결제에 대한 상태 변화들을 실시간으로 알려주는 Server to Server 서비스입니다. 구매, 취소, 환불, 갱신, 만료 등 인앱결제 상품에서 발생하는 이벤트들을 수신할 수 있습니다. 수신받는 서버는 수신된 데이터를 가지..
넘블 백엔드 챌린지 - Django 컨트리뷰터와 함께 배우는 빠르고 재미있는 웹개발
안녕하세요, 블로그 주인장 입니다. 최근에 좋은 기회가 생겨서 넘블이라는 IT 프로젝트 챌린지 플랫폼에서 장고 관련된 챌린지를 오픈하게 되었습니다!! 특히, 현업에서 요구되어지는 비즈니스적 로직들을 구현하는 것에 초점이 되어 있으며 테스트 코드가 익숙하지 않은 분들도 이번 기회에 작성 해보는 것을 주요 챌린지 목표로 삼고 있습니다. 관심이 있으신 분들은 챌린지 참여를 통해서 개발 실력을 한단계 더 성장해보면 좋을 것 같습니다. 넘블 챌린지 참여하러 가기 (모집중) Django 컨트리뷰터와 함께 배우는 빠르고 재미있는 웹 개발 당신의 시간은 넘블이 아껴드립니다! 30초 요약해볼게요! www.numble.it 많은 참여 부탁드립니다 :) 감사합니다~!
외부 API 오류가 발생한다면, 서버는 어떤 status code를 전달해야 할까?
최근에 개발하면서 곰곰히 생각해보아도 마땅한 결론이 나지 않았던 경험에 대해서 이야기해보려고 합니다. 외부 API의 오류 그리고 HTTP Status Code 외부 API 에서 오류가 발생한다면 내 서버는 클라이언트에게 어떤 status code를 전달해야 할까요? 이 글을 쓰기 전까지 저는 위 내용에 대해서 잠깐 고민해본적은 있지만 심각하게 고민해본적은 없었습니다. 그저 습관적으로 400 Bad Request를 리턴하고 있었죠. 400 Bad Request 란? 400 에러는 과연 적절한 status code 일까요? MDN의 정의를 살펴봅시다. The HyperText Transfer Protocol (HTTP) 400 Bad Request response status code indicates th..
오픈소스 기여하기 회고 3
이번 포스팅을 마지막으로 오픈소스 기여하기 시리즈는 끝입니다. 마지막인만큼 오픈소스 컨트리뷰터로서 활동하는 것에 대한 느낀점을 쭈욱 나열하는 형식으로 적어보려고 합니다. 오픈소스를 왜 시작했어요 ? "유명한 오픈소스에 내 코드를 남겨보자" 시작하자고 마음을 먹은 이유자체는 정말 순수했습니다. 물론 앞선 포스팅에서 다양한 이유들도 적어두긴 했습니다만, 위와 같은 이유가 제일 컸습니다. 자랑하거나 유명해지고 싶었다고 할까요? 쉽지 않은 길이라는 것을 미리 알고는 있었지만, 때로는 이런 무모하고 단순한 이유들이 가장 큰 원동력이 되기도 합니다. 어렵거나 큰일을 이루어 내기 위해서는 해내야하는 수많은 일들이 있는데 이런 순수한 감정들은 정말 큰 도움이 됩니다. 패치할만한 버그를 찾는 과정은 고달프다 오픈소스를 ..
오픈소스 기여하기 회고 2 (feat. Regression Test)
안녕하세요, 이번 포스팅에서는 코드 관점에서 Django 버그 패치 과정을 다뤄보려고 합니다. 문제를 접근하는 방식, 해결 과정, 느낀점 등의 내용이 담겨 있습니다. 버그 재현하기 (Reproduce bug) 우선 해당 이슈를 패치하기로 결정했다면 가장 먼저 해야할 일은 버그를 재현하는 것입니다. 대부분의 이슈들은 자세한 설명과 재현 방법이 나와있어 그대로 따라하면 됩니다. 만약 그렇지 않다면 이슈 리포터에게 조금 더 상세한 내용이나 샘플 코드를 부탁하면 됩니다. 제가 할당했던 티켓의 경우에는 명확한 재현 방법, version등이 나와 있어 재현에 어려움을 겪지는 않았습니다. https://code.djangoproject.com/ticket/34052 #34052 (migrate --check stil..
오픈소스 기여하기 회고 1 (feat. Django Contributor)
안녕하세요, 오랜만에 블로그 포스팅으로 찾아왔습니다. 회사에서도 바쁜 시간을 보냈고 여러 오픈소스에 관심을 가지면서 시간을 보냈던 것 같습니다. 오늘은 틈나는대로 관심을 가지고 있던 오픈소스 생태계에서 Django Contributor가 된 경험을 공유하려고 합니다. 바로 시작하겠습니다! 오픈소스 Contributor 되기로 마음 먹기 시작하기 전 오픈소스와 관련된 여러 글들을 읽어 보았는데 공통적으로 하는 말이 꽤나 고되며, 시간이 많이 소요된다라는 말들을 종종 볼 수 있었습니다. 하지만 그럼에도 불구하고 장점이 더 많았고 무엇보다 너무 해보고 싶었던 일이었기에 올해 안에는 오픈소스에 기여를 무조건 해보자 라는 마음가짐으로 시작했습니다. 제가 오픈소스를 시작하면서 기대했던 효과는 다음과 같습니다. 각국..
사이드 프로젝트, 어플리케이션 출시 회고
지난번 어플 출시 소개에 이어 오늘은 출시까지의 과정, 경험에 대한 리뷰입니다. 약 4개월간 회사일과 병행하면서 느꼈던 점들을 주로 적었습니다! 사이드 프로젝트 기획 & 시작 🚀 배달비가 나날이 비싸지는 와중에, 절약하기 위한 방법이 뭐가 있을까 하면서 생각났던 아이디어로 어플을 출시하는 것을 기획하게 되었습니다. 바로 근처의 사람들과 파티를 만들어 공동 주문을 통해 배달비를 1/N 하는 것입니다. 처음에는 친구와 2인으로 시작하였지만, 사정상 혼자하게 되었습니다. 어플 출시 목표 ✨ 처음에는 스토어에 출시하는 것 자체에만 목표를 두었습니다. 출시 프로세스를 경험해본 적이 없었기에 좋은 경험이 될 것 이라고 생각했습니다. 기술 스택은..? ⚒️ 사이드 프로젝트이기 때문에 많은 시간을 할애할 수는 없었습니..
[SQLAlchemy]dict 타입의 값 변경을 감지하지 못하는 이슈, 트러블 슈팅
안녕하세요, 오늘은 SQLAlchemy에서 지원하는 Mutation Tracking을 사용하던 중 겪었던 이슈에 대한 해결 과정을 공유하려고 합니다. 설명하기 앞서, Mutation Tracking이란 무엇인지 알아보겠습니다. https://docs.sqlalchemy.org/en/14/orm/extensions/mutable.html#module-sqlalchemy.ext.mutable Mutation Tracking — SQLAlchemy 1.4 Documentation Mutation Tracking Provide support for tracking of in-place changes to scalar values, which are propagated into ORM change events o..