<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Maya Lee</title>
    <description>The latest articles on Forem by Maya Lee (@maya_lee).</description>
    <link>https://forem.com/maya_lee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3535103%2Ffcc4749e-3fc7-4d61-9fcf-7641d1735ea8.jpeg</url>
      <title>Forem: Maya Lee</title>
      <link>https://forem.com/maya_lee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/maya_lee"/>
    <language>en</language>
    <item>
      <title>초기 단계에서 CloudFront와 ALB 없이 ECS + RDS만으로 운영해도 괜찮을까요?</title>
      <dc:creator>Maya Lee</dc:creator>
      <pubDate>Mon, 29 Sep 2025 01:26:30 +0000</pubDate>
      <link>https://forem.com/maya_lee/cogi-dangyeeseo-cloudfrontwa-alb-eobsi-ecs-rdsmaneuro-unyeonghaedo-gwaencanheulggayo-17dp</link>
      <guid>https://forem.com/maya_lee/cogi-dangyeeseo-cloudfrontwa-alb-eobsi-ecs-rdsmaneuro-unyeonghaedo-gwaencanheulggayo-17dp</guid>
      <description>&lt;h2&gt;
  
  
  ECS Apps + RDS 직접 구성
&lt;/h2&gt;

&lt;h3&gt;
  
  
  가능한 시나리오
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. ECS에서 직접 HTTP 서빙&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ECS Task Definition&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-nextjs-app&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:3000"&lt;/span&gt;  &lt;span class="c1"&gt;# Next.js 기본 포트&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=postgresql://user:pass@rds-endpoint:5432/db&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Route 53으로 도메인 직접 연결&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-domain.com → ECS 퍼블릭 IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. ECS Service에서 퍼블릭 IP 할당&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ECS Service 설정&lt;/span&gt;
&lt;span class="na"&gt;network_configuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;subnets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;subnet-public-1a&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;subnet-public-1b&lt;/span&gt;
  &lt;span class="na"&gt;security_groups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;sg-web-app&lt;/span&gt;
  &lt;span class="na"&gt;assign_public_ip&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ENABLED&lt;/span&gt;  &lt;span class="c1"&gt;# 중요!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  장점
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;단순함&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;인프라 복잡도 최소화&lt;/li&gt;
&lt;li&gt;비용 절약 ($200-400/월)&lt;/li&gt;
&lt;li&gt;빠른 배포와 테스트&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;개발 편의성&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;로컬과 동일한 구조&lt;/li&gt;
&lt;li&gt;디버깅 쉬움&lt;/li&gt;
&lt;li&gt;설정 최소화&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  단점과 한계
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;보안&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ SSL 인증서 직접 관리 필요
❌ DDoS 보호 없음
❌ 방화벽 설정 복잡
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;성능&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ CDN 없어서 정적 파일 느림
❌ 단일 리전만 서빙
❌ 캐싱 레이어 없음
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;확장성&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ 트래픽 급증시 대응 어려움
❌ 로드 밸런싱 수동 설정
❌ Health Check 제한적
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  실제 구성 예시
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. ECS Cluster 생성&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Fargate 클러스터&lt;/span&gt;
aws ecs create-cluster &lt;span class="nt"&gt;--cluster-name&lt;/span&gt; academy-cms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Task Definition&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"family"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"academy-cms-task"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"networkMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"awsvpc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiresCompatibilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"FARGATE"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cpu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1024"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2048"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"containerDefinitions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"web-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-account.dkr.ecr.region.amazonaws.com/academy-cms:latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"portMappings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"containerPort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tcp"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DATABASE_URL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgresql://user:pass@rds-endpoint:5432/academy"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NODE_ENV"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"production"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Service 생성&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ecs create-service &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cluster&lt;/span&gt; academy-cms &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--service-name&lt;/span&gt; web-service &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--task-definition&lt;/span&gt; academy-cms-task &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--desired-count&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--launch-type&lt;/span&gt; FARGATE &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network-configuration&lt;/span&gt; &lt;span class="s2"&gt;"awsvpcConfiguration={subnets=[subnet-xxx],securityGroups=[sg-xxx],assignPublicIp=ENABLED}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  추후 확장 경로
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1단계: 현재&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ECS Apps ← → RDS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2단계: 로드밸런서 추가&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALB ← → ECS Apps ← → RDS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3단계: CDN 추가&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CloudFront ← → ALB ← → ECS Apps ← → RDS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  주의사항
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. SSL/TLS 설정&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Next.js에서 HTTPS 리다이렉트&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;redirects&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/(.*)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;has&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;header&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-forwarded-proto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://yourdomain.com/$1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;permanent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Health Check&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// pages/api/health.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;healthy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;uptime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uptime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. 환경변수 보안&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# AWS Parameter Store 사용 권장&lt;/span&gt;
aws ssm put-parameter &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"/academy-cms/database-url"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--value&lt;/span&gt; &lt;span class="s2"&gt;"postgresql://..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; &lt;span class="s2"&gt;"SecureString"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  결론
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ECS + RDS만으로도 1000명 정도는 충분히 처리 가능&lt;/strong&gt;합니다. 다만 트래픽이 늘어나면 CloudFront와 ALB를 점진적으로 추가하는 것을 권장합니다.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;클로드가 준 답변 어느정도 신뢰 할 수 있을까요?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Next.js 배포할 때, CloudFront + S3 vs ECS 뭐가 다를까?</title>
      <dc:creator>Maya Lee</dc:creator>
      <pubDate>Mon, 29 Sep 2025 00:57:31 +0000</pubDate>
      <link>https://forem.com/maya_lee/nextjs-baepohal-ddae-cloudfront-s3-vs-ecs-mweoga-dareulgga-2kl7</link>
      <guid>https://forem.com/maya_lee/nextjs-baepohal-ddae-cloudfront-s3-vs-ecs-mweoga-dareulgga-2kl7</guid>
      <description>&lt;p&gt;Next.js 프로젝트를 AWS에 배포할 때 고려해야 할 점.&lt;/p&gt;

