<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>man.hwangsehyun.com</title>
    <link>https://man.hwangsehyun.com/kp/</link>
    <description>Recent content on man.hwangsehyun.com</description>
    <image>
      <title>man.hwangsehyun.com</title>
      <url>https://man.hwangsehyun.com/images/papermod-cover.png</url>
      <link>https://man.hwangsehyun.com/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.145.0</generator>
    <language>kp</language>
    <lastBuildDate>Fri, 08 Nov 2024 00:00:00 +0900</lastBuildDate>
    <atom:link href="https://man.hwangsehyun.com/kp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>발자취</title>
      <link>https://man.hwangsehyun.com/kp/career/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/career/</guid>
      <description>&lt;h1 id=&#34;career&#34;&gt;Career&lt;/h1&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;소속&lt;/th&gt;
          &lt;th&gt;재직 기간&lt;/th&gt;
          &lt;th&gt;부서&lt;/th&gt;
          &lt;th&gt;담당 업무&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;연세대학교 기계공학과&lt;/td&gt;
          &lt;td&gt;2019/03 ~ 2021/02&lt;/td&gt;
          &lt;td&gt;&lt;a
  href=&#34;https://kbd.yonsei.ac.kr/&#34;
  &gt;지식 기반 설계 연구실&lt;/a
&gt;
&lt;/td&gt;
          &lt;td&gt;AI serving full-stack 개발&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a
  href=&#34;https://www.nextlab.ai/&#34;
  &gt;넥스트랩&lt;/a
&gt;
&lt;/td&gt;
          &lt;td&gt;2021/01 ~ 2024/02&lt;/td&gt;
          &lt;td&gt;지능형 자동화 사업부&lt;/td&gt;
          &lt;td&gt;백엔드 및 배포 리드&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a
  href=&#34;https://works.crowdworks.kr/&#34;
  &gt;크라우드웍스&lt;/a
&gt;
&lt;/td&gt;
          &lt;td&gt;2024/03 ~ 2024/11&lt;/td&gt;
          &lt;td&gt;AI 개발실&lt;/td&gt;
          &lt;td&gt;백엔드 및 인프라 / R&amp;amp;D&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;crowdworks&#34;&gt;[2024] 크라우드웍스&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;AI 개발실&lt;/em&gt;, 9개월 근무&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/project/llm-nutrition-coach/&#34;
  &gt;대표 프로젝트: LLM을 이용한 영양 상담 서비스&lt;/a
&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;크라우드웍스의 AI 개발실&lt;/em&gt;은 고객사의 사내 문서부터 서비스 데이터베이스까지 정형/비정형 데이터에 LLM을 접목하는 사업을 위한 개발을 진행합니다. 더 큰 기업과 협업하기 위해 필요한 기초적인 보안과 인프라 관련 업무를 통해서 다양한 프로젝트에 참여했으며, HTML로 변환된 사내 문서를 LLM에 적합한 형태로 정형화 및 검수하는 실험적인 내부용 프론트엔드 개발을 진행했습니다. 대표 프로젝트에서는 메인 Python 개발자로서 백엔드 개발에 참여하면서 AWS에 서비스를 배포하기 위해 IaaS 툴을 취급했습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>&lt;/&gt; 황세현 리용자 설명서 (1)</title>
      <link>https://man.hwangsehyun.com/kp/man/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/man/</guid>
      <description>&lt;h2 id=&#34;name&#34;&gt;🪪 NAME&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;황세현, &lt;em&gt;Sehyun Hwang&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/kp/&#34;
  &gt;hwanghyun3@gmail.com&lt;/a
&gt;
&lt;/li&gt;
&lt;li&gt;Lives in Seoul&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;synopsis&#34;&gt;🙋 SYNOPSIS&lt;/h2&gt;
&lt;p&gt;개발팀이 조화롭게 일할 수 있도록 노력하는 백엔드 개발자 황세현입니다. 저는 대학원에서 웹 개발을 파고든 후로 현재 현업에서는 4년 차에 접어들었습니다. 제가 넥스트랩에서 일했던 지능형 자동화 팀은, 제가 입사하기 직전 신규로 꾸려져 현재는 차량, 보행자 영상 데이터를 다루는 서비스를 다양한 고객사에 납품할 수 있을 정도로 성장했습니다. 알고리즘 POC부터 서비스 운영까지 직접 발로 뛰었던 시기도 있었지만, 현재는 서비스 설계, 개발 방향 제안, 인프라 방면에서 역할을 다하고 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>수행 프로젝트</title>
      <link>https://man.hwangsehyun.com/kp/all/project/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/all/project/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;대학원 재학 시절과 재직했던 회사들에서 수행했던 프로젝트 목록입니다.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTIxNDI3Nzk0MywtMTE2MzY4NDg1MiwtMj
A0OTUyNzk4OSwtMjI4MzUzNjQ2LDE5NjM3NjA5MjcsMjE0NDg2
NTc2NSw1Njk5MTkyMDQsMTUzMDI1NTQ0OSw5NDA2Nzc1NDEsLT
E1NDU2OTAwNjQsLTEzMDMxMTc3ODcsLTIzNzgyOTYxNywtNDcz
OTk5NDQwLDY2OTQ2NzU1NCwxMzYxNzY0MzE5XX0=
--&gt;</description>
    </item>
    <item>
      <title>LLM을 이용한 영양 상담 서비스</title>
      <link>https://man.hwangsehyun.com/kp/project/llm-nutrition-coach/</link>
      <pubDate>Fri, 08 Nov 2024 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/llm-nutrition-coach/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;크라우드웍스에서 &lt;a
  href=&#34;https://man.hwangsehyun.com/project/llm-docs-search/&#34;
  &gt;초기 6개월 동안 프로젝트&lt;/a
&gt;
를 수행하면서 개발자와 비개발자들이 프롬프트 엔지니어링과 서비스 개발에 걸쳐 가지고 있던 요구 사항을 종합하고 AWS 생태계 내에서 지속 가능한 해결책을 도출하려고 노력했습니다.&lt;/li&gt;
&lt;li&gt;3단계로 나누어진 프로젝트에서 첫 번째 단계로 Queue consumer service와 프롬프트 운영 프로세스를 Python으로 개발했습니다.&lt;/li&gt;
&lt;li&gt;3단계 전체에서 CloudFormation을 기반으로 하는 &lt;a
  href=&#34;https://docs.aws.amazon.com/cdk/v2/guide/home.html&#34;
  &gt;AWS CDK&lt;/a
