<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Labaratory]]></title><description><![CDATA[Labaratory]]></description><link>https://100lab.org</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 18:55:33 GMT</lastBuildDate><atom:link href="https://100lab.org/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Tech Lead의 기술 로드맵 작성법: 실전 예시와 함께]]></title><description><![CDATA["우리 팀 기술 방향이 뭐예요?"
Tech Lead가 되면 반드시 듣게 되는 질문입니다. 팀원들은 자신이 어디로 가고 있는지 알고 싶어합니다. 내년에도 이 기술을 쓸 건지, 새로운 걸 배워야 하는지, 이 프로젝트가 끝나면 뭘 하게 되는지.
기술 로드맵은 이 질문에 대한 답입니다. 단순히 "이런 기술 쓸 거예요"가 아니라, 왜 그 방향으로 가는지, 언제쯤 도달할 수 있는지, 각자 무엇을 준비해야 하는지를 보여주는 지도입니다.
이 글에서는 실제로 ...]]></description><link>https://100lab.org/tech-lead-1</link><guid isPermaLink="true">https://100lab.org/tech-lead-1</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Sat, 10 Jan 2026 02:59:39 GMT</pubDate><content:encoded><![CDATA[<p>"우리 팀 기술 방향이 뭐예요?"</p>
<p>Tech Lead가 되면 반드시 듣게 되는 질문입니다. 팀원들은 자신이 어디로 가고 있는지 알고 싶어합니다. 내년에도 이 기술을 쓸 건지, 새로운 걸 배워야 하는지, 이 프로젝트가 끝나면 뭘 하게 되는지.</p>
<p>기술 로드맵은 이 질문에 대한 답입니다. 단순히 "이런 기술 쓸 거예요"가 아니라, 왜 그 방향으로 가는지, 언제쯤 도달할 수 있는지, 각자 무엇을 준비해야 하는지를 보여주는 지도입니다.</p>
<p>이 글에서는 실제로 활용할 수 있는 기술 로드맵 예시들을 공유합니다.</p>
<hr />
<h2 id="heading-6riw7iigiouhnoutnounteydtcdtlytsmpttlzwg7j207jyg">기술 로드맵이 필요한 이유</h2>
<p>로드맵 없이 일하면 어떻게 될까요?</p>
<p>급한 일에 치여서 기술 부채만 쌓입니다. 팀원마다 다른 방향으로 학습합니다. 새로운 기술 도입이 "그때그때 기분"에 따라 결정됩니다. 결국 1년이 지나도 팀의 기술 역량은 제자리입니다.</p>
<p>로드맵이 있으면 달라집니다.</p>
<p>팀 전체가 같은 방향을 봅니다. 학습에 투자할 시간을 확보할 명분이 생깁니다. 기술 도입의 기준이 명확해집니다. 채용할 때도 "이런 역량을 가진 사람이 필요하다"고 말할 수 있습니다.</p>
<hr />
<h2 id="heading-1">예시 1: 분기별 기술 로드맵</h2>
<p>가장 기본적인 형태입니다. 분기별로 주요 기술 목표를 정리합니다.</p>
<h3 id="heading-2025">2025년 기술 로드맵</h3>
<p><strong>Q1: 안정성 강화</strong></p>
<p>지금 가장 아픈 곳부터 치료합니다. 장애가 나면 원인 파악에 너무 오래 걸린다는 피드백이 있었습니다.</p>
<p>주요 과제는 다음과 같습니다. Grafana 대시보드 구축으로 시스템 상태를 한눈에 볼 수 있게 합니다. 알림 체계를 정비해서 장애 감지 시간을 줄입니다. SLO(Service Level Objective)를 정의해서 "어느 정도면 괜찮은 건지" 기준을 만듭니다.</p>
<p>기대 효과는 장애 감지 시간 50% 단축입니다.</p>
<p><strong>Q2: 성능 최적화</strong></p>
<p>안정성이 확보되면 성능을 개선합니다. 주문 조회 API가 느리다는 CS가 꾸준히 들어오고 있습니다.</p>
<p>주문 조회 API에 캐싱 전략을 적용합니다. 슬로우 쿼리를 분석하고 인덱스를 최적화합니다. 불필요한 N+1 쿼리를 제거합니다.</p>
<p>기대 효과는 API 응답 시간 30% 개선입니다.</p>
<p><strong>Q3: 확장성 확보</strong></p>
<p>하반기 프로모션 시즌을 대비합니다. 작년 블랙프라이데이에 트래픽 2배 증가로 서버가 힘들었습니다.</p>
<p>주문 서비스를 MSA(Microservices Architecture)로 분리합니다. 이벤트 기반 아키텍처로 전환해서 서비스 간 결합도를 낮춥니다. Auto Scaling 정책을 고도화합니다.</p>
<p>기대 효과는 피크 트래픽 2배 대응입니다.</p>
<p><strong>Q4: 개발 생산성</strong></p>
<p>연말에는 내년을 준비합니다. 올해 불편했던 개발 환경을 개선합니다.</p>
<p>CI/CD 파이프라인을 개선해서 배포 시간을 단축합니다. 테스트 자동화 커버리지를 확대합니다. AI 코딩 도구를 공식 도입합니다.</p>
<p>기대 효과는 배포 주기를 주 1회에서 일 1회로 단축하는 것입니다.</p>
<hr />
<h2 id="heading-2">예시 2: 카테고리별 로드맵</h2>
<p>기술 영역별로 나눠서 보면 더 명확합니다.</p>
<h3 id="heading-infrastructure">Infrastructure 로드맵</h3>
<p>현재 EC2 단일 서버에서 수동 배포하고 있습니다. CloudWatch 기본 모니터링만 사용 중입니다.</p>
<p>6개월 후에는 Auto Scaling을 적용하고, Jenkins로 CI/CD를 구축합니다. Grafana와 Prometheus로 모니터링을 고도화합니다.</p>
<p>12개월 후에는 EKS(Elastic Kubernetes Service) 전환을 검토합니다. GitOps 방식으로 ArgoCD를 도입합니다. 통합 Observability 플랫폼을 구축합니다.</p>
<h3 id="heading-backend">Backend 로드맵</h3>
<p>현재 Spring Boot 2.7 기반 모놀리식 구조입니다. JUnit 단위 테스트만 있습니다.</p>
<p>6개월 후에는 Spring Boot 3.x로 마이그레이션합니다. 도메인별로 모듈을 분리합니다. 통합 테스트를 확대합니다.</p>
<p>12개월 후에는 Virtual Thread를 적용해서 동시성을 개선합니다. 핵심 도메인을 MSA로 분리합니다. E2E(End-to-End) 테스트를 자동화합니다.</p>
<h3 id="heading-data">Data 로드맵</h3>
<p>현재 MySQL 단일 DB에 로컬 캐시를 사용합니다. 배치 ETL(Extract, Transform, Load)로 데이터를 처리합니다.</p>
<p>6개월 후에는 Read Replica를 구성해서 읽기 부하를 분산합니다. Redis 클러스터를 도입합니다. 실시간 CDC(Change Data Capture) 파이프라인을 구축합니다.</p>
<p>12개월 후에는 샤딩 전략을 수립합니다. 캐시 히트율 95%를 달성합니다. 데이터 레이크를 구축합니다.</p>
<hr />
<h2 id="heading-3">예시 3: 문제 해결 중심 로드맵</h2>
<p>"어떤 기술을 쓸 것인가"보다 "어떤 문제를 해결할 것인가"에 집중하는 방식입니다. 팀원들이 공감하기 쉽습니다.</p>
<h3 id="heading-1-1">문제 1: 배포가 무섭다</h3>
<p>롤백이 어렵고, 배포할 때마다 긴장됩니다. 금요일 오후에는 아무도 배포하려 하지 않습니다.</p>
<p>1월에 Feature Flag를 도입합니다. 코드는 배포하되, 기능은 플래그로 켜고 끌 수 있게 합니다. 문제가 생기면 플래그만 끄면 됩니다.</p>
<p>2월에 Blue-Green 배포를 구성합니다. 새 버전을 별도 환경에 띄우고, 문제없으면 트래픽을 전환합니다. 롤백은 트래픽을 되돌리면 끝입니다.</p>
<p>3월에 Canary 배포를 자동화합니다. 새 버전에 트래픽 1%만 보내서 테스트하고, 점진적으로 늘립니다.</p>
<h3 id="heading-2-1">문제 2: 장애 원인 파악이 오래 걸린다</h3>
<p>장애가 나면 로그를 뒤지느라 30분 이상 걸립니다. 어디서 문제가 생겼는지 찾기 어렵습니다.</p>
<p>2월에 구조화된 로깅을 표준화합니다. JSON 형식으로 통일하고, 필수 필드를 정의합니다. 검색이 쉬워집니다.</p>
<p>4월에 분산 추적을 도입합니다. 요청이 여러 서비스를 거칠 때 하나의 ID로 추적할 수 있게 합니다. 어디서 느려졌는지 한눈에 보입니다.</p>
<p>6월에 자동 알림과 Runbook을 연동합니다. 알림이 오면 "이럴 때는 이렇게 하세요"가 같이 옵니다. 새벽에 장애 콜 받아도 당황하지 않습니다.</p>
<h3 id="heading-3-db">문제 3: DB가 병목이다</h3>
<p>피크 시간에 DB CPU가 100%를 찍습니다. 커넥션 풀이 고갈되어 장애가 난 적도 있습니다.</p>
<p>1월에 슬로우 쿼리를 분석합니다. 상위 10개 쿼리를 최적화하고 인덱스를 추가합니다. 가장 빠르게 효과를 볼 수 있는 방법입니다.</p>
<p>3월에 Read Replica를 구성합니다. 읽기 트래픽을 분산해서 Primary DB 부하를 줄입니다.</p>
<p>4월에 핫 데이터를 Redis에 캐싱합니다. 자주 조회되는 데이터는 DB까지 가지 않습니다.</p>
<p>6월에 CQRS(Command Query Responsibility Segregation) 패턴을 부분 적용합니다. 쓰기와 읽기를 분리해서 각각 최적화합니다.</p>
<h3 id="heading-4">문제 4: 신규 입사자 온보딩이 오래 걸린다</h3>
<p>새로 온 사람이 첫 PR을 올리기까지 2주 이상 걸립니다. 로컬 환경 세팅에서 막히고, 코드 구조를 파악하느라 힘들어합니다.</p>
<p>1월에 개발 환경을 Docker Compose로 통합합니다. 명령어 하나로 로컬 환경이 뜹니다. "내 PC에서는 되는데요"가 사라집니다.</p>
<p>2월에 아키텍처 문서를 정비합니다. 시스템 구조도, 핵심 플로우, 주요 컴포넌트 설명을 문서화합니다.</p>
<p>3월에 온보딩 체크리스트와 튜토리얼 과제를 만듭니다. 첫 주에 뭘 해야 하는지 명확하고, 작은 과제를 완료하면서 자신감을 얻습니다.</p>
<hr />
<h2 id="heading-4-1">예시 4: 팀 역량 기반 로드맵</h2>
<p>기술만 보면 안 됩니다. 그 기술을 다룰 사람이 있어야 합니다.</p>
<h3 id="heading-7zie7j6sio2mgcdsg4htmak">현재 팀 상황</h3>
<p>인원은 5명입니다. 시니어 1명, 미드레벨 2명, 주니어 2명입니다. 강점은 Spring Boot와 MySQL입니다. 약점은 인프라, 모니터링, 테스트입니다.</p>
<h3 id="heading-7jet65jioyeseyepsdrozzrk5zrp7u">역량 성장 로드맵</h3>
<p>1~2월에는 Docker와 컨테이너 기초를 학습합니다. 내부 스터디로 주 1회 진행하고, 시니어가 리드합니다.</p>
<p>3~4월에는 Kubernetes 입문을 진행합니다. 외부 교육을 수강하고, 스테이징 환경에서 실습합니다.</p>
<p>5~6월에는 모니터링을 학습합니다. Prometheus와 Grafana를 실제 서비스에 적용하는 프로젝트를 진행합니다.</p>
<p>7~8월에는 테스트 자동화에 집중합니다. 커버리지를 50%에서 70%로 올리는 것이 목표입니다. 주니어 전원이 참여해서 테스트 작성 역량을 키웁니다.</p>
<p>9~10월에는 Kafka를 심화 학습합니다. 이벤트 소싱 패턴을 적용해봅니다.</p>
<p>11~12월에는 성능 테스트와 튜닝을 배웁니다. k6를 도입하고 부하 테스트를 정례화합니다.</p>
<p>중요한 것은 업무와 병행할 수 있는 속도로 계획하는 것입니다. 한 번에 너무 많은 것을 배우려고 하면 아무것도 제대로 못 합니다.</p>
<hr />
<h2 id="heading-5-okr">예시 5: OKR 연계 로드맵</h2>
<p>회사에서 OKR(Objectives and Key Results)을 쓴다면, 기술 로드맵도 연계해야 합니다. 그래야 "기술 과제에 시간 쓰는 것"을 정당화할 수 있습니다.</p>
<h3 id="heading-objective-1-999">Objective 1: 시스템 안정성 99.9% 달성</h3>
<p>Key Result 1은 MTTR(Mean Time To Recovery) 30분 이내입니다. 이를 위해 자동 알림 체계를 구축하고 Runbook을 정비합니다. Q1에 완료합니다.</p>
<p>Key Result 2는 월간 장애 건수 2건 이하입니다. 카오스 엔지니어링을 도입하고 장애 훈련을 진행합니다. Q2에 완료합니다.</p>
<p>Key Result 3은 핵심 API 응답 시간 p99 500ms 미만입니다. 캐싱 전략을 적용하고 쿼리를 최적화합니다. Q1~Q2에 걸쳐 진행합니다.</p>
<h3 id="heading-objective-2-2">Objective 2: 개발 생산성 2배 향상</h3>
<p>Key Result 1은 배포 리드타임 1일 이내입니다. CI/CD 파이프라인을 개선합니다. Q1에 완료합니다.</p>
<p>Key Result 2는 테스트 커버리지 70%입니다. 테스트 자동화를 확대하고 TDD(Test-Driven Development) 교육을 진행합니다. Q1~Q2에 걸쳐 진행합니다.</p>
<p>Key Result 3은 코드 리뷰 응답 시간 4시간 이내입니다. 리뷰 가이드라인을 만들고 자동 할당을 도입합니다. Q1에 완료합니다.</p>
<p>이렇게 연계하면 경영진에게 "이 기술 과제가 왜 중요한지"를 설명하기 쉽습니다.</p>
<hr />
<h2 id="heading-6riw7iigiouhnoutnountsdsnphshleg7yyb">기술 로드맵 작성 팁</h2>
<h3 id="heading-7zie7iuk7kcb7jy866gcioyekeyese2vmoudva">현실적으로 작성하라</h3>
<p>리소스를 고려해야 합니다. 5명이서 1년에 할 수 있는 일은 한정되어 있습니다. 한 분기에 큰 변화 1~2개가 현실적입니다. 야심 찬 계획을 세우고 매번 실패하면, 로드맵에 대한 신뢰가 사라집니다.</p>
<h3 id="heading-why">Why를 명확히 하라</h3>
<p>"왜 이 기술을?"에 대한 답이 있어야 합니다. "요즘 핫해서", "다른 회사도 쓰니까"는 이유가 아닙니다. 비즈니스 목표와 연결되어야 합니다. "피크 시간 장애를 줄이기 위해"처럼 구체적이어야 합니다.</p>
<h3 id="heading-7jyg7jew7zwy6rkmioyatoyyge2vmoudva">유연하게 운영하라</h3>
<p>로드맵은 계획이지, 계약이 아닙니다. 분기마다 리뷰하고 조정합니다. 비즈니스 상황이 바뀌면 우선순위도 바뀔 수 있습니다. 중요한 것은 방향성이지, 세부 일정이 아닙니다.</p>
<h3 id="heading-7yya6ro8io2vqoq7mcdrp4zrk6tslrtrnbw">팀과 함께 만들어라</h3>
<p>Tech Lead가 혼자 만들어서 "이거 해"라고 하면 실패합니다. 팀원들의 의견을 수렴하고, 공감대를 형성해야 합니다. 본인이 참여해서 만든 로드맵은 주인의식을 갖게 됩니다.</p>
<h3 id="heading-6ro17jyg7zwy6rogio2irouqhe2vmoqyjcdsmrtsmihtlzjrnbw">공유하고 투명하게 운영하라</h3>
<p>팀 전체가 로드맵을 알고 있어야 합니다. 위키나 노션에 공개하고, 정기적으로 진행 상황을 공유합니다. 진행이 안 되면 안 되는 대로, 되면 되는 대로 솔직하게 이야기합니다.</p>
<hr />
<h2 id="heading-66ei66y066asoidsmytrsr3tlzwg66gc65oc66e17j2aioyxhuulpa">마무리: 완벽한 로드맵은 없다</h2>
<p>처음부터 완벽한 로드맵을 만들려고 하지 마세요. 시작이 중요합니다.</p>
<p>일단 만들어서 공유하고, 피드백을 받고, 수정하면 됩니다. 3개월만 지나도 "그때는 왜 저런 걸 중요하다고 생각했지?"라는 항목이 생깁니다. 괜찮습니다. 그게 정상입니다.</p>
<p>로드맵의 가치는 완벽함이 아니라, 팀이 같은 방향을 보게 만드는 것입니다.</p>
<p>다음에 팀원이 "우리 기술 방향이 뭐예요?"라고 물으면, 자신 있게 보여줄 수 있는 로드맵을 만들어 보세요.</p>
<hr />
<p><em>이 글이 도움이 되셨다면 공유 부탁드립니다. 질문이나 의견은 댓글로 남겨주세요.</em></p>
]]></content:encoded></item><item><title><![CDATA[Tech Lead의 비용 관점: 돈을 아는 개발자가 되어야 하는 이유]]></title><description><![CDATA[Tech Lead는 단순히 "코드를 잘 짜는 시니어 개발자"가 아닙니다. 기술적 의사결정이 비즈니스에 미치는 영향을 이해하고, 비용 효율적인 선택을 할 수 있어야 합니다.
저는 직장을 다니면서 6년간 친구들과 창업을 준비했습니다. 자본이 넉넉하지 않았기에 모든 기술적 선택에서 "이게 정말 필요한가?", "더 저렴한 방법은 없는가?"를 고민할 수밖에 없었습니다. 그 경험이 지금의 비용 관점을 형성하는 데 큰 영향을 주었습니다.
이 글에서는 Tec...]]></description><link>https://100lab.org/tech-lead</link><guid isPermaLink="true">https://100lab.org/tech-lead</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Sat, 10 Jan 2026 02:33:04 GMT</pubDate><content:encoded><![CDATA[<p>Tech Lead는 단순히 "코드를 잘 짜는 시니어 개발자"가 아닙니다. 기술적 의사결정이 비즈니스에 미치는 영향을 이해하고, 비용 효율적인 선택을 할 수 있어야 합니다.</p>
<p>저는 직장을 다니면서 6년간 친구들과 창업을 준비했습니다. 자본이 넉넉하지 않았기에 모든 기술적 선택에서 "이게 정말 필요한가?", "더 저렴한 방법은 없는가?"를 고민할 수밖에 없었습니다. 그 경험이 지금의 비용 관점을 형성하는 데 큰 영향을 주었습니다.</p>
<p>이 글에서는 Tech Lead가 비용 관점에서 고려해야 할 구체적인 방안들을 정리해 보겠습니다.</p>
<hr />
<h2 id="heading-1">1. 인프라 비용 최적화</h2>
<p>클라우드 시대에 인프라 비용은 곧 운영 비용입니다. 잘못된 설정 하나가 매달 수백만 원의 차이를 만들 수 있습니다.</p>
<h3 id="heading-7yg065287jqw65ocioumroygjoykpcdqtidrpqw">클라우드 리소스 관리</h3>
<p>가장 흔한 실수는 over-provisioning입니다. "혹시 모르니까" 큰 인스턴스를 선택하고, 실제 사용률은 10%도 안 되는 경우가 많습니다.</p>
<ul>
<li><p>실제 사용량을 모니터링하고 적정 인스턴스 타입 선정</p>
</li>
<li><p>Reserved Instance나 Savings Plans로 장기 비용 30~50% 절감</p>
</li>
<li><p>배치 작업이나 테스트 환경에는 Spot Instance 활용</p>
</li>
<li><p>좀비 리소스 정기 점검 (미사용 인스턴스, 오래된 스냅샷, 방치된 EIP)</p>
</li>
</ul>
<h3 id="heading-auto-scaling">Auto Scaling 전략</h3>
<p>트래픽 패턴을 분석하면 비용 절감 포인트가 보입니다. 대부분의 서비스는 피크 시간대가 정해져 있습니다.</p>
<ul>
<li><p>피크 시간대만 스케일 아웃</p>
</li>
<li><p>야간, 주말에는 최소 인스턴스로 스케일 다운</p>
</li>
<li><p>개발/스테이징 환경은 업무 시간 외 자동 종료</p>
</li>
</ul>
<h3 id="heading-642w7j207yswiou5hoyaqq">데이터 비용</h3>
<p>데이터는 쌓이기만 하고 지우지 않으면 비용이 계속 증가합니다.</p>
<ul>
<li><p>S3 스토리지 클래스 활용 (자주 접근하지 않는 데이터는 Glacier로)</p>
</li>
<li><p>데이터 전송 비용 최적화 (같은 리전 내 통신, CloudFront 활용)</p>
</li>
<li><p>로그 보관 주기 정책 수립 (무한정 보관은 비용 폭탄)</p>
</li>
</ul>
<hr />
<h2 id="heading-2">2. 기술 부채 관리</h2>
<p>기술 부채는 "나중에 갚으면 된다"고 생각하기 쉽지만, 이자가 붙습니다. 방치된 기술 부채는 개발 속도 저하, 장애 빈도 증가, 팀원 이탈로 이어집니다.</p>
<h3 id="heading-7lih7kcv6ro8ioqwgoylno2zla">측정과 가시화</h3>
<p>보이지 않는 것은 관리할 수 없습니다. 기술 부채를 정량화해야 합니다.</p>
<p>기술 부채를 백로그에 등록하고, 가능하면 비용으로 환산합니다. "이 레거시 코드 때문에 매번 배포할 때마다 2시간씩 추가 작업이 필요하다"처럼 구체적으로 표현하면 비개발 직군도 이해할 수 있습니다.</p>
<h3 id="heading-7kce65617kcbioydge2zma">전략적 상환</h3>
<p>모든 부채를 한 번에 갚을 수는 없습니다. 전략이 필요합니다.</p>
<ul>
<li><p>스프린트마다 일정 비율(예: 20%)을 기술 부채 해소에 할당</p>
</li>
<li><p>비즈니스 임팩트가 큰 부분부터 우선 처리</p>
</li>
<li><p>"완벽한 리팩토링"보다 "점진적 개선" 추구</p>
</li>
</ul>
<h3 id="heading-7jii67cp7j20ioy1noyeoa">예방이 최선</h3>
<p>새로운 부채가 생기는 것을 막는 게 가장 효율적입니다.</p>
<p>코드 리뷰에서 "빠른 해결책"과 "올바른 해결책"의 트레이드오프를 명시적으로 논의합니다. 일정 때문에 의도적으로 부채를 지는 경우, 반드시 문서화하고 상환 계획을 세웁니다.</p>
<hr />
<h2 id="heading-3-build-vs-buy">3. Build vs Buy 의사결정</h2>
<p>직접 만들 것인가, 사서 쓸 것인가. 이 결정이 수개월의 개발 시간과 수천만 원의 비용을 좌우합니다.</p>
<h3 id="heading-67ae7isdio2uhougioyehoybjo2bra">분석 프레임워크</h3>
<p>단순히 "라이선스 비용"만 비교하면 안 됩니다.</p>
<p><strong>총 비용 = 초기 구축 비용 + 유지보수 비용 + 기회비용</strong></p>
<p>직접 개발하면 라이선스 비용은 없지만, 개발 시간, 버그 수정, 보안 패치, 문서화 등의 숨겨진 비용이 있습니다. 그 시간에 핵심 기능을 개발했다면 얻었을 가치(기회비용)도 고려해야 합니다.</p>
<h3 id="heading-7yyq64uoioq4soykga">판단 기준</h3>
<ul>
<li><p><strong>핵심 역량인가?</strong>: 우리 서비스의 차별화 요소가 아니면 Buy</p>
</li>
<li><p><strong>전문성이 있는가?</strong>: 팀 내 해당 기술 전문가가 없으면 Buy</p>
</li>
<li><p><strong>유지보수할 여력이 있는가?</strong>: 만들고 방치할 거면 차라리 Buy</p>
</li>
</ul>
<p>인증, 결제, 모니터링, 로깅 같은 범용 기능은 대부분 Buy가 답입니다. 반면 핵심 비즈니스 로직은 Build해야 합니다.</p>
<h3 id="heading-vendor-lock-in">Vendor Lock-in 주의</h3>
<p>SaaS 도입 시 vendor lock-in 리스크를 평가해야 합니다. 나중에 다른 솔루션으로 전환할 때 드는 비용도 총 비용에 포함시켜야 합니다.</p>
<hr />
<h2 id="heading-4">4. 개발 생산성 = 비용</h2>
<p>개발자의 시간은 가장 비싼 자원입니다. 생산성 향상은 곧 비용 절감입니다.</p>
<h3 id="heading-7j6s7j6r7jefioy1noygjo2zla">재작업 최소화</h3>
<p>가장 큰 낭비는 재작업입니다. 요구사항이 불명확해서 다시 만들고, 기술 검증 없이 진행했다가 엎어지는 경우가 많습니다.</p>
<ul>
<li><p>요구사항 명확화에 충분한 시간 투자 (PRD 리뷰, 기술 스펙 문서)</p>
</li>
<li><p>POC(Proof of Concept)로 기술 리스크 조기 검증</p>
</li>
<li><p>점진적 배포로 피드백 루프 단축</p>
</li>
</ul>
<h3 id="heading-6rcc67ccio2zmoqyvsdtmqjsnkjtmzq">개발 환경 효율화</h3>
<p>"내 로컬에서는 되는데요"를 없애야 합니다.</p>
<ul>
<li><p>로컬 개발 환경 세팅 자동화 (Docker Compose, 스크립트)</p>
</li>
<li><p>CI/CD(Continuous Integration/Continuous Deployment) 파이프라인 최적화 (빌드 시간 단축)</p>
</li>
<li><p>AI 도구 적극 활용 (GitHub Copilot, Claude Code 등)</p>
</li>
</ul>
<h3 id="heading-7zie7iuk7kcbioydvoyglsdsgrdsoju">현실적 일정 산정</h3>
<p>낙관적 산정은 결국 야근 비용으로 돌아옵니다.</p>
<p>과거 유사 작업 데이터를 기반으로 추정하고, 적절한 버퍼를 포함합니다. "3일이면 될 것 같아요"라는 말을 들으면 "최악의 경우는요?"라고 물어봅니다.</p>
<hr />
<h2 id="heading-5">5. 아키텍처 레벨 비용 설계</h2>
<p>아키텍처 결정은 장기적인 비용 구조를 결정합니다. 한 번 잘못 선택하면 수정 비용이 매우 큽니다.</p>
<h3 id="heading-7kcb7kcvioq4soyiocdshkdtg50">적정 기술 선택</h3>
<p>기술적으로 멋진 것과 비즈니스에 적합한 것은 다릅니다.</p>
<p>작은 서비스에 Kubernetes를 도입하면 운영 오버헤드가 서비스 개발보다 커질 수 있습니다. 트래픽 규모, 팀 역량, 운영 비용을 종합적으로 고려해야 합니다.</p>
<ul>
<li><p>서버리스 vs 컨테이너 vs VM 비용 비교</p>
</li>
<li><p>마이크로서비스 도입 시점 신중히 판단 (복잡성도 비용)</p>
</li>
<li><p>"나중에 트래픽이 많아지면"보다 "지금 필요한 것"에 집중</p>
</li>
</ul>
<h3 id="heading-642w7j207ysw67kg7j207iqkioyghouetq">데이터베이스 전략</h3>
<p>데이터베이스는 보통 가장 큰 비용 항목 중 하나입니다.</p>
<ul>
<li><p>Read Replica 활용으로 읽기 부하 분산</p>
</li>
<li><p>캐시 레이어(Redis) 적극 활용으로 DB 부하 감소</p>
</li>
<li><p>적절한 인덱싱으로 쿼리 성능 최적화 (느린 쿼리 = 높은 비용)</p>
</li>
</ul>
<hr />
<h2 id="heading-6-amp">6. 모니터링 &amp; 비용 거버넌스</h2>
<p>비용 관리는 한 번 설정하고 끝나는 게 아닙니다. 지속적인 모니터링과 개선이 필요합니다.</p>
<h3 id="heading-67me7jqpioqwgoylno2zla">비용 가시화</h3>
<p>보이지 않으면 관리할 수 없습니다.</p>
<ul>
<li><p>AWS Cost Explorer 대시보드 구성</p>
</li>
<li><p>Budget Alerts로 임계치 초과 시 알림</p>
</li>
<li><p>팀/프로젝트별 태깅으로 비용 귀속</p>
</li>
<li><p>월간 비용 리뷰 정례화</p>
</li>
</ul>
<h3 id="heading-7j207iobio2dkoynga">이상 탐지</h3>
<p>비정상적인 비용 증가를 빠르게 감지해야 합니다.</p>
<p>비용이 갑자기 급증하면 알림이 오도록 설정합니다. 원인 분석 프로세스를 미리 정해두면 대응 속도가 빨라집니다.</p>
<hr />
<h2 id="heading-66ei66y066asoidruytsmqkg6rcq6rcb7j2aioqyve2xmoyxkoyencdrgpjsmkjri6q">마무리: 비용 감각은 경험에서 나온다</h2>
<p>이 글에서 다룬 내용들은 책이나 강의로도 배울 수 있습니다. 하지만 진짜 비용 감각은 실제로 돈이 부족한 상황에서 길러집니다.</p>
<p>저는 6년간의 창업 준비 과정에서 "이번 달 AWS 비용을 줄이지 않으면 다음 달 개발을 못 한다"는 절박함을 경험했습니다. 그 경험이 지금 Tech Lead로서 비용 관점의 의사결정을 하는 데 큰 자산이 되고 있습니다.</p>
<p>Tech Lead를 목표로 하는 분들께 권합니다. 사이드 프로젝트라도 좋으니 직접 돈을 내고 서비스를 운영해 보세요. 본인 돈이 나가기 시작하면 비용 최적화에 대한 감각이 급격히 발달합니다.</p>
<p>좋은 Tech Lead는 기술로 문제를 해결하고, 훌륭한 Tech Lead는 비용을 고려한 기술로 문제를 해결합니다.</p>
<hr />
<p><em>이 글이 도움이 되셨다면 공유 부탁드립니다. 질문이나 의견은 댓글로 남겨주세요.</em></p>
]]></content:encoded></item><item><title><![CDATA[HTTP Toolkit으로 Spring Boot 애플리케이션 HTTP 요청 캡처하기]]></title><description><![CDATA[IntelliJ IDEA에서 HTTP Toolkit 프록시 설정하기
Spring Boot 애플리케이션을 개발할 때 외부 API 요청을 모니터링하고 디버깅하기 위해 HTTP Toolkit을 사용하는 경우가 많습니다. 이 글에서는 IntelliJ IDEA에서 HTTP Toolkit으로 프록시 설정하는 방법을 단계별로 설명하겠습니다.
1. HTTP Toolkit 설정
먼저 HTTP Toolkit을 실행하고 프록시 서버를 시작합니다.

HTTP Too...]]></description><link>https://100lab.org/http-toolkit-spring-boot-http</link><guid isPermaLink="true">https://100lab.org/http-toolkit-spring-boot-http</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Fri, 04 Jul 2025 10:02:31 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-intellij-idea-http-toolkit">IntelliJ IDEA에서 HTTP Toolkit 프록시 설정하기</h1>
<p>Spring Boot 애플리케이션을 개발할 때 외부 API 요청을 모니터링하고 디버깅하기 위해 HTTP Toolkit을 사용하는 경우가 많습니다. 이 글에서는 IntelliJ IDEA에서 HTTP Toolkit으로 프록시 설정하는 방법을 단계별로 설명하겠습니다.</p>
<h2 id="heading-1-http-toolkit">1. HTTP Toolkit 설정</h2>
<p>먼저 HTTP Toolkit을 실행하고 프록시 서버를 시작합니다.</p>
<ol>
<li><p>HTTP Toolkit 실행</p>
</li>
<li><p>"Intercept HTTP" 클릭</p>
</li>
<li><p>프록시 포트 확인 (기본값: 8000번 포트)</p>
</li>
</ol>
<h2 id="heading-2-intellij-idea-jdk">2. IntelliJ IDEA에서 사용하는 JDK 확인</h2>
<p>프록시 설정 전에 IntelliJ에서 사용하는 JDK 버전을 확인해야 합니다. 이는 후에 HTTPS 인증서 문제를 해결할 때 중요합니다.</p>
<h3 id="heading-jdk">프로젝트 JDK 확인</h3>
<ol>
<li><p><strong>File → Project Structure</strong> (또는 <code>Cmd + ;</code>)</p>
</li>
<li><p><strong>Project Settings → Project</strong></p>
</li>
<li><p><strong>Project SDK</strong> 확인</p>
<ul>
<li>예: <code>corretto-17.0.15</code>, <code>openjdk-11</code>, <code>Oracle OpenJDK 21</code> 등</li>
</ul>
</li>
</ol>
<h3 id="heading-intellij-jdk">IntelliJ에서 JDK 경로 확인</h3>
<p>터미널을 사용하지 않고 IntelliJ에서 직접 JDK 경로를 확인할 수 있습니다.</p>
<ol>
<li><p><strong>File → Project Structure</strong> (또는 <code>Cmd + ;</code>)</p>
</li>
<li><p><strong>Platform Settings → SDKs</strong> 선택</p>
</li>
<li><p>사용 중인 JDK 선택 (예: <code>corretto-17</code>)</p>
</li>
<li><p><strong>JDK home path</strong> 확인</p>
<ul>
<li>예: <code>~/Library/Java/JavaVirtualMachines/corretto-17.0.15/Contents/Home</code></li>
</ul>
</li>
</ol>
<p>이 경로가 나중에 인증서를 추가할 때 필요한 Java 설치 경로입니다.</p>
<h2 id="heading-3-intellij-idea">3. IntelliJ IDEA 프록시 설정</h2>
<h3 id="heading-1-run-configuration-jvm">방법 1: Run Configuration에서 JVM 옵션 설정 (권장)</h3>
<p>가장 간단하고 효과적인 방법입니다.</p>
<ol>
<li><p><strong>Run → Edit Configurations</strong></p>
</li>
<li><p>해당 Spring Boot 애플리케이션 선택</p>
</li>
<li><p><strong>VM options</strong> 필드에 다음 옵션 추가:</p>
</li>
</ol>
<pre><code class="lang-plaintext">-Dhttp.proxyHost=127.0.0.1
-Dhttp.proxyPort=8000
-Dhttps.proxyHost=127.0.0.1
-Dhttps.proxyPort=8000
</code></pre>
<h3 id="heading-2-environment-variables">방법 2: Environment Variables 설정</h3>
<p>같은 Run Configuration에서 <strong>Environment variables</strong>에 추가:</p>
<pre><code class="lang-plaintext">HTTP_PROXY=http://127.0.0.1:8000
HTTPS_PROXY=http://127.0.0.1:8000
</code></pre>
<h3 id="heading-3-ide">방법 3: IDE 전체 프록시 설정</h3>
<p>IDE 전체에 프록시를 적용하려면:</p>
<ol>
<li><p><strong>File → Settings</strong> (또는 <code>Cmd + ,</code>)</p>
</li>
<li><p><strong>Appearance &amp; Behavior → System Settings → HTTP Proxy</strong></p>
</li>
<li><p><strong>Manual proxy configuration</strong> 선택</p>
</li>
<li><p>HTTP와 HTTPS 프록시 설정:</p>
<ul>
<li><p><strong>Host</strong>: <code>127.0.0.1</code></p>
</li>
<li><p><strong>Port</strong>: <code>8000</code></p>
</li>
</ul>
</li>
<li><p><strong>Check connection</strong> 버튼으로 연결 테스트</p>
</li>
</ol>
<h2 id="heading-4-https">4. HTTPS 인증서 문제 해결</h2>
<p>HTTP 요청은 바로 캡처되지만, HTTPS 요청 시 다음과 같은 SSL 에러가 발생할 수 있습니다:</p>
<pre><code class="lang-plaintext">javax.net.ssl.SSLHandshakeException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target
</code></pre>
<p>이 문제를 해결하기 위해 HTTP Toolkit의 CA 인증서를 Java keystore에 추가해야 합니다.</p>
<h3 id="heading-http-toolkit-ca">HTTP Toolkit CA 인증서 위치 확인</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># macOS</span>
ls -la ~/Library/Preferences/httptoolkit/ca.pem

