코딩하는기술사
체계적 이론 겸비 + 20년 이상 실무 경험 + Top-tier 라이선스 보유
20+ 실무 경력
대형 게임사, 대기업 통신사 계열, 스타트 업 등에서 개발 리더/아키텍트
웹, 윈도우, 게임, 자동화, 데이터분석 등 다양한 응용 개발
개발팀(메인), 데이터베이스팀, 인프라팀 등 매니징
사내 공식 강사
체계적 이론 겸비
컴퓨터 공학 석사
(학위논문) 가격제한폭 확대 이후 소표본 IPO의 상장일 시초가 예측을 위한 LoRA 기반 TabPFN 파인튜닝
집필 및 기고
시작하세요! 모바일 웹개발 (2011년, 문화체육관광부 올해의 우수학술도서 선정(기술과학 분야)
Top-Tier 라이선스 보유
기술사(정보관리) / 정보시스템수석감리원
ISMS-P인증심사원 / SW보안약점진단원
데이터품질인증심사원(DQC-V)
Microsoft MVP(C#부문) / MCAD
PMP / OCP9i
인프런 개발자들과 함께 성장하겠습니다.
공부하는 모든 개발자 분들 화이팅! 입니다^^
Courses
Reviews
goyangee
·
2026! A Practical Guide to Redis for Backend Developers: From Basics to Real-World Patterns2026! A Practical Guide to Redis for Backend Developers: From Basics to Real-World Patternshidongmin37
·
Equipping Developer Fundamentals - Essential Concepts and Core Theories for Programming DevelopmentEquipping Developer Fundamentals - Essential Concepts and Core Theories for Programming Developmentdbpjack1
·
Equipping Developer Fundamentals - Essential Concepts and Core Theories for Programming DevelopmentEquipping Developer Fundamentals - Essential Concepts and Core Theories for Programming Development- 2026! Learning Object-Oriented Programming Properly (with Python)
nonnamed884863
·
2026! A Practical Guide to Redis for Backend Developers: From Basics to Real-World Patterns2026! A Practical Guide to Redis for Backend Developers: From Basics to Real-World Patterns
Posts
Q&A
레디스로 재고 관리
안녕하세요! 두 질문 모두 같은 핵심을 담고 있네요. Redis의 재고 감소와 DB 반영의 정합성에 대한 문제네요. 가장 심플한 구조Lua Script로 Redis 작업을 처리한 뒤 바로 DB에 반영하는 방법이 있어요.다만 이 구조는 Redis 성공 + DB 실패 시 정합성이 깨지는 문제가 있어요. 그래서 말씀하신 대로 중간에 큐를 두는 접근이 좋습니다. (1번 질문) Redis Stream + Worker + DB제안하신 구조도 괜찮은 접근입니다. 다만 Worker 실패 시 재처리 전략을 검토해 주세요.처리 완료 → XACK미처리 메시지 확인 및 재처리 → XPENDING중복처리에 대한 멱득성 보장한 가지 더, Redis Stream은 인메모리 기반이라 Redis 장애 시 데이터 유실 가능성이 있어요. 프로덕션 환경이라면 AOF 설정을 반드시 활성화하세요. (2번 질문) Kafka 추가1번 구조에서 Worker → DB 사이에 Kafka가 추가된 구조네요. Kafka를 추가하면 Consumer를 여러 개 띄워 처리량을 늘릴 수 있지만 운영 복잡도가 증가합니다. 트래픽이 충분히 커졌을 때 or 완벽한 내구성이 필요할 때 도입하는 걸 권장드립니다.
- Likes
- 0
- Comments
- 2
- Viewcount
- 35
Q&A
Lock 해제 문의 드립니다.
안녕하세요. 😊release_lock의 identifier 비교 로직은 "임계영역에 대한 작업 소요 시간이 락의 TTL을 초과했을 때" 를 전제로 한 방어 코드입니다.락을 먼저 잡은 A가 임계영역에 대한 작업이 예상보다 길어져 락의 TTL이 먼저 만료되어 버리면, 락이 자동 삭제되고 다른 요청 B가 새로 락을 획득할 수 있습니다. 이 시점에 A가 작업을 끝내고 아무 검증 없이 DEL을 호출하면 B의 락을 지워버리는 문제가 생깁니다. 그래서 identifier를 비교한 뒤 삭제하면 이를 막을 수 있습니다.또한 GET → DEL 사이에 TTL이 만료되고 다른 요청이 락을 가져가는 상황이 끼어들 수 있기 때문에, Lua 스크립트로 원자적으로 묶을 것을 권장드린 것이고요.참고로 강의의 샘플 코드에서는 작업 시간(sleep(2))이 락의 TTL(5초)보다 짧아서 이와 같은 상황이 발생하지는 않겠지만, 실무에서는 DB 응답 지연, 서버 부하 등으로 작업 시간이 예상을 초과하는 일이 발생할 수 있습니다. 그래서 TTL을 작업 예상 시간보다 충분히 크게 설정하는 것이 중요합니다. 그리고 이 코드는 분산락의 기본 원리 이해 직접 구현한 샘플이고요실제 실무에서는 Lua 원자성, 다중 노드 지원(Redlock) 등을 고려해 Redisson(Java), redlock-py(Python) 같은 검증된 라이브러리 도입을 검토하시길 권장합니다.좋은 질문 감사합니다. 👍
- Likes
- 0
- Comments
- 2
- Viewcount
- 39
Q&A
레디스로 대기큐 구현 질문
안녕하세요. 😊유투브 영상을 보셨군요.백단의 스케줄러가 대기열(Sorted Set)에서 입장시킬 수 있는 수 만큼 뽑아서 Active User에 넣습니다. Active User에 있는 유저는 입장 허가를 받은 거죠. 이 시점부터 예매 페이지로 가서 출발시간과 좌석수 등을 선택해서 예매를 진행할 수 있게 됩니다. (이때 Active User는 개별 유저에 대해 TTL을 설정해야 하기 때문에 Redis의 String이 적합합니다. 키 예시: active:user:{uuid})그리고 나서, 유저가 최종 예매 버튼을 클릭하면 (여러 유저가 동시에 요청을 할 수 있기 때문에) 해당 시간에 남은 좌석수를 Redis의 Lua Script나 Functions를 사용해 원자적으로 계산해서 최종 예매 처리를 합니다.(예매처리는 RDB로 최종 쓰기 작업을 할 수도 있고, MQ로 보낼 수도 있습니다)화이팅입니다. 👍
- Likes
- 0
- Comments
- 2
- Viewcount
- 73
Q&A
API LIMIT
안녕하세요.😊1. Rate Limiting과 어뷰징부분적으로는 비슷해 보이지만, 이 둘은 목적과 대응이 다릅니다.a. Rate Limiting사용량 제한리소스 보호와 공정한 사용이 주 목적입니다. 즉 너무 많이 사용하지 말라는 거죠.b. Abusing 탐지악의적인 행위 탐지단순히 횟수 초과를 넘어 호출 패턴, 속도, 분포 등을 함께 봐야 합니다.그래서 일반적으로 Rate Limiting을 먼저 적용하고, 사용량을 초과하면서 특정한 이상 호출 패턴이 보이면 어뷰징 처리를 추가로 하는 형태로 구현합니다. 즉 Rate Limiting은 1차 방어선이고 Abusing 탐지는 그 다음 레이어로 처리하는 게 일반적입니다. 따라서 이 둘을 완전히 동일하게 가져가지는 마시고 계층을 분리해서 설계하는 것을 권장드립니다.2. API Rate Limiting 실무 임계치말씀하신 대로 보통 인간이 초당 빠르게 클릭할 수 있는 경험적 최대치(도메인 상식 기반)를 우선 감안합니다. 그리고 실제 정상적인 유저의 해당 액션 빈도를 보고 조정할 수 있습니다.(정상적인 의도를 가진 사용자가 막히면 안 되니까요) 그리고 '좋아요'와 같은 비교적 가벼운 액션은 좀 관대하게 잡기도 하지만, 중요한 행위일 경우 좀 더 타이트하게 설정하는 것이 좋습니다.화이팅입니다. 👍
- Likes
- 0
- Comments
- 1
- Viewcount
- 51
Q&A
Redis와 Kafca의 Pub/Sub 차이
안녕하세요. 😊대규모 처리일 경우 'Redis 좋아요 증가 → Kafka 메시지 발행 → MySQL 업데이트'는 실무적으로 잘 설계된 패턴이라고 할 수 있습니다.Redis의 Pub/Sub과 Kafka의 메시지 발생의 가장 기본적인 차이점은 메시지 유실 가능성입니다. Redis의 Pub/Sub은 완전한 실시간 알림 성격으로 Publish할 때 받지 못하면 해당 데이터는 바로 유실됩니다. 즉 특정 장애 상황에서 MySQL에 좋아요 수치가 일치하지 않을 수 있는 거죠. 대신 Kafka는 메시지가 유실되지 않고 전달을 보장합니다.또한 트래픽이 폭발적으로 몰리는 상황에서 메시지를 버퍼링해 두고, MySQL이 처리 가능한 속도로 메시지를 소비할 수 있게 해 줍니다.정리하자면Redis는 빠른 속도(카운터 증가), Kafka는 신뢰성 있는 처리(MySQL 반영 보장)와 버퍼링 으로 각각의 역할을 분리하는 것이 좋습니다.참고로 Redis에 Pub/Sub 말고 Streams라는 기능이 있습니다. 마치 Kafka와 같이 메시지 영속성과 컨슈머 그룹을 지원합니다. 소규모 트래픽이라면 Redis Streams로 Kafka를 대체할 수도 있습니다. 이럴 경우 아키텍처가 좀 단순해 질테구요.(Redis로 속도와 메시징 둘 다 처리)그러나 역시 대규모 트래픽 환경이라면 Kafka가 더 적합한 선택입니다.
- Likes
- 0
- Comments
- 2
- Viewcount
- 58
Q&A
캐시 무효화
안녕하세요. 😊일반적으로 기존 캐시를 삭제하는 방식이 더 깔끔해서 실무에서 선호하는 방식입니다.아래와 같은 이유입니다.기존 캐시 수정 시, GET하고 수정하고 SET 순서로 처리에 따른 원자성 보장 -> 갱신 로직 복잡(삭제에 비해) 사용자 이름이 여러 캐시에 있을 경우 일부 캐시 수정 누락 -> 불일치 가능성 사용자 이름 변경은 빈도가 낮은 이벤트라 캐시 미스 시키고 DB조회로 다시 갱신하는것이 그리 큰 부담이 되지 않는 거 같습니다. 따라서 작업의 단순성과 데이터의 정합성 측면에서 삭제하는 것을 권장드립니다.그러나 만일 캐시 재생성 비용이 매우 크고 캐시 미스에 따른 속도 저하가 아주 민감한 경우라면 기존 캐시 수정을 고려해 볼 수 있을 거 같습니다. 연휴에도 열심히 하시네요. 화이팅입니다. 👍
- Likes
- 0
- Comments
- 2
- Viewcount
- 43
Q&A
SP를 아직도 사용하나요?
안녕하세요. 😊일부 도메인, 작업 영역에서 여전해 SP가 활용되는 걸로 알고 있습니다. 관행, 감사추적, 대용량 처리, 보안 등의 각기 서로 다른 니즈가 있을 것입니다.
- Likes
- 0
- Comments
- 2
- Viewcount
- 59
Q&A
너무 흥미진진합니다..
안녕하세요. Redis를 RDBMS를 보완하는 도구로 잘 활용하시면 실무의 많은 문제를 해결할 수 있습니다. 특히 대용량 서비스일 수록 그 진가가 더욱 발휘됩니다.강의 수강해 주셔서 감사합니다. 😊
- Likes
- 1
- Comments
- 2
- Viewcount
- 60
Q&A
순위가 동률일 때의 처리에 대해 질문드립니다.
안녕하세요. 실무에서 부딪힐 만한 좋은 질문 주셨네요. 😊여러 방안이 있을 수 있겠습니다.1. 공동 순위로 처리화면 표시 순서는 애플리케이션에서 담당.(예: 달성 시간, 닉네임 가나다순 등)가장 심플. 안전. 권장. (ZSet의 순위에 영향을 주는게 아니니 깔끔함)(공동순위로 하고 화면 표시만 다르게 해도 대부분의 서비스에서 허용 가능) 2. 먼저 달성한 사람을 상위 순위로점수 + 시간을 하나의 score로 인코딩합니다.score = 실제점수 * scale + (scale - custom_timestamp) scale두 값의 자릿수를 분리하는 상수 custom_timestamp 최댓값보다 커야 함(ex: 10⁹) custom_timestamp먼저 달성한 사람이 더 작은 값이 되도록 해서 높은 순위가 되도록 함계산식: 점수 달성 시각 - 기준 시각(ex: 서비스 출시일)Unix timestamp를 그대로 사용하면, 초 단위로도 10자리라서 scale을 더 크게 잡아야 하고,그만큼 ZSET score의 double 정밀도 한계(~10¹⁵)에서 실제점수에 쓸 수 있는 자릿수가 줄어듦. 따라서 기준 시점을 서비스 출시일로 잡으면 custom_timestamp가 8~9자리로 줄어들어 정밀도 예산을 아낄 수 있음. 3. 3개 이상의 기준 필요시 (1)말씀하신 대로 자릿수를 잘게 쪼개는 방식은 정밀도 한계 때문에 빠르게 무너질 수 있습니다. 이때는 Redis와 다른 자료구조의 역할을 분리하는 것을 생각해 볼 수 있습니다.ZSET: 1차 정렬 기준만 score에 저장 (ex: 점수)Hash 또는 RDBMS: 멤버별 상세 정보 저장 (2차·3차 기준)이후 조회 흐름 (페이징 / Top-N 조회)1) ZSET에서 1차 기준으로 해당 페이지에 해당하는 Top-N 후보 조회 (동점이 많을 수 있는 것을 감안해서 보여줄 개수보다 여유 있게 가져오기)2) Hash 또는 RDBMS에서 후보들의 상세 정보 조회. (RDBMS 사용 시 IN 절 인덱스 쿼리 필수)3) 애플리케이션에서 전체 기준으로 최종 정렬 후 페이지 단위로 응답 4. 3개 이상의 기준 필요시 (2)순위에 영향을 주는 여러 요인을 서비스 내부 공식을 따로 만들어서 최종 계산 값을 score로 사용기타 여러 방안이 있을 수 있겠으나, 대체로 이 범위 안에서 해결 할 수 있을거 같습니다. 좋은 질문 감사합니다. 화이팅입니다. 👍
- Likes
- 0
- Comments
- 2
- Viewcount
- 69
Q&A
Redlock 알고리즘 관해 궁금한게 있습니다!
안녕하세요. 질문에 답변 드립니다.1. Redis 노드들끼리 알아서 자동으로 동기화 되는 건 아니고, 클라이언트가 각 노드에 직접 SET NX PX 를 요청합니다. 즉 수동으로 동일한 값을 각 노드에 입력하는 것입니다. (Redis 노드들 끼리는 서로 전혀 모르는 사이입니다.)2. 이렇게 하면 노드마다 미세한 시간 차가 생기는 게 맞습니다. 그래서 Redlock은 "설정 TTL - 락 획득에 걸린 시간"으로 실제 유효 TTL을 다시 계산하고, 이 유효 TTL안에 작업을 끝내도록 합니다. 만일 유효 TTL이 작업하기에 너무 짧으면 락 획득 자체를 포기합니다.
- Likes
- 0
- Comments
- 2
- Viewcount
- 90