&gt;
와 &lt;a
  href=&#34;https://aws.github.io/copilot-cli/&#34;
  &gt;Copilot CLI&lt;/a
&gt;
를 조합한 ECS 서비스 2개를 중심으로 다양한 AWS 리소스를 생성했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;iframe-wrapper&#34;&gt;
&lt;p&gt;
  

  
    
    
      &lt;img
        src=&#34;https://man.hwangsehyun.com/diagram-export-21-01-2025-03_13_38_6717719122690619770.png&#34;
        
          width=&#34;2127&#34; height=&#34;1634&#34;
        
        alt=&#34;enter image description here&#34;
      /&gt;
    
  








&lt;/p&gt;
&lt;iframe src=&#34;https://app.eraser.io/workspace/TAAK8BBBhSbQTFLwV0tj?origin=share&#34; allowtransparency=&#34;true&#34;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;h3 id=&#34;cloudformation-stacks&#34;&gt;CloudFormation Stacks&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Copilot CLI + AWS CDK&lt;/p&gt;</description>
    </item>
    <item>
      <title>Basic LLM Ops in AWS</title>
      <link>https://man.hwangsehyun.com/kp/posts/llm-ops-in-aws/</link>
      <pubDate>Thu, 19 Sep 2024 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/posts/llm-ops-in-aws/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;
  &lt;img
    loading=&#34;lazy&#34;
    src=&#34;https://upload.wikimedia.org/wikipedia/commons/8/82/Las_Vegas_slot_machines.jpg&#34;
    alt=&#34;Row of digital-based slot machines inside a casino in Las Vegas&#34;
    
  /&gt;







&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Row of digital-based slot machines inside a casino in Las Vegas: &lt;a
  href=&#34;https://en.wikipedia.org/wiki/Slot_machine#/media/File:Las_Vegas_slot_machines.jpg&#34;
  &gt;Source&lt;/a
&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a
  href=&#34;https://arxiv.org/abs/2409.05746&#34;
  &gt;LLMs Will Always Hallucinate, and We Need to Live With This&lt;/a
&gt;
. 프롬프트에 수정이 필요할 때, 비관적인 관점에서는 LLM은 슬롯 머신과 같아서 &lt;a
  href=&#34;https://en.wikipedia.org/wiki/Balloon_effect&#34;
  &gt;풍선 효과&lt;/a
&gt;
를 피할 수 없다. 운이 좋으면 안 되던 것이 될 수도 있겠지만, 되던 것이 안 되던 경우도 비일비재했으며, 자연어를 출력하는 LLM의 특성 상 결국 테스트셋 전체를 LLM에 넣어보고 출력을 사람이 검토하는 작업을 정기적으로 수행했다. Batch job을 수행하고 비개발자와 결과를 검토하는 과정에서 개발자들은 엑셀을 읽고 쓰는 일회용 파이썬 코드를 (무수히 많이) 혼자서만 쓰고 폐기했으며, 이 코드는 서비스에서 돌아가는 코드와 입출력이 달라 테스트 결과도 신뢰할 수 없었다. Batch testing은 통과했으나 실제 서비스에서는 체감 성능이 다른 고통스런 경험을 수도 없이 반복하며, 이 비효율을 발본색원할 수 있는 시스템을 AWS 서비스들과 &lt;a
  href=&#34;https://opentelemetry.io/&#34;
  &gt;&lt;em&gt;OpenTelemetry&lt;/em&gt;&lt;/a
&gt;
를 이용해 구축하고 있다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>LLM을 이용한 기업용 챗봇 서비스</title>
      <link>https://man.hwangsehyun.com/kp/project/llm-docs-search/</link>
      <pubDate>Tue, 30 Apr 2024 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/llm-docs-search/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;blockquote&gt;
&lt;h3 id=&#34;&#34;&gt;💬 사내 문서에 대한 Q&amp;amp;A 챗봇 개발&lt;/h3&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;네이버 클라우드에서 고객사의 문서 데이터를 취급하기 위한 인프라 및 보안 설계&lt;/li&gt;
&lt;li&gt;챗봇 형태의 PoC 서비스 아키텍처 설계&lt;/li&gt;
&lt;li&gt;무정형의 HWP를 HTML 형태로 변환해 LLM에 적합한 형태로 정형화하고 검수하는 Frontend 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;architecture&#34;&gt;Architecture&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;sequenceDiagram
    autonumber

    actor frontend as 💻 Frontend
    participant auth as Auth λ
    participant backend as 🗄️ Backend
    
    frontend -&amp;gt;&amp;gt; auth: 📩 ID, PW
    auth -&amp;gt;&amp;gt; frontend: 🔐 Token

    frontend -&amp;gt;&amp;gt; backend: 🔐 Token 
    backend -&amp;gt;&amp;gt; auth: 🔐 Token
    auth -&amp;gt;&amp;gt; backend: ✅❌ Pass/Fail
    backend -&amp;gt;&amp;gt; frontend: 💯 Response
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;인프라
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://min.io/&#34;
  &gt;Minio&lt;/a
&gt;
라는 S3-compatable object storage에 원본 문서와 Chunking document를 적재&lt;/li&gt;
&lt;li&gt;네이버 클라우드 VM 초기 구성, 목적 별로 할당 및 관리&lt;/li&gt;
&lt;li&gt;VPN을 통해서만 VPC 내부에 접근할 수 있도록 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;챗봇 형태의 PoC 서비스 구성
&lt;ul&gt;
&lt;li&gt;React frontend가 Fast API chat server, Self-hosted &lt;a
  href=&#34;https://sentry.io/welcome/&#34;
  &gt;Sentry&lt;/a
&gt;
 등에 접근할 수 있는 Nginx 개발&lt;/li&gt;
&lt;li&gt;업데이트가 잦은 Fast API 서버에 의존하지 않도록 JWT 서비스를 &lt;a
  href=&#34;https://www.ncloud.com/product/compute/cloudFunctions&#34;
  &gt;Naver Cloud Function&lt;/a
&gt;
를 이용해 별도로 분리&lt;/li&gt;
&lt;li&gt;채팅 API 사용 시나리오 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;html-정형화-frontend-개발&#34;&gt;HTML 정형화 Frontend 개발&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;기술 스택
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://lit.dev/&#34;
  &gt;Lit&lt;/a