<span class="hljs-comment"># Windows</span>
dir %APPDATA%\httptoolkit\ca.pem

<span class="hljs-comment"># Linux</span>
ls -la ~/.config/httptoolkit/ca.pem
</code></pre>
<h3 id="heading-java-keystore">Java keystore에 인증서 추가</h3>
<p>앞서 확인한 JDK 경로를 사용하여 인증서를 추가합니다:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># 일반적인 macOS OpenJDK 경로</span>
sudo keytool -import -<span class="hljs-built_in">alias</span> httptoolkit \
  -keystore /Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home/lib/security/cacerts \
  -file ~/Library/Preferences/httptoolkit/ca.pem \
  -storepass changeit -noprompt

<span class="hljs-comment"># Amazon Corretto 17 예시</span>
sudo keytool -import -<span class="hljs-built_in">alias</span> httptoolkit \
  -keystore ~/Library/Java/JavaVirtualMachines/corretto-17.0.15/Contents/Home/lib/security/cacerts \
  -file ~/Library/Preferences/httptoolkit/ca.pem \
  -storepass changeit -noprompt
</code></pre>
<h3 id="heading-7j247kad7iscioy2loqwgcdtmzxsnbg">인증서 추가 확인</h3>
<pre><code class="lang-bash">keytool -list -keystore /path/to/java/lib/security/cacerts \
  -storepass changeit | grep httptoolkit
