<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>로슬린의 인생잡담</title>
    <link>https://roslyndev.tistory.com/</link>
    <description>21년째 웹 서비스를 만들고 있는 개발자이자, 웹소설을 쓰는 창작자입니다.
AI가 글을 대신 쓰는 시대에, 저는 사람이 자기 리듬으로 오래 쓸 수 있는 창작 도구를 만들고 있습니다.</description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 17:44:35 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Roslyn</managingEditor>
    <image>
      <title>로슬린의 인생잡담</title>
      <url>https://tistory1.daumcdn.net/tistory/6053988/attach/3bbcae5a5eeb4df38effc768401dc70e</url>
      <link>https://roslyndev.tistory.com</link>
    </image>
    <item>
      <title>작은 서비스에서 로그 다음으로 필요한 것은 상태를 보는 화면입니다</title>
      <link>https://roslyndev.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서비스를&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;로그를&amp;nbsp;먼저&amp;nbsp;생각하게&amp;nbsp;됩니다.&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;원인을&amp;nbsp;찾아야&amp;nbsp;하고,&amp;nbsp;어떤&amp;nbsp;요청에서&amp;nbsp;실패했는지&amp;nbsp;확인해야&amp;nbsp;하기&amp;nbsp;때문입니다.&amp;nbsp;저도&amp;nbsp;닷넷&amp;nbsp;프로젝트를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;Serilog&amp;nbsp;같은&amp;nbsp;구조화&amp;nbsp;로깅&amp;nbsp;도구를&amp;nbsp;자주&amp;nbsp;떠올립니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;로그를&amp;nbsp;남기기&amp;nbsp;시작하면&amp;nbsp;곧&amp;nbsp;다른&amp;nbsp;질문이&amp;nbsp;생깁니다.&amp;nbsp;로그는&amp;nbsp;문제가&amp;nbsp;생긴&amp;nbsp;뒤에&amp;nbsp;뒤져보는&amp;nbsp;기록에&amp;nbsp;가깝습니다.&amp;nbsp;그렇다면&amp;nbsp;지금&amp;nbsp;서비스가&amp;nbsp;어떤&amp;nbsp;상태인지,&amp;nbsp;오늘&amp;nbsp;어떤&amp;nbsp;일이&amp;nbsp;있었는지,&amp;nbsp;사용자가&amp;nbsp;실제로&amp;nbsp;어떤&amp;nbsp;흐름을&amp;nbsp;지나고&amp;nbsp;있는지는&amp;nbsp;어디에서&amp;nbsp;봐야&amp;nbsp;할까요. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;지점에서&amp;nbsp;작은&amp;nbsp;대시보드나&amp;nbsp;상태&amp;nbsp;확인&amp;nbsp;화면이&amp;nbsp;필요해집니다.&amp;nbsp;거창한&amp;nbsp;분석&amp;nbsp;시스템이&amp;nbsp;아니라,&amp;nbsp;운영자가&amp;nbsp;매일&amp;nbsp;한&amp;nbsp;번쯤&amp;nbsp;열어보고&amp;nbsp;서비스의&amp;nbsp;현재&amp;nbsp;상태를&amp;nbsp;감각할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;화면입니다.&amp;nbsp;혼자&amp;nbsp;운영하는&amp;nbsp;서비스일수록&amp;nbsp;이런&amp;nbsp;화면이&amp;nbsp;생각보다&amp;nbsp;중요합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;로그는&amp;nbsp;자세하지만&amp;nbsp;한눈에&amp;nbsp;보이지&amp;nbsp;않습니다&lt;/b&gt; &lt;br /&gt;로그는&amp;nbsp;운영에&amp;nbsp;꼭&amp;nbsp;필요합니다.&amp;nbsp;요청&amp;nbsp;경로,&amp;nbsp;예외&amp;nbsp;메시지,&amp;nbsp;사용자&amp;nbsp;식별자,&amp;nbsp;처리&amp;nbsp;시간&amp;nbsp;같은&amp;nbsp;정보는&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;큰&amp;nbsp;도움이&amp;nbsp;됩니다.&amp;nbsp;구조화된&amp;nbsp;로그를&amp;nbsp;잘&amp;nbsp;남겨두면&amp;nbsp;특정&amp;nbsp;사용자나&amp;nbsp;특정&amp;nbsp;기능을&amp;nbsp;기준으로&amp;nbsp;상황을&amp;nbsp;좁혀볼&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;로그는&amp;nbsp;기본적으로&amp;nbsp;자세한&amp;nbsp;기록입니다.&amp;nbsp;한&amp;nbsp;줄&amp;nbsp;한&amp;nbsp;줄을&amp;nbsp;따라가며&amp;nbsp;맥락을&amp;nbsp;찾아야&amp;nbsp;합니다.&amp;nbsp;어떤&amp;nbsp;문제를&amp;nbsp;이미&amp;nbsp;알고&amp;nbsp;있을&amp;nbsp;때는&amp;nbsp;로그가&amp;nbsp;강력하지만,&amp;nbsp;아직&amp;nbsp;무엇을&amp;nbsp;봐야&amp;nbsp;할지&amp;nbsp;모르는&amp;nbsp;상태에서는&amp;nbsp;오히려&amp;nbsp;부담스럽습니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;어제보다&amp;nbsp;오류가&amp;nbsp;늘었는지,&amp;nbsp;특정&amp;nbsp;작업이&amp;nbsp;계속&amp;nbsp;실패하고&amp;nbsp;있는지,&amp;nbsp;사용자가&amp;nbsp;생성한&amp;nbsp;데이터가&amp;nbsp;정상적으로&amp;nbsp;쌓이고&amp;nbsp;있는지&amp;nbsp;알고&amp;nbsp;싶을&amp;nbsp;때가&amp;nbsp;있습니다.&amp;nbsp;이때&amp;nbsp;모든&amp;nbsp;로그를&amp;nbsp;검색해서&amp;nbsp;판단하는&amp;nbsp;것은&amp;nbsp;번거롭습니다.&amp;nbsp;운영자가&amp;nbsp;먼저&amp;nbsp;봐야&amp;nbsp;할&amp;nbsp;신호는&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;압축된&amp;nbsp;형태로&amp;nbsp;보여야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;상태&amp;nbsp;화면은&amp;nbsp;이&amp;nbsp;역할을&amp;nbsp;합니다.&amp;nbsp;로그가&amp;nbsp;현미경이라면,&amp;nbsp;상태&amp;nbsp;화면은&amp;nbsp;작은&amp;nbsp;지도에&amp;nbsp;가깝습니다.&amp;nbsp;지금&amp;nbsp;어디를&amp;nbsp;봐야&amp;nbsp;하는지&amp;nbsp;알려주는&amp;nbsp;첫&amp;nbsp;화면입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;작은&amp;nbsp;서비스에도&amp;nbsp;관찰&amp;nbsp;가능한&amp;nbsp;지점이&amp;nbsp;필요합니다&lt;/b&gt; &lt;br /&gt;관찰&amp;nbsp;가능성이라는&amp;nbsp;말을&amp;nbsp;쓰면&amp;nbsp;조금&amp;nbsp;거창하게&amp;nbsp;들립니다.&amp;nbsp;대규모&amp;nbsp;시스템,&amp;nbsp;분산&amp;nbsp;추적,&amp;nbsp;메트릭&amp;nbsp;수집,&amp;nbsp;알림&amp;nbsp;체계&amp;nbsp;같은&amp;nbsp;것들이&amp;nbsp;먼저&amp;nbsp;떠오르기&amp;nbsp;때문입니다.&amp;nbsp;하지만&amp;nbsp;작은&amp;nbsp;서비스에서도&amp;nbsp;관찰&amp;nbsp;가능한&amp;nbsp;지점은&amp;nbsp;필요합니다. &lt;br /&gt;&lt;br /&gt;사용자&amp;nbsp;수가&amp;nbsp;많지&amp;nbsp;않아도&amp;nbsp;작업은&amp;nbsp;실패할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;배치&amp;nbsp;작업이&amp;nbsp;멈출&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;외부&amp;nbsp;API&amp;nbsp;호출이&amp;nbsp;실패할&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;특정&amp;nbsp;데이터가&amp;nbsp;예상과&amp;nbsp;다르게&amp;nbsp;쌓일&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;혼자&amp;nbsp;운영하는&amp;nbsp;서비스에서는&amp;nbsp;이런&amp;nbsp;문제를&amp;nbsp;누가&amp;nbsp;대신&amp;nbsp;알려주지&amp;nbsp;않습니다. &lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;처음부터&amp;nbsp;완성된&amp;nbsp;모니터링&amp;nbsp;시스템을&amp;nbsp;만들&amp;nbsp;필요는&amp;nbsp;없지만,&amp;nbsp;최소한&amp;nbsp;자주&amp;nbsp;확인해야&amp;nbsp;할&amp;nbsp;상태는&amp;nbsp;화면으로&amp;nbsp;꺼내두는&amp;nbsp;편이&amp;nbsp;좋습니다.&amp;nbsp;오늘&amp;nbsp;생성된&amp;nbsp;항목&amp;nbsp;수,&amp;nbsp;실패한&amp;nbsp;작업&amp;nbsp;수,&amp;nbsp;최근&amp;nbsp;오류,&amp;nbsp;대기&amp;nbsp;중인&amp;nbsp;작업,&amp;nbsp;오래&amp;nbsp;처리되지&amp;nbsp;않은&amp;nbsp;요청&amp;nbsp;같은&amp;nbsp;정보만&amp;nbsp;있어도&amp;nbsp;운영&amp;nbsp;감각이&amp;nbsp;달라집니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;화면은&amp;nbsp;예쁜&amp;nbsp;차트가&amp;nbsp;아니어도&amp;nbsp;됩니다.&amp;nbsp;숫자&amp;nbsp;몇&amp;nbsp;개와&amp;nbsp;목록&amp;nbsp;몇&amp;nbsp;개로&amp;nbsp;시작해도&amp;nbsp;충분합니다.&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;운영자가&amp;nbsp;지금&amp;nbsp;서비스를&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;입구가&amp;nbsp;있다는&amp;nbsp;점입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;대시보드는&amp;nbsp;의사결정을&amp;nbsp;위한&amp;nbsp;화면이어야&amp;nbsp;합니다&lt;/b&gt; &lt;br /&gt;대시보드를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;조심해야&amp;nbsp;할&amp;nbsp;부분도&amp;nbsp;있습니다.&amp;nbsp;보기&amp;nbsp;좋은&amp;nbsp;숫자를&amp;nbsp;많이&amp;nbsp;모아놓는다고&amp;nbsp;해서&amp;nbsp;좋은&amp;nbsp;운영&amp;nbsp;화면이&amp;nbsp;되는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;오히려&amp;nbsp;너무&amp;nbsp;많은&amp;nbsp;숫자는&amp;nbsp;중요한&amp;nbsp;신호를&amp;nbsp;가리기도&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;혼자&amp;nbsp;운영하는&amp;nbsp;서비스에서&amp;nbsp;대시보드는&amp;nbsp;의사결정과&amp;nbsp;연결되어야&amp;nbsp;합니다.&amp;nbsp;이&amp;nbsp;숫자를&amp;nbsp;보고&amp;nbsp;제가&amp;nbsp;무엇을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;생각해야&amp;nbsp;합니다.&amp;nbsp;실패한&amp;nbsp;작업&amp;nbsp;수가&amp;nbsp;보인다면&amp;nbsp;다시&amp;nbsp;실행하거나&amp;nbsp;원인을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다.&amp;nbsp;미처리&amp;nbsp;문의가&amp;nbsp;보인다면&amp;nbsp;바로&amp;nbsp;상세&amp;nbsp;화면으로&amp;nbsp;들어갈&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다.&amp;nbsp;최근&amp;nbsp;오류가&amp;nbsp;보인다면&amp;nbsp;로그로&amp;nbsp;이어질&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;즉,&amp;nbsp;대시보드는&amp;nbsp;단순한&amp;nbsp;통계판이&amp;nbsp;아니라&amp;nbsp;작업의&amp;nbsp;출발점이어야&amp;nbsp;합니다.&amp;nbsp;숫자를&amp;nbsp;보고&amp;nbsp;끝나는&amp;nbsp;화면보다,&amp;nbsp;숫자를&amp;nbsp;보고&amp;nbsp;다음&amp;nbsp;행동으로&amp;nbsp;넘어갈&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;화면이&amp;nbsp;운영에는&amp;nbsp;더&amp;nbsp;도움이&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;이&amp;nbsp;기준이&amp;nbsp;특히&amp;nbsp;1인&amp;nbsp;서비스에&amp;nbsp;중요하다고&amp;nbsp;느낍니다.&amp;nbsp;시간이&amp;nbsp;넉넉하지&amp;nbsp;않기&amp;nbsp;때문에,&amp;nbsp;화면을&amp;nbsp;열었을&amp;nbsp;때&amp;nbsp;바로&amp;nbsp;확인하고&amp;nbsp;바로&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다.&amp;nbsp;보는&amp;nbsp;화면과&amp;nbsp;일하는&amp;nbsp;화면이&amp;nbsp;너무&amp;nbsp;멀리&amp;nbsp;떨어져&amp;nbsp;있으면&amp;nbsp;결국&amp;nbsp;다시&amp;nbsp;사용하지&amp;nbsp;않게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;로그와&amp;nbsp;상태&amp;nbsp;화면은&amp;nbsp;서로&amp;nbsp;이어져야&amp;nbsp;합니다&lt;/b&gt; &lt;br /&gt;로그와&amp;nbsp;대시보드는&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;역할을&amp;nbsp;하지만,&amp;nbsp;따로&amp;nbsp;떨어져&amp;nbsp;있으면&amp;nbsp;힘이&amp;nbsp;줄어듭니다.&amp;nbsp;상태&amp;nbsp;화면에서&amp;nbsp;이상한&amp;nbsp;신호를&amp;nbsp;발견하면&amp;nbsp;로그로&amp;nbsp;내려갈&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다.&amp;nbsp;반대로&amp;nbsp;로그에서&amp;nbsp;반복되는&amp;nbsp;오류를&amp;nbsp;발견했다면,&amp;nbsp;다음에는&amp;nbsp;그&amp;nbsp;오류를&amp;nbsp;상태&amp;nbsp;화면에서&amp;nbsp;빨리&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;정리할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;최근&amp;nbsp;24시간&amp;nbsp;동안&amp;nbsp;실패한&amp;nbsp;작업&amp;nbsp;수를&amp;nbsp;대시보드에&amp;nbsp;보여준다고&amp;nbsp;가정해보겠습니다.&amp;nbsp;숫자만&amp;nbsp;보여주면&amp;nbsp;아쉬움이&amp;nbsp;남습니다.&amp;nbsp;클릭했을&amp;nbsp;때&amp;nbsp;실패한&amp;nbsp;작업&amp;nbsp;목록으로&amp;nbsp;들어가고,&amp;nbsp;각&amp;nbsp;항목에서&amp;nbsp;관련&amp;nbsp;로그나&amp;nbsp;오류&amp;nbsp;메시지를&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있으면&amp;nbsp;훨씬&amp;nbsp;실용적입니다. &lt;br /&gt;&lt;br /&gt;또한&amp;nbsp;로그에&amp;nbsp;남긴&amp;nbsp;요청&amp;nbsp;ID나&amp;nbsp;작업&amp;nbsp;ID를&amp;nbsp;상태&amp;nbsp;화면에서도&amp;nbsp;함께&amp;nbsp;보여주면&amp;nbsp;문제를&amp;nbsp;추적하기&amp;nbsp;쉬워집니다.&amp;nbsp;로그를&amp;nbsp;잘&amp;nbsp;남기는&amp;nbsp;것과&amp;nbsp;운영&amp;nbsp;화면을&amp;nbsp;잘&amp;nbsp;만드는&amp;nbsp;일은&amp;nbsp;결국&amp;nbsp;같은&amp;nbsp;방향을&amp;nbsp;향합니다.&amp;nbsp;나중에&amp;nbsp;원인을&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;맥락을&amp;nbsp;남기는&amp;nbsp;일입니다. &lt;br /&gt;&lt;br /&gt;이런&amp;nbsp;연결은&amp;nbsp;처음부터&amp;nbsp;완벽할&amp;nbsp;필요가&amp;nbsp;없습니다.&amp;nbsp;중요한&amp;nbsp;작업부터&amp;nbsp;하나씩&amp;nbsp;이어두면&amp;nbsp;됩니다.&amp;nbsp;실패한&amp;nbsp;생성&amp;nbsp;작업,&amp;nbsp;결제&amp;nbsp;실패,&amp;nbsp;외부&amp;nbsp;API&amp;nbsp;오류,&amp;nbsp;오래&amp;nbsp;걸리는&amp;nbsp;요청처럼&amp;nbsp;운영자가&amp;nbsp;실제로&amp;nbsp;불안해하는&amp;nbsp;지점부터&amp;nbsp;화면으로&amp;nbsp;꺼내면&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;닷넷에서는&amp;nbsp;작은&amp;nbsp;상태&amp;nbsp;API부터&amp;nbsp;시작할&amp;nbsp;수&amp;nbsp;있습니다&lt;/b&gt; &lt;br /&gt;닷넷&amp;nbsp;기반&amp;nbsp;서비스라면&amp;nbsp;처음부터&amp;nbsp;복잡한&amp;nbsp;대시보드&amp;nbsp;시스템을&amp;nbsp;붙이지&amp;nbsp;않아도&amp;nbsp;됩니다.&amp;nbsp;ASP.NET&amp;nbsp;Core에서&amp;nbsp;간단한&amp;nbsp;관리자용&amp;nbsp;API를&amp;nbsp;만들고,&amp;nbsp;필요한&amp;nbsp;상태&amp;nbsp;데이터를&amp;nbsp;모아&amp;nbsp;내려주는&amp;nbsp;것만으로도&amp;nbsp;시작할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;/api/admin/status&amp;nbsp;같은&amp;nbsp;엔드포인트에서&amp;nbsp;오늘의&amp;nbsp;가입자&amp;nbsp;수,&amp;nbsp;최근&amp;nbsp;오류&amp;nbsp;수,&amp;nbsp;실패한&amp;nbsp;작업&amp;nbsp;수,&amp;nbsp;대기&amp;nbsp;중인&amp;nbsp;작업&amp;nbsp;수를&amp;nbsp;내려줄&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;React&amp;nbsp;화면에서는&amp;nbsp;이&amp;nbsp;데이터를&amp;nbsp;TanStack&amp;nbsp;Query로&amp;nbsp;가져와&amp;nbsp;카드나&amp;nbsp;목록으로&amp;nbsp;보여주면&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;이때&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;데이터의&amp;nbsp;기준입니다.&amp;nbsp;오늘이라는&amp;nbsp;범위를&amp;nbsp;어느&amp;nbsp;시간대로&amp;nbsp;볼&amp;nbsp;것인지,&amp;nbsp;실패&amp;nbsp;상태는&amp;nbsp;어떤&amp;nbsp;값을&amp;nbsp;기준으로&amp;nbsp;볼&amp;nbsp;것인지,&amp;nbsp;운영자가&amp;nbsp;직접&amp;nbsp;처리해야&amp;nbsp;하는&amp;nbsp;항목과&amp;nbsp;자동&amp;nbsp;재시도될&amp;nbsp;항목을&amp;nbsp;어떻게&amp;nbsp;구분할&amp;nbsp;것인지&amp;nbsp;정해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;결국&amp;nbsp;상태&amp;nbsp;화면을&amp;nbsp;만든다는&amp;nbsp;것은&amp;nbsp;단순히&amp;nbsp;SQL을&amp;nbsp;몇&amp;nbsp;개&amp;nbsp;작성하는&amp;nbsp;일이&amp;nbsp;아닙니다.&amp;nbsp;서비스의&amp;nbsp;현재&amp;nbsp;상태를&amp;nbsp;어떤&amp;nbsp;언어로&amp;nbsp;설명할지&amp;nbsp;정하는&amp;nbsp;일에&amp;nbsp;가깝습니다.&amp;nbsp;이&amp;nbsp;기준이&amp;nbsp;생기면&amp;nbsp;운영이&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;차분해집니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;처음에&amp;nbsp;볼&amp;nbsp;만한&amp;nbsp;항목들&lt;/b&gt; &lt;br /&gt;작은&amp;nbsp;서비스에서&amp;nbsp;처음&amp;nbsp;대시보드에&amp;nbsp;올릴&amp;nbsp;만한&amp;nbsp;항목은&amp;nbsp;많지&amp;nbsp;않아도&amp;nbsp;됩니다.&amp;nbsp;오히려&amp;nbsp;적은&amp;nbsp;편이&amp;nbsp;좋습니다.&amp;nbsp;제가&amp;nbsp;먼저&amp;nbsp;생각하는&amp;nbsp;항목은&amp;nbsp;다음과&amp;nbsp;같습니다. &lt;br /&gt;&lt;br /&gt;최근&amp;nbsp;24시간&amp;nbsp;동안&amp;nbsp;생성된&amp;nbsp;주요&amp;nbsp;데이터&amp;nbsp;수 &lt;br /&gt;최근&amp;nbsp;24시간&amp;nbsp;동안&amp;nbsp;발생한&amp;nbsp;오류&amp;nbsp;수 &lt;br /&gt;실패&amp;nbsp;상태로&amp;nbsp;남아&amp;nbsp;있는&amp;nbsp;작업&amp;nbsp;목록 &lt;br /&gt;처리&amp;nbsp;대기&amp;nbsp;중인&amp;nbsp;요청이나&amp;nbsp;문의&amp;nbsp;수 &lt;br /&gt;최근&amp;nbsp;배포&amp;nbsp;이후&amp;nbsp;발생한&amp;nbsp;주요&amp;nbsp;예외 &lt;br /&gt;이&amp;nbsp;정도만&amp;nbsp;있어도&amp;nbsp;매일&amp;nbsp;서비스를&amp;nbsp;확인하는&amp;nbsp;기준이&amp;nbsp;생깁니다.&amp;nbsp;사용자가&amp;nbsp;많지&amp;nbsp;않은&amp;nbsp;단계에서는&amp;nbsp;숫자가&amp;nbsp;작을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그래도&amp;nbsp;괜찮습니다.&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;숫자의&amp;nbsp;크기가&amp;nbsp;아니라&amp;nbsp;흐름을&amp;nbsp;보는&amp;nbsp;습관입니다. &lt;br /&gt;&lt;br /&gt;나중에&amp;nbsp;필요해지면&amp;nbsp;응답&amp;nbsp;시간,&amp;nbsp;외부&amp;nbsp;API&amp;nbsp;실패율,&amp;nbsp;결제&amp;nbsp;전환,&amp;nbsp;기능별&amp;nbsp;사용량&amp;nbsp;같은&amp;nbsp;항목을&amp;nbsp;추가할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;처음부터&amp;nbsp;모든&amp;nbsp;것을&amp;nbsp;넣으려&amp;nbsp;하면&amp;nbsp;화면이&amp;nbsp;무거워지고,&amp;nbsp;운영자가&amp;nbsp;실제로&amp;nbsp;보지&amp;nbsp;않는&amp;nbsp;정보가&amp;nbsp;늘어납니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;상태&amp;nbsp;화면은&amp;nbsp;불안을&amp;nbsp;줄이기&amp;nbsp;위한&amp;nbsp;도구입니다&lt;/b&gt; &lt;br /&gt;혼자&amp;nbsp;서비스를&amp;nbsp;만들고&amp;nbsp;운영하다&amp;nbsp;보면&amp;nbsp;작은&amp;nbsp;불안이&amp;nbsp;계속&amp;nbsp;생깁니다.&amp;nbsp;사용자가&amp;nbsp;작업하다가&amp;nbsp;막히지는&amp;nbsp;않았을까,&amp;nbsp;어제&amp;nbsp;배포한&amp;nbsp;기능이&amp;nbsp;제대로&amp;nbsp;동작하고&amp;nbsp;있을까,&amp;nbsp;백그라운드&amp;nbsp;작업이&amp;nbsp;멈춰&amp;nbsp;있지는&amp;nbsp;않을까&amp;nbsp;하는&amp;nbsp;생각입니다. &lt;br /&gt;&lt;br /&gt;상태&amp;nbsp;화면은&amp;nbsp;이&amp;nbsp;불안을&amp;nbsp;완전히&amp;nbsp;없애주지는&amp;nbsp;않습니다.&amp;nbsp;하지만&amp;nbsp;불안을&amp;nbsp;확인&amp;nbsp;가능한&amp;nbsp;항목으로&amp;nbsp;바꿔줍니다.&amp;nbsp;막연히&amp;nbsp;걱정하는&amp;nbsp;대신&amp;nbsp;오늘의&amp;nbsp;실패&amp;nbsp;목록을&amp;nbsp;보고,&amp;nbsp;최근&amp;nbsp;오류를&amp;nbsp;확인하고,&amp;nbsp;필요한&amp;nbsp;작업을&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;해줍니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;점에서&amp;nbsp;상태&amp;nbsp;화면은&amp;nbsp;운영자의&amp;nbsp;정신적인&amp;nbsp;부담을&amp;nbsp;줄이는&amp;nbsp;도구이기도&amp;nbsp;합니다.&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;어디를&amp;nbsp;봐야&amp;nbsp;하는지&amp;nbsp;알고&amp;nbsp;있으면,&amp;nbsp;서비스&amp;nbsp;운영이&amp;nbsp;조금&amp;nbsp;덜&amp;nbsp;막막해집니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;마무리&lt;/b&gt; &lt;br /&gt;로그는&amp;nbsp;서비스&amp;nbsp;운영의&amp;nbsp;중요한&amp;nbsp;기록입니다.&amp;nbsp;하지만&amp;nbsp;로그만으로는&amp;nbsp;지금&amp;nbsp;서비스가&amp;nbsp;어떤&amp;nbsp;상태인지&amp;nbsp;한눈에&amp;nbsp;보기&amp;nbsp;어렵습니다.&amp;nbsp;작은&amp;nbsp;서비스에서도&amp;nbsp;현재&amp;nbsp;상태를&amp;nbsp;압축해서&amp;nbsp;보여주는&amp;nbsp;화면이&amp;nbsp;필요합니다. &lt;br /&gt;&lt;br /&gt;대시보드는&amp;nbsp;처음부터&amp;nbsp;거창할&amp;nbsp;필요가&amp;nbsp;없습니다.&amp;nbsp;오늘의&amp;nbsp;주요&amp;nbsp;숫자,&amp;nbsp;실패한&amp;nbsp;작업,&amp;nbsp;최근&amp;nbsp;오류,&amp;nbsp;처리해야&amp;nbsp;할&amp;nbsp;항목&amp;nbsp;정도로&amp;nbsp;시작해도&amp;nbsp;충분합니다.&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;그&amp;nbsp;화면이&amp;nbsp;다음&amp;nbsp;행동으로&amp;nbsp;이어지는가입니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;요즘&amp;nbsp;작은&amp;nbsp;서비스를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;로그&amp;nbsp;다음에는&amp;nbsp;상태&amp;nbsp;화면을&amp;nbsp;생각하게&amp;nbsp;됩니다.&amp;nbsp;기록을&amp;nbsp;남기는&amp;nbsp;것에서&amp;nbsp;한&amp;nbsp;걸음&amp;nbsp;더&amp;nbsp;나아가,&amp;nbsp;그&amp;nbsp;기록을&amp;nbsp;운영자가&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;형태로&amp;nbsp;정리하는&amp;nbsp;일입니다.&amp;nbsp;아직&amp;nbsp;완성된&amp;nbsp;기준은&amp;nbsp;아니지만,&amp;nbsp;혼자&amp;nbsp;오래&amp;nbsp;운영할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;서비스를&amp;nbsp;만들기&amp;nbsp;위해&amp;nbsp;계속&amp;nbsp;다듬어가야&amp;nbsp;할&amp;nbsp;부분이라고&amp;nbsp;느낍니다.&lt;/p&gt;</description>
      <category>만드는 기록/서비스 운영기</category>
      <category>Dashboard</category>
      <category>Logging</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/117</guid>
      <comments>https://roslyndev.tistory.com/117#entry117comment</comments>
      <pubDate>Thu, 9 Jul 2026 19:23:10 +0900</pubDate>
    </item>
    <item>
      <title>BFF 구조에서 리액트는 화면에 집중하고 인증은 서버가 맡는 방식</title>
      <link>https://roslyndev.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드를&amp;nbsp;리액트로&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;어느&amp;nbsp;순간&amp;nbsp;인증&amp;nbsp;처리를&amp;nbsp;어디까지&amp;nbsp;맡겨야&amp;nbsp;하는지&amp;nbsp;고민하게&amp;nbsp;됩니다.&amp;nbsp;화면을&amp;nbsp;그리는&amp;nbsp;일은&amp;nbsp;리액트가&amp;nbsp;잘합니다.&amp;nbsp;상태를&amp;nbsp;다루고,&amp;nbsp;컴포넌트를&amp;nbsp;나누고,&amp;nbsp;사용자와&amp;nbsp;빠르게&amp;nbsp;상호작용하는&amp;nbsp;것도&amp;nbsp;리액트의&amp;nbsp;장점입니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;인증은&amp;nbsp;조금&amp;nbsp;다릅니다.&amp;nbsp;토큰을&amp;nbsp;어디에&amp;nbsp;저장할지,&amp;nbsp;쿠키는&amp;nbsp;어떻게&amp;nbsp;다룰지,&amp;nbsp;API&amp;nbsp;호출&amp;nbsp;권한은&amp;nbsp;어디서&amp;nbsp;확인할지,&amp;nbsp;새로고침&amp;nbsp;후&amp;nbsp;세션은&amp;nbsp;어떻게&amp;nbsp;유지할지&amp;nbsp;같은&amp;nbsp;문제들이&amp;nbsp;따라옵니다.&amp;nbsp;처음에는&amp;nbsp;단순해&amp;nbsp;보이지만,&amp;nbsp;실제&amp;nbsp;서비스를&amp;nbsp;운영하려고&amp;nbsp;하면&amp;nbsp;생각보다&amp;nbsp;신경&amp;nbsp;쓸&amp;nbsp;부분이&amp;nbsp;많아집니다. &lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;요즘&amp;nbsp;다시&amp;nbsp;관심을&amp;nbsp;두고&amp;nbsp;있는&amp;nbsp;구조가&amp;nbsp;BFF입니다.&amp;nbsp;Backend&amp;nbsp;for&amp;nbsp;Frontend의&amp;nbsp;줄임말인데,&amp;nbsp;이름&amp;nbsp;그대로&amp;nbsp;프론트엔드를&amp;nbsp;위한&amp;nbsp;백엔드&amp;nbsp;계층을&amp;nbsp;하나&amp;nbsp;두는&amp;nbsp;방식입니다.&amp;nbsp;저는&amp;nbsp;이&amp;nbsp;구조를&amp;nbsp;&amp;ldquo;서버사이드가&amp;nbsp;프론트엔드를&amp;nbsp;한&amp;nbsp;번&amp;nbsp;감싸주는&amp;nbsp;방식&amp;rdquo;으로&amp;nbsp;이해하고&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;리액트가&amp;nbsp;모든&amp;nbsp;것을&amp;nbsp;직접&amp;nbsp;알&amp;nbsp;필요는&amp;nbsp;없습니다&lt;/b&gt; &lt;br /&gt;SPA&amp;nbsp;구조에서는&amp;nbsp;리액트&amp;nbsp;앱이&amp;nbsp;브라우저에서&amp;nbsp;실행되고,&amp;nbsp;필요한&amp;nbsp;데이터를&amp;nbsp;API로&amp;nbsp;직접&amp;nbsp;가져오는&amp;nbsp;흐름이&amp;nbsp;자연스럽습니다.&amp;nbsp;이&amp;nbsp;방식&amp;nbsp;자체가&amp;nbsp;나쁜&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;작은&amp;nbsp;서비스나&amp;nbsp;내부&amp;nbsp;도구에서는&amp;nbsp;충분히&amp;nbsp;단순하고&amp;nbsp;빠르게&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;문제는&amp;nbsp;인증과&amp;nbsp;권한&amp;nbsp;처리까지&amp;nbsp;브라우저&amp;nbsp;쪽으로&amp;nbsp;많이&amp;nbsp;내려왔을&amp;nbsp;때입니다.&amp;nbsp;액세스&amp;nbsp;토큰을&amp;nbsp;브라우저에&amp;nbsp;저장해야&amp;nbsp;하고,&amp;nbsp;갱신&amp;nbsp;토큰을&amp;nbsp;어떻게&amp;nbsp;보호할지도&amp;nbsp;고민해야&amp;nbsp;합니다.&amp;nbsp;API&amp;nbsp;서버&amp;nbsp;주소나&amp;nbsp;인증&amp;nbsp;흐름도&amp;nbsp;프론트엔드&amp;nbsp;코드에서&amp;nbsp;점점&amp;nbsp;많이&amp;nbsp;알게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;BFF&amp;nbsp;구조에서는&amp;nbsp;이&amp;nbsp;부담을&amp;nbsp;조금&amp;nbsp;다르게&amp;nbsp;나눕니다.&amp;nbsp;사용자는&amp;nbsp;먼저&amp;nbsp;서버사이드에&amp;nbsp;접근합니다.&amp;nbsp;서버는&amp;nbsp;사용자가&amp;nbsp;로그인되어&amp;nbsp;있는지&amp;nbsp;확인합니다.&amp;nbsp;조회&amp;nbsp;가능한&amp;nbsp;페이지라면&amp;nbsp;리액트&amp;nbsp;앱을&amp;nbsp;내려주고,&amp;nbsp;리액트는&amp;nbsp;그&amp;nbsp;안에서&amp;nbsp;화면을&amp;nbsp;그립니다.&amp;nbsp;반대로&amp;nbsp;권한이&amp;nbsp;없거나&amp;nbsp;인증이&amp;nbsp;필요한&amp;nbsp;상태라면&amp;nbsp;서버가&amp;nbsp;먼저&amp;nbsp;막거나&amp;nbsp;로그인&amp;nbsp;흐름으로&amp;nbsp;보냅니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;서버사이드가&amp;nbsp;문지기&amp;nbsp;역할을&amp;nbsp;합니다&lt;/b&gt; &lt;br /&gt;이&amp;nbsp;구조에서&amp;nbsp;중요한&amp;nbsp;점은&amp;nbsp;서버사이드가&amp;nbsp;문지기&amp;nbsp;역할을&amp;nbsp;한다는&amp;nbsp;것입니다.&amp;nbsp;브라우저에&amp;nbsp;있는&amp;nbsp;리액트&amp;nbsp;앱이&amp;nbsp;&amp;ldquo;이&amp;nbsp;사용자가&amp;nbsp;누구인지&amp;rdquo;를&amp;nbsp;모든&amp;nbsp;책임으로&amp;nbsp;들고&amp;nbsp;있지&amp;nbsp;않습니다.&amp;nbsp;서버가&amp;nbsp;먼저&amp;nbsp;세션이나&amp;nbsp;쿠키를&amp;nbsp;확인하고,&amp;nbsp;이&amp;nbsp;사용자가&amp;nbsp;이&amp;nbsp;화면에&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;판단합니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;관리자&amp;nbsp;페이지가&amp;nbsp;있다고&amp;nbsp;가정해보겠습니다.&amp;nbsp;사용자가&amp;nbsp;/admin&amp;nbsp;경로에&amp;nbsp;접근하면&amp;nbsp;서버가&amp;nbsp;먼저&amp;nbsp;인증&amp;nbsp;상태를&amp;nbsp;확인합니다.&amp;nbsp;권한이&amp;nbsp;있으면&amp;nbsp;리액트&amp;nbsp;앱과&amp;nbsp;필요한&amp;nbsp;초기&amp;nbsp;정보를&amp;nbsp;내려줍니다.&amp;nbsp;권한이&amp;nbsp;없으면&amp;nbsp;리액트가&amp;nbsp;렌더링되기도&amp;nbsp;전에&amp;nbsp;접근을&amp;nbsp;막습니다. &lt;br /&gt;&lt;br /&gt;이렇게&amp;nbsp;하면&amp;nbsp;프론트엔드는&amp;nbsp;화면에&amp;nbsp;집중할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;물론&amp;nbsp;리액트&amp;nbsp;안에서도&amp;nbsp;사용자의&amp;nbsp;상태에&amp;nbsp;따라&amp;nbsp;버튼을&amp;nbsp;숨기거나&amp;nbsp;메뉴를&amp;nbsp;다르게&amp;nbsp;보여줄&amp;nbsp;수는&amp;nbsp;있습니다.&amp;nbsp;하지만&amp;nbsp;그것은&amp;nbsp;사용자&amp;nbsp;경험을&amp;nbsp;위한&amp;nbsp;처리이지,&amp;nbsp;최종&amp;nbsp;보안&amp;nbsp;판단의&amp;nbsp;기준이&amp;nbsp;되어서는&amp;nbsp;안&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;조회&amp;nbsp;가능한&amp;nbsp;페이지라면&amp;nbsp;리액트가&amp;nbsp;그립니다&lt;/b&gt; &lt;br /&gt;BFF를&amp;nbsp;쓴다고&amp;nbsp;해서&amp;nbsp;모든&amp;nbsp;화면을&amp;nbsp;서버&amp;nbsp;렌더링으로&amp;nbsp;만들어야&amp;nbsp;하는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;제가&amp;nbsp;관심&amp;nbsp;있는&amp;nbsp;방식은&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;현실적인&amp;nbsp;절충입니다.&amp;nbsp;인증과&amp;nbsp;접근&amp;nbsp;가능&amp;nbsp;여부는&amp;nbsp;서버가&amp;nbsp;확인하고,&amp;nbsp;실제&amp;nbsp;화면&amp;nbsp;구성은&amp;nbsp;리액트가&amp;nbsp;맡는&amp;nbsp;방식입니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;방식에서는&amp;nbsp;서버가&amp;nbsp;먼저&amp;nbsp;&amp;ldquo;이&amp;nbsp;사용자가&amp;nbsp;이&amp;nbsp;페이지를&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는가&amp;rdquo;를&amp;nbsp;확인합니다.&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;리액트&amp;nbsp;앱을&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;HTML을&amp;nbsp;내려줍니다.&amp;nbsp;이후&amp;nbsp;화면&amp;nbsp;안에서&amp;nbsp;필요한&amp;nbsp;데이터는&amp;nbsp;BFF를&amp;nbsp;통해&amp;nbsp;가져오게&amp;nbsp;합니다.&amp;nbsp;리액트는&amp;nbsp;외부&amp;nbsp;API를&amp;nbsp;직접&amp;nbsp;호출하기보다,&amp;nbsp;같은&amp;nbsp;서버의&amp;nbsp;엔드포인트를&amp;nbsp;호출하는&amp;nbsp;형태가&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;구조가&amp;nbsp;좋은&amp;nbsp;이유는&amp;nbsp;역할이&amp;nbsp;비교적&amp;nbsp;분명해지기&amp;nbsp;때문입니다.&amp;nbsp;서버는&amp;nbsp;인증,&amp;nbsp;권한,&amp;nbsp;민감한&amp;nbsp;API&amp;nbsp;호출,&amp;nbsp;외부&amp;nbsp;서비스&amp;nbsp;연동을&amp;nbsp;맡습니다.&amp;nbsp;리액트는&amp;nbsp;화면&amp;nbsp;상태,&amp;nbsp;사용자&amp;nbsp;입력,&amp;nbsp;목록과&amp;nbsp;상세&amp;nbsp;화면,&amp;nbsp;컴포넌트&amp;nbsp;구성을&amp;nbsp;맡습니다.&amp;nbsp;서로의&amp;nbsp;책임이&amp;nbsp;겹치지&amp;nbsp;않도록&amp;nbsp;선을&amp;nbsp;그을&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;토큰을&amp;nbsp;브라우저에&amp;nbsp;오래&amp;nbsp;들고&amp;nbsp;있지&amp;nbsp;않아도&amp;nbsp;됩니다&lt;/b&gt; &lt;br /&gt;BFF&amp;nbsp;구조를&amp;nbsp;선택하는&amp;nbsp;이유&amp;nbsp;중&amp;nbsp;하나는&amp;nbsp;토큰&amp;nbsp;관리입니다.&amp;nbsp;브라우저&amp;nbsp;안에&amp;nbsp;액세스&amp;nbsp;토큰이나&amp;nbsp;갱신&amp;nbsp;토큰을&amp;nbsp;직접&amp;nbsp;보관하는&amp;nbsp;방식은&amp;nbsp;늘&amp;nbsp;조심스럽습니다.&amp;nbsp;저장&amp;nbsp;위치에&amp;nbsp;따라&amp;nbsp;XSS&amp;nbsp;같은&amp;nbsp;공격에&amp;nbsp;취약해질&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;만료와&amp;nbsp;갱신&amp;nbsp;흐름도&amp;nbsp;프론트엔드&amp;nbsp;코드에&amp;nbsp;많이&amp;nbsp;들어가게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;BFF를&amp;nbsp;두면&amp;nbsp;민감한&amp;nbsp;토큰은&amp;nbsp;서버&amp;nbsp;쪽에서&amp;nbsp;다루고,&amp;nbsp;브라우저에는&amp;nbsp;세션&amp;nbsp;쿠키만&amp;nbsp;전달하는&amp;nbsp;방식으로&amp;nbsp;정리할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;물론&amp;nbsp;쿠키도&amp;nbsp;안전하게&amp;nbsp;설정해야&amp;nbsp;합니다.&amp;nbsp;HttpOnly,&amp;nbsp;Secure,&amp;nbsp;SameSite&amp;nbsp;같은&amp;nbsp;설정을&amp;nbsp;제대로&amp;nbsp;해야&amp;nbsp;하고,&amp;nbsp;CSRF에&amp;nbsp;대한&amp;nbsp;고려도&amp;nbsp;필요합니다. &lt;br /&gt;&lt;br /&gt;다만&amp;nbsp;중요한&amp;nbsp;차이는&amp;nbsp;있습니다.&amp;nbsp;프론트엔드&amp;nbsp;코드가&amp;nbsp;직접&amp;nbsp;토큰을&amp;nbsp;읽고&amp;nbsp;들고&amp;nbsp;다니는&amp;nbsp;구조보다,&amp;nbsp;서버가&amp;nbsp;인증&amp;nbsp;흐름을&amp;nbsp;감싸는&amp;nbsp;구조가&amp;nbsp;운영&amp;nbsp;관점에서는&amp;nbsp;더&amp;nbsp;다루기&amp;nbsp;쉬울&amp;nbsp;때가&amp;nbsp;많습니다.&amp;nbsp;특히&amp;nbsp;혼자&amp;nbsp;서비스를&amp;nbsp;만들고&amp;nbsp;운영하는&amp;nbsp;입장에서는&amp;nbsp;인증&amp;nbsp;관련&amp;nbsp;코드를&amp;nbsp;여러&amp;nbsp;군데&amp;nbsp;흩뿌리지&amp;nbsp;않는&amp;nbsp;것이&amp;nbsp;중요합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;API도&amp;nbsp;프론트엔드&amp;nbsp;전용으로&amp;nbsp;정리할&amp;nbsp;수&amp;nbsp;있습니다&lt;/b&gt; &lt;br /&gt;BFF의&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;장점은&amp;nbsp;프론트엔드에&amp;nbsp;맞춘&amp;nbsp;API를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;점입니다.&amp;nbsp;실제&amp;nbsp;내부&amp;nbsp;API나&amp;nbsp;외부&amp;nbsp;API는&amp;nbsp;서비스&amp;nbsp;구조에&amp;nbsp;맞게&amp;nbsp;복잡할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;하지만&amp;nbsp;화면에서&amp;nbsp;필요한&amp;nbsp;데이터는&amp;nbsp;조금&amp;nbsp;다릅니다.&amp;nbsp;한&amp;nbsp;화면을&amp;nbsp;그리기&amp;nbsp;위해&amp;nbsp;여러&amp;nbsp;API를&amp;nbsp;호출해야&amp;nbsp;할&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;반대로&amp;nbsp;너무&amp;nbsp;많은&amp;nbsp;데이터가&amp;nbsp;내려올&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;BFF는&amp;nbsp;이&amp;nbsp;중간에서&amp;nbsp;화면에&amp;nbsp;맞는&amp;nbsp;형태로&amp;nbsp;데이터를&amp;nbsp;정리해줄&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;리액트는&amp;nbsp;여러&amp;nbsp;내부&amp;nbsp;시스템의&amp;nbsp;구조를&amp;nbsp;몰라도&amp;nbsp;됩니다.&amp;nbsp;화면에&amp;nbsp;필요한&amp;nbsp;모델만&amp;nbsp;받아서&amp;nbsp;렌더링하면&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;대시보드&amp;nbsp;화면이&amp;nbsp;있다고&amp;nbsp;하면,&amp;nbsp;BFF가&amp;nbsp;사용자&amp;nbsp;정보,&amp;nbsp;알림&amp;nbsp;개수,&amp;nbsp;최근&amp;nbsp;활동,&amp;nbsp;권한&amp;nbsp;정보를&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;조합해서&amp;nbsp;내려줄&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;리액트는&amp;nbsp;그&amp;nbsp;결과를&amp;nbsp;받아&amp;nbsp;화면을&amp;nbsp;그립니다.&amp;nbsp;내부&amp;nbsp;API가&amp;nbsp;나중에&amp;nbsp;바뀌어도,&amp;nbsp;BFF&amp;nbsp;계층에서&amp;nbsp;맞춰줄&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;프론트엔드의&amp;nbsp;변경&amp;nbsp;범위를&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;단점도&amp;nbsp;있습니다&lt;/b&gt; &lt;br /&gt;물론&amp;nbsp;BFF가&amp;nbsp;항상&amp;nbsp;정답은&amp;nbsp;아닙니다.&amp;nbsp;백엔드&amp;nbsp;계층이&amp;nbsp;하나&amp;nbsp;더&amp;nbsp;생긴다는&amp;nbsp;것은&amp;nbsp;관리할&amp;nbsp;코드가&amp;nbsp;늘어난다는&amp;nbsp;뜻이기도&amp;nbsp;합니다.&amp;nbsp;단순한&amp;nbsp;정적&amp;nbsp;사이트나&amp;nbsp;인증이&amp;nbsp;거의&amp;nbsp;없는&amp;nbsp;서비스라면&amp;nbsp;오히려&amp;nbsp;구조가&amp;nbsp;무거워질&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;또한&amp;nbsp;BFF가&amp;nbsp;모든&amp;nbsp;것을&amp;nbsp;대신해주다&amp;nbsp;보면,&amp;nbsp;어느&amp;nbsp;순간&amp;nbsp;화면&amp;nbsp;전용&amp;nbsp;로직이&amp;nbsp;서버에&amp;nbsp;너무&amp;nbsp;많이&amp;nbsp;쌓일&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;그러면&amp;nbsp;서버도&amp;nbsp;복잡해지고,&amp;nbsp;프론트엔드도&amp;nbsp;서버&amp;nbsp;응답에&amp;nbsp;과하게&amp;nbsp;묶일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그래서&amp;nbsp;BFF를&amp;nbsp;둘&amp;nbsp;때는&amp;nbsp;&amp;ldquo;보안과&amp;nbsp;조합은&amp;nbsp;서버가&amp;nbsp;맡고,&amp;nbsp;표현과&amp;nbsp;상호작용은&amp;nbsp;프론트가&amp;nbsp;맡는다&amp;rdquo;는&amp;nbsp;기준을&amp;nbsp;계속&amp;nbsp;유지해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;작은&amp;nbsp;서비스에서는&amp;nbsp;특히&amp;nbsp;더&amp;nbsp;그렇습니다.&amp;nbsp;구조가&amp;nbsp;좋아&amp;nbsp;보여도&amp;nbsp;혼자&amp;nbsp;감당하기&amp;nbsp;어려우면&amp;nbsp;오래&amp;nbsp;유지하기&amp;nbsp;어렵습니다.&amp;nbsp;그래서&amp;nbsp;BFF도&amp;nbsp;처음부터&amp;nbsp;크게&amp;nbsp;만들기보다,&amp;nbsp;인증과&amp;nbsp;민감한&amp;nbsp;API&amp;nbsp;호출을&amp;nbsp;감싸는&amp;nbsp;작은&amp;nbsp;계층으로&amp;nbsp;시작하는&amp;nbsp;편이&amp;nbsp;현실적이라고&amp;nbsp;생각합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;닷넷으로&amp;nbsp;만들&amp;nbsp;때의&amp;nbsp;느낌&lt;/b&gt; &lt;br /&gt;닷넷&amp;nbsp;환경에서는&amp;nbsp;ASP.NET&amp;nbsp;Core가&amp;nbsp;이&amp;nbsp;BFF&amp;nbsp;역할을&amp;nbsp;맡기에&amp;nbsp;꽤&amp;nbsp;자연스럽습니다.&amp;nbsp;쿠키&amp;nbsp;기반&amp;nbsp;인증,&amp;nbsp;정책&amp;nbsp;기반&amp;nbsp;권한&amp;nbsp;처리,&amp;nbsp;API&amp;nbsp;라우팅,&amp;nbsp;정적&amp;nbsp;파일&amp;nbsp;제공,&amp;nbsp;프록시&amp;nbsp;구성&amp;nbsp;등을&amp;nbsp;한&amp;nbsp;서버&amp;nbsp;안에서&amp;nbsp;비교적&amp;nbsp;안정적으로&amp;nbsp;다룰&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;리액트&amp;nbsp;앱은&amp;nbsp;빌드된&amp;nbsp;정적&amp;nbsp;파일로&amp;nbsp;배포하고,&amp;nbsp;ASP.NET&amp;nbsp;Core가&amp;nbsp;해당&amp;nbsp;파일을&amp;nbsp;내려주면서&amp;nbsp;인증이&amp;nbsp;필요한&amp;nbsp;경로를&amp;nbsp;감싸는&amp;nbsp;방식으로&amp;nbsp;구성할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;필요한&amp;nbsp;경우&amp;nbsp;서버&amp;nbsp;API는&amp;nbsp;/api&amp;nbsp;같은&amp;nbsp;경로로&amp;nbsp;노출하고,&amp;nbsp;리액트는&amp;nbsp;같은&amp;nbsp;출처의&amp;nbsp;API를&amp;nbsp;호출하게&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;이렇게&amp;nbsp;하면&amp;nbsp;CORS&amp;nbsp;설정이나&amp;nbsp;토큰&amp;nbsp;전달&amp;nbsp;문제도&amp;nbsp;줄어듭니다.&amp;nbsp;브라우저&amp;nbsp;입장에서는&amp;nbsp;같은&amp;nbsp;서버와&amp;nbsp;통신하는&amp;nbsp;구조가&amp;nbsp;되고,&amp;nbsp;서버는&amp;nbsp;내부적으로&amp;nbsp;필요한&amp;nbsp;서비스나&amp;nbsp;데이터베이스에&amp;nbsp;접근합니다.&amp;nbsp;구조가&amp;nbsp;단순해지는&amp;nbsp;만큼,&amp;nbsp;장애가&amp;nbsp;났을&amp;nbsp;때&amp;nbsp;원인을&amp;nbsp;추적하기도&amp;nbsp;쉬워질&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;제가&amp;nbsp;이&amp;nbsp;구조를&amp;nbsp;보는&amp;nbsp;이유&lt;/b&gt; &lt;br /&gt;저는&amp;nbsp;요즘&amp;nbsp;서비스를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;&amp;ldquo;기능을&amp;nbsp;얼마나&amp;nbsp;많이&amp;nbsp;넣을&amp;nbsp;수&amp;nbsp;있는가&amp;rdquo;보다&amp;nbsp;&amp;ldquo;혼자&amp;nbsp;오래&amp;nbsp;운영할&amp;nbsp;수&amp;nbsp;있는가&amp;rdquo;를&amp;nbsp;자주&amp;nbsp;생각합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증은&amp;nbsp;그중에서도&amp;nbsp;초반에&amp;nbsp;잘&amp;nbsp;정리해두지&amp;nbsp;않으면&amp;nbsp;나중에&amp;nbsp;계속&amp;nbsp;발목을&amp;nbsp;잡는&amp;nbsp;영역입니다. &lt;br /&gt;&lt;br /&gt;BFF&amp;nbsp;구조는&amp;nbsp;리액트의&amp;nbsp;장점을&amp;nbsp;버리지&amp;nbsp;않으면서도,&amp;nbsp;인증과&amp;nbsp;보안의&amp;nbsp;중심을&amp;nbsp;서버&amp;nbsp;쪽에&amp;nbsp;둘&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법입니다.&amp;nbsp;리액트는&amp;nbsp;사용자가&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;화면을&amp;nbsp;빠르게&amp;nbsp;구성하고,&amp;nbsp;서버는&amp;nbsp;사용자가&amp;nbsp;봐도&amp;nbsp;되는지&amp;nbsp;먼저&amp;nbsp;판단합니다.&amp;nbsp;이&amp;nbsp;분리가&amp;nbsp;생각보다&amp;nbsp;중요합니다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;관리자&amp;nbsp;화면,&amp;nbsp;유료&amp;nbsp;사용자&amp;nbsp;전용&amp;nbsp;화면,&amp;nbsp;개인&amp;nbsp;데이터가&amp;nbsp;포함된&amp;nbsp;화면처럼&amp;nbsp;접근&amp;nbsp;제어가&amp;nbsp;중요한&amp;nbsp;서비스에서는&amp;nbsp;이&amp;nbsp;방식이&amp;nbsp;더&amp;nbsp;안정적으로&amp;nbsp;느껴집니다.&amp;nbsp;프론트엔드에서&amp;nbsp;숨기는&amp;nbsp;것과&amp;nbsp;서버에서&amp;nbsp;막는&amp;nbsp;것은&amp;nbsp;완전히&amp;nbsp;다른&amp;nbsp;문제이기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;마무리&lt;/b&gt; &lt;br /&gt;BFF는&amp;nbsp;새로운&amp;nbsp;유행어라기보다,&amp;nbsp;프론트엔드와&amp;nbsp;백엔드의&amp;nbsp;책임을&amp;nbsp;다시&amp;nbsp;나누는&amp;nbsp;방식에&amp;nbsp;가깝습니다.&amp;nbsp;서버사이드가&amp;nbsp;프론트엔드를&amp;nbsp;한&amp;nbsp;번&amp;nbsp;감싸고,&amp;nbsp;인증과&amp;nbsp;접근&amp;nbsp;가능&amp;nbsp;여부를&amp;nbsp;먼저&amp;nbsp;판단합니다.&amp;nbsp;조회&amp;nbsp;가능한&amp;nbsp;페이지라면&amp;nbsp;리액트가&amp;nbsp;화면을&amp;nbsp;그립니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;구조가&amp;nbsp;모든&amp;nbsp;서비스에&amp;nbsp;필요한&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;하지만&amp;nbsp;인증이&amp;nbsp;중요하고,&amp;nbsp;브라우저에&amp;nbsp;민감한&amp;nbsp;정보를&amp;nbsp;오래&amp;nbsp;들고&amp;nbsp;있게&amp;nbsp;만들고&amp;nbsp;싶지&amp;nbsp;않다면&amp;nbsp;충분히&amp;nbsp;검토해볼&amp;nbsp;만합니다.&amp;nbsp;특히&amp;nbsp;혼자&amp;nbsp;서비스를&amp;nbsp;만들고&amp;nbsp;운영하는&amp;nbsp;입장에서는&amp;nbsp;보안&amp;nbsp;판단의&amp;nbsp;위치를&amp;nbsp;분명히&amp;nbsp;해두는&amp;nbsp;것만으로도&amp;nbsp;나중의&amp;nbsp;부담을&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;아직&amp;nbsp;이&amp;nbsp;방식이&amp;nbsp;제가&amp;nbsp;만드는&amp;nbsp;모든&amp;nbsp;서비스의&amp;nbsp;정답이라고&amp;nbsp;말하기는&amp;nbsp;어렵습니다.&amp;nbsp;다만&amp;nbsp;지금&amp;nbsp;기준에서는&amp;nbsp;리액트는&amp;nbsp;화면에&amp;nbsp;집중하고,&amp;nbsp;서버는&amp;nbsp;인증과&amp;nbsp;권한을&amp;nbsp;책임지는&amp;nbsp;구조가&amp;nbsp;오래&amp;nbsp;운영하기에&amp;nbsp;더&amp;nbsp;편한&amp;nbsp;방향처럼&amp;nbsp;느껴집니다.&amp;nbsp;그래서&amp;nbsp;이번&amp;nbsp;글은&amp;nbsp;BFF를&amp;nbsp;기술&amp;nbsp;패턴으로&amp;nbsp;소개하기보다,&amp;nbsp;제가&amp;nbsp;서비스를&amp;nbsp;만들며&amp;nbsp;역할을&amp;nbsp;어떻게&amp;nbsp;나누고&amp;nbsp;싶은지&amp;nbsp;정리해둔&amp;nbsp;기록에&amp;nbsp;가깝습니다.&lt;/p&gt;</description>
      <category>개발 노트/프론트엔드</category>
      <category>BFF</category>
      <category>DotNet</category>
      <category>react</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/116</guid>
      <comments>https://roslyndev.tistory.com/116#entry116comment</comments>
      <pubDate>Thu, 9 Jul 2026 19:21:26 +0900</pubDate>
    </item>
    <item>
      <title>닷넷 11 프리뷰에서 지켜볼 만한 것들</title>
      <link>https://roslyndev.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;글은&amp;nbsp;2026년&amp;nbsp;7월&amp;nbsp;7일&amp;nbsp;기준으로&amp;nbsp;정리한&amp;nbsp;기록입니다.&amp;nbsp;.NET&amp;nbsp;11은&amp;nbsp;아직&amp;nbsp;프리뷰&amp;nbsp;단계에&amp;nbsp;있고,&amp;nbsp;현재&amp;nbsp;공개&amp;nbsp;자료&amp;nbsp;기준으로는&amp;nbsp;Preview&amp;nbsp;5까지&amp;nbsp;나와&amp;nbsp;있습니다.&amp;nbsp;정식&amp;nbsp;릴리스는&amp;nbsp;2026년&amp;nbsp;11월로&amp;nbsp;안내되어&amp;nbsp;있으니,&amp;nbsp;지금&amp;nbsp;보이는&amp;nbsp;기능들이&amp;nbsp;모두&amp;nbsp;그대로&amp;nbsp;고정된다고&amp;nbsp;보기는&amp;nbsp;어렵습니다. &lt;br /&gt;&lt;br /&gt;그래도&amp;nbsp;프리뷰를&amp;nbsp;살펴보는&amp;nbsp;일은&amp;nbsp;의미가&amp;nbsp;있습니다.&amp;nbsp;당장&amp;nbsp;운영&amp;nbsp;중인&amp;nbsp;서비스를&amp;nbsp;옮기기&amp;nbsp;위해서라기보다,&amp;nbsp;앞으로&amp;nbsp;닷넷&amp;nbsp;생태계가&amp;nbsp;어떤&amp;nbsp;방향으로&amp;nbsp;움직이는지&amp;nbsp;미리&amp;nbsp;감을&amp;nbsp;잡을&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문입니다.&amp;nbsp;저는&amp;nbsp;21년차&amp;nbsp;닷넷&amp;nbsp;개발자로&amp;nbsp;일하면서,&amp;nbsp;요즘은&amp;nbsp;웹소설&amp;nbsp;집필&amp;nbsp;보조&amp;nbsp;서비스&amp;nbsp;메리톡톡을&amp;nbsp;만들고&amp;nbsp;운영하는&amp;nbsp;흐름도&amp;nbsp;함께&amp;nbsp;고민하고&amp;nbsp;있습니다.&amp;nbsp;그래서&amp;nbsp;새&amp;nbsp;버전을&amp;nbsp;볼&amp;nbsp;때도&amp;nbsp;&amp;ldquo;멋진&amp;nbsp;기능이&amp;nbsp;나왔는가&amp;rdquo;보다&amp;nbsp;&amp;ldquo;혼자&amp;nbsp;오래&amp;nbsp;운영하는&amp;nbsp;서비스에&amp;nbsp;어떤&amp;nbsp;영향을&amp;nbsp;줄까&amp;rdquo;를&amp;nbsp;먼저&amp;nbsp;보게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;프리뷰는&amp;nbsp;정답보다&amp;nbsp;방향을&amp;nbsp;보는&amp;nbsp;단계입니다&lt;/b&gt; &lt;br /&gt;.NET&amp;nbsp;11은&amp;nbsp;LTS가&amp;nbsp;아니라&amp;nbsp;STS,&amp;nbsp;즉&amp;nbsp;비교적&amp;nbsp;짧은&amp;nbsp;지원&amp;nbsp;주기를&amp;nbsp;가진&amp;nbsp;버전입니다.&amp;nbsp;안정성을&amp;nbsp;우선해야&amp;nbsp;하는&amp;nbsp;서비스라면&amp;nbsp;.NET&amp;nbsp;10&amp;nbsp;같은&amp;nbsp;LTS&amp;nbsp;버전을&amp;nbsp;중심에&amp;nbsp;두는&amp;nbsp;판단이&amp;nbsp;더&amp;nbsp;현실적일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;다만&amp;nbsp;STS&amp;nbsp;버전은&amp;nbsp;그&amp;nbsp;시점의&amp;nbsp;실험과&amp;nbsp;개선&amp;nbsp;방향을&amp;nbsp;빠르게&amp;nbsp;보여줍니다. &lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;이번&amp;nbsp;.NET&amp;nbsp;11&amp;nbsp;프리뷰도&amp;nbsp;&amp;ldquo;바로&amp;nbsp;갈아타야&amp;nbsp;할&amp;nbsp;버전&amp;rdquo;이라기보다&amp;nbsp;&amp;ldquo;다음&amp;nbsp;구조를&amp;nbsp;준비할&amp;nbsp;때&amp;nbsp;체크해둘&amp;nbsp;버전&amp;rdquo;에&amp;nbsp;가깝게&amp;nbsp;보고&amp;nbsp;있습니다.&amp;nbsp;특히&amp;nbsp;개인&amp;nbsp;서비스나&amp;nbsp;작은&amp;nbsp;제품을&amp;nbsp;운영하는&amp;nbsp;입장에서는&amp;nbsp;새&amp;nbsp;기능&amp;nbsp;자체보다&amp;nbsp;업그레이드&amp;nbsp;비용,&amp;nbsp;운영&amp;nbsp;안정성,&amp;nbsp;배포&amp;nbsp;흐름,&amp;nbsp;관찰&amp;nbsp;가능성이&amp;nbsp;더&amp;nbsp;중요합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;런타임과&amp;nbsp;JIT&amp;nbsp;개선은&amp;nbsp;조용하지만&amp;nbsp;중요합니다&lt;/b&gt; &lt;br /&gt;.NET&amp;nbsp;11에서&amp;nbsp;먼저&amp;nbsp;눈에&amp;nbsp;들어오는&amp;nbsp;부분은&amp;nbsp;런타임과&amp;nbsp;JIT&amp;nbsp;개선입니다.&amp;nbsp;공식&amp;nbsp;문서에서는&amp;nbsp;Runtime&amp;nbsp;Async,&amp;nbsp;JIT&amp;nbsp;최적화,&amp;nbsp;하드웨어&amp;nbsp;요구사항&amp;nbsp;갱신&amp;nbsp;같은&amp;nbsp;내용을&amp;nbsp;언급하고&amp;nbsp;있습니다.&amp;nbsp;이런&amp;nbsp;내용은&amp;nbsp;겉으로&amp;nbsp;보기에는&amp;nbsp;화려하지&amp;nbsp;않습니다.&amp;nbsp;하지만&amp;nbsp;실제&amp;nbsp;서비스를&amp;nbsp;운영하다&amp;nbsp;보면&amp;nbsp;이런&amp;nbsp;낮은&amp;nbsp;층의&amp;nbsp;개선이&amp;nbsp;누적되어&amp;nbsp;체감되는&amp;nbsp;경우가&amp;nbsp;많습니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;비동기&amp;nbsp;처리의&amp;nbsp;오버헤드가&amp;nbsp;줄고,&amp;nbsp;스택&amp;nbsp;트레이스가&amp;nbsp;더&amp;nbsp;읽기&amp;nbsp;쉬워진다면&amp;nbsp;장애를&amp;nbsp;추적하는&amp;nbsp;시간이&amp;nbsp;줄어들&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;JIT&amp;nbsp;최적화가&amp;nbsp;좋아지는&amp;nbsp;것도&amp;nbsp;마찬가지입니다.&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;큰&amp;nbsp;변화를&amp;nbsp;느끼기&amp;nbsp;어렵더라도,&amp;nbsp;서버&amp;nbsp;비용이나&amp;nbsp;응답&amp;nbsp;시간에&amp;nbsp;민감한&amp;nbsp;서비스에서는&amp;nbsp;이런&amp;nbsp;변화가&amp;nbsp;결국&amp;nbsp;운영&amp;nbsp;부담과&amp;nbsp;연결됩니다. &lt;br /&gt;&lt;br /&gt;저처럼&amp;nbsp;혼자&amp;nbsp;서비스를&amp;nbsp;만들고&amp;nbsp;보는&amp;nbsp;사람에게&amp;nbsp;성능&amp;nbsp;개선은&amp;nbsp;단순히&amp;nbsp;&amp;ldquo;더&amp;nbsp;빠르다&amp;rdquo;의&amp;nbsp;문제가&amp;nbsp;아닙니다.&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;원인을&amp;nbsp;찾기&amp;nbsp;쉬운가,&amp;nbsp;작은&amp;nbsp;서버로도&amp;nbsp;버틸&amp;nbsp;수&amp;nbsp;있는가,&amp;nbsp;배포&amp;nbsp;후에&amp;nbsp;예상하지&amp;nbsp;못한&amp;nbsp;부담이&amp;nbsp;늘어나지&amp;nbsp;않는가의&amp;nbsp;문제입니다.&amp;nbsp;그래서&amp;nbsp;런타임&amp;nbsp;개선은&amp;nbsp;늘&amp;nbsp;조용히&amp;nbsp;살펴보게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;라이브러리&amp;nbsp;변화는&amp;nbsp;일상적인&amp;nbsp;코드의&amp;nbsp;마찰을&amp;nbsp;줄입니다&lt;/b&gt; &lt;br /&gt;.NET&amp;nbsp;11의&amp;nbsp;라이브러리&amp;nbsp;쪽에서는&amp;nbsp;Syste&lt;a href=&quot;http://m.Text.Json,&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.Text.Json,&lt;/a&gt;&amp;nbsp;LINQ,&amp;nbsp;압축,&amp;nbsp;암호화,&amp;nbsp;Process&amp;nbsp;관련&amp;nbsp;API&amp;nbsp;등이&amp;nbsp;눈에&amp;nbsp;띕니다.&amp;nbsp;특히&amp;nbsp;JSON&amp;nbsp;Lines&amp;nbsp;직렬화,&amp;nbsp;LINQ의&amp;nbsp;FullJoin,&amp;nbsp;X25519&amp;nbsp;키&amp;nbsp;교환,&amp;nbsp;Random의&amp;nbsp;제네릭&amp;nbsp;숫자&amp;nbsp;API&amp;nbsp;같은&amp;nbsp;항목이&amp;nbsp;Preview&amp;nbsp;5에서&amp;nbsp;소개되었습니다. &lt;br /&gt;&lt;br /&gt;이런&amp;nbsp;기능들은&amp;nbsp;발표&amp;nbsp;자료에서&amp;nbsp;크게&amp;nbsp;보이지&amp;nbsp;않을&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;실제&amp;nbsp;코드에서는&amp;nbsp;자주&amp;nbsp;마주치는&amp;nbsp;작은&amp;nbsp;불편을&amp;nbsp;줄여줍니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;로그나&amp;nbsp;이벤트&amp;nbsp;데이터를&amp;nbsp;한&amp;nbsp;줄&amp;nbsp;단위&amp;nbsp;JSON으로&amp;nbsp;다루는&amp;nbsp;경우가&amp;nbsp;많아지고&amp;nbsp;있습니다.&amp;nbsp;AI&amp;nbsp;도구나&amp;nbsp;작업&amp;nbsp;큐,&amp;nbsp;분석&amp;nbsp;파이프라인과&amp;nbsp;연결할&amp;nbsp;때도&amp;nbsp;이런&amp;nbsp;형식은&amp;nbsp;자주&amp;nbsp;등장합니다.&amp;nbsp;Syste&lt;a href=&quot;http://m.Text.Json에서&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.Text.Json에서&lt;/a&gt;&amp;nbsp;관련&amp;nbsp;지원이&amp;nbsp;늘어나는&amp;nbsp;흐름은&amp;nbsp;개인적으로&amp;nbsp;반갑게&amp;nbsp;느껴졌습니다. &lt;br /&gt;&lt;br /&gt;LINQ의&amp;nbsp;FullJoin도&amp;nbsp;비슷합니다.&amp;nbsp;데이터&amp;nbsp;비교나&amp;nbsp;동기화&amp;nbsp;작업을&amp;nbsp;하다&amp;nbsp;보면&amp;nbsp;양쪽에&amp;nbsp;모두&amp;nbsp;있는&amp;nbsp;값뿐&amp;nbsp;아니라&amp;nbsp;한쪽에만&amp;nbsp;있는&amp;nbsp;값까지&amp;nbsp;함께&amp;nbsp;봐야&amp;nbsp;할&amp;nbsp;때가&amp;nbsp;있습니다.&amp;nbsp;그동안은&amp;nbsp;직접&amp;nbsp;구현하거나&amp;nbsp;우회하는&amp;nbsp;코드가&amp;nbsp;필요했는데,&amp;nbsp;이런&amp;nbsp;기능이&amp;nbsp;표준&amp;nbsp;라이브러리&amp;nbsp;안으로&amp;nbsp;들어오면&amp;nbsp;코드의&amp;nbsp;의도가&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;분명해집니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;SDK&amp;nbsp;개선은&amp;nbsp;작은&amp;nbsp;프로젝트일수록&amp;nbsp;체감될&amp;nbsp;수&amp;nbsp;있습니다&lt;/b&gt; &lt;br /&gt;이번&amp;nbsp;프리뷰에서&amp;nbsp;SDK&amp;nbsp;쪽&amp;nbsp;변화도&amp;nbsp;살펴볼&amp;nbsp;만합니다.&amp;nbsp;Linux와&amp;nbsp;macOS의&amp;nbsp;SDK&amp;nbsp;설치&amp;nbsp;크기를&amp;nbsp;줄이기&amp;nbsp;위한&amp;nbsp;작업,&amp;nbsp;dotnet&amp;nbsp;sln&amp;nbsp;명령의&amp;nbsp;solution&amp;nbsp;filter&amp;nbsp;지원,&amp;nbsp;파일&amp;nbsp;기반&amp;nbsp;앱에서&amp;nbsp;여러&amp;nbsp;C#&amp;nbsp;파일을&amp;nbsp;포함하는&amp;nbsp;기능,&amp;nbsp;dotnet&amp;nbsp;run에서&amp;nbsp;환경&amp;nbsp;변수를&amp;nbsp;바로&amp;nbsp;넘기는&amp;nbsp;옵션&amp;nbsp;등이&amp;nbsp;소개되어&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;이런&amp;nbsp;변화는&amp;nbsp;대규모&amp;nbsp;팀보다&amp;nbsp;오히려&amp;nbsp;작은&amp;nbsp;프로젝트에서&amp;nbsp;더&amp;nbsp;반가울&amp;nbsp;때가&amp;nbsp;있습니다.&amp;nbsp;간단한&amp;nbsp;실험을&amp;nbsp;만들고,&amp;nbsp;확인하고,&amp;nbsp;버리고,&amp;nbsp;다시&amp;nbsp;정리하는&amp;nbsp;과정이&amp;nbsp;빨라지기&amp;nbsp;때문입니다.&amp;nbsp;개인&amp;nbsp;서비스나&amp;nbsp;내부&amp;nbsp;도구를&amp;nbsp;만들&amp;nbsp;때는&amp;nbsp;거창한&amp;nbsp;프로젝트&amp;nbsp;구조보다&amp;nbsp;빠르게&amp;nbsp;검증할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;흐름이&amp;nbsp;중요할&amp;nbsp;때가&amp;nbsp;많습니다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;파일&amp;nbsp;기반&amp;nbsp;앱이&amp;nbsp;조금씩&amp;nbsp;확장되는&amp;nbsp;흐름은&amp;nbsp;흥미롭습니다.&amp;nbsp;C#이&amp;nbsp;꼭&amp;nbsp;큰&amp;nbsp;솔루션과&amp;nbsp;프로젝트&amp;nbsp;파일&amp;nbsp;안에서만&amp;nbsp;시작해야&amp;nbsp;하는&amp;nbsp;언어가&amp;nbsp;아니라,&amp;nbsp;작은&amp;nbsp;스크립트나&amp;nbsp;실험&amp;nbsp;코드의&amp;nbsp;자리까지&amp;nbsp;넓히려는&amp;nbsp;방향으로&amp;nbsp;보입니다.&amp;nbsp;닷넷&amp;nbsp;개발자로&amp;nbsp;오래&amp;nbsp;일해온&amp;nbsp;입장에서는&amp;nbsp;이&amp;nbsp;변화가&amp;nbsp;꽤&amp;nbsp;상징적으로&amp;nbsp;느껴집니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;C#&amp;nbsp;15와&amp;nbsp;union&amp;nbsp;관련&amp;nbsp;흐름도&amp;nbsp;지켜보고&amp;nbsp;있습니다&lt;/b&gt; &lt;br /&gt;.NET&amp;nbsp;11과&amp;nbsp;함께&amp;nbsp;언급되는&amp;nbsp;C#&amp;nbsp;15에서는&amp;nbsp;collection&amp;nbsp;expression&amp;nbsp;arguments와&amp;nbsp;union&amp;nbsp;types가&amp;nbsp;주요&amp;nbsp;항목으로&amp;nbsp;안내되어&amp;nbsp;있습니다.&amp;nbsp;특히&amp;nbsp;union&amp;nbsp;관련&amp;nbsp;흐름은&amp;nbsp;앞으로&amp;nbsp;도메인&amp;nbsp;모델을&amp;nbsp;표현하는&amp;nbsp;방식에&amp;nbsp;영향을&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있어&amp;nbsp;보입니다. &lt;br /&gt;&lt;br /&gt;서비스를&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;성공과&amp;nbsp;실패,&amp;nbsp;여러&amp;nbsp;상태,&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;결과&amp;nbsp;타입을&amp;nbsp;표현해야&amp;nbsp;하는&amp;nbsp;일이&amp;nbsp;많습니다.&amp;nbsp;지금도&amp;nbsp;record,&amp;nbsp;enum,&amp;nbsp;interface,&amp;nbsp;discriminated&amp;nbsp;union에&amp;nbsp;가까운&amp;nbsp;패턴을&amp;nbsp;조합해&amp;nbsp;표현할&amp;nbsp;수는&amp;nbsp;있습니다.&amp;nbsp;다만&amp;nbsp;언어&amp;nbsp;차원에서&amp;nbsp;이런&amp;nbsp;표현을&amp;nbsp;더&amp;nbsp;자연스럽게&amp;nbsp;지원하게&amp;nbsp;되면,&amp;nbsp;코드가&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;읽기&amp;nbsp;쉬워질&amp;nbsp;가능성이&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;물론&amp;nbsp;프리뷰&amp;nbsp;단계의&amp;nbsp;언어&amp;nbsp;기능은&amp;nbsp;조심해서&amp;nbsp;봐야&amp;nbsp;합니다.&amp;nbsp;당장&amp;nbsp;운영&amp;nbsp;코드에&amp;nbsp;넣기보다는,&amp;nbsp;어떤&amp;nbsp;문제를&amp;nbsp;해결하려는&amp;nbsp;방향인지&amp;nbsp;살펴보는&amp;nbsp;정도가&amp;nbsp;적당하다고&amp;nbsp;생각합니다.&amp;nbsp;그래도&amp;nbsp;C#이&amp;nbsp;단순히&amp;nbsp;문법을&amp;nbsp;늘리는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;복잡한&amp;nbsp;상태를&amp;nbsp;더&amp;nbsp;안전하게&amp;nbsp;표현하는&amp;nbsp;방향으로&amp;nbsp;움직이는&amp;nbsp;점은&amp;nbsp;계속&amp;nbsp;지켜볼&amp;nbsp;만합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;ASP.NET&amp;nbsp;Core와&amp;nbsp;Blazor는&amp;nbsp;운영&amp;nbsp;관점에서&amp;nbsp;확인해야&amp;nbsp;합니다&lt;/b&gt; &lt;br /&gt;Preview&amp;nbsp;5에서는&amp;nbsp;ASP.NET&amp;nbsp;Core&amp;nbsp;쪽에서도&amp;nbsp;Blazor&amp;nbsp;SSR의&amp;nbsp;클라이언트&amp;nbsp;사이드&amp;nbsp;검증,&amp;nbsp;QuickGrid의&amp;nbsp;비대화형&amp;nbsp;환경&amp;nbsp;지원,&amp;nbsp;Blazor&amp;nbsp;WebAssembly&amp;nbsp;Gateway,&amp;nbsp;세션&amp;nbsp;기반&amp;nbsp;파라미터&amp;nbsp;공급&amp;nbsp;같은&amp;nbsp;항목이&amp;nbsp;소개되었습니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;Blazor를&amp;nbsp;볼&amp;nbsp;때마다&amp;nbsp;&amp;ldquo;기술적으로&amp;nbsp;가능한가&amp;rdquo;보다&amp;nbsp;&amp;ldquo;혼자&amp;nbsp;운영하는&amp;nbsp;서비스에서&amp;nbsp;부담이&amp;nbsp;적은가&amp;rdquo;를&amp;nbsp;먼저&amp;nbsp;생각하게&amp;nbsp;됩니다.&amp;nbsp;화면과&amp;nbsp;서버의&amp;nbsp;경계가&amp;nbsp;복잡해질수록&amp;nbsp;개발&amp;nbsp;경험은&amp;nbsp;편해질&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;배포와&amp;nbsp;장애&amp;nbsp;추적은&amp;nbsp;오히려&amp;nbsp;어려워질&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;반대로&amp;nbsp;잘&amp;nbsp;맞는&amp;nbsp;구조를&amp;nbsp;찾으면&amp;nbsp;작은&amp;nbsp;팀이나&amp;nbsp;1인&amp;nbsp;개발자에게는&amp;nbsp;꽤&amp;nbsp;생산적인&amp;nbsp;선택지가&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;.NET&amp;nbsp;11의&amp;nbsp;ASP.NET&amp;nbsp;Core&amp;nbsp;변화는&amp;nbsp;기능&amp;nbsp;목록만&amp;nbsp;보기보다,&amp;nbsp;실제&amp;nbsp;운영&amp;nbsp;흐름에서&amp;nbsp;얼마나&amp;nbsp;단순하게&amp;nbsp;가져갈&amp;nbsp;수&amp;nbsp;있을지를&amp;nbsp;기준으로&amp;nbsp;보는&amp;nbsp;편이&amp;nbsp;좋겠습니다.&amp;nbsp;새&amp;nbsp;기능이&amp;nbsp;많아지는&amp;nbsp;것보다,&amp;nbsp;기존&amp;nbsp;구조의&amp;nbsp;빈틈이&amp;nbsp;줄어드는지가&amp;nbsp;더&amp;nbsp;중요할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;EF&amp;nbsp;Core&amp;nbsp;변화는&amp;nbsp;데이터&amp;nbsp;작업의&amp;nbsp;안정성과&amp;nbsp;연결됩니다&lt;/b&gt; &lt;br /&gt;EF&amp;nbsp;Core&amp;nbsp;쪽에서는&amp;nbsp;file-based&amp;nbsp;apps&amp;nbsp;지원,&amp;nbsp;SQL&amp;nbsp;Server&amp;nbsp;2022&amp;nbsp;호환성&amp;nbsp;기본값,&amp;nbsp;비동기&amp;nbsp;쿼리가&amp;nbsp;동기적으로&amp;nbsp;실행될&amp;nbsp;때의&amp;nbsp;경고,&amp;nbsp;더&amp;nbsp;깔끔한&amp;nbsp;SQL&amp;nbsp;생성&amp;nbsp;등이&amp;nbsp;Preview&amp;nbsp;5&amp;nbsp;항목으로&amp;nbsp;소개되었습니다. &lt;br /&gt;&lt;br /&gt;개인적으로는&amp;nbsp;EF1004처럼&amp;nbsp;잘못된&amp;nbsp;비동기&amp;nbsp;사용을&amp;nbsp;알려주는&amp;nbsp;방향이&amp;nbsp;반갑습니다.&amp;nbsp;작은&amp;nbsp;서비스에서는&amp;nbsp;성능&amp;nbsp;문제가&amp;nbsp;아주&amp;nbsp;큰&amp;nbsp;트래픽에서만&amp;nbsp;생기는&amp;nbsp;것이&amp;nbsp;아닙니다.&amp;nbsp;몇&amp;nbsp;개의&amp;nbsp;잘못된&amp;nbsp;쿼리,&amp;nbsp;예상보다&amp;nbsp;오래&amp;nbsp;잡히는&amp;nbsp;연결,&amp;nbsp;추적하기&amp;nbsp;어려운&amp;nbsp;동기&amp;nbsp;실행이&amp;nbsp;쌓이면서&amp;nbsp;문제가&amp;nbsp;생기기도&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;데이터&amp;nbsp;계층은&amp;nbsp;서비스의&amp;nbsp;중심에&amp;nbsp;가깝습니다.&amp;nbsp;그래서&amp;nbsp;EF&amp;nbsp;Core의&amp;nbsp;변화는&amp;nbsp;새&amp;nbsp;문법보다&amp;nbsp;&amp;ldquo;실수하기&amp;nbsp;어려워지는가&amp;rdquo;라는&amp;nbsp;관점으로&amp;nbsp;보게&amp;nbsp;됩니다.&amp;nbsp;혼자&amp;nbsp;운영하는&amp;nbsp;서비스일수록&amp;nbsp;코드&amp;nbsp;리뷰를&amp;nbsp;해줄&amp;nbsp;사람이&amp;nbsp;부족하기&amp;nbsp;때문에,&amp;nbsp;도구가&amp;nbsp;위험한&amp;nbsp;패턴을&amp;nbsp;빨리&amp;nbsp;알려주는&amp;nbsp;것이&amp;nbsp;중요합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;지금&amp;nbsp;당장&amp;nbsp;해야&amp;nbsp;할&amp;nbsp;일은&amp;nbsp;많지&amp;nbsp;않습니다&lt;/b&gt; &lt;br /&gt;.NET&amp;nbsp;11&amp;nbsp;프리뷰를&amp;nbsp;보면서도,&amp;nbsp;당장&amp;nbsp;모든&amp;nbsp;프로젝트를&amp;nbsp;올려야겠다는&amp;nbsp;생각은&amp;nbsp;들지&amp;nbsp;않습니다.&amp;nbsp;오히려&amp;nbsp;지금은&amp;nbsp;몇&amp;nbsp;가지를&amp;nbsp;차분히&amp;nbsp;확인하는&amp;nbsp;정도가&amp;nbsp;맞다고&amp;nbsp;봅니다. &lt;br /&gt;&lt;br /&gt;첫째,&amp;nbsp;현재&amp;nbsp;운영&amp;nbsp;중인&amp;nbsp;프로젝트가&amp;nbsp;어떤&amp;nbsp;.NET&amp;nbsp;버전에&amp;nbsp;묶여&amp;nbsp;있는지&amp;nbsp;확인해야&amp;nbsp;합니다.&amp;nbsp;둘째,&amp;nbsp;외부&amp;nbsp;패키지와&amp;nbsp;배포&amp;nbsp;환경이&amp;nbsp;새&amp;nbsp;버전을&amp;nbsp;따라갈&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;살펴봐야&amp;nbsp;합니다.&amp;nbsp;셋째,&amp;nbsp;성능이나&amp;nbsp;SDK&amp;nbsp;개선&amp;nbsp;중에서&amp;nbsp;실제로&amp;nbsp;내&amp;nbsp;작업&amp;nbsp;흐름을&amp;nbsp;줄여줄&amp;nbsp;부분이&amp;nbsp;있는지&amp;nbsp;작게&amp;nbsp;실험해보면&amp;nbsp;좋겠습니다. &lt;br /&gt;&lt;br /&gt;프리뷰는&amp;nbsp;기대를&amp;nbsp;키우는&amp;nbsp;시기이기도&amp;nbsp;하지만,&amp;nbsp;동시에&amp;nbsp;거리를&amp;nbsp;두고&amp;nbsp;보는&amp;nbsp;시기이기도&amp;nbsp;합니다.&amp;nbsp;특히&amp;nbsp;서비스를&amp;nbsp;운영하는&amp;nbsp;입장에서는&amp;nbsp;새&amp;nbsp;기능보다&amp;nbsp;안정적인&amp;nbsp;전환&amp;nbsp;경로가&amp;nbsp;더&amp;nbsp;중요합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;마무리&lt;/b&gt; &lt;br /&gt;.NET&amp;nbsp;11&amp;nbsp;프리뷰에서&amp;nbsp;제가&amp;nbsp;지켜보는&amp;nbsp;것은&amp;nbsp;거창한&amp;nbsp;한&amp;nbsp;가지&amp;nbsp;기능이&amp;nbsp;아닙니다.&amp;nbsp;런타임의&amp;nbsp;조용한&amp;nbsp;개선,&amp;nbsp;일상적인&amp;nbsp;라이브러리&amp;nbsp;API의&amp;nbsp;정리,&amp;nbsp;작은&amp;nbsp;실험을&amp;nbsp;돕는&amp;nbsp;SDK&amp;nbsp;변화,&amp;nbsp;그리고&amp;nbsp;C#이&amp;nbsp;상태와&amp;nbsp;결과를&amp;nbsp;더&amp;nbsp;분명하게&amp;nbsp;표현하려는&amp;nbsp;흐름입니다. &lt;br /&gt;&lt;br /&gt;이런&amp;nbsp;변화들은&amp;nbsp;당장&amp;nbsp;눈에&amp;nbsp;띄는&amp;nbsp;성공담을&amp;nbsp;만들어주지는&amp;nbsp;않습니다.&amp;nbsp;하지만&amp;nbsp;오래&amp;nbsp;운영할&amp;nbsp;서비스를&amp;nbsp;만들&amp;nbsp;때는&amp;nbsp;이런&amp;nbsp;조용한&amp;nbsp;개선들이&amp;nbsp;꽤&amp;nbsp;중요합니다.&amp;nbsp;코드를&amp;nbsp;조금&amp;nbsp;덜&amp;nbsp;복잡하게&amp;nbsp;만들고,&amp;nbsp;장애를&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;빨리&amp;nbsp;찾게&amp;nbsp;해주고,&amp;nbsp;작은&amp;nbsp;실험을&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;가볍게&amp;nbsp;시작하게&amp;nbsp;해주기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;아직&amp;nbsp;.NET&amp;nbsp;11은&amp;nbsp;완성된&amp;nbsp;결론이&amp;nbsp;아니라&amp;nbsp;진행&amp;nbsp;중인&amp;nbsp;버전입니다.&amp;nbsp;그래서&amp;nbsp;이&amp;nbsp;글도&amp;nbsp;확정된&amp;nbsp;평가라기보다,&amp;nbsp;앞으로&amp;nbsp;몇&amp;nbsp;달&amp;nbsp;동안&amp;nbsp;무엇을&amp;nbsp;지켜볼지&amp;nbsp;정리해둔&amp;nbsp;기록에&amp;nbsp;가깝습니다.&amp;nbsp;정식&amp;nbsp;릴리스가&amp;nbsp;가까워지면,&amp;nbsp;실제&amp;nbsp;프로젝트에&amp;nbsp;어떤&amp;nbsp;기준으로&amp;nbsp;적용할&amp;nbsp;수&amp;nbsp;있을지도&amp;nbsp;다시&amp;nbsp;정리해보려&amp;nbsp;합니다.&lt;/p&gt;</description>
      <category>개발 노트/ASP.NET Core</category>
      <category>Csharp</category>
      <category>DotNet</category>
      <category>net11</category>
      <category>preview</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/115</guid>
      <comments>https://roslyndev.tistory.com/115#entry115comment</comments>
      <pubDate>Thu, 9 Jul 2026 19:18:46 +0900</pubDate>
    </item>
    <item>
      <title>혼자 운영하는 서비스에서 관리자 화면을 먼저 정리하는 이유</title>
      <link>https://roslyndev.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;작은 서비스를 만들 때 처음부터 관리자 화면을 신경 쓰는 일은 조금 과해 보일 수 있습니다. 사용자에게 보이는 기능도 아직 충분하지 않은데, 운영자만 보는 화면을 먼저 만든다는 것이 뒤로 미뤄도 되는 일처럼 느껴지기 때문입니다.&lt;br&gt;&lt;br&gt;저도 예전에는 비슷하게 생각했습니다. 우선 사용자가 보는 화면을 만들고, 데이터가 쌓이면 그때 관리자 기능을 붙이면 된다고 봤습니다. 하지만 혼자 서비스를 만들고 운영하는 시간이 길어질수록, 관리자 화면은 나중에 붙이는 부가 기능이 아니라 서비스를 오래 붙잡기 위한 기본 도구에 가깝다는 생각을 하게 됩니다.&lt;br&gt;&lt;br&gt;특히 메리톡톡처럼 창작자의 흐름을 돕는 서비스를 만들 때는 더 그렇습니다. 사용자가 어떤 지점에서 막히는지, 어떤 데이터가 쌓이고 있는지, 문제가 생겼을 때 어디를 먼저 봐야 하는지 알 수 있어야 합니다. 관리자 화면은 그런 질문에 답하기 위한 작은 작업대입니다.&lt;br&gt;&lt;br&gt;운영자는 데이터베이스를 직접 보지 않는 편이 좋습니다&lt;br&gt;&lt;br&gt;혼자 만드는 서비스에서는 문제가 생겼을 때 데이터베이스에 직접 접속해서 확인하는 일이 어렵지 않습니다. 테이블을 열고, 값을 검색하고, 필요한 경우 직접 수정할 수도 있습니다. 개발자 입장에서는 가장 빠른 방법처럼 느껴집니다.&lt;br&gt;&lt;br&gt;하지만 이 방식은 오래 지속하기 어렵습니다. 매번 데이터베이스 구조를 떠올려야 하고, 실수로 잘못된 값을 바꿀 위험도 있습니다. 특히 운영 중인 데이터라면 작은 수정 하나가 사용자 경험에 영향을 줄 수 있습니다.&lt;br&gt;&lt;br&gt;관리자 화면을 만들어두면 자주 확인하는 정보와 자주 처리하는 작업을 안전한 흐름 안으로 가져올 수 있습니다. 게시글 상태를 바꾸거나, 사용자 문의를 확인하거나, 실패한 작업을 다시 실행하는 일을 데이터베이스 쿼리가 아니라 정리된 버튼과 화면으로 처리할 수 있습니다.&lt;br&gt;&lt;br&gt;이것은 단순히 편의를 위한 일이 아닙니다. 나중의 저를 실수에서 보호하는 장치에 가깝습니다. 혼자 운영하는 서비스일수록 이런 장치가 필요합니다.&lt;br&gt;&lt;br&gt;&lt;b&gt;관리자 화면은 운영 흐름을 드러냅니다&lt;/b&gt;&lt;br&gt;&lt;br&gt;관리자 화면을 만들다 보면 자연스럽게 서비스의 운영 흐름을 다시 보게 됩니다. 사용자는 어떤 상태를 거치는지, 게시물은 어떤 기준으로 공개되는지, 결제나 구독이 있다면 어떤 시점에 상태가 바뀌는지 정리해야 하기 때문입니다.&lt;br&gt;&lt;br&gt;처음에는 기능을 구현하는 데 집중하느라 이런 상태들이 코드 안에 흩어지기 쉽습니다. 어떤 상태는 enum으로 있고, 어떤 상태는 문자열로 남아 있고, 어떤 조건은 화면에서만 확인되기도 합니다. 관리자 화면을 만들려면 이 흐름을 다시 한곳으로 모아야 합니다.&lt;br&gt;&lt;br&gt;예를 들어 글쓰기 보조 서비스라면 초안, 저장됨, 생성 중, 실패, 완료 같은 상태가 있을 수 있습니다. 관리자 화면에서 이 상태들을 보여주려면 각각의 의미가 분명해야 합니다. 실패한 작업은 다시 실행할 수 있는지, 완료된 작업은 수정할 수 있는지, 사용자가 보는 값과 운영자가 보는 값은 어떻게 다른지도 정리해야 합니다.&lt;br&gt;&lt;br&gt;이 과정은 귀찮지만 중요합니다. 관리자 화면은 단순히 데이터를 보여주는 공간이 아니라, 서비스가 실제로 어떻게 움직이는지를 운영자가 이해할 수 있게 만드는 지도에 가깝습니다.&lt;br&gt;&lt;br&gt;&lt;b&gt;React는 운영 화면을 빠르게 정리하기에 좋습니다&lt;/b&gt;&lt;br&gt;&lt;br&gt;최근 React와 TanStack Query를 다시 정리하면서, 관리자 화면에는 이 조합이 꽤 현실적이라고 느꼈습니다. 관리자 화면은 목록, 상세, 검색, 필터, 저장, 삭제 같은 패턴이 반복됩니다. 서버 상태를 가져오고, 변경 후 다시 갱신하는 흐름도 자주 등장합니다.&lt;br&gt;&lt;br&gt;TanStack Query를 사용하면 이런 서버 상태 관리가 비교적 단정해집니다. 데이터를 가져오는 코드는 query로 정리하고, 변경하는 작업은 mutation으로 나눌 수 있습니다. 저장이나 삭제가 끝난 뒤 관련 목록을 다시 불러오는 흐름도 일정한 방식으로 가져갈 수 있습니다.&lt;br&gt;&lt;br&gt;물론 관리자 화면이라고 해서 프론트엔드가 모든 것을 판단하면 안 됩니다. 권한과 접근 제어는 서버에서 최종적으로 막아야 합니다. React는 운영자가 보기 좋은 화면을 만들고, 서버는 이 사용자가 정말 이 작업을 해도 되는지 확인하는 구조가 더 안전합니다.&lt;br&gt;&lt;br&gt;이 기준은 BFF 구조와도 이어집니다. 서버가 먼저 인증과 권한을 확인하고, React는 허용된 범위 안에서 화면을 그립니다. 이렇게 역할을 나누면 프론트엔드는 화면에 집중하고, 서버는 운영의 안전선을 맡을 수 있습니다.&lt;br&gt;&lt;br&gt;&lt;b&gt;처음부터 거창할 필요는 없습니다&lt;/b&gt;&lt;br&gt;&lt;br&gt;관리자 화면이라고 하면 복잡한 대시보드나 통계 화면을 떠올리기 쉽습니다. 하지만 작은 서비스에서 처음 필요한 것은 그렇게 거창하지 않습니다. 오히려 자주 확인하는 목록 하나, 상태 변경 버튼 하나, 최근 오류를 보는 작은 화면 하나가 더 중요할 때가 많습니다.&lt;br&gt;&lt;br&gt;처음에는 세 가지 정도만 있어도 충분하다고 생각합니다. 첫째, 사용자가 만든 주요 데이터를 조회하는 화면입니다. 둘째, 운영자가 수동으로 처리해야 하는 작업을 모아둔 화면입니다. 셋째, 실패하거나 확인이 필요한 항목을 볼 수 있는 화면입니다.&lt;br&gt;&lt;br&gt;이 정도만 있어도 데이터베이스에 직접 들어가는 횟수를 줄일 수 있습니다. 문제를 확인하는 속도도 빨라집니다. 무엇보다 서비스의 현재 상태를 운영자가 눈으로 볼 수 있게 됩니다.&lt;br&gt;&lt;br&gt;혼자 운영하는 서비스에서 중요한 것은 완벽한 백오피스를 만드는 일이 아닙니다. 지금 가장 자주 불안해지는 지점을 화면으로 꺼내는 일입니다. 그 불안을 줄이는 화면부터 만들면 됩니다.&lt;br&gt;&lt;br&gt;&lt;b&gt;관리자 화면은 미래의 운영자를 위한 기록입니다&lt;/b&gt;&lt;br&gt;&lt;br&gt;제가 관리자 화면을 중요하게 보는 또 다른 이유는 기록성 때문입니다. 좋은 관리자 화면은 단순한 조작 도구가 아니라, 운영자가 어떤 기준으로 서비스를 보고 있는지를 남기는 기록이 됩니다.&lt;br&gt;&lt;br&gt;어떤 항목을 목록에 보여줄지, 어떤 상태를 강조할지, 어떤 작업에는 확인 단계를 둘지 같은 선택에는 운영자의 관점이 들어갑니다. 이 서비스에서 무엇이 위험한지, 무엇을 자주 확인해야 하는지, 어떤 작업은 자동화하고 어떤 작업은 사람이 확인해야 하는지가 화면에 반영됩니다.&lt;br&gt;&lt;br&gt;이런 기준은 시간이 지나면 더 중요해집니다. 몇 달 뒤 다시 프로젝트를 열었을 때, 관리자 화면은 코드보다 먼저 현재 서비스를 이해하게 해줄 수 있습니다. 화면에 남은 항목과 버튼을 보면, 그때 제가 무엇을 중요하게 봤는지 다시 떠올릴 수 있습니다.&lt;br&gt;&lt;br&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;br&gt;&lt;br&gt;혼자 운영하는 서비스에서 관리자 화면은 나중에 붙이는 장식이 아닙니다. 사용자에게 보이지 않지만, 운영자가 서비스를 계속 붙잡기 위해 필요한 기본 도구입니다.&lt;br&gt;&lt;br&gt;데이터베이스를 직접 만지는 일을 줄이고, 자주 확인하는 상태를 화면으로 꺼내고, 위험한 작업에는 안전한 흐름을 두는 것. 이런 작은 정리가 쌓이면 서비스는 조금 더 오래 운영할 수 있는 모양이 됩니다.&lt;br&gt;&lt;br&gt;아직 제가 만드는 모든 서비스에 완벽한 관리자 화면이 있는 것은 아닙니다. 다만 요즘은 새 기능을 만들 때마다 이 기능을 운영자가 어디서 확인할 것인지도 함께 생각하게 됩니다. 이번 기록은 관리자 화면을 거창한 백오피스가 아니라, 혼자 만드는 서비스를 오래 유지하기 위한 작은 작업대로 다시 바라보기 위한 기준점에 가깝습니다.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>만드는 기록/서비스 운영기</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/114</guid>
      <comments>https://roslyndev.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 8 Jul 2026 06:51:49 +0900</pubDate>
    </item>
    <item>
      <title>닷넷 프로젝트에서 Serilog를 자주 쓰는 이유</title>
      <link>https://roslyndev.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;닷넷&amp;nbsp;프로젝트에서&amp;nbsp;Serilog를&amp;nbsp;자주&amp;nbsp;쓰는&amp;nbsp;이유 &lt;br /&gt;닷넷&amp;nbsp;프로젝트를&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;로깅&amp;nbsp;도구를&amp;nbsp;고르는&amp;nbsp;순간이&amp;nbsp;자주&amp;nbsp;옵니다.&amp;nbsp;작은&amp;nbsp;기능을&amp;nbsp;만들&amp;nbsp;때는&amp;nbsp;Console.WriteLine만으로도&amp;nbsp;충분해&amp;nbsp;보이지만,&amp;nbsp;서비스가&amp;nbsp;실제로&amp;nbsp;운영되기&amp;nbsp;시작하면&amp;nbsp;이야기가&amp;nbsp;달라집니다.&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;&amp;ldquo;어디에서&amp;rdquo;,&amp;nbsp;&amp;ldquo;어떤&amp;nbsp;값으로&amp;rdquo;,&amp;nbsp;&amp;ldquo;누가&amp;rdquo;,&amp;nbsp;&amp;ldquo;얼마나&amp;nbsp;자주&amp;rdquo;&amp;nbsp;발생했는지&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;하기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;닷넷으로&amp;nbsp;서비스를&amp;nbsp;만들고&amp;nbsp;운영하면서&amp;nbsp;Serilog를&amp;nbsp;자주&amp;nbsp;사용합니다.&amp;nbsp;대단히&amp;nbsp;특별한&amp;nbsp;이유라기보다,&amp;nbsp;혼자서도&amp;nbsp;상황을&amp;nbsp;추적하고&amp;nbsp;정리하기에&amp;nbsp;현실적인&amp;nbsp;도구라고&amp;nbsp;느껴왔기&amp;nbsp;때문입니다.&amp;nbsp;로그는&amp;nbsp;개발&amp;nbsp;중&amp;nbsp;확인용&amp;nbsp;메시지가&amp;nbsp;아니라,&amp;nbsp;운영&amp;nbsp;중인&amp;nbsp;서비스를&amp;nbsp;이해하기&amp;nbsp;위한&amp;nbsp;기록에&amp;nbsp;가깝습니다.&amp;nbsp;그런&amp;nbsp;관점에서&amp;nbsp;Serilog는&amp;nbsp;꽤&amp;nbsp;오랫동안&amp;nbsp;손에&amp;nbsp;익은&amp;nbsp;선택지였습니다. &lt;br /&gt;&lt;br /&gt;문자열&amp;nbsp;로그보다&amp;nbsp;구조화된&amp;nbsp;기록이&amp;nbsp;필요했습니다 &lt;br /&gt;일반적인&amp;nbsp;로그는&amp;nbsp;사람이&amp;nbsp;읽기&amp;nbsp;좋은&amp;nbsp;문장으로&amp;nbsp;남습니다. &lt;br /&gt;&lt;br /&gt;사용자&amp;nbsp;로그인&amp;nbsp;실패:&amp;nbsp;userId=1234,&amp;nbsp;reason=password_mismatch &lt;br /&gt;이런&amp;nbsp;로그도&amp;nbsp;당장은&amp;nbsp;충분해&amp;nbsp;보입니다.&amp;nbsp;하지만&amp;nbsp;운영&amp;nbsp;중&amp;nbsp;비슷한&amp;nbsp;로그가&amp;nbsp;수천&amp;nbsp;줄씩&amp;nbsp;쌓이면,&amp;nbsp;단순&amp;nbsp;문자열&amp;nbsp;검색만으로&amp;nbsp;원인을&amp;nbsp;찾기&amp;nbsp;어렵습니다.&amp;nbsp;특정&amp;nbsp;사용자만&amp;nbsp;확인하고&amp;nbsp;싶을&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;실패&amp;nbsp;사유별로&amp;nbsp;건수를&amp;nbsp;보고&amp;nbsp;싶을&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;요청&amp;nbsp;경로,&amp;nbsp;응답&amp;nbsp;시간,&amp;nbsp;예외&amp;nbsp;정보,&amp;nbsp;사용자&amp;nbsp;식별자&amp;nbsp;같은&amp;nbsp;값을&amp;nbsp;따로&amp;nbsp;묶어서&amp;nbsp;보고&amp;nbsp;싶을&amp;nbsp;때도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;Serilog의&amp;nbsp;장점은&amp;nbsp;이&amp;nbsp;지점에서&amp;nbsp;드러납니다.&amp;nbsp;Serilog는&amp;nbsp;메시지&amp;nbsp;안에&amp;nbsp;들어간&amp;nbsp;값을&amp;nbsp;단순&amp;nbsp;문자열로&amp;nbsp;합쳐버리지&amp;nbsp;않고,&amp;nbsp;이름이&amp;nbsp;붙은&amp;nbsp;속성으로&amp;nbsp;함께&amp;nbsp;기록할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;Log.Information(&quot;Login&amp;nbsp;failed&amp;nbsp;for&amp;nbsp;{UserId}&amp;nbsp;because&amp;nbsp;{Reason}&quot;,&amp;nbsp;userId,&amp;nbsp;reason); &lt;br /&gt;이렇게&amp;nbsp;남기면&amp;nbsp;로그&amp;nbsp;문장은&amp;nbsp;사람이&amp;nbsp;읽을&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;동시에&amp;nbsp;UserId와&amp;nbsp;Reason은&amp;nbsp;검색하거나&amp;nbsp;필터링할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;값으로&amp;nbsp;남습니다.&amp;nbsp;나중에&amp;nbsp;Seq,&amp;nbsp;Elasticsearch,&amp;nbsp;Application&amp;nbsp;Insights&amp;nbsp;같은&amp;nbsp;도구와&amp;nbsp;연결했을&amp;nbsp;때&amp;nbsp;이&amp;nbsp;차이가&amp;nbsp;꽤&amp;nbsp;크게&amp;nbsp;느껴집니다. &lt;br /&gt;&lt;br /&gt;Serilog를&amp;nbsp;쓰면&amp;nbsp;로그의&amp;nbsp;목적지가&amp;nbsp;유연해집니다 &lt;br /&gt;Serilog에서&amp;nbsp;로그를&amp;nbsp;어디로&amp;nbsp;보낼지는&amp;nbsp;Sink라는&amp;nbsp;개념으로&amp;nbsp;정리합니다.&amp;nbsp;콘솔에&amp;nbsp;출력할&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;파일로&amp;nbsp;남길&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;Seq나&amp;nbsp;Elasticsearch&amp;nbsp;같은&amp;nbsp;로그&amp;nbsp;수집&amp;nbsp;도구로&amp;nbsp;보낼&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;개발&amp;nbsp;중에는&amp;nbsp;콘솔&amp;nbsp;로그가&amp;nbsp;편합니다.&amp;nbsp;로컬에서&amp;nbsp;바로&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문입니다.&amp;nbsp;반면&amp;nbsp;운영&amp;nbsp;환경에서는&amp;nbsp;파일이나&amp;nbsp;별도의&amp;nbsp;로그&amp;nbsp;서버에&amp;nbsp;남겨야&amp;nbsp;할&amp;nbsp;때가&amp;nbsp;많습니다.&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;이&amp;nbsp;구성이&amp;nbsp;코드&amp;nbsp;곳곳에&amp;nbsp;흩어지지&amp;nbsp;않는다는&amp;nbsp;점입니다.&amp;nbsp;보통은&amp;nbsp;appsettings.json&amp;nbsp;같은&amp;nbsp;설정&amp;nbsp;파일에&amp;nbsp;정리해두고,&amp;nbsp;환경에&amp;nbsp;따라&amp;nbsp;다르게&amp;nbsp;적용합니다. &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;Serilog&quot;:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;MinimumLevel&quot;:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Default&quot;:&amp;nbsp;&quot;Information&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Override&quot;:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Microsoft&quot;:&amp;nbsp;&quot;Warning&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;System&quot;:&amp;nbsp;&quot;Warning&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Enrich&quot;:&amp;nbsp;[&amp;nbsp;&quot;FromLogContext&quot;&amp;nbsp;], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;WriteTo&quot;:&amp;nbsp;[ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&quot;Name&quot;:&amp;nbsp;&quot;Console&quot;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Name&quot;:&amp;nbsp;&quot;File&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;Args&quot;:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;path&quot;:&amp;nbsp;&quot;logs/app-.log&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;rollingInterval&quot;:&amp;nbsp;&quot;Day&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;] &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt;이런&amp;nbsp;방식은&amp;nbsp;혼자&amp;nbsp;서비스를&amp;nbsp;운영할&amp;nbsp;때&amp;nbsp;특히&amp;nbsp;편합니다.&amp;nbsp;개발&amp;nbsp;환경에서는&amp;nbsp;자세히&amp;nbsp;보고,&amp;nbsp;운영&amp;nbsp;환경에서는&amp;nbsp;필요한&amp;nbsp;수준만&amp;nbsp;남기도록&amp;nbsp;조정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;로그&amp;nbsp;설정을&amp;nbsp;바꾸기&amp;nbsp;위해&amp;nbsp;매번&amp;nbsp;코드를&amp;nbsp;수정하는&amp;nbsp;부담도&amp;nbsp;줄어듭니다. &lt;br /&gt;&lt;br /&gt;Enrich는&amp;nbsp;운영&amp;nbsp;중&amp;nbsp;맥락을&amp;nbsp;남기는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;됩니다 &lt;br /&gt;서비스&amp;nbsp;장애를&amp;nbsp;확인할&amp;nbsp;때&amp;nbsp;가장&amp;nbsp;답답한&amp;nbsp;순간은&amp;nbsp;로그&amp;nbsp;한&amp;nbsp;줄만으로는&amp;nbsp;상황을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없을&amp;nbsp;때입니다.&amp;nbsp;예외&amp;nbsp;메시지는&amp;nbsp;남아&amp;nbsp;있지만&amp;nbsp;어떤&amp;nbsp;요청에서&amp;nbsp;발생했는지&amp;nbsp;모를&amp;nbsp;때가&amp;nbsp;있습니다.&amp;nbsp;사용자는&amp;nbsp;누구였는지,&amp;nbsp;어떤&amp;nbsp;화면이나&amp;nbsp;API를&amp;nbsp;거쳤는지,&amp;nbsp;어떤&amp;nbsp;서버에서&amp;nbsp;실행됐는지&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없으면&amp;nbsp;원인을&amp;nbsp;좁히는&amp;nbsp;데&amp;nbsp;시간이&amp;nbsp;오래&amp;nbsp;걸립니다. &lt;br /&gt;&lt;br /&gt;Serilog의&amp;nbsp;Enrich&amp;nbsp;기능은&amp;nbsp;이런&amp;nbsp;맥락을&amp;nbsp;로그에&amp;nbsp;덧붙이는&amp;nbsp;역할을&amp;nbsp;합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;요청&amp;nbsp;ID,&amp;nbsp;사용자&amp;nbsp;ID,&amp;nbsp;머신&amp;nbsp;이름,&amp;nbsp;스레드&amp;nbsp;ID&amp;nbsp;같은&amp;nbsp;정보를&amp;nbsp;함께&amp;nbsp;남길&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;using&amp;nbsp;(LogContext.PushProperty(&quot;UserId&quot;,&amp;nbsp;userId)) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.Information(&quot;User&amp;nbsp;requested&amp;nbsp;novel&amp;nbsp;draft&amp;nbsp;list&quot;); &lt;br /&gt;} &lt;br /&gt;이렇게&amp;nbsp;남긴&amp;nbsp;값은&amp;nbsp;해당&amp;nbsp;흐름&amp;nbsp;안에서&amp;nbsp;발생하는&amp;nbsp;로그에&amp;nbsp;함께&amp;nbsp;붙습니다.&amp;nbsp;나중에&amp;nbsp;특정&amp;nbsp;사용자나&amp;nbsp;특정&amp;nbsp;요청을&amp;nbsp;기준으로&amp;nbsp;로그를&amp;nbsp;묶어볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;단순히&amp;nbsp;&amp;ldquo;오류가&amp;nbsp;났다&amp;rdquo;가&amp;nbsp;아니라&amp;nbsp;&amp;ldquo;어떤&amp;nbsp;맥락에서&amp;nbsp;오류가&amp;nbsp;났는지&amp;rdquo;를&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;ASP.NET&amp;nbsp;Core에서는&amp;nbsp;요청&amp;nbsp;로그&amp;nbsp;정리가&amp;nbsp;편합니다 &lt;br /&gt;ASP.NET&amp;nbsp;Core&amp;nbsp;프로젝트에서는&amp;nbsp;Serilog.AspNetCore를&amp;nbsp;함께&amp;nbsp;사용하는&amp;nbsp;경우가&amp;nbsp;많습니다.&amp;nbsp;기본&amp;nbsp;요청&amp;nbsp;로그를&amp;nbsp;Serilog의&amp;nbsp;흐름으로&amp;nbsp;정리할&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;UseSerilogRequestLogging()을&amp;nbsp;통해&amp;nbsp;HTTP&amp;nbsp;요청&amp;nbsp;단위의&amp;nbsp;로그를&amp;nbsp;남길&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;builder.Host.UseSerilog((context,&amp;nbsp;services,&amp;nbsp;configuration)&amp;nbsp;=&amp;gt;&amp;nbsp;configuration &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ReadFrom.Configuration(context.Configuration) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ReadFrom.Services(services) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Enrich.FromLogContext()); &lt;br /&gt;&lt;br /&gt;app.UseSerilogRequestLogging(); &lt;br /&gt;요청&amp;nbsp;로그가&amp;nbsp;정리되면&amp;nbsp;운영&amp;nbsp;중&amp;nbsp;확인해야&amp;nbsp;할&amp;nbsp;기본&amp;nbsp;정보가&amp;nbsp;훨씬&amp;nbsp;안정적으로&amp;nbsp;남습니다.&amp;nbsp;어떤&amp;nbsp;API가&amp;nbsp;느린지,&amp;nbsp;어떤&amp;nbsp;경로에서&amp;nbsp;오류가&amp;nbsp;자주&amp;nbsp;나는지,&amp;nbsp;특정&amp;nbsp;시간대에&amp;nbsp;요청이&amp;nbsp;몰리는지&amp;nbsp;살펴보기&amp;nbsp;쉬워집니다.&amp;nbsp;큰&amp;nbsp;시스템이&amp;nbsp;아니더라도&amp;nbsp;이런&amp;nbsp;기록은&amp;nbsp;나중에&amp;nbsp;서비스를&amp;nbsp;다듬는&amp;nbsp;기준이&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;제가&amp;nbsp;Serilog를&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;신경&amp;nbsp;쓰는&amp;nbsp;기준 &lt;br /&gt;Serilog를&amp;nbsp;쓴다고&amp;nbsp;해서&amp;nbsp;로그가&amp;nbsp;자동으로&amp;nbsp;좋아지는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;오히려&amp;nbsp;아무&amp;nbsp;기준&amp;nbsp;없이&amp;nbsp;많이&amp;nbsp;남기면&amp;nbsp;나중에&amp;nbsp;더&amp;nbsp;찾기&amp;nbsp;어려운&amp;nbsp;기록이&amp;nbsp;됩니다.&amp;nbsp;그래서&amp;nbsp;저는&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;기준을&amp;nbsp;두고&amp;nbsp;사용하려고&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;첫째,&amp;nbsp;문자열&amp;nbsp;보간보다&amp;nbsp;메시지&amp;nbsp;템플릿을&amp;nbsp;사용합니다. &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;피하고&amp;nbsp;싶은&amp;nbsp;방식 &lt;br /&gt;Log.Information($&quot;Order&amp;nbsp;{orderId}&amp;nbsp;completed&amp;nbsp;in&amp;nbsp;{elapsedMs}ms&quot;); &lt;br /&gt;&lt;br /&gt;//&amp;nbsp;선호하는&amp;nbsp;방식 &lt;br /&gt;Log.Information(&quot;Order&amp;nbsp;{OrderId}&amp;nbsp;completed&amp;nbsp;in&amp;nbsp;{ElapsedMs}ms&quot;,&amp;nbsp;orderId,&amp;nbsp;elapsedMs); &lt;br /&gt;두&amp;nbsp;번째&amp;nbsp;방식은&amp;nbsp;OrderId와&amp;nbsp;ElapsedMs가&amp;nbsp;속성으로&amp;nbsp;남습니다.&amp;nbsp;나중에&amp;nbsp;검색과&amp;nbsp;집계가&amp;nbsp;쉬워집니다. &lt;br /&gt;&lt;br /&gt;둘째,&amp;nbsp;로그&amp;nbsp;레벨을&amp;nbsp;너무&amp;nbsp;가볍게&amp;nbsp;쓰지&amp;nbsp;않습니다.&amp;nbsp;Information은&amp;nbsp;서비스&amp;nbsp;흐름을&amp;nbsp;이해하는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;기록에&amp;nbsp;사용하고,&amp;nbsp;Warning은&amp;nbsp;당장&amp;nbsp;실패는&amp;nbsp;아니지만&amp;nbsp;확인이&amp;nbsp;필요한&amp;nbsp;상황에&amp;nbsp;사용합니다.&amp;nbsp;Error는&amp;nbsp;실제로&amp;nbsp;처리가&amp;nbsp;실패했거나&amp;nbsp;사용자가&amp;nbsp;영향을&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;경우에&amp;nbsp;남기는&amp;nbsp;편이&amp;nbsp;좋습니다. &lt;br /&gt;&lt;br /&gt;셋째,&amp;nbsp;민감한&amp;nbsp;정보는&amp;nbsp;로그에&amp;nbsp;남기지&amp;nbsp;않습니다.&amp;nbsp;이메일,&amp;nbsp;전화번호,&amp;nbsp;토큰,&amp;nbsp;결제&amp;nbsp;정보,&amp;nbsp;비밀번호&amp;nbsp;같은&amp;nbsp;값은&amp;nbsp;운영&amp;nbsp;편의를&amp;nbsp;위해&amp;nbsp;남기기&amp;nbsp;시작하면&amp;nbsp;나중에&amp;nbsp;더&amp;nbsp;큰&amp;nbsp;위험이&amp;nbsp;됩니다.&amp;nbsp;로그는&amp;nbsp;문제&amp;nbsp;해결을&amp;nbsp;돕는&amp;nbsp;기록이어야지,&amp;nbsp;개인정보&amp;nbsp;저장소가&amp;nbsp;되어서는&amp;nbsp;안&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;넷째,&amp;nbsp;운영자가&amp;nbsp;실제로&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;위치에&amp;nbsp;로그를&amp;nbsp;둡니다.&amp;nbsp;아무리&amp;nbsp;좋은&amp;nbsp;로그를&amp;nbsp;남겨도&amp;nbsp;확인하기&amp;nbsp;어렵다면&amp;nbsp;의미가&amp;nbsp;줄어듭니다.&amp;nbsp;작은&amp;nbsp;서비스라면&amp;nbsp;파일&amp;nbsp;로그와&amp;nbsp;콘솔만으로도&amp;nbsp;시작할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;규모가&amp;nbsp;커지거나&amp;nbsp;추적이&amp;nbsp;어려워지면&amp;nbsp;Seq&amp;nbsp;같은&amp;nbsp;도구를&amp;nbsp;붙여&amp;nbsp;구조화된&amp;nbsp;검색&amp;nbsp;환경을&amp;nbsp;만드는&amp;nbsp;식으로&amp;nbsp;단계적으로&amp;nbsp;늘리는&amp;nbsp;편이&amp;nbsp;현실적입니다. &lt;br /&gt;&lt;br /&gt;작은&amp;nbsp;서비스일수록&amp;nbsp;로그가&amp;nbsp;더&amp;nbsp;중요할&amp;nbsp;때가&amp;nbsp;있습니다 &lt;br /&gt;큰&amp;nbsp;조직에서는&amp;nbsp;모니터링,&amp;nbsp;알림,&amp;nbsp;장애&amp;nbsp;대응&amp;nbsp;체계가&amp;nbsp;따로&amp;nbsp;마련되어&amp;nbsp;있는&amp;nbsp;경우가&amp;nbsp;많습니다.&amp;nbsp;하지만&amp;nbsp;혼자&amp;nbsp;만드는&amp;nbsp;서비스에서는&amp;nbsp;그런&amp;nbsp;체계를&amp;nbsp;처음부터&amp;nbsp;모두&amp;nbsp;갖추기&amp;nbsp;어렵습니다.&amp;nbsp;그렇다고&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;감으로만&amp;nbsp;대응할&amp;nbsp;수는&amp;nbsp;없습니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;작은&amp;nbsp;서비스일수록&amp;nbsp;최소한의&amp;nbsp;로그&amp;nbsp;기준이&amp;nbsp;필요하다고&amp;nbsp;느낍니다.&amp;nbsp;사용자가&amp;nbsp;어떤&amp;nbsp;흐름에서&amp;nbsp;막혔는지,&amp;nbsp;특정&amp;nbsp;기능이&amp;nbsp;실제로&amp;nbsp;호출되고&amp;nbsp;있는지,&amp;nbsp;예외가&amp;nbsp;반복되는&amp;nbsp;구간은&amp;nbsp;어디인지&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다.&amp;nbsp;Serilog는&amp;nbsp;이&amp;nbsp;기준을&amp;nbsp;너무&amp;nbsp;무겁지&amp;nbsp;않게&amp;nbsp;시작할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;도와줍니다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;메리톡톡처럼&amp;nbsp;창작&amp;nbsp;흐름을&amp;nbsp;돕는&amp;nbsp;서비스를&amp;nbsp;만들&amp;nbsp;때는&amp;nbsp;사용자의&amp;nbsp;작업&amp;nbsp;흐름을&amp;nbsp;방해하지&amp;nbsp;않는&amp;nbsp;안정성이&amp;nbsp;중요합니다.&amp;nbsp;기능이&amp;nbsp;많아지는&amp;nbsp;것보다,&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;원인을&amp;nbsp;찾아&amp;nbsp;다시&amp;nbsp;이어갈&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;구조가&amp;nbsp;먼저일&amp;nbsp;때가&amp;nbsp;있습니다.&amp;nbsp;로그는&amp;nbsp;그&amp;nbsp;구조를&amp;nbsp;받쳐주는&amp;nbsp;가장&amp;nbsp;기본적인&amp;nbsp;기록입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;마무리&lt;/b&gt; &lt;br /&gt;Serilog는&amp;nbsp;닷넷에서&amp;nbsp;많이&amp;nbsp;쓰이는&amp;nbsp;로깅&amp;nbsp;라이브러리입니다.&amp;nbsp;하지만&amp;nbsp;제게는&amp;nbsp;단순히&amp;nbsp;유명해서&amp;nbsp;쓰는&amp;nbsp;도구라기보다,&amp;nbsp;서비스를&amp;nbsp;오래&amp;nbsp;운영하기&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;기록&amp;nbsp;방식을&amp;nbsp;정리해주는&amp;nbsp;도구에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;로그는&amp;nbsp;개발자의&amp;nbsp;습관처럼&amp;nbsp;보이지만,&amp;nbsp;실제로는&amp;nbsp;운영자의&amp;nbsp;태도와도&amp;nbsp;연결됩니다.&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;원인을&amp;nbsp;찾을&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;남기는&amp;nbsp;것,&amp;nbsp;나중에&amp;nbsp;다시&amp;nbsp;읽어도&amp;nbsp;상황을&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;정리하는&amp;nbsp;것,&amp;nbsp;필요한&amp;nbsp;정보와&amp;nbsp;남기면&amp;nbsp;안&amp;nbsp;되는&amp;nbsp;정보를&amp;nbsp;구분하는&amp;nbsp;것.&amp;nbsp;이런&amp;nbsp;작은&amp;nbsp;기준들이&amp;nbsp;쌓이면&amp;nbsp;서비스는&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;오래&amp;nbsp;버틸&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;아직&amp;nbsp;모든&amp;nbsp;프로젝트에&amp;nbsp;완벽한&amp;nbsp;로깅&amp;nbsp;구조를&amp;nbsp;갖추고&amp;nbsp;있는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;다만&amp;nbsp;닷넷&amp;nbsp;프로젝트를&amp;nbsp;다시&amp;nbsp;만들&amp;nbsp;때마다&amp;nbsp;Serilog를&amp;nbsp;먼저&amp;nbsp;떠올리는&amp;nbsp;이유는&amp;nbsp;분명합니다.&amp;nbsp;혼자&amp;nbsp;만들고&amp;nbsp;운영하는&amp;nbsp;입장에서,&amp;nbsp;나중의&amp;nbsp;저를&amp;nbsp;도와주는&amp;nbsp;기록을&amp;nbsp;남기기에&amp;nbsp;꽤&amp;nbsp;현실적인&amp;nbsp;도구이기&amp;nbsp;때문입니다.&lt;/p&gt;</description>
      <category>개발 노트/ASP.NET Core</category>
      <category>DotNet</category>
      <category>LoGS</category>
      <category>Serilog</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/113</guid>
      <comments>https://roslyndev.tistory.com/113#entry113comment</comments>
      <pubDate>Mon, 6 Jul 2026 20:00:35 +0900</pubDate>
    </item>
    <item>
      <title>OIDC와 OPA로 접근 제어를 분리해보는 닷넷 설계 기록</title>
      <link>https://roslyndev.tistory.com/112</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서비스를&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;로그인보다&amp;nbsp;더&amp;nbsp;오래&amp;nbsp;고민하게&amp;nbsp;되는&amp;nbsp;부분이&amp;nbsp;있습니다.&amp;nbsp;바로&amp;nbsp;&amp;ldquo;이&amp;nbsp;사용자가&amp;nbsp;어디까지&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는가&amp;rdquo;를&amp;nbsp;판단하는&amp;nbsp;일입니다. &lt;br /&gt;&lt;br /&gt;처음에는&amp;nbsp;닷넷&amp;nbsp;코드&amp;nbsp;안에&amp;nbsp;Admin,&amp;nbsp;Manager,&amp;nbsp;User&amp;nbsp;같은&amp;nbsp;역할을&amp;nbsp;기준으로&amp;nbsp;조건문을&amp;nbsp;넣으면&amp;nbsp;충분해&amp;nbsp;보입니다.&amp;nbsp;하지만&amp;nbsp;서비스가&amp;nbsp;조금씩&amp;nbsp;커지고,&amp;nbsp;조직이나&amp;nbsp;기능&amp;nbsp;단위의&amp;nbsp;규칙이&amp;nbsp;늘어나면&amp;nbsp;접근&amp;nbsp;제어는&amp;nbsp;금방&amp;nbsp;복잡해집니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;보면서&amp;nbsp;인증과&amp;nbsp;인가를&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;분리해서&amp;nbsp;생각해보고&amp;nbsp;싶었습니다.&amp;nbsp;사용자가&amp;nbsp;누구인지&amp;nbsp;확인하는&amp;nbsp;일은&amp;nbsp;OIDC가&amp;nbsp;맡고,&amp;nbsp;그&amp;nbsp;사용자가&amp;nbsp;특정&amp;nbsp;자원에&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;판단하는&amp;nbsp;일은&amp;nbsp;OPA가&amp;nbsp;맡는&amp;nbsp;구조입니다.&amp;nbsp;닷넷&amp;nbsp;애플리케이션은&amp;nbsp;두&amp;nbsp;세계를&amp;nbsp;연결하는&amp;nbsp;얇은&amp;nbsp;통로가&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;OIDC는&amp;nbsp;사용자가&amp;nbsp;누구인지&amp;nbsp;확인합니다 &lt;br /&gt;OIDC,&amp;nbsp;즉&amp;nbsp;OpenID&amp;nbsp;Connect는&amp;nbsp;OAuth&amp;nbsp;2.0&amp;nbsp;위에&amp;nbsp;인증&amp;nbsp;계층을&amp;nbsp;얹은&amp;nbsp;표준입니다.&amp;nbsp;쉽게&amp;nbsp;말하면&amp;nbsp;&amp;ldquo;이&amp;nbsp;사용자가&amp;nbsp;누구인지&amp;rdquo;를&amp;nbsp;애플리케이션이&amp;nbsp;신뢰할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방식으로&amp;nbsp;전달받기&amp;nbsp;위한&amp;nbsp;구조입니다. &lt;br /&gt;&lt;br /&gt;닷넷에서는&amp;nbsp;ASP.NET&amp;nbsp;Core의&amp;nbsp;OpenID&amp;nbsp;Connect&amp;nbsp;인증&amp;nbsp;미들웨어를&amp;nbsp;사용하면&amp;nbsp;비교적&amp;nbsp;익숙한&amp;nbsp;방식으로&amp;nbsp;붙일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;Microsoft&amp;nbsp;Entra&amp;nbsp;ID,&amp;nbsp;Keycloak,&amp;nbsp;Auth0,&amp;nbsp;Duende&amp;nbsp;IdentityServer&amp;nbsp;같은&amp;nbsp;OIDC&amp;nbsp;Provider를&amp;nbsp;통해&amp;nbsp;로그인하고,&amp;nbsp;애플리케이션은&amp;nbsp;ID&amp;nbsp;Token이나&amp;nbsp;Access&amp;nbsp;Token에&amp;nbsp;담긴&amp;nbsp;클레임을&amp;nbsp;읽습니다. &lt;br /&gt;&lt;br /&gt;여기서&amp;nbsp;중요한&amp;nbsp;것은&amp;nbsp;OIDC가&amp;nbsp;모든&amp;nbsp;접근&amp;nbsp;제어&amp;nbsp;문제를&amp;nbsp;해결해주지는&amp;nbsp;않는다는&amp;nbsp;점입니다.&amp;nbsp;OIDC는&amp;nbsp;사용자의&amp;nbsp;식별자,&amp;nbsp;이메일,&amp;nbsp;조직,&amp;nbsp;역할,&amp;nbsp;그룹&amp;nbsp;같은&amp;nbsp;정보를&amp;nbsp;전달해줄&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;하지만&amp;nbsp;&amp;ldquo;이&amp;nbsp;사용자가&amp;nbsp;이&amp;nbsp;문서의&amp;nbsp;수정&amp;nbsp;버튼을&amp;nbsp;눌러도&amp;nbsp;되는가&amp;rdquo;,&amp;nbsp;&amp;ldquo;이&amp;nbsp;프로젝트의&amp;nbsp;결제&amp;nbsp;정보를&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는가&amp;rdquo;&amp;nbsp;같은&amp;nbsp;판단은&amp;nbsp;결국&amp;nbsp;서비스의&amp;nbsp;정책에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;처음에는&amp;nbsp;이&amp;nbsp;판단을&amp;nbsp;컨트롤러나&amp;nbsp;서비스&amp;nbsp;코드&amp;nbsp;안에&amp;nbsp;직접&amp;nbsp;넣게&amp;nbsp;됩니다.&amp;nbsp;문제는&amp;nbsp;시간이&amp;nbsp;지나면서&amp;nbsp;이&amp;nbsp;규칙들이&amp;nbsp;흩어진다는&amp;nbsp;점입니다.&amp;nbsp;어떤&amp;nbsp;규칙은&amp;nbsp;컨트롤러에&amp;nbsp;있고,&amp;nbsp;어떤&amp;nbsp;규칙은&amp;nbsp;서비스&amp;nbsp;레이어에&amp;nbsp;있고,&amp;nbsp;어떤&amp;nbsp;규칙은&amp;nbsp;데이터&amp;nbsp;조회&amp;nbsp;조건에&amp;nbsp;숨어&amp;nbsp;있게&amp;nbsp;됩니다.&amp;nbsp;나중에&amp;nbsp;접근&amp;nbsp;정책을&amp;nbsp;바꾸려면&amp;nbsp;코드를&amp;nbsp;따라다니며&amp;nbsp;확인해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;OPA는&amp;nbsp;접근&amp;nbsp;판단을&amp;nbsp;밖으로&amp;nbsp;꺼냅니다 &lt;br /&gt;OPA,&amp;nbsp;Open&amp;nbsp;Policy&amp;nbsp;Agent는&amp;nbsp;정책을&amp;nbsp;코드&amp;nbsp;바깥에서&amp;nbsp;판단할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;해주는&amp;nbsp;정책&amp;nbsp;엔진입니다.&amp;nbsp;정책은&amp;nbsp;Rego라는&amp;nbsp;선언형&amp;nbsp;언어로&amp;nbsp;작성합니다.&amp;nbsp;애플리케이션은&amp;nbsp;OPA에게&amp;nbsp;&amp;ldquo;이&amp;nbsp;입력값에서&amp;nbsp;접근을&amp;nbsp;허용해도&amp;nbsp;되는가&amp;rdquo;를&amp;nbsp;물어보고,&amp;nbsp;OPA는&amp;nbsp;정책에&amp;nbsp;따라&amp;nbsp;결과를&amp;nbsp;돌려줍니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;구조의&amp;nbsp;장점은&amp;nbsp;접근&amp;nbsp;제어&amp;nbsp;규칙이&amp;nbsp;애플리케이션&amp;nbsp;코드&amp;nbsp;안에&amp;nbsp;흩어지지&amp;nbsp;않는다는&amp;nbsp;데&amp;nbsp;있습니다.&amp;nbsp;닷넷&amp;nbsp;서비스는&amp;nbsp;사용자의&amp;nbsp;클레임,&amp;nbsp;요청&amp;nbsp;경로,&amp;nbsp;HTTP&amp;nbsp;메서드,&amp;nbsp;대상&amp;nbsp;리소스의&amp;nbsp;소유자&amp;nbsp;정보&amp;nbsp;같은&amp;nbsp;데이터를&amp;nbsp;모아&amp;nbsp;OPA에&amp;nbsp;전달합니다.&amp;nbsp;OPA는&amp;nbsp;그&amp;nbsp;데이터를&amp;nbsp;기준으로&amp;nbsp;허용&amp;nbsp;여부를&amp;nbsp;판단합니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;이런&amp;nbsp;흐름을&amp;nbsp;생각할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;사용자가&amp;nbsp;OIDC&amp;nbsp;Provider를&amp;nbsp;통해&amp;nbsp;로그인합니다. &lt;br /&gt;ASP.NET&amp;nbsp;Core&amp;nbsp;애플리케이션은&amp;nbsp;토큰을&amp;nbsp;검증하고&amp;nbsp;사용자&amp;nbsp;클레임을&amp;nbsp;확보합니다. &lt;br /&gt;요청이&amp;nbsp;들어오면&amp;nbsp;닷넷&amp;nbsp;미들웨어나&amp;nbsp;AuthorizationHandler가&amp;nbsp;접근&amp;nbsp;판단에&amp;nbsp;필요한&amp;nbsp;정보를&amp;nbsp;구성합니다. &lt;br /&gt;닷넷&amp;nbsp;애플리케이션은&amp;nbsp;OPA의&amp;nbsp;REST&amp;nbsp;API로&amp;nbsp;정책&amp;nbsp;판단을&amp;nbsp;요청합니다. &lt;br /&gt;OPA가&amp;nbsp;허용&amp;nbsp;여부와&amp;nbsp;필요한&amp;nbsp;사유를&amp;nbsp;응답합니다. &lt;br /&gt;닷넷&amp;nbsp;애플리케이션은&amp;nbsp;그&amp;nbsp;결과에&amp;nbsp;따라&amp;nbsp;요청을&amp;nbsp;계속&amp;nbsp;처리하거나&amp;nbsp;차단합니다. &lt;br /&gt;이렇게&amp;nbsp;보면&amp;nbsp;OPA는&amp;nbsp;로그인&amp;nbsp;시스템이&amp;nbsp;아니라&amp;nbsp;판단&amp;nbsp;시스템에&amp;nbsp;가깝습니다.&amp;nbsp;OIDC가&amp;nbsp;&amp;ldquo;누구인가&amp;rdquo;를&amp;nbsp;알려주고,&amp;nbsp;OPA는&amp;nbsp;&amp;ldquo;그래서&amp;nbsp;지금&amp;nbsp;이&amp;nbsp;행동을&amp;nbsp;해도&amp;nbsp;되는가&amp;rdquo;를&amp;nbsp;판단합니다. &lt;br /&gt;&lt;br /&gt;닷넷에서는&amp;nbsp;어디에&amp;nbsp;붙일&amp;nbsp;수&amp;nbsp;있을까 &lt;br /&gt;ASP.NET&amp;nbsp;Core에서는&amp;nbsp;몇&amp;nbsp;가지&amp;nbsp;위치에서&amp;nbsp;OPA를&amp;nbsp;붙일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;가장&amp;nbsp;단순한&amp;nbsp;방식은&amp;nbsp;커스텀&amp;nbsp;미들웨어를&amp;nbsp;만드는&amp;nbsp;것입니다.&amp;nbsp;요청이&amp;nbsp;컨트롤러에&amp;nbsp;도달하기&amp;nbsp;전에&amp;nbsp;사용자&amp;nbsp;클레임과&amp;nbsp;요청&amp;nbsp;정보를&amp;nbsp;모아&amp;nbsp;OPA에&amp;nbsp;질의하고,&amp;nbsp;허용되지&amp;nbsp;않으면&amp;nbsp;403&amp;nbsp;응답을&amp;nbsp;반환합니다. &lt;br /&gt;&lt;br /&gt;조금&amp;nbsp;더&amp;nbsp;닷넷다운&amp;nbsp;방식으로는&amp;nbsp;IAuthorizationHandler를&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;기존의&amp;nbsp;[Authorize]&amp;nbsp;특성과&amp;nbsp;정책&amp;nbsp;기반&amp;nbsp;권한&amp;nbsp;부여&amp;nbsp;흐름을&amp;nbsp;유지하면서,&amp;nbsp;실제&amp;nbsp;판단만&amp;nbsp;OPA에&amp;nbsp;위임할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이미&amp;nbsp;ASP.NET&amp;nbsp;Core&amp;nbsp;Authorization을&amp;nbsp;사용하고&amp;nbsp;있다면&amp;nbsp;이&amp;nbsp;방식이&amp;nbsp;구조적으로&amp;nbsp;더&amp;nbsp;자연스럽습니다. &lt;br /&gt;&lt;br /&gt;입력값은&amp;nbsp;대략&amp;nbsp;이런&amp;nbsp;형태가&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;user&quot;:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;sub&quot;:&amp;nbsp;&quot;user-123&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;roles&quot;:&amp;nbsp;[&quot;writer&quot;], &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;tenant_id&quot;:&amp;nbsp;&quot;tenant-a&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;request&quot;:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;method&quot;:&amp;nbsp;&quot;POST&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;path&quot;:&amp;nbsp;&quot;/api/articles/100/publish&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&quot;resource&quot;:&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;owner_id&quot;:&amp;nbsp;&quot;user-123&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;status&quot;:&amp;nbsp;&quot;draft&quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;} &lt;br /&gt;OPA&amp;nbsp;정책은&amp;nbsp;이&amp;nbsp;입력값을&amp;nbsp;보고&amp;nbsp;판단합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;글의&amp;nbsp;소유자이고,&amp;nbsp;상태가&amp;nbsp;초안이며,&amp;nbsp;사용자의&amp;nbsp;역할이&amp;nbsp;작성자라면&amp;nbsp;발행을&amp;nbsp;허용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;반대로&amp;nbsp;소유자가&amp;nbsp;아니거나&amp;nbsp;이미&amp;nbsp;발행된&amp;nbsp;글이라면&amp;nbsp;차단할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;방식은&amp;nbsp;역할&amp;nbsp;기반&amp;nbsp;접근&amp;nbsp;제어만으로&amp;nbsp;부족할&amp;nbsp;때&amp;nbsp;특히&amp;nbsp;유용합니다.&amp;nbsp;실제&amp;nbsp;서비스에서는&amp;nbsp;역할보다&amp;nbsp;맥락이&amp;nbsp;더&amp;nbsp;중요할&amp;nbsp;때가&amp;nbsp;많습니다.&amp;nbsp;같은&amp;nbsp;작성자라도&amp;nbsp;자기&amp;nbsp;글은&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;다른&amp;nbsp;사람의&amp;nbsp;글은&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;없고,&amp;nbsp;같은&amp;nbsp;관리자라도&amp;nbsp;특정&amp;nbsp;테넌트&amp;nbsp;안에서만&amp;nbsp;권한을&amp;nbsp;가져야&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;운영&amp;nbsp;관점에서&amp;nbsp;조심해야&amp;nbsp;할&amp;nbsp;부분 &lt;br /&gt;물론&amp;nbsp;OPA를&amp;nbsp;붙인다고&amp;nbsp;해서&amp;nbsp;구조가&amp;nbsp;자동으로&amp;nbsp;단순해지는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;오히려&amp;nbsp;작은&amp;nbsp;서비스에서는&amp;nbsp;과한&amp;nbsp;선택이&amp;nbsp;될&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;정책&amp;nbsp;엔진이&amp;nbsp;하나&amp;nbsp;더&amp;nbsp;생긴다는&amp;nbsp;것은&amp;nbsp;배포,&amp;nbsp;모니터링,&amp;nbsp;장애&amp;nbsp;대응&amp;nbsp;지점도&amp;nbsp;하나&amp;nbsp;늘어난다는&amp;nbsp;뜻입니다. &lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;처음부터&amp;nbsp;모든&amp;nbsp;권한을&amp;nbsp;OPA로&amp;nbsp;옮기기보다는,&amp;nbsp;바뀔&amp;nbsp;가능성이&amp;nbsp;높고&amp;nbsp;코드&amp;nbsp;안에&amp;nbsp;흩어지기&amp;nbsp;쉬운&amp;nbsp;정책부터&amp;nbsp;분리하는&amp;nbsp;편이&amp;nbsp;현실적입니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;관리자&amp;nbsp;메뉴&amp;nbsp;접근처럼&amp;nbsp;단순한&amp;nbsp;규칙은&amp;nbsp;닷넷의&amp;nbsp;기본&amp;nbsp;Authorization만으로도&amp;nbsp;충분할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;반면&amp;nbsp;테넌트,&amp;nbsp;리소스&amp;nbsp;소유자,&amp;nbsp;상태,&amp;nbsp;요청&amp;nbsp;행위가&amp;nbsp;함께&amp;nbsp;얽히는&amp;nbsp;규칙은&amp;nbsp;OPA로&amp;nbsp;분리했을&amp;nbsp;때&amp;nbsp;장점이&amp;nbsp;생깁니다. &lt;br /&gt;&lt;br /&gt;또&amp;nbsp;하나&amp;nbsp;중요한&amp;nbsp;점은&amp;nbsp;OPA에&amp;nbsp;전달하는&amp;nbsp;입력값의&amp;nbsp;기준을&amp;nbsp;잘&amp;nbsp;정리하는&amp;nbsp;일입니다.&amp;nbsp;정책&amp;nbsp;엔진은&amp;nbsp;입력값이&amp;nbsp;정확할&amp;nbsp;때만&amp;nbsp;좋은&amp;nbsp;판단을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;사용자&amp;nbsp;클레임을&amp;nbsp;그대로&amp;nbsp;믿을&amp;nbsp;것인지,&amp;nbsp;데이터베이스에서&amp;nbsp;리소스&amp;nbsp;정보를&amp;nbsp;다시&amp;nbsp;조회할&amp;nbsp;것인지,&amp;nbsp;토큰에&amp;nbsp;들어&amp;nbsp;있는&amp;nbsp;역할과&amp;nbsp;내부&amp;nbsp;권한&amp;nbsp;테이블이&amp;nbsp;다를&amp;nbsp;때&amp;nbsp;무엇을&amp;nbsp;우선할&amp;nbsp;것인지&amp;nbsp;같은&amp;nbsp;기준이&amp;nbsp;필요합니다. &lt;br /&gt;&lt;br /&gt;성능도&amp;nbsp;고려해야&amp;nbsp;합니다.&amp;nbsp;모든&amp;nbsp;요청마다&amp;nbsp;OPA를&amp;nbsp;호출하면&amp;nbsp;네트워크&amp;nbsp;비용이&amp;nbsp;생깁니다.&amp;nbsp;사이드카로&amp;nbsp;붙일지,&amp;nbsp;별도&amp;nbsp;정책&amp;nbsp;서버로&amp;nbsp;둘지,&amp;nbsp;일부&amp;nbsp;결과를&amp;nbsp;캐시할지,&amp;nbsp;실패했을&amp;nbsp;때&amp;nbsp;기본적으로&amp;nbsp;차단할지&amp;nbsp;허용할지&amp;nbsp;같은&amp;nbsp;운영&amp;nbsp;기준도&amp;nbsp;함께&amp;nbsp;정해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;제가&amp;nbsp;이&amp;nbsp;구조에&amp;nbsp;관심을&amp;nbsp;두는&amp;nbsp;이유 &lt;br /&gt;제가&amp;nbsp;OIDC와&amp;nbsp;OPA&amp;nbsp;조합에&amp;nbsp;관심을&amp;nbsp;두는&amp;nbsp;이유는&amp;nbsp;최신&amp;nbsp;기술을&amp;nbsp;더&amp;nbsp;붙이고&amp;nbsp;싶어서라기보다,&amp;nbsp;역할과&amp;nbsp;정책이&amp;nbsp;커지는&amp;nbsp;순간을&amp;nbsp;미리&amp;nbsp;상상하게&amp;nbsp;되었기&amp;nbsp;때문입니다.&amp;nbsp;혼자&amp;nbsp;서비스를&amp;nbsp;만들고&amp;nbsp;운영하다&amp;nbsp;보면&amp;nbsp;기능을&amp;nbsp;빨리&amp;nbsp;붙이는&amp;nbsp;것만큼이나&amp;nbsp;나중에&amp;nbsp;고치기&amp;nbsp;쉬운&amp;nbsp;구조가&amp;nbsp;중요해집니다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;닷넷&amp;nbsp;기반의&amp;nbsp;서비스는&amp;nbsp;인증과&amp;nbsp;권한&amp;nbsp;부여&amp;nbsp;기능이&amp;nbsp;이미&amp;nbsp;잘&amp;nbsp;정리되어&amp;nbsp;있습니다.&amp;nbsp;그래서&amp;nbsp;모든&amp;nbsp;것을&amp;nbsp;바깥으로&amp;nbsp;밀어내기보다,&amp;nbsp;닷넷이&amp;nbsp;잘하는&amp;nbsp;부분은&amp;nbsp;그대로&amp;nbsp;두고,&amp;nbsp;자주&amp;nbsp;바뀌는&amp;nbsp;정책&amp;nbsp;판단만&amp;nbsp;분리하는&amp;nbsp;방식이&amp;nbsp;더&amp;nbsp;현실적으로&amp;nbsp;느껴집니다. &lt;br /&gt;&lt;br /&gt;OIDC는&amp;nbsp;신원을&amp;nbsp;확인하는&amp;nbsp;안정적인&amp;nbsp;입구가&amp;nbsp;되고,&amp;nbsp;OPA는&amp;nbsp;정책을&amp;nbsp;기록하고&amp;nbsp;검증하는&amp;nbsp;별도의&amp;nbsp;공간이&amp;nbsp;됩니다.&amp;nbsp;닷넷&amp;nbsp;애플리케이션은&amp;nbsp;그&amp;nbsp;사이에서&amp;nbsp;요청의&amp;nbsp;맥락을&amp;nbsp;정리해&amp;nbsp;전달합니다.&amp;nbsp;이&amp;nbsp;구분이&amp;nbsp;명확해지면&amp;nbsp;나중에&amp;nbsp;정책을&amp;nbsp;바꿀&amp;nbsp;때도&amp;nbsp;&amp;ldquo;코드&amp;nbsp;어디에&amp;nbsp;조건문을&amp;nbsp;넣었더라&amp;rdquo;&amp;nbsp;하고&amp;nbsp;헤매는&amp;nbsp;시간을&amp;nbsp;줄일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;마무리 &lt;br /&gt;접근&amp;nbsp;제어는&amp;nbsp;처음에는&amp;nbsp;단순한&amp;nbsp;권한&amp;nbsp;체크처럼&amp;nbsp;보이지만,&amp;nbsp;서비스가&amp;nbsp;오래&amp;nbsp;갈수록&amp;nbsp;운영의&amp;nbsp;언어에&amp;nbsp;가까워집니다.&amp;nbsp;누가,&amp;nbsp;어떤&amp;nbsp;상황에서,&amp;nbsp;어떤&amp;nbsp;자원에,&amp;nbsp;어떤&amp;nbsp;행동을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는지를&amp;nbsp;정리하는&amp;nbsp;일이기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;OPA와&amp;nbsp;OIDC를&amp;nbsp;닷넷에&amp;nbsp;붙이는&amp;nbsp;구조는&amp;nbsp;모든&amp;nbsp;서비스의&amp;nbsp;정답은&amp;nbsp;아닙니다.&amp;nbsp;다만&amp;nbsp;인증과&amp;nbsp;정책&amp;nbsp;판단을&amp;nbsp;분리해두면,&amp;nbsp;나중에&amp;nbsp;서비스가&amp;nbsp;커졌을&amp;nbsp;때&amp;nbsp;규칙을&amp;nbsp;더&amp;nbsp;차분하게&amp;nbsp;다룰&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;지금&amp;nbsp;제&amp;nbsp;기준에서는&amp;nbsp;이것이&amp;nbsp;&amp;ldquo;멋진&amp;nbsp;아키텍처&amp;rdquo;라기보다,&amp;nbsp;혼자&amp;nbsp;운영하는&amp;nbsp;서비스에서&amp;nbsp;복잡도를&amp;nbsp;한곳에&amp;nbsp;모아두기&amp;nbsp;위한&amp;nbsp;실험에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;아직&amp;nbsp;이&amp;nbsp;구조를&amp;nbsp;어디까지&amp;nbsp;적용하는&amp;nbsp;것이&amp;nbsp;적당한지는&amp;nbsp;더&amp;nbsp;실험해봐야&amp;nbsp;합니다.&amp;nbsp;다만&amp;nbsp;이번&amp;nbsp;기록은&amp;nbsp;닷넷&amp;nbsp;서비스에서&amp;nbsp;접근&amp;nbsp;제어를&amp;nbsp;바라볼&amp;nbsp;때,&amp;nbsp;로그인과&amp;nbsp;권한&amp;nbsp;판단을&amp;nbsp;같은&amp;nbsp;덩어리로&amp;nbsp;보지&amp;nbsp;않기&amp;nbsp;위한&amp;nbsp;기준점으로&amp;nbsp;남겨두고&amp;nbsp;싶습니다.&lt;/p&gt;</description>
      <category>개발 노트/ASP.NET Core</category>
      <category>OIDC</category>
      <category>OPA</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/112</guid>
      <comments>https://roslyndev.tistory.com/112#entry112comment</comments>
      <pubDate>Sun, 5 Jul 2026 20:41:35 +0900</pubDate>
    </item>
    <item>
      <title>닷넷 어스파이어를 다시 살펴보게 된 이유</title>
      <link>https://roslyndev.tistory.com/111</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;닷넷&amp;nbsp;어스파이어를&amp;nbsp;다시&amp;nbsp;살펴보게&amp;nbsp;된&amp;nbsp;이유 &lt;br /&gt;요즘&amp;nbsp;애플리케이션은&amp;nbsp;예전처럼&amp;nbsp;하나의&amp;nbsp;프로젝트만&amp;nbsp;실행해서&amp;nbsp;끝나는&amp;nbsp;경우가&amp;nbsp;점점&amp;nbsp;줄어들고&amp;nbsp;있습니다.&amp;nbsp;API&amp;nbsp;서버가&amp;nbsp;있고,&amp;nbsp;프론트엔드가&amp;nbsp;있고,&amp;nbsp;데이터베이스와&amp;nbsp;Redis&amp;nbsp;같은&amp;nbsp;외부&amp;nbsp;서비스가&amp;nbsp;붙습니다.&amp;nbsp;여기에&amp;nbsp;로그,&amp;nbsp;설정,&amp;nbsp;배포&amp;nbsp;환경까지&amp;nbsp;생각하면&amp;nbsp;작은&amp;nbsp;서비스도&amp;nbsp;금방&amp;nbsp;여러&amp;nbsp;조각으로&amp;nbsp;나뉩니다. &lt;br /&gt;&lt;br /&gt;닷넷&amp;nbsp;어스파이어는&amp;nbsp;이런&amp;nbsp;분산&amp;nbsp;애플리케이션을&amp;nbsp;개발할&amp;nbsp;때&amp;nbsp;필요한&amp;nbsp;실행,&amp;nbsp;연결,&amp;nbsp;관찰&amp;nbsp;흐름을&amp;nbsp;한곳에서&amp;nbsp;정리해주는&amp;nbsp;도구입니다.&amp;nbsp;Microsoft&amp;nbsp;문서에서는&amp;nbsp;Aspire를&amp;nbsp;여러&amp;nbsp;언어를&amp;nbsp;지원하는&amp;nbsp;로컬&amp;nbsp;개발&amp;nbsp;시점의&amp;nbsp;오케스트레이션&amp;nbsp;도구&amp;nbsp;체인으로&amp;nbsp;설명하고&amp;nbsp;있습니다.&amp;nbsp;단순히&amp;nbsp;닷넷&amp;nbsp;프로젝트를&amp;nbsp;하나&amp;nbsp;더&amp;nbsp;만드는&amp;nbsp;도구라기보다,&amp;nbsp;여러&amp;nbsp;구성&amp;nbsp;요소를&amp;nbsp;함께&amp;nbsp;실행하고&amp;nbsp;살펴보기&amp;nbsp;위한&amp;nbsp;작업&amp;nbsp;환경에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;혼자&amp;nbsp;만드는&amp;nbsp;서비스에서&amp;nbsp;더&amp;nbsp;필요한&amp;nbsp;도구 &lt;br /&gt;혼자&amp;nbsp;서비스를&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;기능&amp;nbsp;자체보다&amp;nbsp;운영&amp;nbsp;흐름이&amp;nbsp;더&amp;nbsp;부담스러울&amp;nbsp;때가&amp;nbsp;있습니다.&amp;nbsp;로컬에서&amp;nbsp;여러&amp;nbsp;프로젝트를&amp;nbsp;켜고,&amp;nbsp;포트를&amp;nbsp;맞추고,&amp;nbsp;환경&amp;nbsp;변수를&amp;nbsp;확인하고,&amp;nbsp;로그를&amp;nbsp;따로&amp;nbsp;열어보는&amp;nbsp;일은&amp;nbsp;생각보다&amp;nbsp;자주&amp;nbsp;집중을&amp;nbsp;끊습니다. &lt;br /&gt;&lt;br /&gt;어스파이어는&amp;nbsp;이런&amp;nbsp;부분을&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;구조화해줍니다.&amp;nbsp;AppHost를&amp;nbsp;통해&amp;nbsp;애플리케이션의&amp;nbsp;구성&amp;nbsp;요소를&amp;nbsp;코드로&amp;nbsp;정의하고,&amp;nbsp;대시보드에서&amp;nbsp;각&amp;nbsp;서비스의&amp;nbsp;상태와&amp;nbsp;로그,&amp;nbsp;트레이스&amp;nbsp;정보를&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;개발&amp;nbsp;중에&amp;nbsp;무엇이&amp;nbsp;실행되고&amp;nbsp;있는지,&amp;nbsp;어디에서&amp;nbsp;문제가&amp;nbsp;생겼는지&amp;nbsp;보는&amp;nbsp;일이&amp;nbsp;조금&amp;nbsp;더&amp;nbsp;쉬워집니다. &lt;br /&gt;&lt;br /&gt;기술&amp;nbsp;과시보다&amp;nbsp;운영&amp;nbsp;가능한&amp;nbsp;구조 &lt;br /&gt;제가&amp;nbsp;이&amp;nbsp;도구를&amp;nbsp;흥미롭게&amp;nbsp;보는&amp;nbsp;이유는&amp;nbsp;최신&amp;nbsp;기술이라는&amp;nbsp;점&amp;nbsp;때문만은&amp;nbsp;아닙니다.&amp;nbsp;오히려&amp;nbsp;작은&amp;nbsp;서비스를&amp;nbsp;오래&amp;nbsp;운영하려면&amp;nbsp;복잡한&amp;nbsp;구조를&amp;nbsp;얼마나&amp;nbsp;덜&amp;nbsp;흔들리게&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는지가&amp;nbsp;더&amp;nbsp;중요하다고&amp;nbsp;느끼기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;어스파이어는&amp;nbsp;모든&amp;nbsp;문제를&amp;nbsp;대신&amp;nbsp;해결해주는&amp;nbsp;정답은&amp;nbsp;아닙니다.&amp;nbsp;하지만&amp;nbsp;서비스가&amp;nbsp;여러&amp;nbsp;조각으로&amp;nbsp;나뉘기&amp;nbsp;시작했을&amp;nbsp;때,&amp;nbsp;그&amp;nbsp;조각들을&amp;nbsp;어떻게&amp;nbsp;함께&amp;nbsp;실행하고&amp;nbsp;관찰할지에&amp;nbsp;대한&amp;nbsp;기준점을&amp;nbsp;만들어줍니다.&amp;nbsp;특히&amp;nbsp;닷넷&amp;nbsp;기반으로&amp;nbsp;API,&amp;nbsp;백그라운드&amp;nbsp;작업,&amp;nbsp;데이터&amp;nbsp;저장소를&amp;nbsp;함께&amp;nbsp;다루는&amp;nbsp;프로젝트라면&amp;nbsp;한&amp;nbsp;번쯤&amp;nbsp;살펴볼&amp;nbsp;만합니다. &lt;br /&gt;&lt;br /&gt;지금의&amp;nbsp;기준점 &lt;br /&gt;아직&amp;nbsp;제&amp;nbsp;프로젝트에&amp;nbsp;어디까지&amp;nbsp;적용하는&amp;nbsp;것이&amp;nbsp;적당한지는&amp;nbsp;더&amp;nbsp;실험해봐야&amp;nbsp;합니다.&amp;nbsp;작은&amp;nbsp;서비스에&amp;nbsp;너무&amp;nbsp;많은&amp;nbsp;구조를&amp;nbsp;얹으면&amp;nbsp;오히려&amp;nbsp;부담이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;다만&amp;nbsp;분명한&amp;nbsp;것은&amp;nbsp;있습니다.&amp;nbsp;혼자&amp;nbsp;만드는&amp;nbsp;서비스일수록&amp;nbsp;실행과&amp;nbsp;관찰의&amp;nbsp;흐름은&amp;nbsp;더&amp;nbsp;단순해야&amp;nbsp;합니다.&amp;nbsp;문제가&amp;nbsp;생겼을&amp;nbsp;때&amp;nbsp;바로&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;하고,&amp;nbsp;새로운&amp;nbsp;기능을&amp;nbsp;붙일&amp;nbsp;때&amp;nbsp;기존&amp;nbsp;구성과&amp;nbsp;충돌하지&amp;nbsp;않아야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;닷넷&amp;nbsp;어스파이어는&amp;nbsp;그런&amp;nbsp;관점에서&amp;nbsp;다시&amp;nbsp;살펴볼&amp;nbsp;만한&amp;nbsp;도구입니다.&amp;nbsp;이번&amp;nbsp;기록은&amp;nbsp;사용법을&amp;nbsp;깊게&amp;nbsp;정리한&amp;nbsp;글이라기보다,&amp;nbsp;앞으로&amp;nbsp;작은&amp;nbsp;서비스의&amp;nbsp;개발&amp;nbsp;환경을&amp;nbsp;어떻게&amp;nbsp;정리할지&amp;nbsp;고민하기&amp;nbsp;위한&amp;nbsp;출발점에&amp;nbsp;가깝습니다.&lt;/p&gt;</description>
      <category>개발 노트/ASP.NET Core</category>
      <category>모니터링</category>
      <category>어스파이어</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/111</guid>
      <comments>https://roslyndev.tistory.com/111#entry111comment</comments>
      <pubDate>Sun, 5 Jul 2026 20:40:36 +0900</pubDate>
    </item>
    <item>
      <title>React에서 서버 상태를 다루기 편하게 해주는 TanStack Query</title>
      <link>https://roslyndev.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;React로&amp;nbsp;화면을&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;생각보다&amp;nbsp;많은&amp;nbsp;시간이&amp;nbsp;API&amp;nbsp;데이터를&amp;nbsp;다루는&amp;nbsp;데&amp;nbsp;쓰입니다.&amp;nbsp;데이터를&amp;nbsp;불러오고,&amp;nbsp;로딩&amp;nbsp;상태를&amp;nbsp;표시하고,&amp;nbsp;실패했을&amp;nbsp;때의&amp;nbsp;처리를&amp;nbsp;만들고,&amp;nbsp;다시&amp;nbsp;새로고침해야&amp;nbsp;하는&amp;nbsp;시점을&amp;nbsp;고민합니다.&amp;nbsp;처음에는&amp;nbsp;단순한&amp;nbsp;fetch&amp;nbsp;코드로&amp;nbsp;충분해&amp;nbsp;보이지만,&amp;nbsp;화면이&amp;nbsp;늘어나면&amp;nbsp;이&amp;nbsp;흐름이&amp;nbsp;금방&amp;nbsp;복잡해집니다. &lt;br /&gt;&lt;br /&gt;TanStack&amp;nbsp;Query,&amp;nbsp;예전&amp;nbsp;이름으로&amp;nbsp;React&amp;nbsp;Query는&amp;nbsp;이&amp;nbsp;문제를&amp;nbsp;꽤&amp;nbsp;잘&amp;nbsp;정리해주는&amp;nbsp;도구입니다.&amp;nbsp;React&amp;nbsp;애플리케이션에서&amp;nbsp;비동기&amp;nbsp;데이터,&amp;nbsp;특히&amp;nbsp;서버에서&amp;nbsp;가져오는&amp;nbsp;데이터를&amp;nbsp;가져오고,&amp;nbsp;캐싱하고,&amp;nbsp;동기화하고,&amp;nbsp;업데이트하는&amp;nbsp;일을&amp;nbsp;도와줍니다. &lt;br /&gt;&lt;br /&gt;클라이언트&amp;nbsp;상태와&amp;nbsp;서버&amp;nbsp;상태는&amp;nbsp;다릅니다 &lt;br /&gt;React에서&amp;nbsp;상태라고&amp;nbsp;하면&amp;nbsp;보통&amp;nbsp;useState나&amp;nbsp;Zustand&amp;nbsp;같은&amp;nbsp;상태&amp;nbsp;관리&amp;nbsp;도구를&amp;nbsp;떠올립니다.&amp;nbsp;하지만&amp;nbsp;서버에서&amp;nbsp;가져온&amp;nbsp;데이터는&amp;nbsp;일반적인&amp;nbsp;화면&amp;nbsp;상태와&amp;nbsp;조금&amp;nbsp;다릅니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;모달이&amp;nbsp;열려&amp;nbsp;있는지,&amp;nbsp;입력창에&amp;nbsp;어떤&amp;nbsp;값이&amp;nbsp;들어&amp;nbsp;있는지는&amp;nbsp;클라이언트&amp;nbsp;안에서만&amp;nbsp;관리하면&amp;nbsp;됩니다.&amp;nbsp;반면&amp;nbsp;게시글&amp;nbsp;목록,&amp;nbsp;사용자&amp;nbsp;정보,&amp;nbsp;알림&amp;nbsp;개수&amp;nbsp;같은&amp;nbsp;데이터는&amp;nbsp;서버에&amp;nbsp;원본이&amp;nbsp;있습니다.&amp;nbsp;화면에&amp;nbsp;보이는&amp;nbsp;값은&amp;nbsp;그&amp;nbsp;원본을&amp;nbsp;잠시&amp;nbsp;가져와&amp;nbsp;보여주는&amp;nbsp;캐시에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;TanStack&amp;nbsp;Query는&amp;nbsp;이&amp;nbsp;서버&amp;nbsp;상태를&amp;nbsp;다루는&amp;nbsp;데&amp;nbsp;집중합니다.&amp;nbsp;단순히&amp;nbsp;API를&amp;nbsp;호출하는&amp;nbsp;도구라기보다,&amp;nbsp;가져온&amp;nbsp;데이터의&amp;nbsp;생명주기를&amp;nbsp;관리해주는&amp;nbsp;도구에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;반복되는&amp;nbsp;코드를&amp;nbsp;줄여줍니다 &lt;br /&gt;직접&amp;nbsp;API&amp;nbsp;호출&amp;nbsp;코드를&amp;nbsp;작성하면&amp;nbsp;보통&amp;nbsp;loading,&amp;nbsp;error,&amp;nbsp;data&amp;nbsp;상태를&amp;nbsp;따로&amp;nbsp;관리하게&amp;nbsp;됩니다.&amp;nbsp;같은&amp;nbsp;패턴이&amp;nbsp;여러&amp;nbsp;화면에&amp;nbsp;반복되고,&amp;nbsp;캐시를&amp;nbsp;직접&amp;nbsp;관리하려면&amp;nbsp;더&amp;nbsp;복잡해집니다. &lt;br /&gt;&lt;br /&gt;TanStack&amp;nbsp;Query를&amp;nbsp;사용하면&amp;nbsp;useQuery&amp;nbsp;훅으로&amp;nbsp;데이터를&amp;nbsp;가져오고,&amp;nbsp;로딩&amp;nbsp;여부나&amp;nbsp;에러&amp;nbsp;상태,&amp;nbsp;성공한&amp;nbsp;데이터를&amp;nbsp;함께&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;같은&amp;nbsp;query&amp;nbsp;key를&amp;nbsp;사용하는&amp;nbsp;데이터는&amp;nbsp;캐시로&amp;nbsp;관리되기&amp;nbsp;때문에,&amp;nbsp;이미&amp;nbsp;가져온&amp;nbsp;데이터를&amp;nbsp;다시&amp;nbsp;활용하기도&amp;nbsp;쉽습니다. &lt;br /&gt;&lt;br /&gt;또한&amp;nbsp;서버&amp;nbsp;데이터를&amp;nbsp;변경하는&amp;nbsp;작업은&amp;nbsp;mutation으로&amp;nbsp;분리할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;게시글을&amp;nbsp;등록하거나&amp;nbsp;삭제한&amp;nbsp;뒤,&amp;nbsp;관련&amp;nbsp;목록을&amp;nbsp;다시&amp;nbsp;불러오게&amp;nbsp;만드는&amp;nbsp;흐름도&amp;nbsp;Query&amp;nbsp;Invalidation이라는&amp;nbsp;방식으로&amp;nbsp;정리할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;작은&amp;nbsp;프로젝트에서도&amp;nbsp;장점이&amp;nbsp;있습니다 &lt;br /&gt;TanStack&amp;nbsp;Query는&amp;nbsp;큰&amp;nbsp;서비스에서만&amp;nbsp;필요한&amp;nbsp;도구처럼&amp;nbsp;보일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;하지만&amp;nbsp;작은&amp;nbsp;프로젝트에서도&amp;nbsp;장점이&amp;nbsp;있습니다.&amp;nbsp;API&amp;nbsp;데이터&amp;nbsp;처리&amp;nbsp;방식이&amp;nbsp;일정해지기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;혼자&amp;nbsp;서비스를&amp;nbsp;만들&amp;nbsp;때는&amp;nbsp;새로운&amp;nbsp;기능을&amp;nbsp;빠르게&amp;nbsp;붙이는&amp;nbsp;것도&amp;nbsp;중요하지만,&amp;nbsp;나중에&amp;nbsp;다시&amp;nbsp;열어봤을&amp;nbsp;때&amp;nbsp;구조를&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있어야&amp;nbsp;합니다.&amp;nbsp;TanStack&amp;nbsp;Query를&amp;nbsp;사용하면&amp;nbsp;&amp;ldquo;서버에서&amp;nbsp;가져온&amp;nbsp;데이터는&amp;nbsp;query로&amp;nbsp;관리한다&amp;rdquo;는&amp;nbsp;기준이&amp;nbsp;생깁니다.&amp;nbsp;이&amp;nbsp;기준&amp;nbsp;하나만으로도&amp;nbsp;코드가&amp;nbsp;덜&amp;nbsp;흩어집니다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;목록,&amp;nbsp;상세,&amp;nbsp;저장,&amp;nbsp;삭제&amp;nbsp;같은&amp;nbsp;화면이&amp;nbsp;반복되는&amp;nbsp;관리자&amp;nbsp;페이지나&amp;nbsp;작은&amp;nbsp;SaaS&amp;nbsp;형태의&amp;nbsp;서비스에서는&amp;nbsp;체감이&amp;nbsp;큽니다.&amp;nbsp;매번&amp;nbsp;로딩&amp;nbsp;상태와&amp;nbsp;새로고침&amp;nbsp;시점을&amp;nbsp;직접&amp;nbsp;고민하지&amp;nbsp;않아도&amp;nbsp;되기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;그래도&amp;nbsp;모든&amp;nbsp;상태를&amp;nbsp;맡기는&amp;nbsp;도구는&amp;nbsp;아닙니다 &lt;br /&gt;TanStack&amp;nbsp;Query를&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;주의할&amp;nbsp;점도&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;도구는&amp;nbsp;서버&amp;nbsp;상태를&amp;nbsp;다루는&amp;nbsp;데&amp;nbsp;강하지만,&amp;nbsp;모든&amp;nbsp;클라이언트&amp;nbsp;상태를&amp;nbsp;대신하는&amp;nbsp;도구는&amp;nbsp;아닙니다.&amp;nbsp;입력&amp;nbsp;폼의&amp;nbsp;임시&amp;nbsp;값,&amp;nbsp;UI&amp;nbsp;토글,&amp;nbsp;화면&amp;nbsp;안에서만&amp;nbsp;쓰이는&amp;nbsp;상태는&amp;nbsp;여전히&amp;nbsp;React의&amp;nbsp;기본&amp;nbsp;상태나&amp;nbsp;다른&amp;nbsp;상태&amp;nbsp;관리&amp;nbsp;도구가&amp;nbsp;더&amp;nbsp;단순할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;또&amp;nbsp;하나는&amp;nbsp;query&amp;nbsp;key를&amp;nbsp;잘&amp;nbsp;정리해야&amp;nbsp;한다는&amp;nbsp;점입니다.&amp;nbsp;캐시는&amp;nbsp;query&amp;nbsp;key를&amp;nbsp;기준으로&amp;nbsp;관리되기&amp;nbsp;때문에,&amp;nbsp;키&amp;nbsp;이름이&amp;nbsp;제각각이면&amp;nbsp;나중에&amp;nbsp;무효화하거나&amp;nbsp;다시&amp;nbsp;불러오는&amp;nbsp;흐름이&amp;nbsp;복잡해질&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;결국&amp;nbsp;TanStack&amp;nbsp;Query를&amp;nbsp;잘&amp;nbsp;쓰려면&amp;nbsp;&amp;ldquo;이&amp;nbsp;데이터의&amp;nbsp;원본이&amp;nbsp;어디에&amp;nbsp;있는가&amp;rdquo;를&amp;nbsp;먼저&amp;nbsp;생각해야&amp;nbsp;합니다.&amp;nbsp;원본이&amp;nbsp;서버에&amp;nbsp;있다면&amp;nbsp;query로&amp;nbsp;관리하고,&amp;nbsp;화면&amp;nbsp;안에서만&amp;nbsp;의미가&amp;nbsp;있다면&amp;nbsp;로컬&amp;nbsp;상태로&amp;nbsp;두는&amp;nbsp;식입니다. &lt;br /&gt;&lt;br /&gt;마무리 &lt;br /&gt;TanStack&amp;nbsp;Query는&amp;nbsp;React에서&amp;nbsp;서버&amp;nbsp;데이터를&amp;nbsp;다루는&amp;nbsp;반복&amp;nbsp;작업을&amp;nbsp;줄여주는&amp;nbsp;실용적인&amp;nbsp;도구입니다.&amp;nbsp;데이터를&amp;nbsp;가져오고,&amp;nbsp;캐싱하고,&amp;nbsp;다시&amp;nbsp;동기화하고,&amp;nbsp;변경&amp;nbsp;후&amp;nbsp;관련&amp;nbsp;데이터를&amp;nbsp;갱신하는&amp;nbsp;흐름을&amp;nbsp;한&amp;nbsp;가지&amp;nbsp;방식으로&amp;nbsp;정리해줍니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;이런&amp;nbsp;도구가&amp;nbsp;작은&amp;nbsp;서비스에도&amp;nbsp;꽤&amp;nbsp;잘&amp;nbsp;맞는다고&amp;nbsp;느낍니다.&amp;nbsp;기능이&amp;nbsp;많아질수록&amp;nbsp;API&amp;nbsp;호출&amp;nbsp;코드는&amp;nbsp;자연스럽게&amp;nbsp;흩어지기&amp;nbsp;쉬운데,&amp;nbsp;TanStack&amp;nbsp;Query는&amp;nbsp;그&amp;nbsp;흐름을&amp;nbsp;다시&amp;nbsp;모아주는&amp;nbsp;기준이&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;물론&amp;nbsp;도구&amp;nbsp;하나가&amp;nbsp;설계를&amp;nbsp;대신해주지는&amp;nbsp;않습니다.&amp;nbsp;하지만&amp;nbsp;서버&amp;nbsp;상태와&amp;nbsp;클라이언트&amp;nbsp;상태를&amp;nbsp;구분하는&amp;nbsp;습관을&amp;nbsp;만들어준다는&amp;nbsp;점에서,&amp;nbsp;React&amp;nbsp;프로젝트를&amp;nbsp;오래&amp;nbsp;관리하려는&amp;nbsp;사람에게는&amp;nbsp;한&amp;nbsp;번쯤&amp;nbsp;제대로&amp;nbsp;써볼&amp;nbsp;만한&amp;nbsp;선택지라고&amp;nbsp;생각합니다.&lt;/p&gt;</description>
      <category>개발 노트/프론트엔드</category>
      <category>react</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/110</guid>
      <comments>https://roslyndev.tistory.com/110#entry110comment</comments>
      <pubDate>Sun, 5 Jul 2026 20:39:28 +0900</pubDate>
    </item>
    <item>
      <title>EF Core Code First와 AI 코딩 도구의 궁합을 다시 봅니다</title>
      <link>https://roslyndev.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;닷넷으로&amp;nbsp;작은&amp;nbsp;서비스를&amp;nbsp;만들다&amp;nbsp;보면&amp;nbsp;데이터베이스&amp;nbsp;작업이&amp;nbsp;생각보다&amp;nbsp;자주&amp;nbsp;발목을&amp;nbsp;잡습니다.&amp;nbsp;테이블을&amp;nbsp;먼저&amp;nbsp;설계하고,&amp;nbsp;그에&amp;nbsp;맞춰&amp;nbsp;모델을&amp;nbsp;만들고,&amp;nbsp;다시&amp;nbsp;API&amp;nbsp;코드를&amp;nbsp;연결하는&amp;nbsp;흐름은&amp;nbsp;익숙하지만&amp;nbsp;손이&amp;nbsp;많이&amp;nbsp;갑니다.&amp;nbsp;그래서&amp;nbsp;요즘은&amp;nbsp;Entity&amp;nbsp;Framework&amp;nbsp;Core의&amp;nbsp;Code&amp;nbsp;First&amp;nbsp;방식이&amp;nbsp;다시&amp;nbsp;편하게&amp;nbsp;느껴집니다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;VS&amp;nbsp;Code에서&amp;nbsp;Codex나&amp;nbsp;Claude&amp;nbsp;Code&amp;nbsp;같은&amp;nbsp;AI&amp;nbsp;코딩&amp;nbsp;도구를&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;때,&amp;nbsp;Code&amp;nbsp;First&amp;nbsp;방식은&amp;nbsp;궁합이&amp;nbsp;꽤&amp;nbsp;좋습니다.&amp;nbsp;이유는&amp;nbsp;단순합니다.&amp;nbsp;데이터&amp;nbsp;구조가&amp;nbsp;C#&amp;nbsp;코드&amp;nbsp;안에&amp;nbsp;먼저&amp;nbsp;표현되기&amp;nbsp;때문입니다.&amp;nbsp;AI&amp;nbsp;도구&amp;nbsp;입장에서도&amp;nbsp;엔티티&amp;nbsp;클래스,&amp;nbsp;DbContext,&amp;nbsp;설정&amp;nbsp;코드,&amp;nbsp;마이그레이션&amp;nbsp;흐름을&amp;nbsp;한&amp;nbsp;프로젝트&amp;nbsp;안에서&amp;nbsp;읽고&amp;nbsp;이해하기가&amp;nbsp;좋습니다. &lt;br /&gt;&lt;br /&gt;Code&amp;nbsp;First는&amp;nbsp;데이터&amp;nbsp;구조를&amp;nbsp;코드로&amp;nbsp;남기는&amp;nbsp;방식입니다 &lt;br /&gt;EF&amp;nbsp;Core는&amp;nbsp;닷넷&amp;nbsp;개발자가&amp;nbsp;데이터베이스를&amp;nbsp;.NET&amp;nbsp;객체로&amp;nbsp;다룰&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;도와주는&amp;nbsp;ORM입니다.&amp;nbsp;복잡한&amp;nbsp;데이터&amp;nbsp;접근&amp;nbsp;코드를&amp;nbsp;많이&amp;nbsp;줄여주고,&amp;nbsp;여러&amp;nbsp;데이터베이스&amp;nbsp;공급자와&amp;nbsp;함께&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;Code&amp;nbsp;First&amp;nbsp;방식에서는&amp;nbsp;먼저&amp;nbsp;C#&amp;nbsp;클래스로&amp;nbsp;엔티티를&amp;nbsp;정의합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;Post,&amp;nbsp;User,&amp;nbsp;Comment&amp;nbsp;같은&amp;nbsp;클래스를&amp;nbsp;만들고,&amp;nbsp;DbContext에&amp;nbsp;DbSet으로&amp;nbsp;연결합니다.&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;EF&amp;nbsp;Core&amp;nbsp;마이그레이션을&amp;nbsp;통해&amp;nbsp;이&amp;nbsp;모델의&amp;nbsp;변화가&amp;nbsp;데이터베이스&amp;nbsp;스키마로&amp;nbsp;반영됩니다. &lt;br /&gt;&lt;br /&gt;공식&amp;nbsp;문서에서도&amp;nbsp;EF&amp;nbsp;Core&amp;nbsp;마이그레이션은&amp;nbsp;데이터&amp;nbsp;모델의&amp;nbsp;변경&amp;nbsp;사항에&amp;nbsp;맞춰&amp;nbsp;데이터베이스&amp;nbsp;스키마를&amp;nbsp;점진적으로&amp;nbsp;업데이트하는&amp;nbsp;기능으로&amp;nbsp;설명합니다.&amp;nbsp;실제&amp;nbsp;프로젝트에서는&amp;nbsp;기능이&amp;nbsp;늘어나면서&amp;nbsp;속성이&amp;nbsp;추가되거나&amp;nbsp;관계가&amp;nbsp;바뀌기&amp;nbsp;때문에,&amp;nbsp;이&amp;nbsp;흐름이&amp;nbsp;꽤&amp;nbsp;자연스럽습니다. &lt;br /&gt;&lt;br /&gt;VS&amp;nbsp;Code와&amp;nbsp;AI&amp;nbsp;도구는&amp;nbsp;코드&amp;nbsp;중심&amp;nbsp;흐름을&amp;nbsp;잘&amp;nbsp;따라옵니다 &lt;br /&gt;Codex의&amp;nbsp;VS&amp;nbsp;Code&amp;nbsp;확장은&amp;nbsp;IDE&amp;nbsp;안에서&amp;nbsp;코드를&amp;nbsp;읽고,&amp;nbsp;수정하고,&amp;nbsp;실행하는&amp;nbsp;코딩&amp;nbsp;에이전트로&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;Claude&amp;nbsp;Code&amp;nbsp;역시&amp;nbsp;코드베이스를&amp;nbsp;이해하고&amp;nbsp;기능&amp;nbsp;구현,&amp;nbsp;버그&amp;nbsp;수정,&amp;nbsp;개발&amp;nbsp;작업&amp;nbsp;자동화를&amp;nbsp;돕는&amp;nbsp;도구로&amp;nbsp;안내되어&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;이런&amp;nbsp;도구들은&amp;nbsp;데이터베이스&amp;nbsp;안쪽을&amp;nbsp;직접&amp;nbsp;바라보기보다,&amp;nbsp;현재&amp;nbsp;열려&amp;nbsp;있는&amp;nbsp;프로젝트의&amp;nbsp;코드와&amp;nbsp;명령어&amp;nbsp;흐름을&amp;nbsp;기반으로&amp;nbsp;작업할&amp;nbsp;때&amp;nbsp;더&amp;nbsp;편합니다.&amp;nbsp;EF&amp;nbsp;Core&amp;nbsp;Code&amp;nbsp;First는&amp;nbsp;이&amp;nbsp;점에서&amp;nbsp;잘&amp;nbsp;맞습니다.&amp;nbsp;테이블&amp;nbsp;설계가&amp;nbsp;C#&amp;nbsp;클래스와&amp;nbsp;설정&amp;nbsp;코드로&amp;nbsp;표현되어&amp;nbsp;있으니,&amp;nbsp;AI에게&amp;nbsp;&amp;ldquo;이&amp;nbsp;엔티티에&amp;nbsp;상태&amp;nbsp;값을&amp;nbsp;추가하고&amp;nbsp;마이그레이션까지&amp;nbsp;만들어줘&amp;rdquo;처럼&amp;nbsp;요청하기가&amp;nbsp;쉽습니다. &lt;br /&gt;&lt;br /&gt;물론&amp;nbsp;AI가&amp;nbsp;만든&amp;nbsp;결과를&amp;nbsp;그대로&amp;nbsp;믿으면&amp;nbsp;안&amp;nbsp;됩니다.&amp;nbsp;데이터베이스&amp;nbsp;변경은&amp;nbsp;되돌리기&amp;nbsp;어려운&amp;nbsp;경우가&amp;nbsp;있기&amp;nbsp;때문에,&amp;nbsp;마이그레이션&amp;nbsp;파일과&amp;nbsp;생성된&amp;nbsp;SQL은&amp;nbsp;사람이&amp;nbsp;직접&amp;nbsp;확인해야&amp;nbsp;합니다.&amp;nbsp;그래도&amp;nbsp;초안을&amp;nbsp;만들고&amp;nbsp;반복&amp;nbsp;작업을&amp;nbsp;줄이는&amp;nbsp;면에서는&amp;nbsp;도움이&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;dotnet&amp;nbsp;CLI&amp;nbsp;덕분에&amp;nbsp;흐름이&amp;nbsp;단순해졌습니다 &lt;br /&gt;VS&amp;nbsp;Code에서&amp;nbsp;닷넷&amp;nbsp;개발을&amp;nbsp;할&amp;nbsp;때&amp;nbsp;중요한&amp;nbsp;장점은&amp;nbsp;대부분의&amp;nbsp;작업을&amp;nbsp;CLI로&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;점입니다.&amp;nbsp;EF&amp;nbsp;Core&amp;nbsp;도구는&amp;nbsp;마이그레이션&amp;nbsp;생성,&amp;nbsp;데이터베이스&amp;nbsp;업데이트&amp;nbsp;같은&amp;nbsp;설계&amp;nbsp;시점&amp;nbsp;작업을&amp;nbsp;.NET&amp;nbsp;CLI로&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;엔티티를&amp;nbsp;수정한&amp;nbsp;뒤에는&amp;nbsp;dotnet&amp;nbsp;ef&amp;nbsp;migrations&amp;nbsp;add&amp;nbsp;명령으로&amp;nbsp;변경&amp;nbsp;이력을&amp;nbsp;만들고,&amp;nbsp;dotnet&amp;nbsp;ef&amp;nbsp;database&amp;nbsp;update&amp;nbsp;명령으로&amp;nbsp;데이터베이스에&amp;nbsp;반영할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;흐름은&amp;nbsp;AI&amp;nbsp;코딩&amp;nbsp;도구와도&amp;nbsp;잘&amp;nbsp;맞습니다.&amp;nbsp;명령어가&amp;nbsp;명확하고,&amp;nbsp;결과물이&amp;nbsp;파일로&amp;nbsp;남고,&amp;nbsp;변경&amp;nbsp;내용을&amp;nbsp;Git&amp;nbsp;diff로&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;Visual&amp;nbsp;Studio의&amp;nbsp;강한&amp;nbsp;도구&amp;nbsp;지원도&amp;nbsp;여전히&amp;nbsp;좋지만,&amp;nbsp;VS&amp;nbsp;Code&amp;nbsp;기반&amp;nbsp;작업은&amp;nbsp;가볍고&amp;nbsp;반복이&amp;nbsp;빠릅니다.&amp;nbsp;특히&amp;nbsp;작은&amp;nbsp;서비스나&amp;nbsp;개인&amp;nbsp;프로젝트에서는&amp;nbsp;에디터,&amp;nbsp;터미널,&amp;nbsp;AI&amp;nbsp;도구,&amp;nbsp;Git&amp;nbsp;diff만으로도&amp;nbsp;꽤&amp;nbsp;안정적인&amp;nbsp;개발&amp;nbsp;흐름을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;궁합이&amp;nbsp;좋은&amp;nbsp;이유는&amp;nbsp;책임&amp;nbsp;경계가&amp;nbsp;보이기&amp;nbsp;때문입니다 &lt;br /&gt;AI&amp;nbsp;코딩&amp;nbsp;도구를&amp;nbsp;잘&amp;nbsp;쓰려면&amp;nbsp;프로젝트의&amp;nbsp;책임&amp;nbsp;경계가&amp;nbsp;코드에&amp;nbsp;드러나야&amp;nbsp;합니다.&amp;nbsp;EF&amp;nbsp;Core&amp;nbsp;Code&amp;nbsp;First는&amp;nbsp;이&amp;nbsp;점에서&amp;nbsp;장점이&amp;nbsp;있습니다.&amp;nbsp;엔티티는&amp;nbsp;데이터&amp;nbsp;구조를&amp;nbsp;표현하고,&amp;nbsp;DbContext는&amp;nbsp;데이터베이스&amp;nbsp;연결과&amp;nbsp;모델&amp;nbsp;구성을&amp;nbsp;담당하며,&amp;nbsp;마이그레이션은&amp;nbsp;구조&amp;nbsp;변경&amp;nbsp;이력을&amp;nbsp;남깁니다. &lt;br /&gt;&lt;br /&gt;이렇게&amp;nbsp;역할이&amp;nbsp;나뉘어&amp;nbsp;있으면&amp;nbsp;AI에게&amp;nbsp;작업을&amp;nbsp;맡길&amp;nbsp;때도&amp;nbsp;요청이&amp;nbsp;구체적이&amp;nbsp;됩니다.&amp;nbsp;&amp;ldquo;게시글에&amp;nbsp;공개&amp;nbsp;여부를&amp;nbsp;추가해줘&amp;rdquo;,&amp;nbsp;&amp;ldquo;조회용&amp;nbsp;DTO에는&amp;nbsp;작성자&amp;nbsp;이름만&amp;nbsp;포함해줘&amp;rdquo;,&amp;nbsp;&amp;ldquo;마이그레이션&amp;nbsp;이름은&amp;nbsp;AddPostVisibility로&amp;nbsp;만들어줘&amp;rdquo;처럼&amp;nbsp;말할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;요청이&amp;nbsp;구체적일수록&amp;nbsp;결과를&amp;nbsp;검토하기도&amp;nbsp;쉬워집니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;이&amp;nbsp;부분이&amp;nbsp;Code&amp;nbsp;First와&amp;nbsp;AI&amp;nbsp;도구의&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;접점이라고&amp;nbsp;봅니다.&amp;nbsp;AI가&amp;nbsp;모든&amp;nbsp;설계를&amp;nbsp;대신해주는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;이미&amp;nbsp;코드&amp;nbsp;안에&amp;nbsp;드러난&amp;nbsp;구조를&amp;nbsp;따라&amp;nbsp;반복&amp;nbsp;작업을&amp;nbsp;빠르게&amp;nbsp;처리해주는&amp;nbsp;방식입니다. &lt;br /&gt;&lt;br /&gt;그래도&amp;nbsp;기준은&amp;nbsp;사람이&amp;nbsp;잡아야&amp;nbsp;합니다 &lt;br /&gt;Code&amp;nbsp;First가&amp;nbsp;편하다고&amp;nbsp;해서&amp;nbsp;모든&amp;nbsp;데이터베이스&amp;nbsp;설계를&amp;nbsp;가볍게&amp;nbsp;다뤄도&amp;nbsp;되는&amp;nbsp;것은&amp;nbsp;아닙니다.&amp;nbsp;인덱스,&amp;nbsp;관계,&amp;nbsp;삭제&amp;nbsp;정책,&amp;nbsp;nullable&amp;nbsp;여부,&amp;nbsp;마이그레이션&amp;nbsp;순서&amp;nbsp;같은&amp;nbsp;부분은&amp;nbsp;여전히&amp;nbsp;사람이&amp;nbsp;판단해야&amp;nbsp;합니다.&amp;nbsp;특히&amp;nbsp;운영&amp;nbsp;중인&amp;nbsp;서비스에서는&amp;nbsp;마이그레이션&amp;nbsp;하나가&amp;nbsp;실제&amp;nbsp;데이터에&amp;nbsp;영향을&amp;nbsp;줄&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;AI&amp;nbsp;도구도&amp;nbsp;마찬가지입니다.&amp;nbsp;Codex나&amp;nbsp;Claude&amp;nbsp;Code는&amp;nbsp;좋은&amp;nbsp;보조자가&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;프로젝트의&amp;nbsp;기준을&amp;nbsp;대신&amp;nbsp;정해주지는&amp;nbsp;않습니다.&amp;nbsp;어떤&amp;nbsp;이름을&amp;nbsp;쓸지,&amp;nbsp;어떤&amp;nbsp;관계를&amp;nbsp;허용할지,&amp;nbsp;어느&amp;nbsp;시점에&amp;nbsp;DB&amp;nbsp;변경을&amp;nbsp;배포할지는&amp;nbsp;결국&amp;nbsp;운영자가&amp;nbsp;결정해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;그래서&amp;nbsp;저는&amp;nbsp;이&amp;nbsp;조합을&amp;nbsp;&amp;ldquo;자동&amp;nbsp;개발&amp;rdquo;이라기보다&amp;nbsp;&amp;ldquo;검토&amp;nbsp;가능한&amp;nbsp;초안을&amp;nbsp;빠르게&amp;nbsp;만드는&amp;nbsp;흐름&amp;rdquo;에&amp;nbsp;가깝게&amp;nbsp;보고&amp;nbsp;있습니다.&amp;nbsp;코드는&amp;nbsp;AI가&amp;nbsp;도와서&amp;nbsp;빠르게&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;기준과&amp;nbsp;책임은&amp;nbsp;여전히&amp;nbsp;사람에게&amp;nbsp;남습니다. &lt;br /&gt;&lt;br /&gt;마무리 &lt;br /&gt;EF&amp;nbsp;Core&amp;nbsp;Code&amp;nbsp;First,&amp;nbsp;VS&amp;nbsp;Code,&amp;nbsp;Codex나&amp;nbsp;Claude&amp;nbsp;Code&amp;nbsp;같은&amp;nbsp;AI&amp;nbsp;코딩&amp;nbsp;도구는&amp;nbsp;서로&amp;nbsp;잘&amp;nbsp;맞는&amp;nbsp;편입니다.&amp;nbsp;데이터&amp;nbsp;구조가&amp;nbsp;C#&amp;nbsp;코드로&amp;nbsp;표현되고,&amp;nbsp;마이그레이션은&amp;nbsp;파일로&amp;nbsp;남으며,&amp;nbsp;CLI&amp;nbsp;명령으로&amp;nbsp;흐름을&amp;nbsp;반복할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;작은&amp;nbsp;서비스를&amp;nbsp;혼자&amp;nbsp;만들고&amp;nbsp;운영하는&amp;nbsp;입장에서는&amp;nbsp;이런&amp;nbsp;단순한&amp;nbsp;흐름이&amp;nbsp;꽤&amp;nbsp;중요합니다.&amp;nbsp;복잡한&amp;nbsp;도구를&amp;nbsp;많이&amp;nbsp;붙이기보다,&amp;nbsp;코드로&amp;nbsp;구조를&amp;nbsp;남기고,&amp;nbsp;AI에게&amp;nbsp;반복&amp;nbsp;작업을&amp;nbsp;맡기고,&amp;nbsp;사람은&amp;nbsp;변경&amp;nbsp;내용을&amp;nbsp;검토하는&amp;nbsp;방식이&amp;nbsp;현실적입니다. &lt;br /&gt;&lt;br /&gt;결국&amp;nbsp;좋은&amp;nbsp;궁합은&amp;nbsp;도구가&amp;nbsp;똑똑해서만&amp;nbsp;생기는&amp;nbsp;것이&amp;nbsp;아닙니다.&amp;nbsp;사람이&amp;nbsp;이해할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;구조로&amp;nbsp;프로젝트를&amp;nbsp;정리해두었을&amp;nbsp;때,&amp;nbsp;AI&amp;nbsp;도구도&amp;nbsp;그&amp;nbsp;구조를&amp;nbsp;따라&amp;nbsp;더&amp;nbsp;잘&amp;nbsp;도와줄&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;EF&amp;nbsp;Core의&amp;nbsp;Code&amp;nbsp;First&amp;nbsp;방식은&amp;nbsp;그런&amp;nbsp;점에서&amp;nbsp;지금의&amp;nbsp;닷넷&amp;nbsp;개발&amp;nbsp;흐름과&amp;nbsp;잘&amp;nbsp;어울리는&amp;nbsp;선택지라고&amp;nbsp;느낍니다.&lt;/p&gt;</description>
      <category>개발 노트/ASP.NET Core</category>
      <category>codefirst</category>
      <category>EntityFramework</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/109</guid>
      <comments>https://roslyndev.tistory.com/109#entry109comment</comments>
      <pubDate>Sun, 5 Jul 2026 20:38:24 +0900</pubDate>
    </item>
    <item>
      <title>MediatR 유료화를 보며 CQRS를 다시 생각했습니다</title>
      <link>https://roslyndev.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CQRS&amp;nbsp;패턴을&amp;nbsp;닷넷에서&amp;nbsp;이야기할&amp;nbsp;때&amp;nbsp;MediatR은&amp;nbsp;거의&amp;nbsp;자연스럽게&amp;nbsp;함께&amp;nbsp;언급되곤&amp;nbsp;했습니다.&amp;nbsp;Command와&amp;nbsp;Query를&amp;nbsp;나누고,&amp;nbsp;Controller나&amp;nbsp;Minimal&amp;nbsp;API&amp;nbsp;endpoint에서는&amp;nbsp;요청만&amp;nbsp;보내고,&amp;nbsp;실제&amp;nbsp;처리는&amp;nbsp;Handler에&amp;nbsp;맡기는&amp;nbsp;구조가&amp;nbsp;익숙했기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;저도&amp;nbsp;이&amp;nbsp;흐름이&amp;nbsp;꽤&amp;nbsp;마음에&amp;nbsp;들었습니다.&amp;nbsp;기능이&amp;nbsp;늘어날수록&amp;nbsp;Controller가&amp;nbsp;비대해지는&amp;nbsp;것을&amp;nbsp;막을&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;요청&amp;nbsp;단위로&amp;nbsp;코드를&amp;nbsp;나누면&amp;nbsp;나중에&amp;nbsp;다시&amp;nbsp;열어봤을&amp;nbsp;때&amp;nbsp;흐름을&amp;nbsp;따라가기&amp;nbsp;쉬웠습니다.&amp;nbsp;특히&amp;nbsp;혼자&amp;nbsp;서비스를&amp;nbsp;만들고&amp;nbsp;운영할&amp;nbsp;때는&amp;nbsp;&amp;ldquo;이&amp;nbsp;기능이&amp;nbsp;어디에&amp;nbsp;있지?&amp;rdquo;를&amp;nbsp;빨리&amp;nbsp;찾는&amp;nbsp;것이&amp;nbsp;생각보다&amp;nbsp;중요합니다. &lt;br /&gt;&lt;br /&gt;CQRS는&amp;nbsp;거창한&amp;nbsp;구조라기보다&amp;nbsp;역할을&amp;nbsp;나누는&amp;nbsp;방식입니다 &lt;br /&gt;CQRS는&amp;nbsp;Command&amp;nbsp;Query&amp;nbsp;Responsibility&amp;nbsp;Segregation의&amp;nbsp;줄임말입니다.&amp;nbsp;말은&amp;nbsp;조금&amp;nbsp;무겁지만,&amp;nbsp;기본&amp;nbsp;생각은&amp;nbsp;단순합니다.&amp;nbsp;데이터를&amp;nbsp;바꾸는&amp;nbsp;요청과&amp;nbsp;데이터를&amp;nbsp;조회하는&amp;nbsp;요청을&amp;nbsp;구분하자는&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;게시글을&amp;nbsp;등록하는&amp;nbsp;작업은&amp;nbsp;Command에&amp;nbsp;가깝습니다.&amp;nbsp;반대로&amp;nbsp;게시글&amp;nbsp;목록을&amp;nbsp;읽어오는&amp;nbsp;작업은&amp;nbsp;Query에&amp;nbsp;가깝습니다.&amp;nbsp;이렇게&amp;nbsp;나누면&amp;nbsp;코드의&amp;nbsp;목적이&amp;nbsp;분명해집니다.&amp;nbsp;이&amp;nbsp;코드는&amp;nbsp;상태를&amp;nbsp;바꾸는&amp;nbsp;코드인지,&amp;nbsp;단순히&amp;nbsp;읽어오는&amp;nbsp;코드인지가&amp;nbsp;파일&amp;nbsp;이름과&amp;nbsp;구조에서&amp;nbsp;바로&amp;nbsp;드러납니다. &lt;br /&gt;&lt;br /&gt;여기에&amp;nbsp;중재자&amp;nbsp;패턴을&amp;nbsp;더하면&amp;nbsp;호출하는&amp;nbsp;쪽과&amp;nbsp;처리하는&amp;nbsp;쪽의&amp;nbsp;연결이&amp;nbsp;느슨해집니다.&amp;nbsp;API는&amp;nbsp;&amp;ldquo;이&amp;nbsp;요청을&amp;nbsp;처리해&amp;nbsp;주세요&amp;rdquo;라고만&amp;nbsp;말하고,&amp;nbsp;실제&amp;nbsp;Handler를&amp;nbsp;찾아&amp;nbsp;실행하는&amp;nbsp;일은&amp;nbsp;중재자가&amp;nbsp;맡습니다.&amp;nbsp;MediatR은&amp;nbsp;이&amp;nbsp;역할을&amp;nbsp;닷넷에서&amp;nbsp;아주&amp;nbsp;편하게&amp;nbsp;제공해준&amp;nbsp;대표적인&amp;nbsp;라이브러리였습니다. &lt;br /&gt;&lt;br /&gt;MediatR의&amp;nbsp;라이선스&amp;nbsp;변화는&amp;nbsp;한&amp;nbsp;번쯤&amp;nbsp;생각해볼&amp;nbsp;계기가&amp;nbsp;됐습니다 &lt;br /&gt;최근&amp;nbsp;MediatR은&amp;nbsp;13.0.0&amp;nbsp;버전부터&amp;nbsp;라이선스&amp;nbsp;정책이&amp;nbsp;바뀌었습니다.&amp;nbsp;공식&amp;nbsp;안내에&amp;nbsp;따르면&amp;nbsp;MediatR&amp;nbsp;13.0.0&amp;nbsp;이후&amp;nbsp;버전은&amp;nbsp;Lucky&amp;nbsp;Penny&amp;nbsp;Software의&amp;nbsp;상업&amp;nbsp;라이선스&amp;nbsp;대상이며,&amp;nbsp;그&amp;nbsp;이전&amp;nbsp;버전은&amp;nbsp;기존&amp;nbsp;오픈소스&amp;nbsp;라이선스&amp;nbsp;조건이&amp;nbsp;유지됩니다.&amp;nbsp;현재&amp;nbsp;NuGet&amp;nbsp;기준&amp;nbsp;최신&amp;nbsp;MediatR은&amp;nbsp;14.x&amp;nbsp;계열까지&amp;nbsp;올라와&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;변화&amp;nbsp;자체를&amp;nbsp;좋다거나&amp;nbsp;나쁘다고&amp;nbsp;단정하고&amp;nbsp;싶지는&amp;nbsp;않습니다.&amp;nbsp;오픈소스&amp;nbsp;유지에도&amp;nbsp;비용과&amp;nbsp;시간이&amp;nbsp;들고,&amp;nbsp;오랫동안&amp;nbsp;널리&amp;nbsp;쓰인&amp;nbsp;라이브러리가&amp;nbsp;지속&amp;nbsp;가능한&amp;nbsp;방식을&amp;nbsp;찾는&amp;nbsp;것은&amp;nbsp;자연스러운&amp;nbsp;일입니다.&amp;nbsp;다만&amp;nbsp;사용하는&amp;nbsp;입장에서는&amp;nbsp;이제&amp;nbsp;&amp;ldquo;그냥&amp;nbsp;늘&amp;nbsp;쓰던&amp;nbsp;패키지니까&amp;nbsp;넣는다&amp;rdquo;에서&amp;nbsp;한&amp;nbsp;번&amp;nbsp;더&amp;nbsp;멈춰&amp;nbsp;생각하게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;특히&amp;nbsp;작은&amp;nbsp;서비스나&amp;nbsp;개인&amp;nbsp;프로젝트에서는&amp;nbsp;의존성을&amp;nbsp;하나&amp;nbsp;추가하는&amp;nbsp;일도&amp;nbsp;운영의&amp;nbsp;일부입니다.&amp;nbsp;라이선스,&amp;nbsp;업데이트,&amp;nbsp;보안,&amp;nbsp;장기&amp;nbsp;유지보수까지&amp;nbsp;함께&amp;nbsp;따라옵니다.&amp;nbsp;그래서&amp;nbsp;MediatR의&amp;nbsp;변화는&amp;nbsp;단순히&amp;nbsp;비용&amp;nbsp;문제가&amp;nbsp;아니라,&amp;nbsp;이&amp;nbsp;정도&amp;nbsp;구조를&amp;nbsp;꼭&amp;nbsp;외부&amp;nbsp;라이브러리에&amp;nbsp;맡겨야&amp;nbsp;하는가를&amp;nbsp;다시&amp;nbsp;묻게&amp;nbsp;만들었습니다. &lt;br /&gt;&lt;br /&gt;요즘&amp;nbsp;닷넷에서는&amp;nbsp;직접&amp;nbsp;구현도&amp;nbsp;크게&amp;nbsp;어렵지&amp;nbsp;않습니다 &lt;br /&gt;예전에는&amp;nbsp;이런&amp;nbsp;구조를&amp;nbsp;직접&amp;nbsp;만들려면&amp;nbsp;DI&amp;nbsp;컨테이너나&amp;nbsp;리플렉션&amp;nbsp;처리&amp;nbsp;때문에&amp;nbsp;신경&amp;nbsp;쓸&amp;nbsp;일이&amp;nbsp;많았습니다.&amp;nbsp;하지만&amp;nbsp;지금의&amp;nbsp;닷넷은&amp;nbsp;기본&amp;nbsp;의존성&amp;nbsp;주입&amp;nbsp;기능이&amp;nbsp;꽤&amp;nbsp;강해졌습니다.&amp;nbsp;ASP.NET&amp;nbsp;Core는&amp;nbsp;기본적으로&amp;nbsp;IServiceProvider와&amp;nbsp;IServiceCollection&amp;nbsp;기반의&amp;nbsp;DI&amp;nbsp;컨테이너를&amp;nbsp;제공하고,&amp;nbsp;서비스&amp;nbsp;수명&amp;nbsp;관리나&amp;nbsp;생성자&amp;nbsp;주입도&amp;nbsp;자연스럽게&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;.NET&amp;nbsp;8&amp;nbsp;이후에는&amp;nbsp;Keyed&amp;nbsp;Services도&amp;nbsp;공식적으로&amp;nbsp;제공됩니다.&amp;nbsp;같은&amp;nbsp;인터페이스의&amp;nbsp;여러&amp;nbsp;구현을&amp;nbsp;키로&amp;nbsp;구분해&amp;nbsp;등록하고&amp;nbsp;가져오는&amp;nbsp;방식입니다.&amp;nbsp;물론&amp;nbsp;CQRS용&amp;nbsp;중재자를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;반드시&amp;nbsp;Keyed&amp;nbsp;Services가&amp;nbsp;필요한&amp;nbsp;것은&amp;nbsp;아니지만,&amp;nbsp;닷넷의&amp;nbsp;기본&amp;nbsp;DI가&amp;nbsp;예전보다&amp;nbsp;훨씬&amp;nbsp;표현력이&amp;nbsp;좋아졌다는&amp;nbsp;점은&amp;nbsp;분명합니다. &lt;br /&gt;&lt;br /&gt;간단한&amp;nbsp;CQRS&amp;nbsp;구조라면&amp;nbsp;직접&amp;nbsp;만드는&amp;nbsp;것도&amp;nbsp;어렵지&amp;nbsp;않습니다.&amp;nbsp;IRequest,&amp;nbsp;IRequestHandler&amp;nbsp;같은&amp;nbsp;인터페이스를&amp;nbsp;만들고,&amp;nbsp;Dispatcher가&amp;nbsp;IServiceProvider를&amp;nbsp;통해&amp;nbsp;알맞은&amp;nbsp;Handler를&amp;nbsp;찾아&amp;nbsp;실행하도록&amp;nbsp;구성하면&amp;nbsp;됩니다.&amp;nbsp;여기에&amp;nbsp;필요한&amp;nbsp;공통&amp;nbsp;로깅이나&amp;nbsp;트랜잭션&amp;nbsp;처리는&amp;nbsp;프로젝트&amp;nbsp;상황에&amp;nbsp;맞게&amp;nbsp;조금씩&amp;nbsp;붙이면&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;직접&amp;nbsp;만든다는&amp;nbsp;것은&amp;nbsp;모든&amp;nbsp;기능을&amp;nbsp;다시&amp;nbsp;만들겠다는&amp;nbsp;뜻은&amp;nbsp;아닙니다 &lt;br /&gt;물론&amp;nbsp;MediatR이&amp;nbsp;해주던&amp;nbsp;모든&amp;nbsp;기능을&amp;nbsp;직접&amp;nbsp;다시&amp;nbsp;만들겠다는&amp;nbsp;뜻은&amp;nbsp;아닙니다.&amp;nbsp;MediatR은&amp;nbsp;요청/응답,&amp;nbsp;알림,&amp;nbsp;파이프라인&amp;nbsp;동작,&amp;nbsp;예외&amp;nbsp;처리&amp;nbsp;등&amp;nbsp;여러&amp;nbsp;기능을&amp;nbsp;안정적으로&amp;nbsp;제공해왔습니다.&amp;nbsp;이미&amp;nbsp;그&amp;nbsp;기능들을&amp;nbsp;깊게&amp;nbsp;사용하고&amp;nbsp;있다면&amp;nbsp;계속&amp;nbsp;사용하는&amp;nbsp;편이&amp;nbsp;더&amp;nbsp;현실적일&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;다만&amp;nbsp;많은&amp;nbsp;프로젝트에서는&amp;nbsp;MediatR의&amp;nbsp;모든&amp;nbsp;기능을&amp;nbsp;쓰지&amp;nbsp;않습니다.&amp;nbsp;Command&amp;nbsp;하나&amp;nbsp;보내고&amp;nbsp;Handler&amp;nbsp;하나&amp;nbsp;실행하는&amp;nbsp;정도로만&amp;nbsp;사용하는&amp;nbsp;경우도&amp;nbsp;많습니다.&amp;nbsp;그런&amp;nbsp;상황이라면&amp;nbsp;작은&amp;nbsp;Dispatcher를&amp;nbsp;직접&amp;nbsp;두는&amp;nbsp;편이&amp;nbsp;오히려&amp;nbsp;더&amp;nbsp;단순할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;외부&amp;nbsp;패키지의&amp;nbsp;변화에&amp;nbsp;덜&amp;nbsp;흔들리고,&amp;nbsp;우리&amp;nbsp;프로젝트에&amp;nbsp;필요한&amp;nbsp;만큼만&amp;nbsp;유지하면&amp;nbsp;되기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;저는&amp;nbsp;이&amp;nbsp;지점이&amp;nbsp;중요하다고&amp;nbsp;느꼈습니다.&amp;nbsp;직접&amp;nbsp;구현은&amp;nbsp;라이브러리를&amp;nbsp;부정하는&amp;nbsp;선택이&amp;nbsp;아닙니다.&amp;nbsp;지금&amp;nbsp;내&amp;nbsp;서비스&amp;nbsp;규모에서&amp;nbsp;필요한&amp;nbsp;추상화가&amp;nbsp;어디까지인지를&amp;nbsp;다시&amp;nbsp;정리하는&amp;nbsp;일에&amp;nbsp;가깝습니다. &lt;br /&gt;&lt;br /&gt;마무리 &lt;br /&gt;MediatR의&amp;nbsp;유료화는&amp;nbsp;닷넷&amp;nbsp;개발자들에게&amp;nbsp;작은&amp;nbsp;불편함이자,&amp;nbsp;동시에&amp;nbsp;좋은&amp;nbsp;점검&amp;nbsp;기회가&amp;nbsp;된&amp;nbsp;것&amp;nbsp;같습니다.&amp;nbsp;그동안&amp;nbsp;너무&amp;nbsp;자연스럽게&amp;nbsp;추가하던&amp;nbsp;의존성이&amp;nbsp;정말&amp;nbsp;필요한지,&amp;nbsp;아니면&amp;nbsp;지금의&amp;nbsp;닷넷&amp;nbsp;기본&amp;nbsp;기능만으로도&amp;nbsp;충분한지&amp;nbsp;돌아보게&amp;nbsp;만들었기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;제&amp;nbsp;기준에서는&amp;nbsp;단순한&amp;nbsp;CQRS와&amp;nbsp;중재자&amp;nbsp;패턴&amp;nbsp;정도라면&amp;nbsp;이제&amp;nbsp;직접&amp;nbsp;구현해서&amp;nbsp;사용하는&amp;nbsp;것도&amp;nbsp;충분히&amp;nbsp;현실적인&amp;nbsp;선택입니다.&amp;nbsp;닷넷의&amp;nbsp;기본&amp;nbsp;DI가&amp;nbsp;좋아졌고,&amp;nbsp;작은&amp;nbsp;서비스에서는&amp;nbsp;필요한&amp;nbsp;만큼만&amp;nbsp;단순하게&amp;nbsp;가져가는&amp;nbsp;편이&amp;nbsp;오래&amp;nbsp;운영하기에&amp;nbsp;더&amp;nbsp;편할&amp;nbsp;때가&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;결국&amp;nbsp;선택은&amp;nbsp;프로젝트의&amp;nbsp;크기보다&amp;nbsp;운영&amp;nbsp;방식에&amp;nbsp;달려&amp;nbsp;있습니다.&amp;nbsp;이미&amp;nbsp;MediatR의&amp;nbsp;풍부한&amp;nbsp;기능을&amp;nbsp;잘&amp;nbsp;쓰고&amp;nbsp;있다면&amp;nbsp;유지하는&amp;nbsp;것이&amp;nbsp;맞고,&amp;nbsp;단순한&amp;nbsp;요청&amp;nbsp;분리만&amp;nbsp;필요하다면&amp;nbsp;직접&amp;nbsp;구현도&amp;nbsp;좋은&amp;nbsp;선택이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이번&amp;nbsp;기록은&amp;nbsp;어느&amp;nbsp;한쪽을&amp;nbsp;정답으로&amp;nbsp;정하기보다,&amp;nbsp;의존성을&amp;nbsp;추가하기&amp;nbsp;전에&amp;nbsp;한&amp;nbsp;번&amp;nbsp;더&amp;nbsp;생각해보자는&amp;nbsp;기준에&amp;nbsp;가깝습니다.&lt;/p&gt;</description>
      <category>개발 노트/ASP.NET Core</category>
      <category>CQRS</category>
      <category>유료화</category>
      <category>중재자패턴</category>
      <author>Roslyn</author>
      <guid isPermaLink="true">https://roslyndev.tistory.com/108</guid>
      <comments>https://roslyndev.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 5 Jul 2026 20:36:53 +0900</pubDate>
    </item>
  </channel>
</rss>