&gt;
: 대량의 검수 대상 HTML element에 Virtual DOM 없이 직접 접근하고 Boiler plating 없이 빠르게 개발하기 위해서 선택&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://prestd.com/&#34;
  &gt;pREST&lt;/a
&gt;
: 백엔드의 지원 없이 HTML 데이터를 DB에 적재하기 위해 선택&lt;/li&gt;
&lt;li&gt;DB
&lt;ul&gt;
&lt;li&gt;문서 파싱 규칙은 Indexed DB에 적재해 개인이 관리&lt;/li&gt;
&lt;li&gt;문서 파싱 결과는 Postgres에 적재해 RAG 시스템과 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;html 트리를 탐색하며 html element마다 세상에  id를 부여하는 해싱 알고리즘 개발&lt;/li&gt;
&lt;li&gt;문서 파싱 규칙을 UI를 통해 작성하고 규칙의 적용 결과를 바로 확인할 수 있음
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent&#34;
  &gt;&lt;code&gt;textContent&lt;/code&gt;&lt;/a
&gt;
에 대한 Regex matching, CSS selector, DOM tree 내의 위치 등을 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Minio와 연동된 Batch 기능 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lessons&#34;&gt;Lessons&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;새로운 회사에서 일을 시작하며 직접 고객사와 소통하지 않고 PM과 협업했습니다.&lt;/li&gt;
&lt;li&gt;Lit framework를 이용해서 복잡한 상태 관리를 해보았다.&lt;/li&gt;
&lt;li&gt;AWS 이외의 클라우드로 네이버 클라우드를 처음으로 경험해보았으나, 불안정하고 완성도가 떨어지는 모습에 더는 경험해보고 싶지 않았습니다.&lt;/li&gt;
&lt;li&gt;언어 모델과 RAG 시스템의 특성을 서서히 이해해가고 있습니다. 성능에 대한 사람들의 높은 기대치에는 절대 대중들이 예상하는 만큼 쉽게 도달할 수 없어 보이고, 언어 모델 이외의 전문 지식과 소프트웨어 기술에 대한 중요성을 매일 느끼며 겸손을 배우고 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTgxNjMyNDI5OCwtMTk4NDA4NDgxNCwxMT
U5NTU3MDE2LDE2NzgzMTY4MDEsNTk2MjAzMjkwLDg5NTAwMzY2
NiwxMDEwNDQwMjUxLC0xOTcyNzg5MTYwLC0xMDMyMDk2NzEyLD
E4NzM5MDgzMCw1NTc4Mjk2MDUsMjA0OTIzOTkyNiwxMzI2OTgw
MzQwLC0xNDgyMDk1NTI4XX0=
--&gt;</description>
    </item>
    <item>
      <title>About this site: man.hwangsehyun.com</title>
      <link>https://man.hwangsehyun.com/kp/posts/man-hwangsehyun-com/</link>
      <pubDate>Thu, 14 Mar 2024 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/posts/man-hwangsehyun-com/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;6년 간의 개발 경험과 개발자 황세현에 대해 공개적으로 소개할 수 있었으면 해서 품이 들어도 직접 사이트를 만들기로 결정했습니다.&lt;/li&gt;
&lt;li&gt;사이트 구현에서는 기능에 대한 욕심 부리지 않고 HTML 표준에 충실하는 데 집중하고 있습니다.&lt;/li&gt;
&lt;li&gt;꾸준히 새로운 컨텐츠를 올리고 유지보수 하기에는 통상 Jam stack을 사용하듯 git에 글을 직접 커밋하기는 너무 번거로울 것이라고 판단하고, DB와 연동되는 온라인 마크다운 편집 서비스 &lt;a
  href=&#34;https://stackedit.io/&#34;
  &gt;StackEdit&lt;/a
&gt;
에 글을 쓰고 사이트 형태로 빌드하기로 아키텍처를 기획했습니다.&lt;/li&gt;
&lt;li&gt;&lt;del&gt;이 사이트에는 비밀스러운 언어 설정이 있습니다:&lt;/del&gt; &lt;a
  href=&#34;https://man.hwangsehyun.com/kp/&#34;
  &gt;문화어&lt;/a
&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;stateDiagram-v2
  direction LR
  
  [*] --&amp;gt; StackEdit
  StackEdit --&amp;gt; CouchDB
  CouchDB --&amp;gt; Markdowns : Node.js
  Markdowns --&amp;gt; HTML : Hugo build
  HTML --&amp;gt; [*]
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;Written with &lt;a
  href=&#34;https://stackedit.io/&#34;
  &gt;StackEdit&lt;/a
&gt;
.&lt;/p&gt;</description>
    </item>
    <item>
      <title>LLM 기반 작명 서비스</title>
      <link>https://man.hwangsehyun.com/kp/project/naimy/</link>
      <pubDate>Thu, 29 Feb 2024 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/naimy/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;서비스 링크: &lt;a
  href=&#34;https://naimy.ai/&#34;
  &gt;https://naimy.ai/&lt;/a
&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;한글 브랜드 이름에 특화된 브랜드 이름 작명 서비스 &lt;a
  href=&#34;https://naimy.ai/&#34;
  &gt;naimy.ai&lt;/a
&gt;
. 작명에 이어 작명된 이름을 도메인 API, 특허청 API, 소셜 네트워킹 서비스 크롤링 등의 외부 서비스 연동을 통해서 적절성을 분석할 수 있습니다.&lt;/li&gt;
&lt;li&gt;크게 Postgres RDS를 사용하는 Lambda backend와 React frontend로 이루어진 애플리케이션으로, 외부 서비스 연동을 고려한 AWS 아키텍처를 설계하고 특허청을 제외한 외부 서비스 연동 개발을 진행했습니다.&lt;/li&gt;
&lt;li&gt;작명 옵션 선택지 변경, Database connection pool 디버깅, AWS 계정 마이그레이션 등 사이트 운영 이슈 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;
&lt;p&gt;
  

  
    
    
      &lt;img
        src=&#34;https://man.hwangsehyun.com/Untitled-_9481550536864483097.png&#34;
        
          width=&#34;2000&#34; height=&#34;1283&#34;
        
        alt=&#34;enter image description here&#34;
      /&gt;
    
  