</code></pre>
<p>성공 시 출력:</p>
<pre><code class="lang-plaintext">httptoolkit, 2025. 7. 8., trustedCertEntry,
</code></pre>
<h2 id="heading-5">5. 설정 확인 및 테스트</h2>
<ol>
<li><p><strong>애플리케이션 완전 종료</strong></p>
</li>
<li><p><strong>IntelliJ 재시작</strong> (선택사항)</p>
</li>
<li><p><strong>HTTP Toolkit 실행 및 프록시 시작</strong></p>
</li>
<li><p><strong>Spring Boot 애플리케이션 실행</strong></p>
</li>
<li><p><strong>API 요청 실행 후 HTTP Toolkit에서 캡처 확인</strong></p>
</li>
</ol>
<h2 id="heading-6">6. 문제 해결 팁</h2>
<h3 id="heading-7zse66gd7iuc6rcaioyekeupme2vmoyngcdslyrripqg6rk97jqw">프록시가 작동하지 않는 경우</h3>
<ol>
<li><p><strong>HTTP Toolkit 프록시 포트 확인</strong> (기본값: 8000)</p>
</li>
<li><p><strong>방화벽 설정 확인</strong></p>
</li>
<li><p><strong>IntelliJ 재시작</strong></p>
</li>
<li><p><strong>JVM 옵션 오타 확인</strong></p>
</li>
</ol>
<h3 id="heading-7j247kad7iscioq0gougqcdsmktrpzg">인증서 관련 오류</h3>
<ol>
<li><p><strong>올바른 JDK 경로 사용 확인</strong></p>
</li>
<li><p><strong>keytool 명령어 실행 권한 확인</strong></p>
</li>
<li><p><strong>이미 추가된 인증서 확인</strong></p>
</li>
</ol>
<pre><code class="lang-bash"><span class="hljs-comment"># 기존 인증서 삭제 후 재추가</span>
sudo keytool -delete -<span class="hljs-built_in">alias</span> httptoolkit \
  -keystore /path/to/java/lib/security/cacerts \
  -storepass changeit

<span class="hljs-comment"># 재추가</span>
sudo keytool -import -<span class="hljs-built_in">alias</span> httptoolkit \
  -keystore /path/to/java/lib/security/cacerts \
  -file ~/Library/Preferences/httptoolkit/ca.pem \
  -storepass changeit -noprompt
