본문 바로가기

IT

(46)
백엔드 설계 참고사항 1 Contents백엔드를 설계하는데 있어서, 무한히 row가 증가하는 table은 "과연 필요한가?"를 고민해봐야 한다.의도가, "이 table에 데이터를 계속해서 적재해서, 목적 A, B를 위해서 가져다가 쓸꺼야" 이런 식으로 구체화 되어야 한다. 아래는 설계 할 때 참고하면 좋은 작업 시나리오를 작성해둔다. 필요한 기간 동안만 저장(삭제 조건)무한히 row가 증가하는 table이지만, 내가 해당 table에 접근해서 연산하는데 사용하는 데이터가 지난 1달치라면, 1달이 지나는 데이터는 delete되도록 삭제 시나리오를 구성한다.ex) 자정마다 1달이 over 되는 데이터 정리 스케줄러 개발 무한히 증가하지 않는 table 설계요구사항이 저장을 요구하지만, 무한히 증가할 필요 없도록 구성할 수 있다면, ..
Token 수량 확인 해주는 앱(Claude Code, Codex, Gemini CLI) Contents돌아다니다가 재미난 앱을 하나 찾았다. LLM CLI 툴들에 대한 Token 수량을 확인 해주는 MacOS 앱이다. 현재 Codex, Claude, Cursor, Gemini, Antigravity, Droid (Factory), Copilot, z.ai, Kiro, Vertex AI, Augment, Amp, JetBrains AI에 대해서 GUI로 token을 표시해주는 앱이다. 아래 사이트에서 다운로드 가능하다.https://github.com/steipete/CodexBar GitHub - steipete/CodexBar: Show usage stats for OpenAI Codex and Claude Code, without having to login.Show usage stat..
[python] 리스트 잘못 쓰면, 오늘은 정상인데 내일은 망가진다. Intropython에서 mutable 개념이 있다. 보통 reference 기반 언어에서 많이 사용된다.python의 리스트는 mutable이며, 이는 곳 shallow copy를 한다는 뜻이다. 오늘은 mutable이 무엇인지도 알고, shallow copy도 무엇인지 개념은 알지만, 초보자가 쉽게 실수하는 부분에 대해서 이야기 한다. Contentshallow copy를 잘 알고 있다면, 다음과 같은 상황에서 어떤 값이 출력 될지 잘 알 것이다. class Activity: tags = []if __name__ == "__main__": a1 = Activity() a2 = Activity() a1.tags.append("from a1") print("a1.tags:", ..
[개발] AI로 짠 코드, 내가 리뷰하는 건 개발자인가 AI인가 Contents최근에, 지인 중에서 나는 AI로 코드를 생성하는 것을 지양한다는 이야기를 들었다. 이야기는 다음과 같다. - 팀원이 AI를 이용해서, 코드를 작성했다고 가정하자. 해당 팀원은 PR을 올리고 코드리뷰를 요청했고, 팀장 급은 해당 PR을 읽는다. 그러면 리뷰어는 개발자 코드를 리뷰하는 것인가? AI를 리뷰하는 것인가?- 리뷰어가 1시간, 2시간이 걸려서 PR을 검증하기 위하여 시간을 섰다. 피드백 사항을 적어 두니, 팀원이 AI를 이용해서 다시 PR을 올렸다. 리뷰어 입장에서는 AI와 대화를 하는 것인가? 여러 문제가 복합적으로 섞여 있는 것 같지만, 우선은 위에 있는 그대로 바라보겠다. 왜냐하면, 모든 일에는 "정도"의 문제가 있어서, 가능한 정도와 불가능한 정도가 섞여 있기 때문에, 읽는..
[TimescaleDB] hyper table에 indexing을 걸면? Intro환경설정docker run -d --name timescaledb -p 5432:5432 -e POSTGRES_PASSWORD=password timescale/timescaledb:latest-pg15create table realtime_datas ( id serial, event_time timestamptz not null, data integer not null);DO $$DECLARE _current timestamptz; random_interval INTERVAL; random_value INT; start_date timestamptz := '2024-01-01'; end_date timestamptz := '2024-07-30';BEGIN _cu..
[python] module level __getattr__ (__getattr__ 조금 더 파보기) Intro기존 코드의 하위 호환을 위해서, module level의 __getattr__을 쓰게 되었다.오늘은 module level의 __getattr__에 대해서 정리해보려고 한다. Contents# constant.pyclass Settings: def __init__(self): self.ENV_1 = "test1" self.ENV_2 = "test2"setting = Nonedef get_setting(): global setting if setting is None: setting = Settings() return setting def __getattr__(name: str): return getattr(get_settin..
[백엔드] timestamp를 압축 시켜보자 Contents대부분의 서비스에서 timestamp를 압축할 필요성은 없다.물론 하면 좋겠지만, 굳이 안하는 경우가 많다. 전자제품 카테고리의 물품리스트를 한페이지에 30개 정도씩 뿌려준다고 가정해보자.전체 개수가 30개 인것이니까, "created_at": 2025-12-17T01:00:00+00:00 정도의 문자열이 30개만 반복되는 것이다. 그런데, 실시간 시스템이나 하드웨어 센서 등의 데이터를 차트로 보여줘야하는 대시보드 서비스라면 얘기가 달라진다. 생각해보자, 5분마다 측정된 센서 A, B, C에 대해서, 총 3일치의 데이터를 한개의 차트에 그려야 한다고 가정한다. 하루를 기준으로288(5분마다 측정) * 3(센서 3개) 이므로, 864개의 데이터가 하루에 쌓인다. 3일간의 데이터임으로 ..
[백엔드] timestamp의 Z와 +00:00 이야기 Contents지난 글들을 보면, timestamp에 대한 이야기를 꽤나 한 것 같다. 오늘은 UTC에 대해서 이야기 해볼까 한다. UTC는 표현하는 방법이 2가지가 있다. 둘다 표준이다. 2025-12-17T01:00:00Z2025-12-17T01:00:00+00:00 하나는 TZ 모양을 가지고 있고, 다른 하나는 +00:00과 같이 timezone을 표시한다. 2025-12-17T01:00:00ZZ의 의미는 Zulu time이라고 해서, UTC를 의미한다. 즉, Z가 붙어있으면, 이 시간은 무조건 UTC 임을 말한다.이 표현방식은 ISO 8601 방식이다. Zulu time = UTC 이며, UTC를 부르는 군사 항공 항애 분야의 코드명이다.(그래서 Phonetic Code에서 유래되었다고 한다) ..
[TCP] 서버는 TCP 소켓 연결을 몇개 까지 할 수 있을 까? 들어가기 앞서Release의 모든 것이라는 책을 읽다가 보니, 포트가 1024 ~ 65535까지 총 64511개가 있는데 많은 사용자가 서버에 접속할 수 있는 이유에 대해서 설명하는 부분이 있었다.주된 이유는 운영체제가 가상 IP 주소를 동일한 네트워크 인터페이스에 부여하기 때문이라고 적혀있다.내가 예상하는 바와는 다른 내용이라 분석을 시도했다. Contents우선 64511개 보다 더 많은 TCP 연결을 동시에 할 수 있는 이유는, 소켓을 구성하는 데 있어서, 포트 번호로만 연결이 식별되지 않기 때문이다.보통 (Source IP, Source Port, Destination IP, Destination Port)을 기준으로 튜플 key로 연결이 구분된다. Client가 Server에 접속한다고 가정하면..
[DB] UTC로 구성 한다는 것 Contents과거에 timezone이 필요한 날짜 데이터 빠르게 select 하기라는 글을 작성한 적이 있다.시간이 지난 지금, 왜 굳이 이렇게 했을까 라는 생각이 든다.https://nebulayoon.tistory.com/20 [TimescaleDB] timezone이 필요한 날짜 데이터 빠르게 select 하기들어가기 앞서TimescaleDB는 PostgreSQL 진영의 time series 데이터를 저장하기 위한 DB이다. 시계열 데이터를 처리하기 위해 최적화된 데이터베이스로, 실시간으로 쌓이는 대규모 데이터를 처리하기 위nebulayoon.tistory.com 위 글의 내용은 다음과 같다. TimeScaleDB의 hyper table의 기준이 되는 timestamptz column에 사용자의..
[백엔드] output json을 신경써서 만들어야 하는 이유(안티패턴) Contents신입과 주니어 개발자들이 놓치는 부분 중에 하나는 "디테일"이다.동작하는데 문제가 없으니까, 현재의 방법이 맞다고 느끼는 "착각"에 빠지기 쉽다.그 중에, return 값에 대해서 이야기 해볼까 한다. 먼저 아래 json을 확인해보자. 그리고, 문제점을 찾아보자.{ "precheck": {"comment": "검증 완료", "status": 1}, "rules": { "min_stock_rule": {"comment": "최소 재고 충족", "status": 1, "value": 3}, "promo_price_rule": {"comment": "프로모션 가격 미적용", "status": 0, "vlaue": 0} }} 문제점간단하게 예시를 만들어봤다..
[Azure] 클라우드를 몰랐던 스타트업 개발자의 실수 나는 대학생때 클라우드를 공부하지 않았다.모두가 클라우드를 찍먹 해봐야 하지 않겠냐며, 프로젝트를 클라우드에 올리고 그랬던 때이다. 그때의 나의 생각은, '모두가 클라우드를 한다고? 어차피 클라우드는 빌리는 거고, 본질은 네트워크, 인프라 등에 있는 거 아니야? 나는 클라우드 공부 안하고, 온프레미스를 공부해야지'라는 마인드 였다.조금 덧붙이자면, 클라우드의 경험은 회사에서 할 수 있으니, 그 클라우드의 근간이 되는 기술들을 학습하는데 시간을 쓰겠다는 소리였다. 나는 극초기 스타트업의 첫번째 직원으로 합류하게 되면서, 클라우드를 처음 접하게 되었다. 문제는 여기서 발생했다.회사 내의 그 어떤 사람도 클라우드에 대해서 알고 있는 사람이 없었기에, 신입인 내가 모든 부분을 관리해야 했다.서비스 일정은 다가오..
[분석] 카카오톡은 왜 롤백 할 수 없다고 했을 까? 카카오톡은 왜 롤백이 어렵다고 했는지 수많은 생각에 대한 정리이다. 한마디로, 사실과는 무관한 뇌피셜이다.나중에, 혹시나 이유가 공개되거나 한다면, 어떤 부분이 틀렸는지 맞았는지 알아보면 재밌을 것 같다.또한, 나라면 어떻게 해결해야 할지 생각해보면, 조금은 성장하는데 도움이 될 것이다. 사실 뭐 돈과 관련된 것이겠지만, 그게 물질적이든 기회비용이든... 다른 개발자들과 대화하고 든 생각들을 정리해본다. 1. 변경된 카카오톡 화면에서 제공하는 광고 계약 해지 문제변경된 카카오톡에서 광고 수익 비즈니스 모델을 구성했고, 관계자는 변경된 카카오톡에 미래를 보고 광고 계약을 했기 때문에, 해지 문제로 롤백을 할 수 없는 경우이다.계약 문제와 신뢰 문제로 불가능하다고 판단 했을 경우이다. 2. 직책의 권한 문제..
[LLM] 모든 모델을 쓰고 싶은 라이트 유저들의 플랫폼(T3 chat) 요즘은 구글의 gemini, OpenAI의 ChatGPT, Anthropic(Claude)의 Sonnet 등 다양한 LLM AI 모델들이 나온다.그리고, 각 플랫폼 마다 유료버전을 사용하면, 상당한 비용이 나간다. 한국에서 가장 많이 사용하는, ChatGPT만 하더라도, 20$인데, 부가세 포함해서 22$이고, 요즘 원화로 약 30580원(22 * 1390)이다. 이는, 한달에 50번 미만으로 사용할까 말까하는 가볍게 사용하는 유저들한테는 별로 좋은 소식이 아니다.ChatGPT만 3만원 가량 나가는 것이고, 여러 모델을 사용하고 싶은 사람들에게는, 추가적으로 각 플랫폼 별로 비용이 든다. 이 니즈를 t3 chat에서 해결해준다.https://t3.chat/ T3 Chat - Advanced AI Assi..
[Python] .get을 써야 하는 가? 인덱싱(subscription)을 써야 하는 가? Contentspython을 사용하다보면, pythonic한 코드를 사용해야한다는 이야기를 많이 들을 것이다.항상 의문인 것은 그래서 pythonic한 코드가 뭔데? 라는 것이다. 아무튼, 본론으로 돌아와서, python의 dictionary type의 value를 가져오는 방법은 크게 2가지 방법이 있다..get("name")["name"]보통 주니어 개발자는 이런 경우에 이런 생각을 한다. "둘 중에 어떤 것을 사용하는게 pythonic하게 작성하는 걸까?""어떤 문법을 사용하는게 맞을까?" 결론 부터 말하지면, "둘중에 뭐를 사용하더라도, 의도에 맞게 사용하면 된다" 이다.의도에 맞게 사용한다는 관점이 뭔지 설명하겠다. dict_instance.get("name") 과 dict_instance["n..