&lt;/p&gt;</description>
    </item>
    <item>
      <title>보행자 &amp; 번호판 인식 솔루션</title>
      <link>https://man.hwangsehyun.com/kp/project/vision-and-alpr/</link>
      <pubDate>Thu, 29 Feb 2024 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/vision-and-alpr/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/career/#nextlab&#34;
  &gt;넥스트랩&lt;/a
&gt;
의 소속 팀에서 가장 장기적으로 진행한 중요 프로젝트로, CCTV 등의 카메라에서 획득한 보행자와 번호판 이미지를 대상으로 추적 and/or 번호판 인식 모듈을 서비스화하는 프로젝트&lt;/li&gt;
&lt;li&gt;납품 사례마다 다양한 요구 사항이 있었는데, 주로 핵심 AI 모듈을 둘러싼 서비스 구조를 비즈니스 로직에 맞춰 설계하고 구현하는 업무를 맡았습니다. 크게 요청에 따라서 task를 수행하는 &lt;span id=&#34;pull-mode&#34;&gt;&lt;em&gt;pull&lt;/em&gt; mode&lt;/span&gt;와 최대한 빠른 속도로 task를 수행하는 &lt;span id=&#34;push-mode&#34;&gt;&lt;em&gt;push&lt;/em&gt; mode&lt;/span&gt;으로 나눌 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/posts/ssh-tunnel-launchpad/&#34;
  &gt;&lt;em&gt;다련장 발사대&lt;/em&gt;&lt;/a
&gt;
라는 별명의 SSH tunnel을 통한 배포 및 운영 툴을 만들어서 이 프로젝트에서 2년간 안정적으로 사용했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;컨테이너 단위로 역할을 지정하고 Stage와 GPU 환경을 고려한 docker-compose 개발
&lt;ul&gt;
&lt;li&gt;배포와 관련해서 Nvidia GPU를 컨테이너 내부에서 사용하기 위한 고려 사항들을 알고 있고 실무에 활용해왔습니다. (CUDA version, Container runtime, Container base image, Runtime flags&amp;hellip;)&lt;/li&gt;
&lt;li&gt;컨테이너 별 주요 Failure point를 고려해 Health check 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AI task 관리 기능 개발
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/kp/project/vision-and-alpr/#pull-mode&#34;
  &gt;&lt;em&gt;pull&lt;/em&gt; mode&lt;/a
&gt;
에서는 tmpfs 또는 S3-compatable 임시 저장소에 최근 사진만을 적재&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/kp/project/vision-and-alpr/#push-mode&#34;
  &gt;&lt;em&gt;push&lt;/em&gt; mode&lt;/a
&gt;
에서는 대기열에 요청받은 Task들을 적재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 일부분에 대한 테스트 또는 운영 지원을 위한 내부용 프론트엔드 구현&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://aws.amazon.com/cdk/&#34;
  &gt;AWS CDK&lt;/a
&gt;
를 이용해 브랜치 별로 docker compose build를 수행하는 Serverless CI 개발&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;progress&#34;&gt;Progress&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;납품 케이스 별로 개발 사항들을 정리했습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Welcome to StackEdit!</title>
      <link>https://man.hwangsehyun.com/kp/posts/stackedit/</link>
      <pubDate>Wed, 14 Feb 2024 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/posts/stackedit/</guid>
      <description>&lt;h2 id=&#34;welcome-to-stackedit&#34;&gt;Welcome to StackEdit!&lt;/h2&gt;
&lt;p&gt;Hi! I&amp;rsquo;m your first Markdown file in &lt;strong&gt;StackEdit&lt;/strong&gt;. If you want to learn about StackEdit, you can read me. If you want to play with Markdown, you can edit me. Once you have finished with me, you can create new files by opening the &lt;strong&gt;file explorer&lt;/strong&gt; on the left corner of the navigation bar.&lt;/p&gt;
&lt;h1 id=&#34;files&#34;&gt;Files&lt;/h1&gt;
&lt;p&gt;StackEdit stores your files in your browser, which means all your files are automatically saved locally and are accessible &lt;strong&gt;offline!&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>X-Ray 식품 검사 시스템</title>
      <link>https://man.hwangsehyun.com/kp/project/x-ray/</link>
      <pubDate>Sun, 31 Dec 2023 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/x-ray/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;하드웨어 연동과 AI 이물 검사 기능을 핵심으로 하는 &lt;strong&gt;식품 X-Ray 이물 검사 시스템 전면 재개발&lt;/strong&gt; 프로젝트. &lt;a
  href=&#34;https://www.ni.com/ko/shop/labview.html&#34;
  &gt;LabView&lt;/a
&gt;
 윈도우 응용 프로그램을 MSA로 변경.&lt;/li&gt;
&lt;li&gt;크게 장비를 직접 통제하는 하드웨어 스택과 검사 수행에 필요한 비즈니스 로직과 검사 이력을 관리하는 애플리케이션 스택으로 나누어 서비스를 설계했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  

  
    
    
      &lt;img
        src=&#34;https://man.hwangsehyun.com/XRay_comm_process%EC%9D%98%20%EC%82%AC%EB%B3%B8-Running%20%282%29_5485753560808419753.svg&#34;
        
        alt=&#34;x-ray diagram&#34;
      /&gt;
    
  








&lt;/p&gt;
&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;하드웨어 스택에서는 Redis message broker를 중심으로 하드웨어 연동 전용 컨테이너들을 배치하고 해당 컨테이너들에 대해 TDD를 도입해 하드웨어에 의한 Pain point를 줄였습니다.
&lt;ul&gt;
&lt;li&gt;X-Ray의 눈 &lt;code&gt;detector&lt;/code&gt; 컨테이너를 C++로 개발했습니다. bmp 표준을 준수하되 깊은 비트 심도를 나타낼 수 있는 형식을 고안하고, 다른 컨테이너가 &lt;a
  href=&#34;https://man7.org/linux/man-pages/man2/mmap.2.html&#34;
  &gt;mmap&lt;/a
&gt;
 프로토콜을 통해서 필요한 이미지 영역을overhead 없이 획득할 수 있도록 했습니다.&lt;/li&gt;