</code></pre>
<h2 id="heading-66ei66y066as">마무리</h2>
<p>IntelliJ IDEA에서 HTTP Toolkit 프록시 설정은 API 디버깅과 모니터링에 매우 유용합니다. 특히 외부 API 연동 시 요청/응답 데이터를 실시간으로 확인할 수 있어 개발 효율성이 크게 향상됩니다.</p>
<p><strong>권장 설정 순서:</strong></p>
<ol>
<li><p>JDK 버전 확인</p>
</li>
<li><p>Run Configuration에서 JVM 옵션 설정</p>
</li>
<li><p>HTTPS 인증서 추가 (필요시)</p>
</li>
<li><p>애플리케이션 재시작 후 테스트</p>
</li>
</ol>
<p>이 방법을 통해 모든 HTTP/HTTPS 요청을 HTTP Toolkit에서 캡처하고 분석할 수 있습니다.</p>
]]></content:encoded></item><item><title><![CDATA[인공지능 역사 인물 정리: 시대별 발전과 핵심 기여자]]></title><description><![CDATA[인공지능(Artificial Intelligence, AI)은 철학적 질문에서 시작해 알고리즘, 컴퓨팅 기술, 데이터의 발전을 거쳐 오늘날 생성형 AI로 진화했습니다. 이 글은 AI 역사 속 주요 인물을 시대별로 정리하고, 각 인물이 만들어낸 기술적 성과와 개념을 중심으로 소개합니다.

1950년대: 기계 지능 개념의 출발점
앨런 튜링 (Alan Turing, 1912–1954, 영국)

인공지능 개념의 철학적 기초 제시자

주요 이력

(19...]]></description><link>https://100lab.org/7j246ro17kea64qlioyxreycrcdsnbjrrlwg7kcv66asoidsi5zrjidrs4qg67cc7kce6ro8io2vteylrcdquldsl6zsnpa</link><guid isPermaLink="true">https://100lab.org/7j246ro17kea64qlioyxreycrcdsnbjrrlwg7kcv66asoidsi5zrjidrs4qg67cc7kce6ro8io2vteylrcdquldsl6zsnpa</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Thu, 22 May 2025 00:33:35 GMT</pubDate><content:encoded><![CDATA[<p>인공지능(Artificial Intelligence, AI)은 철학적 질문에서 시작해 알고리즘, 컴퓨팅 기술, 데이터의 발전을 거쳐 오늘날 생성형 AI로 진화했습니다. 이 글은 AI 역사 속 주요 인물을 시대별로 정리하고, 각 인물이 만들어낸 기술적 성과와 개념을 중심으로 소개합니다.</p>
<hr />
<h2 id="heading-1950"><strong>1950년대: 기계 지능 개념의 출발점</strong></h2>
<h4 id="heading-alan-turing-19121954"><strong>앨런 튜링 (Alan Turing, 1912–1954, 영국)</strong></h4>
<ul>
<li>인공지능 개념의 철학적 기초 제시자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li>(1938) 프린스턴 대학교 박사</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p>“기계가 생각할 수 있는가?“라는 질문을 던지며 인공지능의 철학적 기초를 마련했습니다.</p>
</li>
<li><p>1950년 논문에서 제시한 <strong>튜링 테스트</strong>는 기계가 인간처럼 행동할 수 있는지를 판별하는 기준으로, 오늘날까지도 AI 판단 기준으로 사용됩니다.</p>
</li>
<li><p>그의 이름을 딴 <strong>튜링상(Turing Award)</strong> 은 컴퓨터 과학 분야의 최고 권위 상입니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-1960-ai"><strong>1960년대: AI 개념 정립과 언어의 등장</strong></h2>
<h4 id="heading-john-mccarthy-19272011"><strong>존 매카시 (John McCarthy, 1927–2011, 미국)</strong></h4>
<ul>
<li>“Artificial Intelligence” 용어 창시자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(1951) 프린스턴 대학교 박사</p>
</li>
<li><p>(1962 ~ 2000) 스탠퍼드 대학교 교수</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p>1956년 다트머스 회의에서 “AI”라는 용어를 처음 제안했습니다.</p>
</li>
<li><p><strong>LISP 언어 (LISt Processing language)</strong> 를 개발해 심볼 기반 처리에 최적화된 함수형 언어를 제공하였고, 이는 AI 연구의 핵심 언어가 되었습니다.</p>
</li>
<li><p>1971년 튜링상을 수상했습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-1970"><strong>1970년대: 인공지능 겨울과 인지과학적 접근</strong></h2>
<h4 id="heading-herbert-simon-19162001"><strong>허버트 사이먼 (Herbert Simon, 1916–2001, 미국)</strong></h4>
<ul>
<li>인지과학 기반 인공지능 개척자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(1943) 시카고 대학교 박사</p>
</li>
<li><p>(1949 ~ 2001) 카네기멜론 대학교 교수</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p>앨런 뉴웰과 함께 <strong>General Problem Solver (GPS)</strong> 를 개발하여 인간의 문제 해결 능력을 모사하려는 시도를 했습니다.</p>
</li>
<li><p><strong>GPS</strong>는 논리적 추론과 수단-목적 분석(means-ends analysis)을 이용해 초기 상태에서 목표 상태까지 문제를 단계적으로 해결하는 방식의 프로그램이었습니다.</p>
</li>
<li><p>AI와 심리학을 통합한 인지과학 기반 접근으로 1975년 튜링상을 수상했습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-1980-ai"><strong>1980년대: 전문가 시스템과 지식 기반 AI</strong></h2>
<h4 id="heading-edward-feigenbaum-1936"><strong>에드워드 파이겐바움 (Edward Feigenbaum, 1936– , 미국)</strong></h4>
<ul>
<li>전문가 시스템의 선구자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(1960) 카네기멜론 대학교 박사</p>
</li>
<li><p>(1965 ~ 2000) 스탠퍼드 대학교 교수</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p><strong>전문가 시스템 (Expert System)</strong> 은 인간 전문가의 판단을 규칙으로 표현해 컴퓨터가 특정 문제를 해결할 수 있도록 만든 시스템입니다.</p>
</li>
<li><p>대표 사례인 <strong>MYCIN</strong>은 600개 이상의 if-then 규칙을 기반으로 세균성 감염을 진단하고 항생제를 추천했으며, 역방향 연쇄 추론과 설명 기능을 갖췄습니다.</p>
</li>
<li><p>전문가 수준의 정확도를 보였으나 의료 책임 문제로 실제 상용화되진 않았습니다.</p>
</li>
<li><p>1994년 튜링상을 수상했습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-1990-ai"><strong>1990년대: AI 비판과 미래 예측의 대두</strong></h2>
<h4 id="heading-ray-kurzweil-1948"><strong>레이 커즈와일 (Ray Kurzweil, 1948– , 미국)</strong></h4>
<ul>
<li>특이점 이론을 통해 AI의 미래를 조망한 인물</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(1970) MIT 학사</p>
</li>
<li><p>(2012 ~ ) Google 엔지니어링 디렉터</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p>『특이점이 온다』를 통해 인간-기계 융합과 초지능 도래 시점을 제시하며 대중적 관심을 이끌었습니다.</p>
</li>
<li><p>TTS, OCR, 전자 음악 장비 등 실용적 AI 기술도 선도했습니다.</p>
</li>
<li><p>1999년 미국 기술훈장을 수상했습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-2000"><strong>2000년대: 딥러닝 부흥과 구조적 이론 정립</strong></h2>
<h3 id="heading-3"><strong>딥러닝 3대장: 힌턴, 르쿤, 벤지오</strong></h3>
<h4 id="heading-geoffrey-hinton-1947"><strong>제프리 힌턴 (Geoffrey Hinton, 1947– , 영국/캐나다)</strong></h4>
<ul>
<li>딥러닝 역전파 알고리즘의 부활을 이끈 인물</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(1978) 케임브리지 대학교 박사</p>
</li>
<li><p>(1987 ~ ) 토론토 대학교 교수</p>
</li>
<li><p>(2013 ~ ) Google Brain 연구자</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p>역전파(backpropagation) 알고리즘을 재조명하며 2012년 <strong>AlexNet</strong>을 통해 이미지넷 대회 우승을 이끌었습니다.</p>
</li>
<li><p><strong>AlexNet</strong>은 ReLU, 드롭아웃, GPU 병렬 처리 등의 기술로 컴퓨터 비전 성능을 획기적으로 높였으며 딥러닝 대중화의 기폭제가 되었습니다.</p>
</li>
</ul>
<h4 id="heading-yann-lecun-1960"><strong>얀 르쿤 (Yann LeCun, 1960– , 프랑스/미국)</strong></h4>
<ul>
<li>합성곱 신경망(CNN)을 개발한 컴퓨터비전 선구자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(1987) 피에르 마리 퀴리 대학교 박사</p>
</li>
<li><p>(2003 ~ ) 뉴욕대학교 교수</p>
</li>
<li><p>(2013 ~ ) Facebook AI Research 소장</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li>CNN 구조를 문자 인식, 영상 분석, 자율주행 등에 응용하며 비전 AI의 기틀을 마련했습니다.</li>
</ul>
<h4 id="heading-yoshua-bengio-1964"><strong>요슈아 벤지오 (Yoshua Bengio, 1964– , 캐나다)</strong></h4>
<ul>
<li>표현 학습과 심층 신경망 이론의 정립자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(1991) 맥길 대학교 박사</p>
</li>
<li><p>(1993 ~ ) 몬트리올 대학교 교수</p>
</li>
<li><p>(2016 ~ ) Mila 연구소 설립자</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p><strong>표현 학습 (Representation Learning)</strong> 은 데이터를 이해하기 쉬운 내부 표현으로 자동 변환하는 기술입니다.</p>
</li>
<li><p><strong>심층 신경망 (Deep Neural Network)</strong> 구조 정립을 통해 오늘날 딥러닝 모델의 이론적 기반을 구축했습니다.</p>
</li>
<li><p>GAN 창시자인 이안 굿펠로우의 박사 지도교수로도 유명합니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-2010"><strong>2010년대: 초거대 모델과 딥러닝 대중화</strong></h2>
<h4 id="heading-ilya-sutskever-1985"><strong>일야 수츠케버 (Ilya Sutskever, 1985– , 캐나다)</strong></h4>
<ul>
<li>GPT 모델 설계와 생성형 AI의 핵심 개발자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(2012) 토론토 대학교 박사</p>
</li>
<li><p>(2013 ~ 2015) Google Brain 연구원</p>
</li>
<li><p>(2015 ~ ) OpenAI 공동 창립자, 수석 과학자</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p>힌턴의 박사 제자로서 AlexNet, <strong>Seq2Seq (Sequence-to-Sequence)</strong> 모델을 개발했고, 이후 GPT 시리즈를 설계하며 생성형 언어모델 기술을 확립했습니다.</p>
</li>
<li><p><strong>Seq2Seq</strong>는 입력 시퀀스를 고정된 벡터로 인코딩하고, 이를 다시 출력 시퀀스로 디코딩하는 구조로, 기계 번역, 요약, 질의응답 등에 널리 사용됩니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-2020-ai"><strong>2020년대: 생성형 AI 상용화와 윤리적 논의</strong></h2>
<h4 id="heading-ian-goodfellow-1985"><strong>이안 굿펠로우 (Ian Goodfellow, 1985– , 미국)</strong></h4>
<ul>
<li>생성적 적대 신경망(GAN) 창시자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(2014) 몬트리올 대학교 석사</p>
</li>
<li><p>(2014 ~ 2016) Google Brain 연구원</p>
</li>
<li><p>(2016 ~ 2022) Apple 및 DeepMind 재직</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><strong>GAN (Generative Adversarial Network)</strong> 은 생성기와 판별기의 경쟁 구조를 통해 고품질 데이터를 생성하는 모델로, 이미지 생성, 딥페이크 등에 활용됩니다.</li>
</ul>
<h4 id="heading-sam-altman-1985"><strong>샘 알트먼 (Sam Altman, 1985– , 미국)</strong></h4>
<ul>
<li>OpenAI CEO, 생성형 AI 상용화 선도자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(2005) 스탠퍼드 대학교 중퇴</p>
</li>
<li><p>(2014 ~ 2019) Y Combinator 대표</p>
</li>
<li><p>(2019 ~ ) OpenAI CEO</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li>GPT-3, ChatGPT 상용화를 통해 생성형 AI를 전 세계에 확산시켰으며, 기술 경영과 윤리 논의 모두를 이끄는 대표적 인물입니다.</li>
</ul>
<h4 id="heading-demis-hassabis-1976"><strong>데미스 하사비스 (Demis Hassabis, 1976– , 영국)</strong></h4>
<ul>
<li>강화학습 기반 인공지능 AlphaGo 개발자</li>
</ul>
<p><strong>주요 이력</strong></p>
<ul>
<li><p>(2009) UCL 박사</p>
</li>
<li><p>(2010 ~ ) DeepMind 공동 창립자, CEO</p>
</li>
</ul>
<p><strong>설명</strong></p>
<ul>
<li><p><strong>강화학습 (Reinforcement Learning)</strong> 을 기반으로 한 AlphaGo를 통해 인간 바둑 챔피언을 이긴 최초의 AI를 만들었습니다.</p>
</li>
<li><p><strong>AlphaFold</strong>는 단백질 서열을 입력받아 3차원 구조를 정확히 예측하는 모델로, 생물학 분야에서 AI의 가능성을 증명한 사례입니다.</p>
</li>
<li><p><strong>AlphaTensor</strong>는 딥러닝을 통해 효율적인 행렬 곱셈 알고리즘을 발견한 시스템으로, 수학 문제 해결에 AI를 활용한 대표 사례입니다.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[📚 퀵소트 (QuickSort) : 원리, 방식 비교, 자바 구현까지]]></title><description><![CDATA[✨ 퀵소트란?
퀵소트(QuickSort)는 분할정복(Divide and Conquer) 전략을 활용한 정렬 알고리즘입니다.
피벗(Pivot)을 기준으로 배열을 분할하고, 각 부분 배열에 대해 재귀적으로 정렬을 수행하여 전체 정렬을 완성합니다.

⚙️ 작동 원리: 분할정복
퀵소트는 다음 세 단계로 구성됩니다.




단계설명



분할피벗을 기준으로 작은 값과 큰 값으로 배열을 나눈다

정복좌우 하위 배열에 대해 재귀적으로 퀵소트를 적용한다

결...]]></description><link>https://100lab.org/quicksort</link><guid isPermaLink="true">https://100lab.org/quicksort</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 20 May 2025 11:00:29 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-kirinkgg7yc17iam7yq4656apyoq"><strong>✨ 퀵소트란?</strong></h2>
<p><strong>퀵소트(QuickSort)</strong>는 분할정복(Divide and Conquer) 전략을 활용한 정렬 알고리즘입니다.</p>
<p>피벗(Pivot)을 기준으로 배열을 분할하고, 각 부분 배열에 대해 재귀적으로 정렬을 수행하여 전체 정렬을 완성합니다.</p>
<hr />
<h2 id="heading-kirimpnvui8g7j6r64zioybkoumrdog67ae7zwg7kcv67o1kio"><strong>⚙️ 작동 원리: 분할정복</strong></h2>
<p>퀵소트는 다음 세 단계로 구성됩니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>단계</strong></td><td><strong>설명</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>분할</strong></td><td>피벗을 기준으로 작은 값과 큰 값으로 배열을 나눈다</td></tr>
<tr>
<td><strong>정복</strong></td><td>좌우 하위 배열에 대해 재귀적으로 퀵소트를 적용한다</td></tr>
<tr>
<td><strong>결합</strong></td><td>별도 병합 없이 제자리 정렬 (in-place) 방식으로 완료됨</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-partition"><strong>📌 분할(Partition)의 의미</strong></h2>
<ul>
<li><p>배열의 값을 <strong>피벗보다 작거나 같은 값은 왼쪽</strong>, <strong>큰 값은 오른쪽</strong>으로 분리</p>
</li>
<li><p><strong>자기 자신과도 비교하고 필요하면 스왑</strong></p>
</li>
<li><p>이 과정에서 <strong>피벗의 위치는 정렬된 상태로 확정됨</strong></p>
</li>
<li><p>이후 <strong>좌/우 하위 배열을 계속 퀵소트</strong>로 정렬</p>
</li>
</ul>
<hr />
<h2 id="heading-kirwn6egio2uvouylqzvcdtjizti7dshztri53snyag7ja065a76rkmioydtoujqoywtoyngoukloqwgd8qkg"><strong>🧠 피벗과 파티셔닝은 어떻게 이루어지는가?</strong></h2>
<blockquote>
<p>파티셔닝이란 피벗 기준으로 배열 요소를 <strong>비교하며 자리를 바꾸는 과정</strong>입니다.</p>
</blockquote>
<ul>
<li><p>일반적으로 <strong>모든 인덱스를 피벗과 비교</strong>합니다.</p>
</li>
<li><p>자기 자신도 비교 대상이며, <strong>조건 충족 시 자기 자신과도 스왑</strong>이 발생합니다.</p>
</li>
<li><p>비교 방식 및 스왑 방식은 <strong>분할 알고리즘에 따라 달라집니다.</strong></p>
</li>
</ul>
<hr />
<h2 id="heading-hoare-vs-lomuto"><strong>🧭 분할 방식 종류: Hoare vs. Lomuto</strong></h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>항목</strong></td><td><strong>Hoare 분할</strong></td><td><strong>Lomuto 분할</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>이름 유래</strong></td><td>Tony Hoare (퀵소트 창시자)</td><td>Nico Lomuto (구현 방식 제공자)</td></tr>
<tr>
<td><strong>피벗 위치</strong></td><td>보통 <strong>중간값</strong></td><td>보통 <strong>마지막 값</strong></td></tr>
<tr>
<td><strong>비교 방식</strong></td><td><strong>양 끝에서 중앙으로</strong> 이동</td><td><strong>왼쪽에서 오른쪽으로</strong> 순차 비교</td></tr>
<tr>
<td><strong>스왑 횟수</strong></td><td>적음</td><td>많음 (자기 자신과도 자주 스왑)</td></tr>
<tr>
<td><strong>실행 속도</strong></td><td>빠름</td><td>상대적으로 느림</td></tr>
<tr>
<td><strong>코드 복잡도</strong></td><td>복잡</td><td>단순</td></tr>
<tr>
<td><strong>사용 용도</strong></td><td>실무, 대규모 데이터</td><td>학습용, 단순 구현</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-kirwn6eqioylpo2wisdsmijsi5wg67me6rwqicjqs7xthrug67cw7je0oioq"><strong>🧪 실행 예시 비교 (공통 배열:</strong></h2>
<h2 id="heading-34-7-23-32-5-62"><strong>[34, 7, 23, 32, 5, 62]</strong></h2>
<h2 id="heading-kiopkio"><strong>)</strong></h2>
<h3 id="heading-hoare-23"><strong>✅ Hoare 방식 (피벗: 23)</strong></h3>
<ol>
<li><p>swap(0,4) → [5, 7, 23, 32, 34, 62]</p>
</li>
<li><p>left=3, right=2 → 종료</p>
</li>
</ol>
<p>→ 결과: [5, 7, 23, 32, 34, 62]</p>
<h3 id="heading-lomuto-62"><strong>✅ Lomuto 방식 (피벗: 62)</strong></h3>
<ul>
<li><p>자기 자신과 6번 스왑 발생</p>
</li>
<li><p>값 재배치 없이 그대로 [34, 7, 23, 32, 5, 62]</p>
</li>
</ul>
<p>→ 분할만 완료된 상태 (정렬은 이후 진행됨)</p>
<hr />
<h2 id="heading-kirwn5k7ioyekouwlcdqtaztmiqg7jii7kcckio"><strong>💻 자바 구현 예제</strong></h2>
<h3 id="heading-1-hoare"><strong>1. Hoare 분할 방식</strong></h3>
<pre><code class="lang-plaintext">int pivot = arr[(left + right) / 2];
while (left &lt;= right) {
    while (arr[left] &lt; pivot) left++;
    while (arr[right] &gt; pivot) right--;
    if (left &lt;= right) {
        swap(arr, left, right);
        left++; right--;
    }
}
</code></pre>
<h3 id="heading-2-lomuto"><strong>2. Lomuto 분할 방식</strong></h3>
<pre><code class="lang-plaintext">int pivot = arr[high];
int i = low - 1;
for (int j = low; j &lt; high; j++) {
    if (arr[j] &lt;= pivot) {
        i++; swap(arr, i, j);
    }
}
swap(arr, i + 1, high);
</code></pre>
<hr />
<h2 id="heading-kiriniug7kcv66asioyaloyvvsoq"><strong>✅ 정리 요약</strong></h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>구분</strong></td><td><strong>Hoare 분할</strong></td><td><strong>Lomuto 분할</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>속도</strong></td><td>평균적으로 더 빠름</td><td>단순하지만 비효율 가능</td></tr>
<tr>
<td><strong>비교 구조</strong></td><td>양쪽에서 가운데로</td><td>한 방향 순차 비교</td></tr>
<tr>
<td><strong>스왑</strong></td><td>적고 효율적</td><td>자주 발생</td></tr>
<tr>
<td><strong>코드 난이도</strong></td><td>다소 복잡</td><td>간단하고 직관적</td></tr>
<tr>
<td><strong>적합 용도</strong></td><td>실무, 대규모 정렬</td><td>학습용, 간단한 정렬</td></tr>
</tbody>
</table>
</div>]]></content:encoded></item><item><title><![CDATA[네트워크 오류를 조용히 알려주는 프로토콜, Icmp]]></title><description><![CDATA[우리가 인터넷에서 ping 명령어를 사용해 어떤 서버가 살아 있는지 확인할 수 있는 이유는 바로 ICMP (Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜) 덕분이다.
ICMP는 단순해 보이지만, 네트워크의 동작과 장애 감지에 매우 핵심적인 역할을 한다.

ICMP란?
ICMP는 IP 패킷 내부에 포함되어 전송되는 제어 메시지용 프로토콜이다.
OSI 7계층 중 3계층인 네트워크 계층 (Layer 3)에...]]></description><link>https://100lab.org/icmp</link><guid isPermaLink="true">https://100lab.org/icmp</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 20 May 2025 08:24:16 GMT</pubDate><content:encoded><![CDATA[<p>우리가 인터넷에서 ping 명령어를 사용해 어떤 서버가 살아 있는지 확인할 수 있는 이유는 바로 <strong>ICMP (Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜)</strong> 덕분이다.</p>
<p>ICMP는 단순해 보이지만, 네트워크의 동작과 장애 감지에 매우 핵심적인 역할을 한다.</p>
<hr />
<h3 id="heading-icmp"><strong>ICMP란?</strong></h3>
<p><strong>ICMP는 IP 패킷 내부에 포함되어 전송되는 제어 메시지용 프로토콜</strong>이다.</p>
<p>OSI 7계층 중 <strong>3계층인 네트워크 계층 (Layer 3)</strong>에서 동작하며,</p>
<p><strong>오류 메시지 전송, 경로 진단, 상태 보고</strong> 등 다양한 제어 기능을 담당한다.</p>
<hr />
<h3 id="heading-kirslrtrlqqg7iob7zmp7jeq7iscioytsoydvoq5jd8qkg"><strong>어떤 상황에서 쓰일까?</strong></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>상황</strong></td><td><strong>ICMP의 역할</strong></td></tr>
</thead>
<tbody>
<tr>
<td>목적지에 도달할 수 없을 때</td><td>“Destination Unreachable” 메시지 전송</td></tr>
<tr>
<td>패킷이 중간에 TTL 초과로 버려졌을 때</td><td>“Time Exceeded” 메시지 전송</td></tr>
<tr>
<td>연결 가능성 확인 (ping)</td><td>Echo Request / Echo Reply 사용</td></tr>
</tbody>
</table>
</div><hr />
<h3 id="heading-kirrjidtkzzsoihsnbgg66mu7iuc7keaio2dgoyehsoq"><strong>대표적인 메시지 타입</strong></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>타입 번호</strong></td><td><strong>메시지 종류</strong></td><td><strong>설명</strong></td></tr>
</thead>
<tbody>
<tr>
<td>8</td><td>Echo Request</td><td>ping 요청</td></tr>
<tr>
<td>0</td><td>Echo Reply</td><td>ping 응답</td></tr>
<tr>
<td>3</td><td>Destination Unreachable</td><td>도달 불가 오류</td></tr>
<tr>
<td>11</td><td>Time Exceeded</td><td>TTL 초과 시 발생</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-icmp-1"><strong>ICMP는 포트가 없다. 그럼 어떻게 구분할까?</strong></h2>
<p>보통 TCP나 UDP는 포트 번호로 통신 대상 애플리케이션을 구분한다.</p>
<p>그러나 <strong>ICMP는 포트를 사용하지 않는다.</strong></p>
<p>ICMP는 <strong>IP 패킷 안의 특별한 필드인 Protocol 번호</strong>로 식별된다.</p>
<hr />
<h3 id="heading-ip-protocol"><strong>IP 헤더의 Protocol 번호란?</strong></h3>
<p>IPv4 헤더에는 다음과 같은 필드들이 포함되어 있는데, 그중 하나가 <strong>Protocol</strong>이다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>필드명</strong></td><td><strong>크기</strong></td><td><strong>설명</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Protocol</td><td>8비트</td><td>IP 패킷의 데이터 부분이 <strong>어떤 상위 계층 프로토콜</strong>인지 지정</td></tr>
</tbody>
</table>
</div><p>이 값이 다음과 같으면?</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>값</strong></td><td><strong>의미</strong></td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>ICMP (Internet Control Message Protocol)</td></tr>
<tr>
<td>6</td><td>TCP (Transmission Control Protocol)</td></tr>
<tr>
<td>17</td><td>UDP (User Datagram Protocol)</td></tr>
</tbody>
</table>
</div><p>즉, 운영체제는 IP 헤더의 이 필드를 보고 <strong>이 패킷은 ICMP구나</strong> 하고 인식하게 된다.</p>
<p><strong>포트가 없어도 구분 가능한 이유</strong>가 여기에 있다.</p>
<hr />
<h3 id="heading-kirsi6tsojwg64sk7yq47jum7ygsioyepeu5hoyxkoyenoukld8qkg"><strong>실제 네트워크 장비에서는?</strong></h3>
<p>방화벽, IDS, 트래픽 필터 등은 이 Protocol 번호를 기반으로 ICMP 트래픽을 감지하거나 차단한다.</p>
<p>예를 들어, ping 요청을 막는 것은 <strong>Protocol 번호 1번 패킷을 필터링</strong>하는 것과 같다.</p>
<hr />
<h3 id="heading-kirsmptslb0qkg"><strong>요약</strong></h3>
<ul>
<li><p><strong>ICMP는 네트워크 계층의 제어용 프로토콜</strong>이며, ping, traceroute 등에 사용됨</p>
</li>
<li><p><strong>오류 상황과 네트워크 진단 메시지를 전달</strong></p>
</li>
<li><p><strong>포트 번호는 없지만, IP 헤더의 Protocol 필드 값 1번으로 식별됨</strong></p>
</li>
<li><p><strong>Layer 3(네트워크 계층)</strong>에서 동작하며, IP와 함께 인터넷의 기본 구조를 형성함</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[JWT 보안: 서명 검증부터 jti (JWT ID: JSON Token Identifier) 관리]]></title><description><![CDATA[JWT(JSON Web Token)는 인증 시스템의 핵심 구성 요소로 널리 사용됩니다. 하지만 단순히 서명만 검증하고 사용하는 것만으로는 보안상 충분하지 않습니다. 이 글에서는 JWT 구조, 서명(Signature) 검증, jti (JWT ID) 검증, 실제 예시, Redis 연동, 그리고 클라이언트에서의 안전한 사용법까지 실전 위주로 모두 정리합니다.

1. JWT 구조 예시
JWT는 다음과 같이 3개의 파트로 구성된 문자열입니다:
<헤더>....]]></description><link>https://100lab.org/jwt-jti-jwt-id-json-token-identifier</link><guid isPermaLink="true">https://100lab.org/jwt-jti-jwt-id-json-token-identifier</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 20 May 2025 07:45:35 GMT</pubDate><content:encoded><![CDATA[<p>JWT(JSON Web Token)는 인증 시스템의 핵심 구성 요소로 널리 사용됩니다. 하지만 단순히 서명만 검증하고 사용하는 것만으로는 보안상 충분하지 않습니다. 이 글에서는 <strong>JWT 구조</strong>, <strong>서명(Signature) 검증</strong>, <strong>jti (JWT ID)</strong> 검증, <strong>실제 예시</strong>, <strong>Redis 연동</strong>, 그리고 <strong>클라이언트에서의 안전한 사용법</strong>까지 실전 위주로 모두 정리합니다.</p>
<hr />
<h2 id="heading-1-jwt"><strong>1. JWT 구조 예시</strong></h2>
<p>JWT는 다음과 같이 3개의 파트로 구성된 문자열입니다:</p>
<pre><code class="lang-plaintext">&lt;헤더&gt;.&lt;페이로드&gt;.&lt;서명&gt;
</code></pre>
<h3 id="heading-jwt"><strong>예시 JWT 문자열</strong></h3>
<pre><code class="lang-plaintext">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiJ1c2VyMTIzIiwianRpIjoiYTIzNC1iNTY3LWQ4OWEtZmdoIiwiaWF0IjoxNzE2MjAwMDAsImV4cCI6MTcxNjIwMzYwMCwicm9sZSI6ImFkbWluIn0.
gnI4FbpyNdo7M43OsldBb4XZ9EMWHUuBh6ilAEM_0BE
</code></pre>
<h3 id="heading-base64"><strong>Base64 디코딩 후 구성 요소</strong></h3>
<h4 id="heading-header"><strong>Header (헤더)</strong></h4>
<pre><code class="lang-plaintext">{
  "alg": "HS256",
  "typ": "JWT"
}
</code></pre>
<ul>
<li><p>alg: 서명 알고리즘 (HMAC-SHA256)</p>
</li>
<li><p>typ: 토큰 타입 (JWT)</p>
</li>
</ul>
<h4 id="heading-payload"><strong>Payload (페이로드)</strong></h4>
<pre><code class="lang-plaintext">{
  "sub": "user123",
  "jti": "a234-b567-d89a-fgh",           // JWT ID (고유 식별자)
  "iat": 1716200000,                      // 발급 시각 (UNIX timestamp)
  "exp": 1716203600,                      // 만료 시각 (UNIX timestamp)
  "role": "admin"
}
</code></pre>
<ul>
<li><p>sub: 사용자 식별자</p>
</li>
<li><p>jti: 고유 토큰 ID</p>
</li>
<li><p>iat: 발급 시각 (예: 2024-05-21 12:00:00)</p>
</li>
<li><p>exp: 만료 시각 (예: 2024-05-21 13:00:00)</p>
</li>
<li><p>role: 권한 정보</p>
</li>
</ul>
<h4 id="heading-signature"><strong>Signature (서명)</strong></h4>
<pre><code class="lang-plaintext">gnI4FbpyNdo7M43OsldBb4XZ9EMWHUuBh6ilAEM_0BE
</code></pre>
<ul>
<li><p>위 Header + Payload를 조합한 후 비밀 키로 HMAC-SHA256 서명한 결과</p>
</li>
<li><p>토큰 위조 여부 검증에 사용</p>
</li>
</ul>
<hr />
<h2 id="heading-2-signature-vs-jti"><strong>2. Signature vs jti: 왜 둘 다 필요한가?</strong></h2>
<h3 id="heading-signature-1"><strong>✅ Signature 검증</strong></h3>
<ul>
<li><p><strong>항상 수행</strong></p>
</li>
<li><p>토큰 위조 여부 확인</p>
</li>
<li><p>비밀 키로 서버가 직접 서명 재생성 → 원본 서명과 비교</p>
</li>
</ul>
<pre><code class="lang-plaintext">Claims claims = Jwts.parser()
  .setSigningKey("my-secret-key".getBytes())
  .parseClaimsJws(jwt)
  .getBody();