&lt;p&gt;첫번째. CloudFront + S3&lt;/p&gt;

&lt;p&gt;S3는 AWS에서 제공하는 객체 스토리지 서비스로 배포방식은 Next.js 프로젝트를 npm run build 후 생성되는 결과물 폴더를 그대로 업로드 하여 생성된 주소로 접근하는 것이다.&lt;/p&gt;

&lt;p&gt;하지만 이 방식은 Next.js의 SSR기능을 사용할 수 없다.&lt;br&gt;
S3로 배포할때는 반드시 CSR 즉, 정적인 사이트로 만들어졌을때만 유용하다는 점.&lt;/p&gt;

&lt;p&gt;그렇다면 굳이 Next.js 프로젝트를 S3로 배포할 큰 이유가 없어 보인다. React 프로젝트에 적합한듯&lt;/p&gt;

&lt;p&gt;두번째. ECS&lt;br&gt;
결국 Next.js의 온전한 기능을 살려 배포하려면 ECS가 최적이다.&lt;/p&gt;

&lt;p&gt;(vercel은 운영으로 가져가기엔 너무 비쌈, 무료버전 또는 MPV 단계에서 적합&lt;/p&gt;

&lt;p&gt;AWS Amplify도 많이 쓴다고 해서 찾아봤는데, 워드프레스가 AWS로 진화한 느낌...&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;아래 글은 제가 작성한 글을 바탕으로 ChatGPT에서 수정을 요청한 글입니다. 가독성을 위해 함께 첨부합니다!&lt;/p&gt;




&lt;h2&gt;
  
  
  Next.js 배포할 때, CloudFront + S3 vs ECS 뭐가 다를까?
&lt;/h2&gt;

&lt;p&gt;Next.js로 만든 프로젝트를 AWS에 배포하려고 할 때, 가장 먼저 고민하게 되는 건 &lt;strong&gt;어떤 방식으로 배포할 것인가&lt;/strong&gt;입니다. 대표적인 두 가지 방법을 비교해보며 어떤 선택이 적절한지 정리해봤습니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. CloudFront + S3
&lt;/h3&gt;

&lt;p&gt;S3는 AWS에서 제공하는 객체 스토리지 서비스로, 정적인 파일을 저장하고 서빙하는 데 최적화되어 있습니다. Next.js 프로젝트를 &lt;code&gt;npm run build&lt;/code&gt; 한 후 생성된 &lt;code&gt;out&lt;/code&gt; 폴더(혹은 &lt;code&gt;.next&lt;/code&gt; → HTML export된 결과)를 S3에 업로드하고, CloudFront를 통해 CDN으로 배포하는 방식입니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;장점:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;비용이 저렴하다.&lt;/li&gt;
&lt;li&gt;정적인 웹사이트(CSR 또는 SSG)에 적합하다.&lt;/li&gt;
&lt;li&gt;배포가 간단하고 빠르다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;단점:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js의 핵심 기능 중 하나인 &lt;strong&gt;SSR(Server-Side Rendering)&lt;/strong&gt; 을 사용할 수 없다.&lt;/li&gt;
&lt;li&gt;동적인 라우팅, API Routes 등 서버 기능을 쓸 수 없다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;즉, 이 방식은 사실상 Next.js를 &lt;strong&gt;정적 사이트 생성기(Static Site Generator)&lt;/strong&gt; 로만 활용할 수 있을 때 의미가 있습니다. 그래서 엄밀히 말하면, React 프로젝트(또는 Next.js의 SSG만 사용하는 경우)에 더 적합한 배포 방식입니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. ECS (Elastic Container Service)
&lt;/h3&gt;

&lt;p&gt;Next.js의 SSR이나 API Routes 같은 &lt;strong&gt;서버 기반 기능까지 온전히 활용&lt;/strong&gt;하고 싶다면 ECS가 좋은 선택입니다.&lt;/p&gt;

&lt;p&gt;Next.js를 Docker 컨테이너로 감싸서 ECS에서 실행하면, Next.js의 모든 기능(SSR, API, ISR 등)을 사용할 수 있습니다.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;장점:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSR, API Routes, ISR 등 Next.js의 서버 기능을 전부 지원한다.&lt;/li&gt;
&lt;li&gt;확장성과 유연성이 높아 대규모 트래픽 대응이 가능하다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;단점:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;초기 설정이 복잡하고 인프라 지식이 필요하다.&lt;/li&gt;
&lt;li&gt;비용이 상대적으로 높다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;특히 운영단계에서 인프라 제어권이 중요한 경우(트래픽 최적화, 로깅, 보안 설정 등), ECS는 매우 강력한 선택지입니다.&lt;/p&gt;

&lt;h3&gt;
  
  
  그 외 고려해본 옵션들
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;br&gt;
Next.js의 공식 배포 플랫폼답게 가장 간편하고 기능이 풍부합니다. 다만 유료 요금제가 비싸기 때문에 MVP 단계나 개인 프로젝트에서는 무료 요금제가 적합하지만, 상용 서비스 운영에는 비용 부담이 큽니다.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Amplify&lt;/strong&gt;&lt;br&gt;
프론트엔드 배포와 CI/CD에 특화되어 있지만, 서버 렌더링보다는 정적 배포에 적합한 구조입니다. 개인적으로는 "AWS판 워드프레스" 같은 느낌이 들기도 했습니다.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  결론
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;정적 사이트만 필요하다면 → CloudFront + S3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSR, API 기능까지 활용하려면 → ECS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;빠른 MVP, 프로토타입 개발에는 → Vercel(무료 버전)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next.js는 단순한 프론트엔드 프레임워크가 아니라 &lt;strong&gt;프론트와 백엔드를 함께 다룰 수 있는 하이브리드 웹 프레임워크&lt;/strong&gt;입니다. 어떤 기능을 활용할지에 따라 배포 전략도 달라져야 합니다.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What skills should a 5-year frontend developer have? 🤔</title>
      <dc:creator>Maya Lee</dc:creator>
      <pubDate>Sun, 28 Sep 2025 11:44:18 +0000</pubDate>
      <link>https://forem.com/maya_lee/what-skills-should-a-5-year-frontend-developer-have-5bp3</link>
      <guid>https://forem.com/maya_lee/what-skills-should-a-5-year-frontend-developer-have-5bp3</guid>
      <description>&lt;p&gt;Hey dev community! 👋&lt;/p&gt;

&lt;p&gt;I'm curious about your thoughts on this - &lt;strong&gt;what core competencies do you think a frontend developer should have after 5 years in the field?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm asking this because I want to benchmark myself and see what areas I might need to focus on for growth. The frontend landscape changes so quickly, and I'd love to hear from developers at different experience levels about what really matters.&lt;/p&gt;

&lt;p&gt;Some areas I'm thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical skills (frameworks, tools, languages)&lt;/li&gt;
&lt;li&gt;Soft skills (communication, teamwork, problem-solving)&lt;/li&gt;
&lt;li&gt;Architecture and system design&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;li&gt;Testing strategies&lt;/li&gt;
&lt;li&gt;Leadership and mentoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What would you add to this list? What do you think separates a 5-year developer from someone with 2-3 years of experience?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear your perspectives! 🚀&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>career</category>
      <category>react</category>
    </item>
  </channel>
</rss>