&lt;li&gt;나머지 하드웨어 연동 컨테이너의 Redis 인터페이스 설계와 Node.js TypeScript 객체 지향 설계를 주도했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;애플리케이션 스택에서는 에러 핸들링과 Canvas로 획득 이미지를 스트리밍하는 기능을 개발했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;docker-compose-services&#34;&gt;&lt;code&gt;docker-compose&lt;/code&gt; services&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Name&lt;/th&gt;
          &lt;th&gt;Language&lt;/th&gt;
          &lt;th&gt;Category&lt;/th&gt;
          &lt;th&gt;Features&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;redis&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
          &lt;td&gt;Infra&lt;/td&gt;
          &lt;td&gt;Event broker&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nginx&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Nginx&lt;/td&gt;
          &lt;td&gt;Infra&lt;/td&gt;
          &lt;td&gt;Static server, Reverse proxy, 이미지 스트리밍&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;api&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Python&lt;/td&gt;
          &lt;td&gt;Service&lt;/td&gt;
          &lt;td&gt;CRUD, Auth, 이미지 처리 Microservice&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;orchestrator&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Node&lt;/td&gt;
          &lt;td&gt;Service&lt;/td&gt;
          &lt;td&gt;하드웨어 상태 모니터링 및 통합 조작&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;detector&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;C++&lt;/td&gt;
          &lt;td&gt;H/W&lt;/td&gt;
          &lt;td&gt;Detector H/W 연동, 기초적인 이미지 처리&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;serial&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Node&lt;/td&gt;
          &lt;td&gt;H/W&lt;/td&gt;
          &lt;td&gt;개별 시리얼 H/W 상태 관리자&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;postgres&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;SQL&lt;/td&gt;
          &lt;td&gt;DB&lt;/td&gt;
          &lt;td&gt;유저, 알고리즘 파라미터, 이미지 목록 관리&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;influxdb&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Flux&lt;/td&gt;
          &lt;td&gt;DB&lt;/td&gt;
          &lt;td&gt;하드웨어 사용 이력 관리&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;s3&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Node&lt;/td&gt;
          &lt;td&gt;Infra&lt;/td&gt;
          &lt;td&gt;mmap, 이미지 데이터 관리&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ai&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Python&lt;/td&gt;
          &lt;td&gt;Service&lt;/td&gt;
          &lt;td&gt;이물 검출 Yolo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;firmware&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;C++, Python&lt;/td&gt;
          &lt;td&gt;Deployment&lt;/td&gt;
          &lt;td&gt;IO controller firmware uploader&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;lessons&#34;&gt;Lessons&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;수많은 야근에도 불구하고 프로젝트의 목표가 달성 불가능한 목표로 설정된 탓에 Production에는 도달하지 못했습니다. 이 글은 프로젝트의 완성보다 제 커리어에서 가장 복잡한 문제를 MSA로 어떻게 풀려고 시도했는지를 중점으로 읽어주시길 부탁드립니다.&lt;/li&gt;
&lt;li&gt;객체를 통해 메모리를 간접적으로 관리하는 현대적인 C++ 개발을 경험했습니다. WebAssembly, &lt;a
  href=&#34;https://pybind11.readthedocs.io/en/stable/index.html&#34;
  &gt;pybind&lt;/a
&gt;
 등을 통해서 일부 기능을 Native하게 구동하는 데 관심이 있었는데, 이번 프로젝트에서 쌓은 C++ 경험을 기반으로 미래에 이러한 개발을 맡을 수 있으면 좋겠습니다.&lt;/li&gt;
&lt;li&gt;Redis를 통한 하드웨어 추상화와 하드웨어에 대한 TDD가 효과적으로 작동했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTEwMjE1OTcxODIsLTE2NDQ2MTcxOTAsLT
E5NTk5MzkyNTIsMTg1OTA0NDYzMSwxMDYzNjgyNDgsMTAxMTc1
Mjg0MywtMTcyNzU3Mzg3LDE4MzcxODE5OTksLTIxMzk5MzMzNj
csLTE5MDA2MzE4MjUsMTM0MzU5Mzc3NywtNjY0NzAzMjI4LDE3
MDM5MjQyMjUsLTI4MTI5MTQ5NSwxOTcwNDQ2NzI2LC00NTI0Nj
gyMTgsLTk2MjMyMDQzMSwtMTc4MDI3ODQzOCwxNTY4MTc1NjQ2
LDEwNzgyODY2MjhdfQ==
--&gt;</description>
    </item>
    <item>
      <title>Serverless 기반 신문 PDF 정형화</title>
      <link>https://man.hwangsehyun.com/kp/project/newspaper-pdf/</link>
      <pubDate>Sat, 31 Dec 2022 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/newspaper-pdf/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;이미지만을 고려하는 기존 OCR 서비스와는 달리, PDF에 담긴 정보까지 이용해 모바일 기사로 나타낼 수 있는 정보를 만드는 Serverless 기반 백엔드와 검수용 프론트엔드 개발 프로젝트&lt;/li&gt;
&lt;li&gt;요구 사항을 분석해 AWS Serverless 서비스들을 이용한 구조로 문제를 쪼개고 각 Lambda의 초중반부 개발을 진행했습니다.&lt;/li&gt;
&lt;li&gt;수백 건 단위의 Lambda concurrency를 동원해 수십 페이지 단위의 PDF 정형화를 동시에 진행할 수 있었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;S3 presigned url을 이용해 PDF를 업로드하면 PDF 정형화 Step Function이 호출되도록 구성&lt;/li&gt;
&lt;li&gt;PDF를 HTML로 변환해서 좌표 정보를 추출하는 Lambda 개발 및 유지 보수&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/step-functions/latest/dg/concepts-activities.html&#34;
  &gt;Step Functions Activity Worker&lt;/a
&gt;
를 이용한 이미지 처리 Worker 개발&lt;/li&gt;
&lt;li&gt;모든 Lambda와 Step Function의 event payload 문서화 및 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;milestones&#34;&gt;Milestones&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;마일스톤 별로 집중했던 개발 내용에 따라서 정리했습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH Tunnel 기반 배포 &amp; 운영 툴</title>
      <link>https://man.hwangsehyun.com/kp/posts/ssh-tunnel-launchpad/</link>
      <pubDate>Tue, 01 Mar 2022 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/posts/ssh-tunnel-launchpad/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;인터넷은 가능하나 Inbound가 제한된 환경에 놓인 다수의 임베디드 또는 서버 형태의 Linux 머신들을 관리하기 위한 위한 &lt;a
  href=&#34;https://hub.docker.com/r/linuxserver/openssh-server&#34;
  &gt;OpenSSH server container&lt;/a