</code></pre>
<h3 id="heading-jti-jwt-id-json-token-identifier"><strong>✅ jti (JWT ID: JSON Token Identifier) 검증</strong></h3>
<ul>
<li><p>토큰 자체의 고유 식별자</p>
</li>
<li><p><strong>블랙리스트</strong>, <strong>로그아웃 처리</strong>, <strong>재사용 탐지</strong> 등에 사용</p>
</li>
<li><p>서버는 Redis/DB에서 jti 존재 여부나 상태를 별도로 확인함</p>
</li>
</ul>
<pre><code class="lang-plaintext">String jti = claims.getId();
if (redis.exists("blacklist:" + jti)) {
  throw new TokenRevokedException();
}
</code></pre>
<hr />
<h2 id="heading-3-redis-jti"><strong>3. Redis와 함께 jti 관리하기</strong></h2>
<h3 id="heading-refreshtoken"><strong>예시: RefreshToken 발급 시</strong></h3>
<ul>
<li><p>jti(UUID) 생성: a234-b567-d89a-fgh</p>
</li>
<li><p>Redis 저장</p>
</li>
</ul>
<pre><code class="lang-plaintext">Key: refreshToken:a234-b567-d89a-fgh
Value:
{
  "userId": "user123",
  "ua": "Chrome/122",
  "ip": "192.168.0.1",
  "expiresAt": 1716800000
}
TTL: 7일
</code></pre>
<h3 id="heading-kirrozzqt7jslytsm4mg7iucioyymoumrcoq"><strong>로그아웃 시 처리</strong></h3>
<ul>
<li><p>해당 jti를 블랙리스트로 이동</p>
</li>
<li><p>이후 모든 요청에서 jti 확인 후 거부 처리</p>
</li>
</ul>
<hr />
<h2 id="heading-4-accesstoken-vs-refreshtoken"><strong>4. AccessToken vs RefreshToken 비교</strong></h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>항목</strong></td><td><strong>AccessToken</strong></td><td><strong>RefreshToken</strong></td></tr>
</thead>
<tbody>
<tr>
<td>역할</td><td>인증에 사용</td><td>AccessToken 재발급에 사용</td></tr>
<tr>
<td>유효 시간</td><td>짧음 (5~15분)</td><td>김 (7~30일)</td></tr>
<tr>
<td>보관 위치</td><td>클라이언트(메모리, 쿠키)</td><td>서버(Redis/DB) 또는 HttpOnly 쿠키</td></tr>
<tr>
<td>jti 사용 여부</td><td>선택 (로그아웃 블랙리스트 등)</td><td>필수 (서버가 상태 관리)</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-5-accesstoken"><strong>5. 클라이언트에서 AccessToken 디코딩은 가능할까?</strong></h2>
<blockquote>
<p>✅ 디코딩은 가능하지만, ❌ 신뢰해서 사용하면 안 됩니다.</p>
</blockquote>
<h3 id="heading-kirslyjsoittlzwg7iks7jqpioyyicoq"><strong>안전한 사용 예</strong></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>용도</strong></td><td><strong>허용 여부</strong></td><td><strong>이유</strong></td></tr>
</thead>
<tbody>
<tr>
<td>UI에 사용자명 표시</td><td>✅</td><td>사용자 경험 개선용</td></tr>
<tr>
<td>관리자 UI 숨김 처리</td><td>✅</td><td>단, 표시만 가능</td></tr>
<tr>
<td>관리자 API 접근 제어</td><td>❌</td><td>서버에서 role 검증 필수</td></tr>
<tr>
<td>userId로 API 호출</td><td>❌</td><td>위조 토큰일 수 있음</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-6"><strong>6. 최종 정리</strong></h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>검증 항목</strong></td><td><strong>필수 여부</strong></td><td><strong>설명</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>Signature</strong></td><td>✅ 필수</td><td>위조 방지를 위해 서명 검증</td></tr>
<tr>
<td><strong>jti</strong></td><td>⭕ 권장</td><td>재사용 차단, 로그아웃, 토큰 무효화 등</td></tr>
</tbody>
</table>
</div><ul>
<li><p><strong>서명(Signature)</strong> 은 토큰이 변조되었는지 판단</p>
</li>
<li><p><strong>jti (JWT ID)</strong> 는 토큰이 <strong>아직 유효한지, 서버가 허용하는지</strong> 판단</p>
</li>
<li><p>보안은 두 단계 모두 필요합니다</p>
</li>
</ul>
<hr />
<h2 id="heading-kirrp4jrrltrpqwqkg"><strong>마무리</strong></h2>
<p>JWT는 위조 방지를 위한 <strong>서명 검증(Signature)</strong>과</p>
<p>상태 추적을 위한 <strong>토큰 식별자(jti)</strong>를 함께 활용할 때,</p>
<p><strong>안정적이면서 보안성 높은 인증 시스템을 만들 수 있습니다.</strong></p>
<blockquote>
<p><strong>서명은 위조를 막고, jti는 남용을 막는다.</strong></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[25년 4월 SKT 해킹 사건 BPFDoor]]></title><description><![CDATA[2025년 4월, SK텔레콤(SKT)은 약 2,700만 명의 가입자 정보를 포함한 대규모 해킹 사건을 겪었습니다. 이번 공격은 리눅스 기반의 고도화된 백도어 악성코드인 BPFDoor를 통해 이루어졌으며, 이는 국내 통신 인프라의 보안 취약점을 드러낸 중대한 사건으로 평가됩니다.

🔍 BPFDoor란 무엇인가?
BPFDoor는 2021년경부터 활동이 관찰된 리눅스 기반의 백도어 악성코드로, Berkeley Packet Filter(BPF)를 악...]]></description><link>https://100lab.org/25-4-skt-bpfdoor</link><guid isPermaLink="true">https://100lab.org/25-4-skt-bpfdoor</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 20 May 2025 05:48:35 GMT</pubDate><content:encoded><![CDATA[<p>2025년 4월, SK텔레콤(SKT)은 약 2,700만 명의 가입자 정보를 포함한 대규모 해킹 사건을 겪었습니다. 이번 공격은 리눅스 기반의 고도화된 백도어 악성코드인 <strong>BPFDoor</strong>를 통해 이루어졌으며, 이는 국내 통신 인프라의 보안 취약점을 드러낸 중대한 사건으로 평가됩니다.</p>
<hr />
<h2 id="heading-bpfdoor"><strong>🔍 BPFDoor란 무엇인가?</strong></h2>
<p><strong>BPFDoor</strong>는 2021년경부터 활동이 관찰된 리눅스 기반의 백도어 악성코드로, <strong>Berkeley Packet Filter(BPF)</strong>를 악용하여 포트 없이도 외부 명령을 수신할 수 있는 특징을 가집니다. 이는 방화벽이나 침입 탐지 시스템(IDS)을 우회하여 탐지를 어렵게 하며, 특정 “매직 패킷”을 수신할 때만 활성화되어 은밀하게 작동합니다.</p>
<hr />
<h2 id="heading-skt"><strong>🧭 SKT 해킹 사건 개요</strong></h2>
<ul>
<li><p><strong>침입 시점</strong>: 2022년 6월 15일경부터 BPFDoor가 SKT 시스템에 잠입하여 활동을 시작한 것으로 추정됩니다.</p>
</li>
<li><p><strong>침해 대상</strong>: SKT의 핵심 인증 시스템인 <strong>Home Subscriber Server(HSS)</strong>를 포함한 23대의 리눅스 서버가 감염되었습니다.</p>
</li>
<li><p><strong>유출 정보</strong>: 국제이동가입자식별번호(IMSI), 유심 고유 식별번호(ICCID), 유심 인증 키 등 약 9.82GB의 데이터가 유출되었습니다.</p>
</li>
<li><p><strong>악성코드 종류</strong>: BPFDoor 변종 24종과 웹 셸 1종 등 총 25종의 악성코드가 발견되었습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-bpfdoor-1"><strong>⚠️ BPFDoor의 특징과 위험성</strong></h2>
<ul>
<li><p><strong>포트리스닝 불필요</strong>: BPF를 활용하여 포트를 열지 않고도 외부 명령을 수신하므로, 방화벽이나 IDS에 탐지되지 않습니다.</p>
</li>
<li><p><strong>은폐성</strong>: 정상적인 시스템 프로세스로 위장하고, 로그를 남기지 않아 장기간 탐지되지 않을 수 있습니다.</p>
</li>
<li><p><strong>다양한 통신 프로토콜 지원</strong>: TCP, UDP, ICMP 등 다양한 프로토콜을 통해 명령을 수신할 수 있습니다.</p>
</li>
<li><p><strong>APT 공격에 활용</strong>: 중국계 해킹 그룹인 <strong>Red Menshen</strong>이 주로 사용하며, 통신사, 금융기관 등 주요 인프라를 대상으로 한 APT 공격에 활용됩니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-skt-1"><strong>🛡️ SKT의 대응 조치</strong></h2>
<ul>
<li><p><strong>유심 교체 서비스 제공</strong>: 전국 매장에서 무료 유심 교체 서비스를 제공하여, 유출된 인증 정보를 무력화하였습니다.</p>
</li>
<li><p><strong>유심 보호 서비스 확대</strong>: 유심 복제 및 무단 변경을 방지하는 유심 보호 서비스를 무료로 전환하여 제공하였습니다.</p>
</li>
<li><p><strong>보안 시스템 강화</strong>: 이상 접근 패턴을 탐지하여 차단하는 시스템을 최고 보안 수준으로 격상시켰습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-kirwn5omioqysouhocdrsi8g7iuc7iks7kcqkio"><strong>📌 결론 및 시사점</strong></h2>
<p>이번 SKT 해킹 사건은 BPFDoor와 같은 고도화된 악성코드가 국내 주요 인프라에 침투할 수 있음을 보여주며, 통신사 및 기업의 보안 체계 강화의 필요성을 강조합니다. 특히, 포트리스닝 없이도 통신이 가능한 BPFDoor의 특성은 기존 보안 시스템의 한계를 드러내며, 보다 정교한 보안 전략과 실시간 모니터링 체계의 구축이 요구됩니다.</p>
]]></content:encoded></item><item><title><![CDATA[LLM 스트리밍 응답의 HTTP Raw 구조 이해하기]]></title><description><![CDATA[대부분의 대형 언어 모델(LLM: Large Language Model) API는 실시간 응답 속도를 높이기 위해 스트리밍 응답(Streaming Response) 방식을 사용합니다. 대표적인 예로 Ollama, OpenAI, Claude 등의 API는 청크 전송 인코딩(Chunked Transfer Encoding)을 통해 응답을 전달합니다. 이 글에서는 스트리밍 응답이 HTTP 레벨에서 어떻게 전달되는지, 그 장단점은 무엇인지, 그리고 cu...]]></description><link>https://100lab.org/llm-http-raw</link><guid isPermaLink="true">https://100lab.org/llm-http-raw</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Fri, 16 May 2025 07:39:17 GMT</pubDate><content:encoded><![CDATA[<p>대부분의 대형 언어 모델(LLM: Large Language Model) API는 실시간 응답 속도를 높이기 위해 <strong>스트리밍 응답(Streaming Response)</strong> 방식을 사용합니다. 대표적인 예로 <strong>Ollama</strong>, <strong>OpenAI</strong>, <strong>Claude</strong> 등의 API는 <strong>청크 전송 인코딩(Chunked Transfer Encoding)</strong>을 통해 응답을 전달합니다. 이 글에서는 스트리밍 응답이 HTTP 레벨에서 어떻게 전달되는지, 그 장단점은 무엇인지, 그리고 curl로 확인하는 방법을 설명합니다.</p>
<hr />
<h3 id="heading-vs"><strong>스트리밍 응답 vs 일반 응답</strong></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>구분</strong></td><td><strong>일반 응답</strong></td><td><strong>스트리밍 응답</strong></td></tr>
</thead>
<tbody>
<tr>
<td>응답 방식</td><td>결과를 완성한 후 한 번에 전송</td><td>결과를 조각(chunk)으로 나눠 실시간 전송</td></tr>
<tr>
<td>헤더</td><td>Content-Length 포함</td><td>Transfer-Encoding: chunked</td></tr>
<tr>
<td>클라이언트 반응</td><td>응답 완료까지 대기</td><td>순차적으로 실시간 처리 가능</td></tr>
<tr>
<td>사용 사례</td><td>검색, 간단한 API</td><td>채팅, 실시간 생성 AI</td></tr>
</tbody>
</table>
</div><hr />
<h3 id="heading-kirsiqttirjrpqzrsi3snzgg7j6l64uo7kcqkio"><strong>스트리밍의 장단점</strong></h3>
<h4 id="heading-kirsnqxsojaqkg"><strong>장점</strong></h4>
<ol>
<li><p><strong>빠른 사용자 반응성</strong></p>
<ul>
<li><p>전체 결과를 기다리지 않고, 생성되는 즉시 전송 가능</p>
</li>
<li><p>사용자에게 실시간 타이핑 효과 등의 자연스러운 경험 제공</p>
</li>
</ul>
</li>
</ol>
<ol start="2">
<li><p><strong>낮은 메모리 사용량</strong></p>
<ul>
<li>서버나 클라이언트 모두 결과 전체를 메모리에 저장할 필요 없이 처리 가능</li>
</ul>
</li>
</ol>
<ol start="3">
<li><p><strong>대용량 데이터 전송에 적합</strong></p>
<ul>
<li>수십 MB 이상의 응답을 쪼개서 안정적으로 전송 가능</li>
</ul>
</li>
</ol>
<ol start="4">
<li><p><strong>실시간 처리 가능</strong></p>
<ul>
<li>로그 스트림, AI 생성, 뉴스 피드 등 실시간 처리에 매우 유리</li>
</ul>
</li>
</ol>
<h4 id="heading-kirri6jsojaqkg"><strong>단점</strong></h4>
<ol>
<li><p><strong>후처리 어려움</strong></p>
<ul>
<li>전체 결과를 한 번에 받지 않으므로, 요약이나 정렬 등 후처리가 어려움</li>
</ul>
</li>
</ol>
<ol start="2">
<li><p><strong>구현 복잡도</strong></p>
<ul>
<li>클라이언트는 스트리밍 조각을 실시간으로 조합하거나 출력해야 하므로 복잡성 증가</li>
</ul>
</li>
</ol>
<ol start="3">
<li><p><strong>중간 끊김에 민감</strong></p>
<ul>
<li>연결 중단 시 복구가 어려울 수 있고, 전체 요청을 다시 보내야 할 수도 있음</li>
</ul>
</li>
</ol>
<ol start="4">
<li><p><strong>디버깅 어려움</strong></p>
<ul>
<li>응답이 점진적으로 오기 때문에 중간 상태를 디버깅하거나 테스트하는 것이 번거로움</li>
</ul>
</li>
</ol>
<hr />
<h3 id="heading-transfer-encoding-chunked"><strong>Transfer-Encoding: chunked 구조</strong></h3>
<p>HTTP/1.1에서 스트리밍 응답을 구현하기 위해 사용하는 표준 방식은 <strong>chunked transfer encoding</strong>입니다.</p>
<h4 id="heading-kirqtazsoba6kio"><strong>구조:</strong></h4>
<pre><code class="lang-plaintext">[청크 길이 (16진수)]\r\n
[청크 데이터]\r\n
</code></pre>
<p>각 청크는 이렇게 반복되고, 마지막에 0\r\n\r\n을 보내며 스트림 종료를 알립니다.</p>
<h4 id="heading-kirsmijsi5w6kio"><strong>예시:</strong></h4>
<pre><code class="lang-plaintext">HTTP/1.1 200 OK
Content-Type: application/json
Transfer-Encoding: chunked

1c
{"response":"Black ","done":false}

1a
{"response":"holes are ","done":false}

1b
{"response":"very dense.","done":true}

0
</code></pre>
<hr />
<h3 id="heading-curl"><strong>curl로 확인하는 방법</strong></h3>
<p>curl을 사용하면 스트리밍 응답을 쉽게 관찰할 수 있습니다.</p>
<pre><code class="lang-plaintext">curl -vN http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3",
    "prompt": "Explain black holes.",
    "stream": true
  }'
</code></pre>
<ul>
<li><p>-v: HTTP 요청/응답 로그 출력</p>
</li>
<li><p>-N: 출력 버퍼링 비활성화 (stream 대응)</p>
</li>
</ul>
<p>출력은 다음과 같이 한 줄씩 출력됩니다:</p>
<pre><code class="lang-plaintext">{"response":"Black ","done":false}
{"response":"holes are ","done":false}
{"response":"very dense.","done":true}
</code></pre>
<hr />
<h3 id="heading-kirtlzzrsojsl5ag67cb7jy866ck66m0pyoq"><strong>한번에 받으려면?</strong></h3>
<p>스트리밍이 아닌 <strong>일반 응답</strong>으로 전환하려면 stream 옵션을 false로 설정하면 됩니다.</p>
<pre><code class="lang-plaintext">curl http://localhost:11434/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3",
    "prompt": "Explain black holes.",
    "stream": false
  }'
</code></pre>
<p>이 경우에는 전체 결과가 완성된 후 한 번에 출력됩니다.</p>
<hr />
<h3 id="heading-kirrp4jrrltrpqwqkg"><strong>마무리</strong></h3>
<p>LLM API의 응답을 스트리밍 방식으로 처리할 수 있다는 것은 빠른 사용자 경험과 메모리 효율을 제공하는 강력한 기능입니다. 하지만 이를 제대로 활용하기 위해서는 <strong>HTTP 수준의 작동 방식과 스트리밍의 특성</strong>을 이해하는 것이 중요합니다. 이 글이 Chunked Transfer Encoding의 구조, 장단점, 활용법에 대한 이해를 높이는 데 도움이 되었기를 바랍니다.</p>
]]></content:encoded></item><item><title><![CDATA[알고리즘에서 log n과 n log n은 무슨 뜻일까?]]></title><description><![CDATA[많은 알고리즘 문제에서 시간복잡도로 O(log n)이나 O(n log n)을 자주 보게 됩니다.처음 접하면 log는 도대체 뭐지? 싶지만, 알고 보면 아주 단순한 개념입니다.이 글에서는 로그의 개념부터 O(log n)과 O(n log n)의 차이를 실제 알고리즘과 함께 쉽게 설명해 드리겠습니다.

1. 로그(log)란?
✔️ 정의
로그는 "몇 번 곱해야 이 수가 되나요?"라는 질문입니다.
예를 들어,
2 × 2 × 2 = 8 → log₂(8) ...]]></description><link>https://100lab.org/log-n-n-log-n</link><guid isPermaLink="true">https://100lab.org/log-n-n-log-n</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Thu, 15 May 2025 05:35:22 GMT</pubDate><content:encoded><![CDATA[<p>많은 알고리즘 문제에서 시간복잡도로 <code>O(log n)</code>이나 <code>O(n log n)</code>을 자주 보게 됩니다.<br />처음 접하면 <strong>log는 도대체 뭐지?</strong> 싶지만, 알고 보면 아주 단순한 개념입니다.<br />이 글에서는 로그의 개념부터 <code>O(log n)</code>과 <code>O(n log n)</code>의 차이를 실제 알고리즘과 함께 쉽게 설명해 드리겠습니다.</p>
<hr />
<h2 id="heading-1-log">1. 로그(log)란?</h2>
<h3 id="heading-4pyu77ipioygleydma">✔️ 정의</h3>
<p><strong>로그는 "몇 번 곱해야 이 수가 되나요?"라는 질문입니다.</strong></p>
<p>예를 들어,</p>
<pre><code class="lang-plaintext">2 × 2 × 2 = 8 → log₂(8) = 3
10 × 10 × 10 = 1000 → log₁₀(1000) = 3
</code></pre>
<p>즉, <code>log₂(8)</code>은 2를 몇 번 곱해야 8이 되는지를 묻습니다 → 정답은 3입니다.</p>
<hr />
<h2 id="heading-2-log-n-logn">2. 알고리즘에서 log n은 log₂(n)</h2>
<h3 id="heading-4p2xioyjvoydma">❗ 주의</h3>
<p>수학에서는 <code>log n</code>을 <code>log₁₀(n)</code>으로 보는 게 일반적이지만,<br /><strong>알고리즘에서는 항상 log₂(n)</strong>, 즉 <strong>밑이 2인 로그</strong>를 기본으로 합니다.</p>
<p>왜냐하면 컴퓨터는 2진수(Binary)를 쓰고,<br />많은 알고리즘이 데이터를 <strong>반씩 나누며 처리</strong>하기 때문입니다.</p>
<hr />
<h2 id="heading-3-olog-n">3. O(log n)이란?</h2>
<h3 id="heading-6rcc64wq">개념</h3>
<ul>
<li><p>입력 크기 n을 <strong>반씩 줄여가며</strong> 처리하는 구조</p>
</li>
<li><p>탐색 범위가 계속 절반이 되는 알고리즘</p>
</li>
</ul>
<h3 id="heading-64ya7zgcioyyioylna">대표 예시</h3>
<ul>
<li><p><strong>이진 탐색 (Binary Search)</strong></p>
</li>
<li><p><strong>힙에서 삽입/삭제</strong></p>
</li>
<li><p><strong>균형 이진 트리에서 삽입/검색</strong></p>
</li>
</ul>
<h3 id="heading-7jii">예</h3>
<p>n = 1024일 때 log₂(n) = 10<br />→ 단 10번만 비교하면 결과에 도달</p>
<hr />
<h2 id="heading-4-on-log-n">4. O(n log n)이란?</h2>
<h3 id="heading-6rcc64wq-1">개념</h3>
<ul>
<li>전체 데이터를 n개 <strong>모두 훑으면서</strong>,<br />  각 원소마다 log n만큼 추가 작업이 들어가는 구조</li>
</ul>
<h3 id="heading-64ya7zgcioyyioylna-1">대표 예시</h3>
<ul>
<li><p><strong>병합 정렬 (Merge Sort)</strong></p>
</li>
<li><p><strong>힙 정렬 (Heap Sort)</strong></p>
</li>
<li><p><strong>우선순위 큐 정렬</strong></p>
</li>
<li><p><strong>세그먼트 트리 계산</strong></p>
</li>
</ul>
<h3 id="heading-7jii-1">예</h3>
<p>n = 1024<br />→ log₂(n) = 10<br />→ 1024 × 10 = 약 10,000번 작업 → O(n log n)</p>
<hr />
<h2 id="heading-5">5. 차이점 비교표</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>항목</td><td>O(log n)</td><td>O(n log n)</td></tr>
</thead>
<tbody>
<tr>
<td>핵심 구조</td><td>반씩 나눔</td><td>전체 순회 + log 연산</td></tr>
<tr>
<td>반복 횟수</td><td>log₂(n)</td><td>n × log₂(n)</td></tr>
<tr>
<td>대표 알고리즘</td><td>이진 탐색, 힙 삽입/삭제</td><td>정렬, 분할정복, 우선순위 큐</td></tr>
<tr>
<td>예 (n=1,000)</td><td>약 10회 연산</td><td>약 10,000회 연산</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-6">6. 한 줄 정리</h2>
<blockquote>
<p><strong>O(log n)</strong>: 반씩 줄이며 찾는다<br /><strong>O(n log n)</strong>: 전체를 보되, 그 안에서 log n 반복이 있다</p>
</blockquote>
<hr />
]]></content:encoded></item><item><title><![CDATA[리액트 웹에서 새창이 열릴 때 DevTools로 화면 캡처하는 절차]]></title><description><![CDATA[웹 애플리케이션에서 window.open()을 통해 새창을 띄우는 기능은 흔히 사용됩니다. 그러나 크롬 개발자도구(DevTools)에서는 이 새창의 DOM 또는 네트워크 정보를 바로 추적하거나 캡처하는 데 어려움이 있습니다. 특히 새창이 리다이렉트 되거나 비동기 렌더링되는 경우, 새창이 열리는 시점에 맞춰 디버깅을 걸지 않으면 놓치기 쉽습니다.
이 글에서는 React 기반 웹에서 새창이 열릴 때의 화면을 정확하게 캡처하는 방법을 단계별로 정리합...]]></description><link>https://100lab.org/devtools-1</link><guid isPermaLink="true">https://100lab.org/devtools-1</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 13 May 2025 02:34:18 GMT</pubDate><content:encoded><![CDATA[<p>웹 애플리케이션에서 <a target="_blank" href="http://window.open">window.open</a>()을 통해 새창을 띄우는 기능은 흔히 사용됩니다. 그러나 크롬 개발자도구(DevTools)에서는 이 새창의 DOM 또는 네트워크 정보를 바로 추적하거나 캡처하는 데 어려움이 있습니다. 특히 새창이 리다이렉트 되거나 비동기 렌더링되는 경우, 새창이 열리는 시점에 맞춰 디버깅을 걸지 않으면 놓치기 쉽습니다.</p>
<p>이 글에서는 <strong>React 기반 웹에서 새창이 열릴 때의 화면을 정확하게 캡처하는 방법</strong>을 단계별로 정리합니다.</p>
<hr />
<h2 id="heading-1"><strong>1. 부모창에서 리액트 컴포넌트의 클릭 이벤트에 브레이크포인트 걸기</strong></h2>
<p>먼저, 새창을 여는 버튼의 클릭 이벤트부터 추적합니다.</p>
<ol>
<li><p>크롬 개발자도구(DevTools)를 열고 Components 탭 또는 Elements → Event Listeners → click 경로를 따라 이벤트를 찾습니다.</p>
</li>
<li><p>새창을 여는 버튼의 클릭 핸들러 코드로 진입하여, <a target="_blank" href="http://window.open">window.open</a>()이 호출되는 위치에 <strong>브레이크포인트</strong>를 겁니다.</p>
</li>
</ol>
<pre><code class="lang-plaintext">// 예시 코드
const handleClick = () =&gt; {
  const win = window.open('/popup', '_blank');
  win?.focus();
};
</code></pre>
<blockquote>
<p>브레이크포인트는 <a target="_blank" href="http://window.open">window.open</a>() 호출 직전에 거는 것이 가장 효과적입니다.</p>
</blockquote>
<hr />
<h2 id="heading-2-devtools"><strong>2. 새창이 열리면 자동으로 연결된 DevTools는 닫히므로, 브레이크포인트에서 멈춘 상태 유지</strong></h2>
<p>클릭 시점에 브레이크포인트가 걸리면 새창이 열리기 전이라 부모창은 멈춰 있게 됩니다. 이 시점에서 새창의 준비를 할 수 있습니다.</p>
<ol>
<li><p><a target="_blank" href="http://window.open">window.open</a>() 이후 win.document가 생성되면서 새창이 로드되기 시작하지만, 이때 DevTools가 자동으로 연결되지 않습니다.</p>
</li>
<li><p>수동으로 새창을 활성화한 뒤 F12를 눌러 새창의 개발자도구를 엽니다.</p>
</li>
</ol>
<hr />
<h2 id="heading-3"><strong>3. 새창에서</strong></h2>
<h2 id="heading-domcontentloaded"><strong>DOMContentLoaded</strong></h2>
<h2 id="heading-kirrpqzsiqtrhijrpbwg7isk7kcvkio"><strong>리스너를 설정</strong></h2>
<p>이제 새창이 열리고 있는 상태에서, <strong>DOM이 준비되는 시점에 브레이크포인트를 걸어야 합니다</strong>.</p>
<ol>
<li><p>새창의 DevTools에서 Sources → Event Listener Breakpoints → Load → DOMContentLoaded 체크박스를 활성화합니다.</p>
</li>
<li><p>이 설정은 새창에서 DOM이 완전히 로드되는 시점에 중단되도록 합니다.</p>
</li>
</ol>
<hr />
<h2 id="heading-4-resume"><strong>4. 부모창에서 resume (▶️) 을 눌러 새창 로딩 진행</strong></h2>
<p>이제 부모창으로 돌아가서 Resume script execution (F8)을 눌러 브레이크포인트를 해제합니다.</p>
<ul>
<li><p>그러면 새창이 실제로 로드되며, 방금 설정한 DOMContentLoaded 브레이크포인트에서 멈추게 됩니다.</p>
</li>
<li><p>이 상태에서 DOM 구조나 네트워크 요청, 렌더링 타이밍 등을 분석할 수 있습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-kirrs7trhijsiqqg7yyboidsg4jssl3sl5dshjwg64sk7yq47jum7ygsioy6oeyymoq5joyngcdtlzjqs6ag7iu264uk66m0pyoq"><strong>보너스 팁: 새창에서 네트워크 캡처까지 하고 싶다면?</strong></h2>
<p>크롬의 DevTools는 새창에서 네트워크 탭을 자동으로 유지하지 않으므로, <strong>개발용 프록시(예: Charles, Fiddler)</strong>를 사용하는 것도 방법입니다. 또는 새창이 띄워지는 시점을 <a target="_blank" href="http://window.open">window.open</a>() 대신 a target="_blank" 형태로 바꾸고, 새창 자체를 명시적으로 열 수 있도록 구조를 바꾸는 것도 고려해볼 수 있습니다.</p>
<hr />
<h2 id="heading-kirsojxrpqwqkg"><strong>정리</strong></h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>단계</strong></td><td><strong>설명</strong></td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>새창을 여는 리액트 컴포넌트 클릭 핸들러 추적</td></tr>
<tr>
<td>2</td><td><a target="_blank" href="http://window.open">window.open</a>() 전에 브레이크포인트 설정</td></tr>
<tr>
<td>3</td><td>새창 DevTools에서 DOMContentLoaded 리스너 설정</td></tr>
<tr>
<td>4</td><td>부모창에서 resume (F8) 눌러 새창 로딩 진행</td></tr>
<tr>
<td>5</td><td>새창의 초기 렌더링을 캡처 및 분석 가능</td></tr>
</tbody>
</table>
</div>]]></content:encoded></item><item><title><![CDATA[팝업/새탭 에서 개발자 도구(DevTools) 자동으로 열기 설정]]></title><description><![CDATA[웹 개발 중 window.open() 또는 링크 클릭 등으로 팝업 창이 열릴 때, 해당 팝업에서 Chrome 개발자 도구(DevTools)가 자동으로 열리지 않아 디버깅이 어려운 경우가 많습니다. 특히 클릭 이벤트 후 열리는 새 창에서 네트워크 요청이나 콘솔 오류를 바로 확인하려면, DevTools가 함께 떠야 빠르게 문제를 파악할 수 있습니다.
이 글에서는 팝업 창이 열릴 때 DevTools가 자동으로 따라 열리게 설정하는 방법을 단계별로 소...]]></description><link>https://100lab.org/devtools</link><guid isPermaLink="true">https://100lab.org/devtools</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 13 May 2025 01:41:45 GMT</pubDate><content:encoded><![CDATA[<p>웹 개발 중 <a target="_blank" href="http://window.open">window.open</a>() 또는 링크 클릭 등으로 팝업 창이 열릴 때, 해당 팝업에서 Chrome 개발자 도구(DevTools)가 자동으로 열리지 않아 디버깅이 어려운 경우가 많습니다. 특히 클릭 이벤트 후 열리는 새 창에서 네트워크 요청이나 콘솔 오류를 바로 확인하려면, DevTools가 함께 떠야 빠르게 문제를 파악할 수 있습니다.</p>
<p>이 글에서는 팝업 창이 열릴 때 <strong>DevTools가 자동으로 따라 열리게 설정하는 방법</strong>을 단계별로 소개합니다.</p>
<hr />
<h2 id="heading-kirsgqzsmqkg7zmy6rk9kio"><strong>사용 환경</strong></h2>
<ul>
<li><p>브라우저: Google Chrome (최신 버전 권장)</p>
</li>
<li><p>OS: macOS, Windows 모두 가능</p>
</li>
</ul>
<hr />
<h2 id="heading-1-chrome-devtools"><strong>1. Chrome DevTools 열기</strong></h2>
<p>먼저 <strong>팝업을 띄우는 원래 창</strong>에서 Chrome의 개발자 도구를 엽니다.</p>
<ul>
<li><p>macOS: Cmd + Option + I</p>
</li>
<li><p>Windows: Ctrl + Shift + I</p>
</li>
</ul>
<hr />
<h2 id="heading-2-command-menu"><strong>2. Command Menu 실행</strong></h2>
<p>DevTools 상단에서 명령어를 실행하기 위해 Command Menu를 열어야 합니다.</p>
<ul>
<li><p>macOS: Cmd + Shift + P</p>
</li>
<li><p>Windows: Ctrl + Shift + P</p>
</li>
</ul>
<p>상단에 검색창이 열립니다.</p>
<hr />
<h2 id="heading-3-auto-open-devtools-for-popups"><strong>3. Auto-open DevTools for popups 검색</strong></h2>
<p>검색창에 아래 명령어를 입력합니다.</p>
<pre><code class="lang-plaintext">Auto-open DevTools for popups
</code></pre>
<p>이 명령은 새 창(팝업)이 열릴 때마다 자동으로 개발자 도구를 함께 실행하게 설정합니다.</p>
<hr />
<h2 id="heading-4"><strong>4. 명령어 활성화</strong></h2>
<p>Auto-open DevTools for popups 항목이 보이면 클릭하여 활성화합니다.</p>
<ul>
<li><p>활성화되면 앞에 ✅ 표시가 붙습니다.</p>
</li>
<li><p>다시 비활성화하고 싶다면 같은 명령어를 한 번 더 실행하여 끌 수 있습니다.</p>
</li>
</ul>
<hr />
<h2 id="heading-5"><strong>5. 팝업 다시 열기</strong></h2>
<p>이제부터 <a target="_blank" href="http://window.open">window.open</a>() 등으로 팝업이 열릴 때, 해당 창에서도 자동으로 DevTools가 함께 열립니다.</p>
<p>팝업 창의 콘솔 로그, 네트워크 요청, Elements 구조 등 모든 정보를 바로 확인할 수 있으므로 디버깅이 훨씬 수월해집니다.</p>
<hr />
<h2 id="heading-kirssljqs6ag7iks7zwtkio"><strong>참고 사항</strong></h2>
<ul>
<li><p>이 설정은 한 번만 해두면 이후에도 유지됩니다.</p>
</li>
<li><p>만약 DevTools가 자동으로 열리지 않는다면 브라우저의 팝업 차단 기능이 원인일 수 있습니다. 이 경우 [설정 &gt; 개인정보 및 보안 &gt; 사이트 설정 &gt; 팝업 및 리디렉션]에서 허용 도메인에 현재 사이트를 추가해 주세요.</p>
</li>
</ul>
<hr />
<p>팝업 디버깅이 잦은 웹앱 개발자라면 꼭 활성화해두면 유용한 설정입니다. 자주 쓰는 옵션인 만큼, 명령어 이름을 기억해 두면 필요할 때 빠르게 적용할 수 있습니다.</p>
]]></content:encoded></item><item><title><![CDATA[[ai] 인공지능 구성요소]]></title><description><![CDATA[이 글은 초보자를 위한 안내서로, 인공지능의 구성 요소를 다음의 주제로 명확히 구분해 설명합니다
AI 개요 → 기술 분야 → 알고리즘 → 신경망 → 모델 → 데이터 → 학습 → 추론 → 평가 → 윤리

1. 인공지능이란 무엇인가? (AI: Artificial Intelligence)
인공지능은 인간의 지능을 모방해 문제를 해결하거나, 언어를 이해하고, 이미지를 인식하는 등 다양한 작업을 자동으로 수행하는 컴퓨터 시스템입니다. 대표적인 예로 챗봇...]]></description><link>https://100lab.org/ai</link><guid isPermaLink="true">https://100lab.org/ai</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Thu, 08 May 2025 08:09:26 GMT</pubDate><content:encoded><![CDATA[<p>이 글은 초보자를 위한 안내서로, 인공지능의 구성 요소를 다음의 주제로 명확히 구분해 설명합니다</p>
<p><strong>AI 개요 → 기술 분야 → 알고리즘 → 신경망 → 모델 → 데이터 → 학습 → 추론 → 평가 → 윤리</strong></p>
<hr />
<h2 id="heading-1-ai-artificial-intelligence">1. 인공지능이란 무엇인가? (AI: Artificial Intelligence)</h2>
<p>인공지능은 인간의 지능을 모방해 문제를 해결하거나, 언어를 이해하고, 이미지를 인식하는 등 다양한 작업을 자동으로 수행하는 컴퓨터 시스템입니다. 대표적인 예로 챗봇, 번역기, 자율주행차, 추천 시스템 등이 있습니다.</p>
<hr />
<h2 id="heading-2-technology-areas">2. 주요 기술 분야 (Technology Areas)</h2>
<p>AI는 다양한 분야에 적용됩니다. 각 분야는 처리 대상 데이터(텍스트, 이미지, 음성 등)에 따라 특화된 기술로 구성됩니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>기술</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>자연어 처리 (NLP: Natural Language Processing)</td><td>텍스트 생성, 요약, 번역, 감정 분석 등 언어 관련 작업</td></tr>
<tr>
<td>컴퓨터 비전 (CV: Computer Vision)</td><td>이미지나 영상 분석, 객체 인식, 얼굴 인식 등 시각 작업</td></tr>
<tr>
<td>음성 인식 (ASR: Automatic Speech Recognition)</td><td>사람의 음성을 텍스트로 변환하는 기술</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-3-algorithm">3. 대표적인 알고리즘 (Algorithm)</h2>
<p>알고리즘은 데이터를 처리해 예측하거나 분류하는 계산 절차입니다. 문제 유형에 따라 회귀(Regression), 분류(Classification), 군집화(Clustering), 강화학습(Reinforcement Learning) 등으로 나뉩니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>알고리즘</td><td>유형</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>선형 회귀 (LR: Linear Regression)</td><td>회귀</td><td>연속형 값을 예측하는 기본적인 회귀 알고리즘</td></tr>
<tr>
<td>로지스틱 회귀 (LogR: Logistic Regression)</td><td>분류</td><td>분류 문제에 사용하는 확률 기반 알고리즘</td></tr>
<tr>
<td>의사결정트리 (DT: Decision Tree)</td><td>분류</td><td>조건 분기를 통해 데이터를 분류하는 트리 구조 알고리즘</td></tr>
<tr>
<td>랜덤 포레스트 (RF: Random Forest)</td><td>분류</td><td>여러 결정트리를 조합한 앙상블 학습 기법</td></tr>
<tr>
<td>서포트 벡터 머신 (SVM: Support Vector Machine)</td><td>분류</td><td>분류 경계선을 최적화하는 알고리즘</td></tr>
<tr>
<td>K-최근접 이웃 (KNN: K-Nearest Neighbors)</td><td>분류</td><td>주변 데이터와의 거리 기반으로 분류 또는 예측</td></tr>
<tr>
<td>K-평균 군집화 (KMeans: K-Means Clustering)</td><td>군집화</td><td>비슷한 데이터들을 자동으로 군집화하는 비지도 학습</td></tr>
<tr>
<td>SARSA (SARSA: State-Action-Reward-State-Action)</td><td>강화학습</td><td>현재 상태에서의 행동과 다음 상태의 행동을 함께 학습</td></tr>
<tr>
<td>Q러닝 (Q-Learning)</td><td>강화학습</td><td>보상을 기반으로 최적의 행동 정책을 학습</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-4-neural-network-architecture">4. 신경망 구조 (Neural Network Architecture)</h2>
<p>신경망은 입력 데이터를 여러 계층(layer)을 거쳐 처리하고 출력하는 구조로, 복잡한 패턴을 학습할 수 있는 심층 구조입니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>신경망</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>다층 퍼셉트론 (MLP: Multi-Layer Perceptron)</td><td>기본적인 완전연결 신경망 구조</td></tr>
<tr>
<td>합성곱 신경망 (CNN: Convolutional Neural Network)</td><td>이미지나 영상 분석에 최적화된 구조</td></tr>
<tr>
<td>순환 신경망 (RNN: Recurrent Neural Network)</td><td>시계열 데이터에 적합한 구조</td></tr>
<tr>
<td>장단기 메모리 (LSTM: Long Short-Term Memory)</td><td>RNN의 장기 기억 문제를 해결한 구조</td></tr>
<tr>
<td>게이트 순환 유닛 (GRU: Gated Recurrent Unit)</td><td>LSTM의 경량화 구조로 학습 효율이 높음</td></tr>
<tr>
<td>트랜스포머 (Transformer)</td><td>병렬 처리와 문맥 이해에 강한 구조로 최신 NLP 모델의 기반</td></tr>
<tr>
<td>생성적 적대 신경망 (GAN: Generative Adversarial Network)</td><td>생성자와 판별자가 경쟁하며 데이터를 생성하는 구조</td></tr>
<tr>
<td>변분 오토인코더 (VAE: Variational Autoencoder)</td><td>데이터를 압축하고 다시 복원하는 생성 구조</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-5-ai-ai-models">5. AI 모델 (AI Models)</h2>
<p>모델은 신경망 구조에 데이터를 학습시켜 만들어진 결과물입니다. 실제로 사용하는 AI의 '실체'라고 볼 수 있습니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>모델</td><td>사용 신경망</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>지피티 (GPT: Generative Pre-trained Transformer)</td><td>트랜스포머 (Transformer)</td><td>텍스트 생성에 특화된 언어 모델</td></tr>
<tr>
<td>버트 (BERT: Bidirectional Encoder Representations from Transformers)</td><td>트랜스포머 (Transformer)</td><td>문장 이해와 분류에 뛰어난 언어 모델</td></tr>
<tr>
<td>달리 (DALL·E)</td><td>트랜스포머 + 디퓨전</td><td>텍스트 설명을 기반으로 이미지를 생성하는 모델</td></tr>
<tr>
<td>클립 (CLIP: Contrastive Language–Image Pretraining)</td><td>트랜스포머 + CNN</td><td>텍스트와 이미지를 함께 이해하는 멀티모달 모델</td></tr>
<tr>
<td>위스퍼 (Whisper)</td><td>트랜스포머 (Transformer)</td><td>오픈소스 음성 인식 모델</td></tr>
<tr>
<td>스타일갠 (StyleGAN)</td><td>생성적 적대 신경망 (GAN)</td><td>고품질 이미지 합성 모델</td></tr>
<tr>
<td>라마 (LLaMA: Large Language Model Meta AI)</td><td>트랜스포머 (Transformer)</td><td>Meta의 경량 고성능 언어 모델</td></tr>
<tr>
<td>파인튜닝된 버전들 (Alpaca, Vicuna 등)</td><td>트랜스포머 (Transformer)</td><td>기존 LLM에 특정 목적을 반영한 경량화/응답형 모델</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-6-data">6. 데이터 (Data)</h2>
<p>AI는 데이터를 기반으로 학습합니다. 다양한 형태의 데이터가 있으며, 품질이 좋을수록 더 정교한 예측이 가능합니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>데이터 유형</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>텍스트 (Text)</td><td>문장, 뉴스, 블로그 등 자연어 기반의 정보</td></tr>
<tr>
<td>이미지 (Image)</td><td>사진, 그림, 도면 등 시각 정보</td></tr>
<tr>
<td>음성 (Audio)</td><td>대화, 녹음 등 소리 정보</td></tr>
<tr>
<td>비디오 (Video)</td><td>시간 정보가 결합된 영상 데이터</td></tr>
<tr>
<td>센서 데이터 (Sensor Data)</td><td>IoT, 의료기기 등에서 수집된 수치</td></tr>
<tr>
<td>로그 (Log)</td><td>시스템 동작 기록, 사용자 행동 추적</td></tr>
<tr>
<td>메타데이터 (Metadata)</td><td>데이터의 속성 정보 (예: 촬영 시각, 위치 등)</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-7-training">7. 학습 (Training)</h2>
<p>AI는 학습을 통해 데이터를 기반으로 문제 해결 능력을 획득합니다. 학습 방식은 여러 종류가 있습니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>학습 방법</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>지도학습 (SL: Supervised Learning)</td><td>정답 데이터를 이용해 예측 학습</td></tr>
<tr>
<td>비지도학습 (UL: Unsupervised Learning)</td><td>정답 없이 패턴을 발견</td></tr>
<tr>
<td>자기지도학습 (SSL: Self-Supervised Learning)</td><td>일부 데이터를 숨기고 예측</td></tr>
<tr>
<td>강화학습 (RL: Reinforcement Learning)</td><td>보상을 통해 행동을 학습</td></tr>
<tr>
<td>전이학습 (TL: Transfer Learning)</td><td>기존 모델을 다른 문제에 적용</td></tr>
<tr>
<td>파인튜닝 (FT: Fine-tuning)</td><td>사전학습된 모델을 특정 데이터에 맞게 미세 조정</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-8-inference">8. 추론 (Inference)</h2>
<p>추론은 학습된 모델이 새로운 입력에 대해 예측을 수행하는 과정입니다. 실시간 또는 일괄처리 방식으로 동작합니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>추론 방식</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>배치 추론 (BI: Batch Inference)</td><td>여러 데이터를 한 번에 처리</td></tr>
<tr>
<td>실시간 추론 (RI: Real-time Inference)</td><td>입력 즉시 결과 도출</td></tr>
<tr>
<td>스트리밍 추론 (SI: Streaming Inference)</td><td>연속 입력 데이터 처리</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-9-evaluation">9. 성능 평가 (Evaluation)</h2>
<p>모델의 성능을 수치적으로 측정하여 실제 환경에서 신뢰할 수 있는지를 판단합니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>지표</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>정확도 (ACC: Accuracy)</td><td>전체 중 정답 예측 비율</td></tr>
<tr>
<td>정밀도 (PRE: Precision)</td><td>양성 예측 중 실제 양성 비율</td></tr>
<tr>
<td>재현율 (REC: Recall)</td><td>실제 양성 중 맞춘 비율</td></tr>
<tr>
<td>F1 점수 (F1: F1 Score)</td><td>정밀도와 재현율의 평균</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-10-ethics-and-governance">10. 윤리와 책임 (Ethics and Governance)</h2>
<p>AI는 사회적 책임이 요구됩니다. 공정성과 개인정보 보호, 편향 방지 등 다양한 윤리 이슈를 고려해야 합니다.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>요소</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>편향 (BIAS: Bias)</td><td>특정 그룹에 불리한 결과 유발 가능성</td></tr>
<tr>
<td>설명 가능성 (EXP: Explainability)</td><td>AI의 판단 근거를 사람이 이해할 수 있도록 설명</td></tr>
<tr>
<td>개인정보 보호 (PP: Privacy Protection)</td><td>민감 정보가 유출되지 않도록 보호</td></tr>
<tr>
<td>공정성 (FAIR: Fairness)</td><td>모든 사용자에게 평등하게 작동하도록 설계</td></tr>
</tbody>
</table>
</div><hr />
<p>이로써 인공지능의 전반적인 구성과 원리를 주제별로 구조화해 이해할 수 있게 되었습니다. 이제 관심 있는 주제를 중심으로 더 깊이 탐구해보세요!</p>
]]></content:encoded></item><item><title><![CDATA[[AI] 신경망(Neural Network)과 모델(Model)의 차이와 종류]]></title><description><![CDATA[인공지능(AI, Artificial Intelligence)을 공부하거나 실무에 적용하면서 자주 접하게 되는 두 용어가 있습니다. 바로 "신경망(Neural Network)"과 "모델(Model)"입니다. 이 두 개념은 혼용되는 경우가 많지만, 엄연히 서로 다른 개념입니다. 이 글에서는 그 차이를 명확히 구분하고, 각 개념에 포함되는 대표적인 예시들을 함께 정리해봅니다.

신경망(Neural Network)이란?
신경망은 인간의 뇌 구조를 모방...]]></description><link>https://100lab.org/ai-neural-network-model</link><guid isPermaLink="true">https://100lab.org/ai-neural-network-model</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Thu, 08 May 2025 07:30:39 GMT</pubDate><content:encoded><![CDATA[<p>인공지능(AI, Artificial Intelligence)을 공부하거나 실무에 적용하면서 자주 접하게 되는 두 용어가 있습니다. 바로 "신경망(Neural Network)"과 "모델(Model)"입니다. 이 두 개념은 혼용되는 경우가 많지만, 엄연히 서로 다른 개념입니다. 이 글에서는 그 차이를 명확히 구분하고, 각 개념에 포함되는 대표적인 예시들을 함께 정리해봅니다.</p>
<hr />
<h2 id="heading-neural-network">신경망(Neural Network)이란?</h2>
<p><strong>신경망은 인간의 뇌 구조를 모방한 계산 구조</strong>로, 데이터를 입력받아 처리하는 알고리즘 설계도입니다. 이 구조는 아직 학습되지 않은 상태이며, 입력과 출력의 연결 방식, 계층 구조 등을 정의합니다.</p>
<h3 id="heading-7iug6rk966ed7j2yioygleydma">신경망의 정의</h3>
<blockquote>
<p>신경망은 입력 데이터를 전달받아 내부 연산을 통해 출력을 도출하는 "연산 구조(architecture)"입니다. 학습이 적용되기 전의 추상적 구조라고 볼 수 있습니다.</p>
</blockquote>
<h3 id="heading-7ko87jquioylooqyveunnsdsooxrpzg">주요 신경망 종류</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>한글명</td><td>영어 표현</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>다층 퍼셉트론</td><td>MLP (Multi-Layer Perceptron)</td><td>가장 기본적인 완전 연결 피드포워드 신경망</td></tr>
<tr>
<td>합성곱 신경망</td><td>CNN (Convolutional Neural Network)</td><td>이미지 처리에 최적화된 구조. 공간적 특징 추출에 강함</td></tr>
<tr>
<td>순환 신경망</td><td>RNN (Recurrent Neural Network)</td><td>시계열이나 문장처럼 순차적 데이터를 처리</td></tr>
<tr>
<td>장단기 메모리 네트워크</td><td>LSTM (Long Short-Term Memory)</td><td>RNN의 장기 의존성 문제를 해결한 구조</td></tr>
<tr>
<td>게이트 순환 유닛</td><td>GRU (Gated Recurrent Unit)</td><td>LSTM보다 간단하고 계산 효율이 높은 구조</td></tr>
<tr>
<td>트랜스포머</td><td>Transformer</td><td>병렬 연산이 가능하며, 문맥을 전역적으로 처리</td></tr>
<tr>
<td>생성적 적대 신경망</td><td>GAN (Generative Adversarial Network)</td><td>생성자와 판별자가 경쟁하며 이미지를 생성</td></tr>
<tr>
<td>변분 오토인코더</td><td>VAE (Variational Autoencoder)</td><td>확률 기반의 잠재 공간을 통해 데이터를 생성</td></tr>
<tr>
<td>그래프 신경망</td><td>GNN (Graph Neural Network)</td><td>노드와 엣지로 구성된 그래프 구조 데이터를 처리</td></tr>
<tr>
<td>스파이킹 신경망</td><td>SNN (Spiking Neural Network)</td><td>생물학적 뉴런 발화 모사를 통한 신호 기반 계산</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-model">모델(Model)이란?</h2>
<p><strong>모델은 특정 신경망 구조에 데이터를 학습시켜 생성된 실체</strong>입니다. 학습이 완료된 모델은 신경망 구조 + 학습된 가중치(weight) + 하이퍼파라미터 + 입출력 정의 등을 포함합니다.</p>
<h3 id="heading-66qo64247j2yioygleydma">모델의 정의</h3>
<blockquote>
<p>모델은 데이터를 기반으로 학습된 신경망의 구현체이며, 실제로 예측이나 생성에 사용되는 "완성된 인공지능 엔진"입니다.</p>
</blockquote>
<h3 id="heading-ai">주요 AI 모델 목록 (기반 신경망 포함)</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>한글명</td><td>영어 표현</td><td>기반 신경망</td><td>설명</td></tr>
</thead>
<tbody>
<tr>
<td>BERT</td><td>BERT (Bidirectional Encoder Representations from Transformers)</td><td>Transformer</td><td>문장 내 단어의 양방향 문맥을 이해. 질의 응답, 분류 등에 사용</td></tr>
<tr>
<td>GPT</td><td>GPT (Generative Pre-trained Transformer)</td><td>Transformer (Decoder)</td><td>문장 생성에 특화된 모델. 대화형 AI의 핵심</td></tr>
<tr>
<td>DALL·E</td><td>DALL·E (by OpenAI)</td><td>Transformer + Diffusion</td><td>텍스트로부터 이미지를 생성</td></tr>
<tr>
<td>Stable Diffusion</td><td>Stable Diffusion</td><td>U-Net + Latent Diffusion</td><td>오픈소스 기반 고해상도 이미지 생성 모델</td></tr>
<tr>
<td>CLIP</td><td>CLIP (Contrastive Language–Image Pretraining)</td><td>Transformer (이중 구조)</td><td>텍스트와 이미지 임베딩을 동일 공간으로 학습</td></tr>
<tr>
<td>StyleGAN</td><td>StyleGAN (Style-based GAN)</td><td>GAN</td><td>얼굴, 예술 이미지 생성에 강력한 GAN 계열 모델</td></tr>
<tr>
<td>VQ-VAE</td><td>VQ-VAE (Vector Quantized Variational Autoencoder)</td><td>VAE + Vector Quantization</td><td>이산 벡터 공간 기반 생성 모델</td></tr>
<tr>
<td>Whisper</td><td>Whisper (by OpenAI)</td><td>CNN + Transformer</td><td>자동 음성 인식(ASR) 모델. 다양한 언어 지원</td></tr>
<tr>
<td>LaMDA</td><td>LaMDA (Language Model for Dialogue Applications)</td><td>Transformer</td><td>대화 특화 언어 모델 (Google 개발)</td></tr>
<tr>
<td>PaLM</td><td>PaLM (Pathways Language Model)</td><td>Transformer</td><td>다중 작업을 하나의 모델로 수행. 논리, 수학, 번역 등</td></tr>
<tr>
<td>LLaMA</td><td>LLaMA (Large Language Model Meta AI)</td><td>Transformer</td><td>Meta 개발, 경량 고성능 오픈모델</td></tr>
<tr>
<td>Gemini</td><td>Gemini (by Google DeepMind)</td><td>Multimodal Transformer</td><td>텍스트, 이미지, 오디오 등 멀티모달 AI</td></tr>
<tr>
<td>BLOOM</td><td>BLOOM (BigScience Multilingual Open Model)</td><td>Transformer</td><td>다국어 지원 LLM, 연구 및 상업에 오픈 사용 가능</td></tr>
</tbody>
</table>
</div><hr />
<h2 id="heading-6rkw66ggoidsi6dqsr3rp53qs7wg66qo64247j2aioustoyxhydtcdri6trpbjqsia">결론: 신경망과 모델은 무엇이 다른가?</h2>
<ul>
<li><p><strong>신경망(Neural Network)</strong>: 알고리즘의 "설계도" — 학습 전 구조</p>
</li>
<li><p><strong>모델(Model)</strong>: 학습이 완료된 "구현체" — 실제로 사용 가능한 AI 시스템</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[[AI] Rnn 의 한계: 그래디언트 소실 문제란?]]></title><description><![CDATA[RNN의 한계: 그래디언트 소실 문제란?
RNN(Recurrent Neural Network) 순환신경망은 자연어 처리나 시계열 데이터와 같이 순서가 중요한 입력을 다루는 데 효과적인 모델입니다. 그러나 긴 시퀀스를 학습할 때 성능이 급격히 떨어지는 문제가 있는데, 그 중심에는 그래디언트 소실(Vanishing Gradient) 현상이 있습니다.

그래디언트 소실(Vanishing Gradient)이란?
신경망은 출력값과 정답의 차이(오차)를 ...]]></description><link>https://100lab.org/ai-rnn</link><guid isPermaLink="true">https://100lab.org/ai-rnn</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Wed, 07 May 2025 10:47:43 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-rnn"><strong>RNN의 한계: 그래디언트 소실 문제란?</strong></h1>
<p>RNN(Recurrent Neural Network) 순환신경망은 자연어 처리나 시계열 데이터와 같이 <strong>순서가 중요한 입력</strong>을 다루는 데 효과적인 모델입니다. 그러나 <strong>긴 시퀀스를 학습할 때 성능이 급격히 떨어지는 문제</strong>가 있는데, 그 중심에는 <strong>그래디언트 소실(Vanishing Gradient)</strong> 현상이 있습니다.</p>
<hr />
<h2 id="heading-vanishing-gradient"><strong>그래디언트 소실(Vanishing Gradient)이란?</strong></h2>
<p>신경망은 출력값과 정답의 차이(오차)를 계산하고, 그 오차를 <strong>역전파(backpropagation)</strong> 를 통해 각 층에 전달하여 <strong>가중치를 조정</strong>합니다. 이때 오차가 <strong>기울기(gradient)</strong> 형태로 전달되는데, RNN에서는 시퀀스가 길어질수록 다음과 같은 문제가 생깁니다:</p>
<ul>
<li><p><strong>기울기의 연속적인 곱셈</strong> → 값이 점점 작아져서 거의 0에 수렴</p>
</li>
<li><p><strong>이전 시점에 대한 학습이 거의 이루어지지 않음</strong></p>
</li>
</ul>
<p>즉, 앞부분의 단어에 대한 정보는 <strong>뒤쪽에 도달하지 못하고 소멸</strong>됩니다. 이것이 바로 <strong>그래디언트 소실</strong>입니다.</p>
<hr />
<h2 id="heading-kirsmijsi5zrozwg7ik07y6067o06riwkio"><strong>예시로 살펴보기</strong></h2>
<p>예를 들어 다음과 같은 문장이 있다고 합시다.</p>
<blockquote>
<p>“나는 오늘 아침에 학교에 <em>갔다</em>.”</p>
</blockquote>
<p>이 문장에서 동사 <em>“갔다”</em> 는 주어 <em>“나는”</em> 과 연결되어야 합니다. 하지만 둘 사이 거리가 멀어질수록, RNN은 <strong>“나는”이라는 단어의 의미를 기억하지 못하게 됩니다.</strong></p>
<p>결국, 문맥이 무너지고 <strong>잘못된 예측이나 번역</strong>이 발생하게 됩니다.</p>
<hr />
<h2 id="heading-kirsmzwg7ksr7jqu7zwc6rcapyoq"><strong>왜 중요한가?</strong></h2>
<p>그래디언트 소실 문제는 단순한 수치상의 이슈를 넘어서, <strong>문장 이해나 시간 흐름을 반영한 예측을 불가능하게 만드는 핵심적 장애 요소</strong>입니다.</p>
<p>이로 인해 RNN은 다음과 같은 한계에 부딪히게 됩니다:</p>
<ul>
<li><p>문장이 길어질수록 성능 저하</p>
</li>
<li><p>앞 단어의 의미가 뒤에 반영되지 않음</p>
</li>
<li><p>의미 단위의 연결 실패</p>
</li>
</ul>
<hr />
<h2 id="heading-kirslrtrlrvqsowg7zw06rkw7zwgioyimcdsnojsnytquywkio"><strong>어떻게 해결할 수 있을까?</strong></h2>
<p>이 문제를 해결하기 위해 등장한 대표적인 모델들이 있습니다:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>모델</strong></td><td><strong>특징</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>LSTM (Long Short-Term Memory)</strong></td><td>중요 정보를 오래 기억할 수 있도록 설계된 구조. 게이트(gate) 메커니즘을 사용해 기울기 소실 완화</td></tr>
<tr>
<td><strong>GRU (Gated Recurrent Unit)</strong></td><td>LSTM보다 구조가 간단하지만, 유사한 성능을 제공</td></tr>
</tbody>
</table>
</div><p>그리고 현재 가장 널리 쓰이는 구조는 다음과 같습니다:</p>
<blockquote>
<p><strong>트랜스포머(Transformer)</strong></p>
</blockquote>
<ul>
<li><blockquote>
<p>Self-Attention 구조를 통해 <strong>장기 의존성 학습</strong>과 <strong>병렬 처리</strong> 모두 가능</p>
</blockquote>
</li>
</ul>
<hr />
<h2 id="heading-kirsojxrpqwqkg"><strong>정리</strong></h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>항목</strong></td><td><strong>설명</strong></td></tr>
</thead>
<tbody>
<tr>
<td>문제명</td><td>그래디언트 소실 (Vanishing Gradient)</td></tr>
<tr>
<td>원인</td><td>시퀀스가 길어질수록 기울기 값이 0에 가까워짐</td></tr>
<tr>
<td>결과</td><td>앞쪽 입력 정보가 학습되지 않고 무시됨</td></tr>
<tr>
<td>해결</td><td>LSTM, GRU, Transformer 등 구조적 개선</td></tr>
</tbody>
</table>
</div>]]></content:encoded></item><item><title><![CDATA[AI 트랜스포머(Transformer)라는 이름의 의미는?]]></title><description><![CDATA[트랜스포머(Transformer)라는 이름의 의미는?
2017년 구글 브레인 팀의 논문 “Attention is All You Need” 에서 처음 등장한 트랜스포머(Transformer)는 그 이름처럼 입력을 변환(transform) 하는 데 초점을 맞춘 구조입니다. 기존의 RNN 계열 모델과 달리, Self-Attention 메커니즘만으로 시퀀스를 처리하는 새로운 접근이었습니다.
왜 Transformer라고 불릴까?

입력 시퀀스의 표현을 ...]]></description><link>https://100lab.org/ai-transformer</link><guid isPermaLink="true">https://100lab.org/ai-transformer</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Wed, 07 May 2025 10:36:54 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-transformer"><strong>트랜스포머(Transformer)라는 이름의 의미는?</strong></h1>
<p>2017년 구글 브레인 팀의 논문 <strong>“Attention is All You Need”</strong> 에서 처음 등장한 트랜스포머(Transformer)는 그 이름처럼 <strong>입력을 변환(transform)</strong> 하는 데 초점을 맞춘 구조입니다. 기존의 RNN 계열 모델과 달리, <strong>Self-Attention 메커니즘만으로 시퀀스를 처리</strong>하는 새로운 접근이었습니다.</p>
<h2 id="heading-transformer-1"><strong>왜 Transformer라고 불릴까?</strong></h2>
<ol>
<li><p><strong>입력 시퀀스의 표현을 변환하기 때문</strong></p>
<ul>
<li><p>예: 영어 문장을 프랑스어로 번역</p>
</li>
<li><p>입력을 더 유의미한 표현으로 바꿔서 출력 생성 → <strong>변환(transform)</strong> 중심 사고</p>
</li>
</ul>
</li>
</ol>
<ol start="2">
<li><p><strong>기존 모델을 완전히 변환한 아키텍처</strong></p>
<ul>
<li><p>RNN, LSTM, GRU 등과는 다른 <strong>새로운 구조로의 전환</strong></p>
</li>
<li><p>모델 자체의 <strong>패러다임을 바꾼다는 의미에서도 ‘변환자’</strong></p>
</li>
</ul>
</li>
</ol>
<ol start="3">
<li><p><strong>논문 자체에서 명시한 모델 이름</strong></p>
<ul>
<li>“We call our model the Transformer.” (논문 중)</li>
</ul>
</li>
</ol>
<hr />
<h1 id="heading-rnnlstm-vs"><strong>RNN/LSTM vs 트랜스포머 구조 비교</strong></h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>항목</strong></td><td><strong>RNN / LSTM</strong></td><td><strong>트랜스포머</strong></td></tr>
</thead>
<tbody>
<tr>
<td>처리 방식</td><td>순차 처리</td><td>병렬 처리 가능</td></tr>
<tr>
<td>기억 처리</td><td>그래디언트 소실로 기억 한계</td><td>장기 의존성 학습 가능</td></tr>
<tr>
<td>정보 흐름</td><td>단방향 처리</td><td>양방향 또는 자유로운 Attention 흐름</td></tr>
</tbody>
</table>
</div><p>트랜스포머는 입력 문장 전체를 한꺼번에 바라보며, 중요한 위치에 <strong>Self-Attention을 적용</strong>합니다. 그 덕분에 병렬 처리가 가능하고, 장기 의존성 문제도 자연스럽게 해결할 수 있습니다.</p>
<hr />
<h1 id="heading-kirrp4jrrltrpqwqkg"><strong>마무리</strong></h1>
<p>트랜스포머는 단순한 구조 변경이 아니라 <strong>시퀀스 처리 방식의 패러다임 전환</strong>을 의미합니다. 이름 하나에도 그 철학이 담겨 있는 셈이죠. 오늘날 GPT, BERT, T5 등 다양한 모델들이 트랜스포머를 기반으로 만들어진 것도 이 구조의 강력함을 증명합니다.</p>
]]></content:encoded></item><item><title><![CDATA[Cloudflare에서 내 도메인으로 이메일 포워딩 설정하기]]></title><description><![CDATA[Cloudflare에서 내 도메인으로 이메일 포워딩 설정하기
Cloudflare는 별도의 메일 서버 없이도 도메인 기반 이메일 주소를 설정하고 Gmail 등으로 포워딩할 수 있는 Email Routing 기능을 제공합니다. 이 글에서는 hello@yourdomain.com 형태의 메일 주소를 만들어 Gmail로 수신하는 방법을 단계별로 설명합니다.
1. 사전 준비

Cloudflare에 연결된 도메인

수신할 이메일 주소 (예: Gmail)

...]]></description><link>https://100lab.org/cloudflare</link><guid isPermaLink="true">https://100lab.org/cloudflare</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Wed, 30 Apr 2025 11:02:56 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-cloudflare">Cloudflare에서 내 도메인으로 이메일 포워딩 설정하기</h1>
<p>Cloudflare는 별도의 메일 서버 없이도 도메인 기반 이메일 주소를 설정하고 Gmail 등으로 포워딩할 수 있는 <strong>Email Routing</strong> 기능을 제공합니다. 이 글에서는 <code>hello@yourdomain.com</code> 형태의 메일 주소를 만들어 Gmail로 수신하는 방법을 단계별로 설명합니다.</p>
<h2 id="heading-1">1. 사전 준비</h2>
<ul>
<li><p>Cloudflare에 연결된 도메인</p>
</li>
<li><p>수신할 이메일 주소 (예: Gmail)</p>
</li>
</ul>
<h2 id="heading-2-email-routing">2. Email Routing 기능 활성화</h2>
<ol>
<li><p><a target="_blank" href="https://dash.cloudflare.com/">Cloudflare 대시보드</a> 접속</p>
</li>
<li><p>도메인 선택</p>
</li>
<li><p>왼쪽 메뉴에서 <strong>Email</strong> 클릭</p>
</li>
<li><p><strong>Email Routing</strong> 탭에서 <strong>Set up Email Routing</strong> 클릭</p>
</li>
</ol>
<h2 id="heading-3">3. 수신 이메일 주소 등록</h2>
<ol>
<li><p><strong>Destination address</strong> 입력란에 Gmail 주소 입력</p>
</li>
<li><p>해당 주소로 인증 메일 전송됨</p>
</li>
<li><p>수신 메일에서 <strong>Verify</strong> 클릭하여 인증 완료</p>
</li>
</ol>
<h2 id="heading-4">4. 도메인 이메일 주소 생성</h2>
<ol>
<li><p><strong>Custom address</strong> 항목에 원하는 도메인 기반 이메일 입력<br /> 예: <code>contact@yourdomain.com</code></p>
</li>
<li><p>포워딩할 Gmail 주소 선택</p>
</li>
<li><p><strong>Create address</strong> 클릭</p>
</li>
</ol>
<h2 id="heading-5-dns">5. DNS 레코드 확인</h2>
<p>Cloudflare는 자동으로 아래 레코드를 생성합니다:</p>
<ul>
<li><p><strong>MX 레코드</strong>: Cloudflare의 메일 서버로 설정</p>
</li>
<li><p><strong>TXT 레코드</strong>: SPF, DKIM, 도메인 검증 용도</p>
</li>
</ul>
<p>설정이 누락되었거나 기존 메일 설정과 충돌이 있다면 <strong>DNS &gt; 레코드 탭</strong>에서 수동으로 조정해야 합니다.</p>
<h2 id="heading-6">6. 테스트</h2>
<ol>
<li><p>외부 메일(예: Naver, 회사 메일)에서 <code>contact@yourdomain.com</code>으로 메일 전송</p>
</li>
<li><p>Gmail에서 메일 수신 확인</p>
</li>
</ol>
<h2 id="heading-7lc46rogioycro2vrq">참고 사항</h2>
<ul>
<li><p>Email Routing은 <strong>수신 및 포워딩 전용 기능</strong>입니다.</p>
</li>
<li><p>도메인 주소로 메일을 <strong>발송하려면</strong> Gmail의 SMTP를 별도로 설정해야 합니다.<br />  설정 방법은 <a target="_blank" href="https://support.google.com/mail/answer/22370?hl=ko">공식 가이드</a>를 참고하세요.</p>
</li>
<li><p>Gmail의 SMTP 인증 후 <code>contact@yourdomain.com</code> 주소로도 직접 답장이 가능합니다.</p>
</li>
</ul>
<h2 id="heading-7jqu7jw9">요약</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>항목</td><td>내용</td></tr>
</thead>
<tbody>
<tr>
<td>서비스명</td><td>Cloudflare Email Routing</td></tr>
<tr>
<td>주요 기능</td><td>도메인 기반 이메일 주소 수신 및 포워딩</td></tr>
<tr>
<td>SMTP 발신</td><td>지원하지 않음 (Gmail SMTP 별도 설정 필요)</td></tr>
<tr>
<td>요금</td><td>무료</td></tr>
</tbody>
</table>
</div><p>Cloudflare Email Routing 기능은 개인 블로그, 포트폴리오, 스타트업 초기 서비스 등에서 도메인 이메일을 간편하게 설정할 수 있는 실용적인 방법입니다.</p>
]]></content:encoded></item><item><title><![CDATA[Hashnode API]]></title><description><![CDATA[이 GraphQL 쿼리는 Hashnode API를 통해 블로그 게시글 정보를 가져오는 예제입니다. 두 개의 쿼리가 있으며, 각각의 목적은 다음과 같습니다:
⸻
🔍 쿼리 설명

Publication 쿼리

query Publication {
  publication(host: "100lab.hashnode.dev") {
    posts(first: 20) {
      edges {
        node {
          id
     ...]]></description><link>https://100lab.org/hashnode-api</link><guid isPermaLink="true">https://100lab.org/hashnode-api</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 29 Apr 2025 06:02:05 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-graphql-hashnode-api">이 GraphQL 쿼리는 Hashnode API를 통해 블로그 게시글 정보를 가져오는 예제입니다. 두 개의 쿼리가 있으며, 각각의 목적은 다음과 같습니다:</h2>
<p>⸻</p>
<h1 id="heading-8jujsdsv7zrpqwg7isk66qf">🔍 쿼리 설명</h1>
<ol>
<li>Publication 쿼리</li>
</ol>
<pre><code>query Publication {
  publication(host: <span class="hljs-string">"100lab.hashnode.dev"</span>) {
    posts(first: <span class="hljs-number">20</span>) {
      edges {
        node {
          id
          title
          brief
          url
          coverImage {
            url
          }
        }
      }
    }
  }
}
</code></pre><ul>
<li>목적: 특정 호스트(100lab.hashnode.dev)의 최신 게시글 20개를 조회합니다.</li>
<li>출력: 각 게시글의 id, title, brief, url, coverImage.url 정보를 제공합니다.</li>
<li><p>사용 예시: 블로그 목록 페이지를 만들 때 유용합니다.</p>
</li>
<li><p>GetPost 쿼리</p>
<pre><code>query GetPost {
post(id: <span class="hljs-string">"68105f5f7017d96ea7cdb1e5"</span>) {
 title
 content {
   markdown
   text
 }
 brief
 slug
 url
 coverImage {
   url
 }
 author {
   name
   username
 }
}
}
</code></pre><p> •    목적: 특정 게시글 ID에 해당하는 상세 정보를 가져옵니다.
 •    출력:
 •    title, brief, slug, url
 •    content.text: 게시글 본문 내용 (Plain Text 형식)
 •    coverImage.url: 커버 이미지
 •    author.name, author.username: 작성자 정보
 •    사용 예시: 게시글 상세 페이지를 렌더링할 때 사용합니다.</p>
</li>
</ul>
<p>⸻</p>
<p>💡 참고 사항
    •    이 API는 Hashnode GraphQL API에 요청을 보내야 작동합니다.
    •    인증이 필요한 경우, x-api-key 또는 Authorization 헤더가 필요할 수 있습니다.
    •    post(id: "...")에서 사용하는 id는 Publication 쿼리의 node.id에서 얻을 수 있습니다.</p>
<p>⸻</p>
<p>이 쿼리를 활용해서 어떤 기능을 구현하고자 하시나요?</p>
]]></content:encoded></item><item><title><![CDATA[금융지주회사법 개정, 핀테크 기업에게 어떤 기회가 열릴까?]]></title><description><![CDATA[금융지주회사법 개정, 핀테크 기업에게 어떤 기회가 열릴까?
2025년 4월, 금융위원회는 금융지주회사법 및 시행령 개정안을 입법예고했습니다.이번 개정안은 금융지주회사가 핀테크 기업에 보다 자유롭게 투자할 수 있도록 규제를 완화하는 내용을 담고 있는데요.핀테크 기업에게 어떤 의미가 있을지 함께 살펴보겠습니다.
금융지주회사의 핀테크 기업 투자, 무엇이 달라지나?
기존에는 금융지주회사가 비금융회사(핀테크 기업 포함)에 직접 출자할 수 있는 범위가 매...]]></description><link>https://100lab.org/6rii7jy17kea7ko87zqm7iks67kvioqwnoyglswg7zwa7ywm7ygsioq4soyxheyxkoqyjcdslrtrlqqg6riw7zqm6rcaioyxtoumtoq5jd8</link><guid isPermaLink="true">https://100lab.org/6rii7jy17kea7ko87zqm7iks67kvioqwnoyglswg7zwa7ywm7ygsioq4soyxheyxkoqyjcdslrtrlqqg6riw7zqm6rcaioyxtoumtoq5jd8</guid><dc:creator><![CDATA[100lab]]></dc:creator><pubDate>Tue, 29 Apr 2025 05:10:55 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-6rii7jy17kea7ko87zqm7iks67kvioqwnoyglswg7zwa7ywm7ygsioq4soyxheyxkoqyjcdslrtrlqqg6riw7zqm6rcaioyxtoumtoq5jd8">금융지주회사법 개정, 핀테크 기업에게 어떤 기회가 열릴까?</h1>
<p>2025년 4월, 금융위원회는 금융지주회사법 및 시행령 개정안을 입법예고했습니다.<br />이번 개정안은 금융지주회사가 핀테크 기업에 보다 자유롭게 투자할 수 있도록 규제를 완화하는 내용을 담고 있는데요.<br />핀테크 기업에게 어떤 의미가 있을지 함께 살펴보겠습니다.</p>
<h2 id="heading-6rii7jy17kea7ko87zqm7iks7j2yio2vgo2fjo2brcdquldsl4ug7yis7j6qlcdrrltsl4fsnbqg64us65287kea64kypw">금융지주회사의 핀테크 기업 투자, 무엇이 달라지나?</h2>
<p>기존에는 금융지주회사가 비금융회사(핀테크 기업 포함)에 직접 출자할 수 있는 범위가 매우 제한적이었습니다.<br />이에 따라 복잡한 투자 구조를 짜야 했고, 파트너십을 맺는 데에도 많은 제약이 따랐습니다.</p>
<p>하지만 이번 개정안으로, 금융지주회사는 핀테크 기업의 지분을 <strong>최대 15%까지 출자할 수 있게</strong> 됩니다.<br />이는 보다 간편하게, 그리고 전략적으로 핀테크 기업에 투자할 수 있는 길을 열어주는 변화입니다.</p>
<h2 id="heading-3">핀테크 기업에 미치는 3가지 주요 영향</h2>
<h3 id="heading-1">1. 투자 구조가 간단해집니다</h3>
<p>그동안은 금융지주회사가 핀테크 기업에 투자하기 위해<br />여러 계열사를 통해 우회하거나 복잡한 구조를 설계해야 했습니다.</p>
<p>이제는 금융지주회사가 직접 15%까지 투자할 수 있어,<br /><strong>투자 구조가 훨씬 단순해지고 효율화</strong>됩니다.</p>
<h3 id="heading-2">2. 전략적 파트너십이 강화됩니다</h3>
<p>금융지주회사는 단순 재무적 투자(FI) 이상의 관계를 맺을 수 있습니다.<br />핀테크 기업과 함께 <strong>공동 상품을 개발</strong>하거나, <strong>디지털 혁신 프로젝트</strong>를 추진하는 등<br /><strong>전략적 파트너십을 맺는 기회</strong>가 확대됩니다.</p>
<p>이는 핀테크 기업에게도 안정적인 파트너를 확보하고,<br />시장 내 입지를 빠르게 강화할 수 있는 기회를 의미합니다.</p>
<h3 id="heading-3-1">3. 경영 독립성을 지키면서도 지원을 받을 수 있습니다</h3>
<p>15% 이내의 소수 지분 투자이기 때문에,<br />핀테크 기업은 <strong>경영권을 유지</strong>하면서도 필요한 자금과 금융지주의 인프라를 활용할 수 있습니다.</p>
<p>즉, <strong>독립성과 성장 지원을 동시에</strong> 확보할 수 있는 좋은 환경이 마련됩니다.</p>
<h2 id="heading-7jwe7jy866gc7j2yioq4soumga">앞으로의 기대</h2>
<p>이번 금융지주회사법 개정은 핀테크 산업 전반에 긍정적인 파급효과를 가져올 것으로 보입니다.<br />핀테크 기업들은 자금 조달이 용이해지고,<br />금융지주회사는 혁신 기술을 빠르게 흡수하며 시장 대응력을 높일 수 있습니다.</p>
<p><strong>디지털 금융 생태계의 확장</strong>, <strong>맞춤형 금융 서비스의 대중화</strong>, <strong>대안 신용평가 모델 발전</strong> 등<br />여러 분야에서 눈에 띄는 변화가 기대됩니다.</p>
<p>앞으로 금융권과 핀테크 업계의 협력이 어떤 시너지를 낼지 주목해볼 만합니다.</p>
<p><a target="_blank" href="https://kcg.korea.kr/multi/visualNewsView.do?newsId=148941965">https://kcg.korea.kr/multi/visualNewsView.do?newsId=148941965</a></p>
]]></content:encoded></item></channel></rss>