&gt;
와 Node.js CLI&lt;/li&gt;
&lt;li&gt;회사 특성 상 일부분만 자동화가 가능할 것이므로, 일반적인 SSH 접속과 자동화 모두 고려해 클라우드를 통한 SSH 연결을 기반으로 한 자동화를 기획했습니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/project/vision-and-alpr/&#34;
  &gt;다양한 컴퓨터 비전 솔루션&lt;/a
&gt;
의 배포에 사용되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  

  
    
    
      &lt;img
        src=&#34;https://man.hwangsehyun.com/auto-ssh-proxy-Device001.drawio_18056987197896324757.svg&#34;
        
        alt=&#34;enter image description here&#34;
      /&gt;
    
  








&lt;/p&gt;
&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;접속 대상 머신에 &lt;a
  href=&#34;https://hub.docker.com/r/jnovack/autossh&#34;
  &gt;&lt;code&gt;autossh&lt;/code&gt; container&lt;/a
&gt;
를 docker와 podman으로 이중화된 형태로 설치해 가용성을 높일 수 있음&lt;/li&gt;
&lt;li&gt;명령을 수행할 장치와 수행할 명령은 json 파일로 정의되고, Node.js CLI는 이 파일들의 경로를 지정해서 실행&lt;/li&gt;
&lt;li&gt;Redis에 stdout, stderr를 임시로 저장하고 SQLite에 영구 저장해 운영 상황을 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  

  
    
    
      &lt;img
        src=&#34;https://man.hwangsehyun.com/Untitled%20%282%29_6325316159775138629.png&#34;
        
          width=&#34;2000&#34; height=&#34;1791&#34;
        
        alt=&#34;enter image description here&#34;
      /&gt;
    
  








&lt;/p&gt;</description>
    </item>
    <item>
      <title>웹 기반 강화 학습 시뮬레이션 서비스화</title>
      <link>https://man.hwangsehyun.com/kp/project/rl-sim/</link>
      <pubDate>Thu, 31 Dec 2020 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/rl-sim/</guid>
      <description>&lt;h2 id=&#34;demo&#34;&gt;Demo&lt;/h2&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/k-XxmSmooy8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;h2 id=&#34;technology&#34;&gt;Technology&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Docker API를 통해 Worker 컴퓨터를 제어해 강화 학습 Training 컨테이너를 구동&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://threejs.org/&#34;
  &gt;three.js&lt;/a
&gt;
와 &lt;a
  href=&#34;https://schteppe.github.io/cannon.js/&#34;
  &gt;cannon.js&lt;/a
&gt;
를 연동해 브라우저 내에 강화 학습 시뮬레이션 환경 구성&lt;/li&gt;
&lt;li&gt;강화 학습 컨테이너와 시뮬레이션 환경을 socket.io 프로토콜을 통해서 환경 정보와 지시 사항을 주고받으며 강화 학습 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;abstract&#34;&gt;Abstract&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;웹 기술을 이용한 3D 로봇 팔 대상의 유연한 강화 학습 환경 구성&lt;/p&gt;</description>
    </item>
    <item>
      <title>플랜트 육상 운송성 평가 시스템</title>
      <link>https://man.hwangsehyun.com/kp/project/ptais/</link>
      <pubDate>Tue, 31 Dec 2019 00:00:00 +0900</pubDate>
      <guid>https://man.hwangsehyun.com/kp/project/ptais/</guid>
      <description>&lt;h2 id=&#34;demo&#34;&gt;Demo&lt;/h2&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/C25Gc_6_Zms?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;플랜트 산업 분야에서 대형 화물을 육상으로 운송할 때, 도로의 폭과 장애물의 높이를 고려해서 운송 경로를 탐색한다는 시나리오에 기반해 웹사이트를 개발한 연구&lt;/li&gt;
&lt;li&gt;레거시 PHP 애플리케이션을 PHP JSON API + jQuery AJAX 형태로 재개발하고 Single page application으로 전환, Google Maps SDK를 통한 interactive한 경로와 지도 기능의 비중을 크게 확대했습니다.&lt;/li&gt;
&lt;li&gt;시작지, 경유지, 도착지를 CRUD하고 비용 분석 Report를 생성하는 핵심 기능이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lessons&#34;&gt;Lessons&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;자바스크립트 3개월 차에 프로젝트 리드를 맡았지만 무사히 프로젝트를 완료할 수 있어 다행이었습니다.&lt;/li&gt;
&lt;li&gt;로컬에서 개발을 전혀 하지 않고, AWS EC2에 개발 환경을 구축하고 처음부터 Nginx를 통한 HTTPS를 도입해 클라우드 네이티브를 추구했습니다.&lt;/li&gt;
&lt;li&gt;실제로 구현은 못했지만, 위성 사진으로부터 도로 폭 추출, 장애물 높이 추출 등 동료들이 진행한 이미지 처리에 관련한 연구들을 어떻게 AWS Lambda 등을 이용해 어떻게 서비스할 수 있을지 고민했었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE06648490&#34;
  &gt;Swept Path Analysis 활용 모듈화 플랜트 운송성 평가 알고리즘 및 자동화 시스템에 대한 연구&lt;/a
&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE08753594&#34;
  &gt;웹 기반 육상 모듈화 플랜트 운송 프로젝트 통합 관리 및 분석 시스템 개발&lt;/a
&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE10527014&#34;
  &gt;Pix2pix를 이용한 클라우드 기반 최소 도로 폭 추출 시스템 개발&lt;/a
&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTkxNTEyNzM1NCwxNDEzMjMxNzE5LC0xNz
IyOTc1MDA4LC0xNzQwNjQzMTcxLDE4NDU2OTY1MDIsNzYzNjAx
MzI0LDEyODAxNDM3NjMsLTY3NzAyNjE2NCwtMTUwMzI2MjA1MS
wtMTM1NzY0Mjc1MiwxNTY1NTc3NTAsLTQ2MjkxODMwOCwtMTky
NDM1NzM0NCwtMzEwODQ3MjAyLC0xOTg0MzY5OTIxLDUwOTkzMj
U2MF19
--&gt;</description>
    </item>
    <item>
      <title>Experiences with Networking</title>
      <link>https://man.hwangsehyun.com/kp/tech/networking/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/networking/</guid>
      <description>&lt;h2 id=&#34;aws-vpc&#34;&gt;AWS VPC&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTP API Gateway와 Elastic Load Balancer를 통해서 [Cloud Map Service]에 등록된 VPC 내부 리소스를 안전하게 공개합니다.&lt;/li&gt;
&lt;li&gt;Public IP가 없는 VPC 내부의 리소스에 대해서 &lt;a
  href=&#34;https://docs.aws.amazon.com/whitepapers/latest/aws-privatelink/what-are-vpc-endpoints.html#gateway-endpoints&#34;
  &gt;Gateway endpoints&lt;/a
&gt;
를 통해서 AWS 내부의 서비스에 접근하게 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;적절한 기준을 가지고 ACL, Security group을 관리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;VPC peering을 통해서 계정/리전이 다른 다수의 VPC를 운영할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;edge-networking&#34;&gt;Edge Networking&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html&#34;
  &gt;ECS Anywhere&lt;/a
&gt;
 서비스로 On-premise 인프라를 ECS cluster에 등록해 서비스할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Frontend 개발자와 협력해 &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html&#34;
  &gt;CloudFront routing rule&lt;/a
&gt;
을 작성하고 배포와 테스트를 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTY5NTkwMzcyNSwxNjYwMDI3NjM1LDE2ND
cwMTA1NzksLTUxMTkyMTQ1Myw2Mjc4NDY3MzEsMTkwOTgwNjYw
NCwtMTY5NzYwNjg1NSwzODcxMjQ2NzZdfQ==
--&gt;</description>
    </item>
    <item>
      <title>Monitoring Experiences</title>
      <link>https://man.hwangsehyun.com/kp/tech/monitoring/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/monitoring/</guid>
      <description>&lt;h2 id=&#34;cloudwatch&#34;&gt;CloudWatch&lt;/h2&gt;
&lt;h3 id=&#34;log--metrics-collection&#34;&gt;Log &amp;amp; Metrics Collection&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://hub.docker.com/r/amazon/cloudwatch-agent&#34;
  &gt;CloudWatch agent container&lt;/a
&gt;
로 Systemd log와 Custom log를 CloudWatch로 수집합니다.&lt;/li&gt;
&lt;li&gt;Request id, Execution id 등 AWS에서 부여한 UUID들을 기준으로 DB를 설계하고 로그에 포함시켜 Tracing을 용이하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html&#34;
  &gt;Subscription filter&lt;/a
&gt;
 기능으로 서비스에서 발생한 중요 로그를 전파합니다.&lt;/li&gt;
&lt;li&gt;EC2, RDS 등의 AWS 서비스에서 기본으로 제공하는 &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html&#34;
  &gt;CloudWatch metrics&lt;/a
&gt;
 외에도 Custom metrics를 정의해 관심 대상으로 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;monitoring&#34;&gt;Monitoring&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/sns/latest/dg/sns-email-notifications.html&#34;
  &gt;SNS topic에 email subscription&lt;/a
&gt;
을 추가해 서비스에서 직접 Topic에 메시지를 발송합니다.&lt;/li&gt;
&lt;li&gt;Metric에 Anomaly condition을 정의하고 &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html&#34;
  &gt;CloudWatch alarm&lt;/a
&gt;
을 설정합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://w1694659396-omq861390.slack.com/apps/A6L22LZNH-aws-chatbot&#34;
  &gt;AWS Chatbot Slack App&lt;/a
&gt;
을 도입해 사내 메신저로 알림을 수신했습니다.
&lt;ul&gt;
&lt;li&gt;CloudWatch alarm state 변경 시&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instance-state-changes.html&#34;
  &gt;EC2 Instance state change event&lt;/a
&gt;

&lt;blockquote&gt;
&lt;p&gt;EC2 state change event
-&amp;gt; EventBridge
-&amp;gt; SNS
-&amp;gt; AWS ChatBot&lt;/p&gt;</description>
    </item>
    <item>
      <title>Operations: Dev, Building, Testing, CI/CD, and more...</title>
      <link>https://man.hwangsehyun.com/kp/tech/operations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/operations/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;개발 팀이 편안한 환경에서 장기적인 성과를 낼 수 있도록 노력해왔습니다.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;development&#34;&gt;Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;가장 코드 양이 많은 JavaScript, Python을 중심으로 Convention 확립에 노력했습니다.&lt;/li&gt;
&lt;li&gt;JavaScript, TypeScript Node.js 프로젝트에 전역적으로 적용할 수 있는 &lt;a
  href=&#34;https://eslint.org/docs/latest/extend/shareable-configs&#34;
  &gt;ESLint Sharable Config&lt;/a
&gt;
를 &lt;a
  href=&#34;https://github.com/sehyun-hwang/eslint-config-nextlab&#34;
  &gt;https://github.com/sehyun-hwang/eslint-config-nextlab&lt;/a
&gt;
에서 오픈소스로 관리하고 있습니다.&lt;/li&gt;
&lt;li&gt;Python에서는 Type checking과 Linting을 동시에 구동하기 위해서 mypy를 Child process로 실행하는 pylint plugin을 제작한 적이 있으며, 최근에는 ruff linter와 black formatter를 사용하고 있습니다.&lt;/li&gt;
&lt;li&gt;다양한 언어로 이루어진 Monorepo에 대한 Convention을 관리하기 위해서 &lt;a
  href=&#34;https://megalinter.io/latest/&#34;
  &gt;MegaLinter&lt;/a
&gt;
와 그것의 &lt;a
  href=&#34;https://github.com/marketplace/actions/megalinter&#34;
  &gt;Github Action&lt;/a
&gt;
을 도입했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;building&#34;&gt;Building&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;이미지 처리 등의 특수한 기능이 있는 컨테이너들에 대해서는 불필요한 컴파일러와 인터프리터를 제거하는 &lt;a
  href=&#34;https://docs.docker.com/build/building/multi-stage/&#34;
  &gt;Multi-stage build&lt;/a
&gt;
를 수행했습니다.&lt;/li&gt;
&lt;li&gt;alpine 기반의 컨테이너로 컨테이너의 이미지 크기를 줄여 빌드 시간 단축, 배포 속도 개선, 취약점 개선 등의 효과를 얻었습니다.&lt;/li&gt;
&lt;li&gt;복수의 Dockerfile을 이용한 Container build, 빌드 캐시 관리 등 High-level build 기능을 구현해주는 &lt;a
  href=&#34;https://docs.docker.com/build/bake/&#34;
  &gt;&lt;code&gt;buildx bake&lt;/code&gt;&lt;/a
&gt;
를 도입했습니다.&lt;/li&gt;
&lt;li&gt;Makefile을 이용해 직접 별도로 컴파일해야 하는 C++ 프로젝트나 표준적이지 않은 프로젝트의 개발-빌드-테스트-배포 과정을 관리합니다.&lt;/li&gt;
&lt;li&gt;빌드를 위한 인프라를 관리할 필요가 없고 동시에 작업을 병렬적으로 진행할 수 있는 Serverless CI를 추구합니다.
&lt;ul&gt;
&lt;li&gt;AWS CodeBuild&lt;/li&gt;
&lt;li&gt;GitHub Action&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Test runner가 테스트 케이스들을 병렬적으로 수행하는 데 문제가 없도록 하는 정석적인 객체 지향 코드를 작성합니다. 서비스 코드에 Side effect가 없고 부분 별로 역할 구분이 명확해야 테스트 코드에서 class를 상속받아서 테스트 케이스를 작성할 수 있었습니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://vitest.dev/&#34;
  &gt;vitest&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.pytest.org/en/stable/&#34;
  &gt;pytest&lt;/a
&gt;
로 테스트 케이스를 작성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTE5ODkxMTU4NDUsNzQ3Njg3NTc3LC0xMz
AzMDYxODAxLC0xOTMyNjY2MDg0LC0xNTc3MDgyMjE5LC03MDIz
MTU0MDksMTY0OTUxNTQ0NiwtMjA3NDg5NTI0NCwxNTcwMDcxND
A5LDg3NDc4Mzk2NywtMTk5ODE4MzY1MCwtMTY5NjU2Mzc1OCwx
MTExNTQ2ODI1LDEyMzUxODU2NDgsLTE2MDA0NjU1MjMsMTIzNT
E4NTY0OCwxODUzOTE3MjQ5LDk2MTIxNDYyMywtOTI1OTUwMDcx
LDczMDk5ODExNl19
--&gt;</description>
    </item>
    <item>
      <title>Security Routines</title>
      <link>https://man.hwangsehyun.com/kp/tech/security/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/security/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;어떻게 보면 당연한 관습들을 풀어서 글로 남겼습니다.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;routines&#34;&gt;Routines&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html&#34;
  &gt;&lt;strong&gt;IAM&lt;/strong&gt;&lt;/a
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Production 환경에서는 &lt;a
  href=&#34;https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html&#34;
  &gt;Lambda execution role&lt;/a
&gt;
과 &lt;a
  href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html&#34;
  &gt;EC2 IAM role&lt;/a
&gt;
 등의 &lt;a
  href=&#34;https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html&#34;
  &gt;IAM temporary credential&lt;/a
&gt;
 기능을 활용합니다.&lt;/li&gt;
&lt;li&gt;리소스에게 부여된 권한들은 해당 리소스의 동작에 대한 명세이기도 하다고 생각하고 있으며, Service role에 Least privilege rule을 최대한 준수했습니다.&lt;/li&gt;
&lt;li&gt;프로젝트 별로 User group을 만들고 개발자들에게 개발에 필요한 권한을 부여합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://cli.github.com/manual/gh_auth_login&#34;
  &gt;GitHub CLI SSO&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html&#34;
  &gt;AWS CLI SSO&lt;/a
&gt;
 등의 SSO 서비스를 사용해 개발자가 개발에 필요한 권한을 획득할 수 있도록 도입 중입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secrets Management&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Skills &amp; Experiences with AWS</title>
      <link>https://man.hwangsehyun.com/kp/tech/aws/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/aws/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;AWS에서 어떤 서비스를 써보셨나요?&lt;/em&gt;
라는 질문에 답하기 힘들어서 적은 페이지&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;skills&#34;&gt;Skills&lt;/h2&gt;
&lt;h3 id=&#34;infra&#34;&gt;Infra&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Python, Node.js 등의 언어로 작성된 코드가 구동되는 EC2 instance의 type과 FarGate, Lambda 등 Serverless 서비스의 spec을 선정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;비용 절감
&lt;ul&gt;
&lt;li&gt;Lambda와 Container에 &lt;strong&gt;ARM architecture&lt;/strong&gt;를 우선적으로 검토합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/using-spot-instances.html&#34;
  &gt;EC2 Spot instance&lt;/a
&gt;
와 &lt;a
  href=&#34;https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/bestpracticesguide/ec2-and-fargate-spot.html&#34;
  &gt;Fargate Spot capacity provider&lt;/a
&gt;
 등 짧은 생명 주기를 가진 인프라를 이용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Storage.html&#34;
  &gt;EBS, EFS, S3&lt;/a
&gt;
 등 적절한 종류의 Storage를 선택하고 EC2 등의 인프라에서 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/aws-backup/latest/devguide/creating-a-backup-plan.html&#34;
  &gt;AWS Backup plan &amp;amp; lifecycle&lt;/a
&gt;
을 지정해 &lt;a
  href=&#34;https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html&#34;
  &gt;EBS&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.aws.amazon.com/efs/latest/ug/awsbackup.html&#34;
  &gt;EFS&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html&#34;
  &gt;RDS&lt;/a
&gt;
 등에 대해서 주기적으로 Backup을 수행하고 삭제할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;monitoring&#34;&gt;Monitoring&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/tech/monitoring/#cloudwatch&#34;
  &gt;Monitoring experience 페이지의 CloudWatch 부분&lt;/a
&gt;
을 참조해주세요.&lt;/p&gt;</description>
    </item>
    <item>
      <title>개발 포트폴리오</title>
      <link>https://man.hwangsehyun.com/kp/all/_index.5426c3a2e42dc454ad3b3e3101c8d5c5.generated/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/all/_index.5426c3a2e42dc454ad3b3e3101c8d5c5.generated/</guid>
      <description>&lt;h2 id=&#34;황세현&#34;&gt;황세현&lt;/h2&gt;
&lt;p&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/kp/&#34;
  &gt;hwanghyun3@gmail.com&lt;/a
&gt;
&lt;/p&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbOTkxNDYwNzc5LC01ODIyNTYxNzYsLTI2Mj
E5MTIzNCwxNTc0NTI3Mjk5LDgyOTIwNjg3MCwyMjc1MjU5OCwt
MTkzNDEzODY1NV19
--&gt;</description>
    </item>
  </channel>
</rss>
